--- a/generator.c +++ b/generator.c @@ -151,6 +151,9 @@ static enum delret delete_item(char *fbuf, int mode, char *replace, int flags) fbuf, mode, flags); } + if (!am_root && !(mode & S_IWUSR)) + do_chmod(fbuf, mode |= S_IWUSR); /* at least try... */ + if (S_ISDIR(mode) && !(flags & DEL_DIR_IS_EMPTY)) { ignore_perishable = 1; /* If DEL_RECURSE is not set, this just reports emptiness. */ @@ -259,9 +262,12 @@ static enum delret delete_dir_contents(char *fname, int flags) strlcpy(p, fp->basename, remainder); /* Save stack by recursing to ourself directly. */ - if (S_ISDIR(fp->mode) - && delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS) - ret = DR_NOT_EMPTY; + if (S_ISDIR(fp->mode)) { + if (!am_root && !(fp->mode & S_IWUSR)) + do_chmod(fname, fp->mode |= S_IWUSR); /* at least try... */ + if (delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS) + ret = DR_NOT_EMPTY; + } if (delete_item(fname, fp->mode, NULL, flags) != DR_SUCCESS) ret = DR_NOT_EMPTY; }