diff options
| author | Michael Forney <mforney@mforney.org> | 2016-11-10 20:20:04 -0800 |
|---|---|---|
| committer | Michael Forney <mforney@mforney.org> | 2016-11-20 21:19:18 -0800 |
| commit | 1c5b595bea3a7802993a28af216a1b90607bad74 (patch) | |
| tree | 3e63016da78ef2b7412678c7b4465a0b8f0d5dd6 /util | |
| parent | 76b5a26ba8d7ad242c4ea1ba2550587eb6022ba4 (diff) | |
perms-hook: Create directories in order, delete in reverse order
Diffstat (limited to 'util')
| -rw-r--r-- | util/perms-hook.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/util/perms-hook.c b/util/perms-hook.c index 840fe142..db2fd1df 100644 --- a/util/perms-hook.c +++ b/util/perms-hook.c @@ -219,33 +219,27 @@ specialperm(struct perm *p) static void specialperms(void) { - int i = oldsp.len - 1, j = newsp.len - 1, n; + int i = 0, j = 0, n; + char *dirs[oldsp.len], **dir = dirs; - /* process in reverse order so that directory removals can succeed */ - while (i >= 0 || j >= 0) { - if (i < 0) - n = -1; - else if (j < 0) + while (i < oldsp.len || j < newsp.len) { + if (i == oldsp.len) n = 1; + else if (j == newsp.len) + n = -1; else n = strcmp(oldsp.perms[i].name, newsp.perms[j].name); - if (n <= 0) { + if (n >= 0) { if (specialperm(&newsp.perms[j]) < 0 && errno != EXDEV) error("specialperm:"); - --j; + ++j; if (n == 0) - --i; + ++i; continue; } switch (oldsp.perms[i].mode&S_IFMT) { case S_IFDIR: - if (rmdir(oldsp.perms[i].name) < 0) switch (errno) { - case ENOENT: - case ENOTEMPTY: - break; - default: - error("rmdir:"); - } + *dir++ = oldsp.perms[i].name; break; default: if (defperm(oldsp.perms[i].name) < 0) switch (errno) { @@ -256,7 +250,18 @@ specialperms(void) error("defperm:"); } } - --i; + ++i; + } + /* delete directories in reverse order */ + while (dir > dirs) { + --dir; + if (rmdir(*dir) < 0) switch (errno) { + case ENOENT: + case ENOTEMPTY: + break; + default: + error("rmdir:"); + } } } |
