diff options
Diffstat (limited to 'libtbd_apply.c')
-rw-r--r-- | libtbd_apply.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/libtbd_apply.c b/libtbd_apply.c index 62b1399..2e62087 100644 --- a/libtbd_apply.c +++ b/libtbd_apply.c @@ -320,45 +320,61 @@ tbd_apply_cmd_file_delta(FILE *stream) return 0; } -static int -tbd_apply_cmd_entity_delete_for_name(const char *name) +static int tbd_apply_cmd_entity_delete_for_name(const char*); +static int tbd_apply_cmd_dir_delete(const char *name) { - DIR *dp = opendir(name); - if(dp == NULL) { - if(remove(name) != 0) - return TBD_ERROR(TBD_ERROR_UNABLE_TO_REMOVE_FILE); - - return 0; + int err = TBD_ERROR_SUCCESS; + DIR *dp; + struct dirent *entry; + if ((dp = opendir(name)) == NULL) { + return TBD_ERROR(TBD_ERROR_UNABLE_TO_REMOVE_FILE); } - if(chdir(name) != 0) { + if (chdir(name) != 0) { closedir(dp); return TBD_ERROR(TBD_ERROR_UNABLE_TO_CHANGE_DIR); } - struct dirent *entry; - - while((entry = readdir(dp)) != NULL) { - if((strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0)) + while ((entry = readdir(dp)) != NULL) { + if ((strcmp(entry->d_name, ".") == 0) || + (strcmp(entry->d_name, "..") == 0)) { continue; + } + if ((err = tbd_apply_cmd_entity_delete_for_name(entry->d_name)) + != TBD_ERROR_SUCCESS) { + goto cleanup; + } + } - int err; - if((err = tbd_apply_cmd_entity_delete_for_name(entry->d_name)) != 0) { - closedir(dp); + if (chdir("..") != 0) { + err = TBD_ERROR(TBD_ERROR_UNABLE_TO_CHANGE_DIR); + goto cleanup; + } + if (rmdir(name) != 0) { + err = TBD_ERROR(TBD_ERROR_UNABLE_TO_REMOVE_FILE); + } +cleanup: + closedir(dp); + return err; +} - if(chdir("..") != 0) - return TBD_ERROR(TBD_ERROR_UNABLE_TO_CHANGE_DIR); +static int +tbd_apply_cmd_entity_delete_for_name(const char *name) +{ + struct stat info; + if (lstat(name, &info) != 0) { + return TBD_ERROR(TBD_ERROR_UNABLE_TO_STAT_FILE); + } - return err; - } + if (S_ISDIR(info.st_mode)) { + return tbd_apply_cmd_dir_delete(name); } - closedir(dp); - if(chdir("..") != 0) - return TBD_ERROR(TBD_ERROR_UNABLE_TO_CHANGE_DIR); - if(remove(name) != 0) + if (unlink(name) != 0) { return TBD_ERROR(TBD_ERROR_UNABLE_TO_REMOVE_FILE); - return 0; + } + + return TBD_ERROR_SUCCESS; } static int |