add function delete
authorLaurent Mazet <mazet@softndesign.org>
Sun, 12 Jan 2025 22:20:14 +0000 (23:20 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 12 Jan 2025 22:22:27 +0000 (23:22 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index 3de2dd1069bdde38d4710f03eba155417279d140..64feae182c87bb6833e089e32725775ac6d6033d 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -324,7 +324,7 @@ int main (int argc, char *argv[])
                 for (i = 0; i < list[panel]->nb; i++) {
                     current = list[panel]->tab + i;
                     if (current->selected) {
-                        char *src = strdupcat (dirname[panel], SEPARATOR, current->name);
+                        char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL);
                         if (processdelete (src) != 0) {
                             char *buf = strdupcat ("Can't delete '", src, "'", NULL);
                             msgwindow (buf, winscreen, 0);
@@ -334,6 +334,8 @@ int main (int argc, char *argv[])
                         free (src);
                     }
                 }
+                freelist (list[panel]);
+                list[panel] = NULL;
                 break;
             case ALT_F: /* filter */
                 string = getwindow ("Set filter", winscreen, MAXFILTER / 2, MAXFILTER, NULL);
@@ -474,4 +476,7 @@ int main (int argc, char *argv[])
 /* test: mkdir .a && touch ../.a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\t\n\t'; sleep 1; echo -en '\em'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a && rm ../.a */
 /* test: mkdir .a && mkdir ../.a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\t\n\t'; sleep 1; echo -en '\em'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a && rmdir ../.a */
 
+/* Delete */
+/* test: touch .a0 && mkdir .a1 && touch .a1/a2 && { sleep 1; echo -en 'k\esk\es'; sleep 1; echo -en '\ed'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */
+
 /* vim: set ts=4 sw=4 et: */
index 2d914c79cd749a0c632ad6852a23f4bc0ff61451..b97fc78bc081976e3953cd7adf952bc106d47803 100644 (file)
@@ -5,6 +5,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <unistd.h>
 
 #ifndef WIN32
 #include <grp.h>
@@ -157,7 +158,7 @@ list_t *exploredir (char *dirname)
     list_t *list = alloclist ();
 
     struct dirent *dp = NULL;
-    while ((dp = readdir(dir)) != NULL) {
+    while ((dp = readdir (dir)) != NULL) {
         if (strcmp (dp->d_name, ".") == 0) {
             continue;
         }
@@ -366,9 +367,46 @@ int processcopy (char *dest, char *src)
     return 0;
 }
 
-int processdelete (char *src)
+int processdelete (char *name)
 {
-    return 0;
+    int rc = 0;
+
+    struct stat sb;
+#ifdef WIN32
+    if (stat (name, &sb) == 0) {
+#else /* Linux*/
+    if (lstat (name, &sb) == 0) {
+#endif
+        if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+            DIR *dir = opendir (name);
+
+            if (dir != NULL) {
+                struct dirent *dp = NULL;
+                while (((dp = readdir (dir)) != NULL) && (rc == 0)) {
+                    if ((strcmp (dp->d_name, ".") == 0) || (strcmp (dp->d_name, "..") == 0)) {
+                        continue;
+                    }
+                    char *next = strdupcat (name, SEPARATOR, dp->d_name, NULL);
+                    rc = processdelete (next);
+                    free (next);
+                }
+                closedir (dir);
+                if (rc == 0) {
+                    //VERBOSE (DEBUG, fprintf (stderr, "rmdir '%s'\n", name));
+                    rc = rmdir (name);
+                }
+            } else {
+                rc = 1;
+            }
+        } else {
+            //VERBOSE (DEBUG, fprintf (stderr, "unlink '%s'\n", name));
+            rc = unlink (name);
+        }
+    } else {
+        rc = 1;
+    }
+
+    return rc;
 }
 
 /* vim: set ts=4 sw=4 et: */