commit 548a3163f1a077b634340da5d20f1d404196bb91 from: Marcel Rodrigues date: Fri Nov 14 14:58:17 2014 UTC Add delete support. commit - 5fc8b927fcb7c5d814eaae082e8c1f349ee6cc4f commit + 548a3163f1a077b634340da5d20f1d404196bb91 blob - b32bf6571b8f586bff3b3fcf791cfd67a974f19e blob + b035754bc1f82097904b417d693c9c1ab397414c --- config.h +++ config.h @@ -19,6 +19,7 @@ #define RVK_TG_MARK "m" #define RVK_INVMARK "M" #define RVK_MARKALL "a" +#define RVK_DELETE "X" /* Colors available: DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, MAGENTA, WHITE. */ #define RVC_CWD GREEN blob - ab6b85f9dd8d90542ce12b8060703560340a2930 blob + 4cf7b7f90451a423393f00599c6f977f0f8f2d79 --- rover.c +++ rover.c @@ -413,6 +413,48 @@ cd(int reset) for (i = 0; i < rover.nfiles; i++) MARKED(i) = 0; update(); +} + +static void +delete_dir(const char *path) +{ + DIR *dp; + struct dirent *ep; + struct stat statbuf; + char subpath[FILENAME_MAX]; + + if((dp = opendir(path)) == NULL) + return; + while ((ep = readdir(dp))) { + if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..")) + continue; + sprintf(subpath, "%s%s", path, ep->d_name); + stat(subpath, &statbuf); + if (S_ISDIR(statbuf.st_mode)) { + strcat(subpath, "/"); + delete_dir(subpath); + } + else + unlink(subpath); + } + closedir(dp); + rmdir(path); +} + +static void +delete_marked() +{ + int i; + char path[FILENAME_MAX]; + + for (i = 0; i < rover.marks.bulk; i++) + if (rover.marks.entries[i]) { + sprintf(path, "%s%s", rover.marks.dirpath, rover.marks.entries[i]); + if (strchr(rover.marks.entries[i], '/')) + delete_dir(path); + else + unlink(path); + } } /* Do a fork-exec to external program (e.g. $EDITOR). */ @@ -710,6 +752,10 @@ main(int argc, char *argv[]) MARKED(i) = 1; } update(); + } + else if (!strcmp(key, RVK_DELETE)) { + delete_marked(); + cd(1); } } if (rover.nfiles)