Add a function for recursive directory removal and use that instead of xsystem.
authorgraham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 16 Nov 2009 00:13:12 +0000 (00:13 +0000)
committergraham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 16 Nov 2009 00:13:12 +0000 (00:13 +0000)
git-svn-id: http://opkg.googlecode.com/svn/trunk@311 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/file_util.c
libopkg/file_util.h
libopkg/opkg_cmd.c
libopkg/opkg_conf.c

index 902b8c935477d35e7da8a26434f2d087cfa4eae4..08c801a1501c261968ba842319aac3fdeeb8cdbe 100644 (file)
@@ -18,6 +18,7 @@
 #include "includes.h"
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <dirent.h>
 
 #include "sprintf_alloc.h"
 #include "file_util.h"
@@ -224,3 +225,83 @@ char *file_sha256sum_alloc(const char *file_name)
 }
 
 #endif
+
+
+int
+rm_r(const char *path)
+{
+       int ret = 0;
+       DIR *dir;
+       struct dirent *dent;
+
+       dir = opendir(path);
+       if (dir == NULL) {
+               perror_msg("%s: opendir(%s)", __FUNCTION__, path);
+               return -1;
+       }
+
+       if (fchdir(dirfd(dir)) == -1) {
+               perror_msg("%s: fchdir(%s)", __FUNCTION__, path);
+               closedir(dir);
+               return -1;
+       }
+
+       while (1) {
+               errno = 0;
+               if ((dent = readdir(dir)) == NULL) {
+                       if (errno) {
+                               perror_msg("%s: readdir(%s)",
+                                               __FUNCTION__, path);
+                               ret = -1;
+                       }
+                       break;
+               }
+
+               if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
+                       continue;
+
+#ifdef _BSD_SOURCE
+               if (dent->d_type == DT_DIR) {
+                       if ((ret = rm_r(dent->d_name)) == -1)
+                               break;
+                       continue;
+               } else if (dent->d_type == DT_UNKNOWN)
+#endif
+               {
+                       struct stat st;
+                       if ((ret = lstat(dent->d_name, &st)) == -1) {
+                               perror_msg("%s: lstat(%s)",
+                                               __FUNCTION__, dent->d_name);
+                               break;
+                       }
+                       if (S_ISDIR(st.st_mode)) {
+                               if ((ret = rm_r(dent->d_name)) == -1)
+                                       break;
+                               continue;
+                       }
+               }
+
+               if ((ret = unlink(dent->d_name)) == -1) {
+                       perror_msg("%s: unlink(%s)",
+                                       __FUNCTION__, dent->d_name);
+                       break;
+               }
+       }
+
+       if (chdir("..") == -1) {
+               ret = -1;
+               perror_msg("%s: chdir(%s/..)", __FUNCTION__, path);
+       }
+
+       if (rmdir(path) == -1 ) {
+               ret = -1;
+               perror_msg("%s: rmdir(%s)", __FUNCTION__, path);
+       }
+
+       if (closedir(dir) == -1) {
+               ret = -1;
+               perror_msg("%s: closedir(%s)", __FUNCTION__, path);
+       }
+
+       return ret;
+}
index 184e04d5ebe5bfbb067bca165ba33b8c06a34a5b..cfad55155a0e25fd3a90623b2c60056bd7c612ec 100644 (file)
@@ -26,5 +26,6 @@ int file_copy(const char *src, const char *dest);
 int file_mkdir_hier(const char *path, long mode);
 char *file_md5sum_alloc(const char *file_name);
 char *file_sha256sum_alloc(const char *file_name);
+int rm_r(const char *path);
 
 #endif
index 9a490828c7bb9d17f714c72837b8b3a52601984e..c40694eff8bb1b78425ea5b0f7bf43b6f4c65760 100644 (file)
@@ -323,7 +323,6 @@ static opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf)
 
 static int opkg_finalize_intercepts(opkg_intercept_t ctx)
 {
-    char *cmd;
     DIR *dir;
     int err = 0;
 
@@ -349,10 +348,7 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx)
     } else
        perror (ctx->statedir);
        
-    sprintf_alloc (&cmd, "rm -rf %s", ctx->statedir);
-    err = xsystem (cmd);
-    free (cmd);
-
+    rm_r(ctx->statedir);
     free (ctx->statedir);
     free (ctx);
 
index 425c72bd9e6832d34d69bcf1f665cd2947044e06..bd73317a4f145dac1578efd0eb1b4c58581cf1d2 100644 (file)
@@ -341,12 +341,7 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
 
 void opkg_conf_deinit(opkg_conf_t *conf)
 {
-     int err;
-     char *cmd;
-
-     sprintf_alloc(&cmd, "rm -fr %s\n", conf->tmp_dir);
-     err = xsystem(cmd);
-     free(cmd);
+     rm_r(conf->tmp_dir);
 
      free(conf->tmp_dir);
      free(conf->lists_dir);