From f5761a342b4d5c0bb1351fc01f3f513f87b248f4 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 11 Nov 2006 14:45:00 +0000 Subject: [PATCH] - Make delete_dir_contents() use less stack by recursing directly to itself, and then calling delete_item() w/o DEL_RECURSE. - Fixed the return value handling of delete_dir_contents(). --- generator.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/generator.c b/generator.c index 67baed2d..ff506c61 100644 --- a/generator.c +++ b/generator.c @@ -182,7 +182,7 @@ static enum delret delete_item(char *fname, int mode, char *replace, int flags) return ret; } -/* Prep directory is to be deleted, so delete all its contents. Note +/* The directory is to be deleted, so delete all its contents. Note * that fname must point to a MAXPATHLEN buffer! (The buffer is used * for recursion, but returned unchanged.) */ @@ -195,6 +195,11 @@ static enum delret delete_dir_contents(char *fname, int flags) int j, dlen; char *p; + if (verbose > 3) { + rprintf(FINFO, "delete_dir_contents(%s) flags=%d\n", + fname, flags); + } + dlen = strlen(fname); save_filters = push_local_filters(fname, dlen); @@ -205,6 +210,8 @@ static enum delret delete_dir_contents(char *fname, int flags) *p++ = '/'; remainder = MAXPATHLEN - (p - fname); + /* We do our own recursion, so make delete_item() non-recursive. */ + flags &= ~DEL_RECURSE; ret = DR_SUCCESS; for (j = dirlist->count; j--; ) { @@ -221,9 +228,19 @@ static enum delret delete_dir_contents(char *fname, int flags) } strlcpy(p, fp->basename, remainder); + if (S_ISDIR(fp->mode)) { + /* Save stack by recursing to ourself directly. */ + result = delete_dir_contents(fname, flags); + if (result == DR_PINNED) + ret = result; + else if (result != DR_SUCCESS && ret == DR_SUCCESS) + ret = DR_NOT_EMPTY; + } result = delete_item(fname, fp->mode, NULL, flags); - if (result != DR_SUCCESS && ret == DR_SUCCESS) - ret = result == DR_PINNED ? result : DR_NOT_EMPTY; + if (result == DR_PINNED) + ret = result; + else if (result != DR_SUCCESS && ret == DR_SUCCESS) + ret = DR_NOT_EMPTY; } fname[dlen] = '\0'; -- 2.34.1