commit - 845f2b8777a55835d667574cc5396cb440edeb74
commit + b7ee4ee2affb393cb02c8af1c8d3e1601c750055
blob - b035754bc1f82097904b417d693c9c1ab397414c
blob + 49ccf2698220512dc4f363c3268be27354a3787e
--- config.h
+++ config.h
#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
blob - 07626cbba7640af3212fdd249814487d990a7c6c
blob + 22f7948cb78bbeb30fd9758f38692b39f7fc7753
--- rover.c
+++ rover.c
#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>
}
}
+/* 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()
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);
}