2014-11-13 17:27:13 (UTC-02:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Add copy support.
diff --git a/config.h b/config.h index b035754..49ccf26 100644 --- a/config.h +++ b/config.h @@ -20,6 +20,7 @@ #define RVK_INVMARK "M" #define RVK_MARKALL "a" #define RVK_DELETE "X" +#define RVK_COPY "C" /* Colors available: DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, MAGENTA, WHITE. */ #define RVC_CWD GREEN diff --git a/rover.c b/rover.c index 07626cb..22f7948 100644 --- a/rover.c +++ b/rover.c @@ -5,9 +5,10 @@ #include <sys/types.h> /* pid_t, ... */ #include <stdio.h> /* FILENAME_MAX */ #include <locale.h> /* setlocale(), LC_ALL */ -#include <unistd.h> /* chdir(), getcwd() */ +#include <unistd.h> /* chdir(), getcwd(), read(), close(), ... */ #include <dirent.h> /* DIR, struct dirent, opendir(), ... */ #include <sys/stat.h> +#include <fcntl.h> /* open() */ #include <sys/wait.h> /* waitpid() */ #include <signal.h> /* struct sigaction, sigaction() */ #include <curses.h> @@ -460,6 +461,39 @@ process_marked(PROCESS pre, PROCESS proc, PROCESS pos) } } +/* Wrappers for file operations. */ +static PROCESS delete = unlink; +static PROCESS deldir = rmdir; +static int copy(const char *srcpath) { + int src, dst, ret; + size_t size; + struct stat st; + char buf[BUFSIZ]; + char dstpath[FILENAME_MAX]; + + ret = src = open(srcpath, O_RDONLY); + if (ret < 0) return ret; + ret = fstat(src, &st); + if (ret < 0) return ret; + strcpy(dstpath, CWD); + strcat(dstpath, srcpath + strlen(rover.marks.dirpath)); + ret = dst = creat(dstpath, st.st_mode); + if (ret < 0) return ret; + while ((size = read(src, buf, BUFSIZ)) > 0) + write(dst, buf, size); + close(src); + close(dst); + return 0; +} +static int adddir(const char *path) { + int ret; + struct stat st; + + ret = stat(CWD, &st); + if (ret < 0) return ret; + return mkdir(path, st.st_mode); +} + /* Do a fork-exec to external program (e.g. $EDITOR). */ static void spawn() @@ -757,7 +791,12 @@ main(int argc, char *argv[]) update(); } else if (!strcmp(key, RVK_DELETE)) { - process_marked(NULL, unlink, rmdir); + process_marked(NULL, delete, deldir); + mark_none(&rover.marks); + cd(1); + } + else if (!strcmp(key, RVK_COPY)) { + process_marked(adddir, copy, NULL); mark_none(&rover.marks); cd(1); }