From 31d2f60e7c81fad0fbc7ec5c9a1db99b11729677 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 12 Jan 2025 23:20:14 +0100 Subject: [PATCH] add function delete --- fm.c | 7 ++++++- function.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/fm.c b/fm.c index 3de2dd1..64feae1 100644 --- 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: */ diff --git a/function.c b/function.c index 2d914c7..b97fc78 100644 --- a/function.c +++ b/function.c @@ -5,6 +5,7 @@ #include #include #include +#include #ifndef WIN32 #include @@ -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: */ -- 2.30.2