summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2016-06-18 15:16:17 -0700
committerMichael Forney <mforney@mforney.org>2016-06-18 15:16:17 -0700
commit03122929d1b2eae16acae8f43b657b74eadc5314 (patch)
tree140eb0b67495a1dc64b2d6555875724481f4bd29
parent1fe6147af6d60bc04ed0a0685349e8e1a716da4e (diff)
perms-hook: Extract defperm from setperm
-rw-r--r--util/perms-hook.c57
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