diff options
| author | Michael Forney <mforney@mforney.org> | 2016-06-18 15:16:17 -0700 |
|---|---|---|
| committer | Michael Forney <mforney@mforney.org> | 2016-06-18 15:16:17 -0700 |
| commit | 03122929d1b2eae16acae8f43b657b74eadc5314 (patch) | |
| tree | 140eb0b67495a1dc64b2d6555875724481f4bd29 | |
| parent | 1fe6147af6d60bc04ed0a0685349e8e1a716da4e (diff) | |
perms-hook: Extract defperm from setperm
| -rw-r--r-- | util/perms-hook.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/util/perms-hook.c b/util/perms-hook.c index ce2667d8..e25adc27 100644 --- a/util/perms-hook.c +++ b/util/perms-hook.c @@ -138,6 +138,37 @@ mkdir_v(const char *path, mode_t mode) return mkdir(path, mode); } +static int +defperm(const char *name) +{ + struct stat st; + mode_t mode; + + if (lstat(name, &st) < 0) + return -1; + if (st.st_dev != rootdev) { + errno = EXDEV; + return -1; + } + switch (st.st_mode & S_IFMT) { + case S_IFREG: + mode = st.st_mode&S_IXUSR ? 0755 : 0644; + break; + case S_IFDIR: + mode = 0755; + break; + case S_IFLNK: + return 0; + default: + die("unexpected file type %#o: %s", st.st_mode, name); + } + if ((st.st_mode&~S_IFMT) == mode) + return 0; + if (chmod_v(name, mode) < 0) + die("chmod:"); + return 0; +} + static void specialperm(struct perm *p) { @@ -179,8 +210,6 @@ static int setperm(const char *name) { int i; - struct stat st; - mode_t mode; for (i = 0; i < perms_len; ++i) { if (strcmp(name, perms[i].name) == 0) { @@ -189,29 +218,7 @@ setperm(const char *name) return 0; } } - if (lstat(name, &st) < 0) - return -1; - if (st.st_dev != rootdev) { - errno = EXDEV; - return -1; - } - switch (st.st_mode & S_IFMT) { - case S_IFREG: - mode = st.st_mode&S_IXUSR ? 0755 : 0644; - break; - case S_IFDIR: - mode = 0755; - break; - case S_IFLNK: - return 0; - default: - die("unexpected file type %#o: %s", st.st_mode, name); - } - if ((st.st_mode&~S_IFMT) == mode) - return 0; - if (chmod_v(name, mode) < 0) - die("chmod:"); - return 0; + return defperm(name); } static void |
