diff --git a/cf.c b/cf.c index b44c6df..20bc344 100644 --- a/cf.c +++ b/cf.c @@ -998,6 +998,19 @@ int getFiles(char* directory, char* target[]) } +/* + Gets write permissions + Returns 1 is `path` is writable +*/ +int getWritePermissions(char *path) +{ + if( access(path, W_OK) == 0 ) + return 1; + else + return 0; +} + + /* Copy files in clipboard to `present_dir` */ @@ -1005,10 +1018,18 @@ void copyFiles(char *present_dir) { FILE *f = fopen(clipboard_path, "r"); char buf[PATH_MAX]; + int flag; if(f == NULL) { return; } + + // Check if `dir` is writable + if(getWritePermissions(dir) == 1) + flag = 0; + else + flag = 1; + endwin(); while(fgets(buf, PATH_MAX, (FILE*) f)) { @@ -1017,7 +1038,10 @@ void copyFiles(char *present_dir) pid_t pid = fork(); if(pid == 0) { - execlp("cp", "cp", "-r", "-v", buf, present_dir, (char *)0); + if(flag == 0) + execlp("cp", "cp", "-r", "-v", buf, present_dir, (char *)0); + else + execlp("sudo", "sudo", "cp", "-r", "-v", buf, present_dir, (char *)0); exit(1); } else @@ -1037,6 +1061,7 @@ void removeFiles() { FILE *f = fopen(clipboard_path, "r"); char buf[PATH_MAX]; + int flag; if(f == NULL) { return; @@ -1045,11 +1070,18 @@ void removeFiles() while(fgets(buf, PATH_MAX, (FILE*) f)) { buf[strlen(buf)-1] = '\0'; + if( getWritePermissions(buf) == 1 ) + flag = 0; + else + flag = 1; // Create a child process to remove file pid_t pid = fork(); if(pid == 0) { - execlp("rm", "rm", "-r", "-v", buf, (char *)0); + if( flag == 0 ) + execlp("rm", "rm", "-r", "-f", "-v", buf, (char *)0); + else + execlp("sudo", "sudo", "rm", "-r", "-f", "-v", buf, (char *)0); exit(1); } else @@ -1172,10 +1204,17 @@ void moveFiles(char *present_dir) { FILE *f = fopen(clipboard_path, "r"); char buf[PATH_MAX]; + int flag; if(f == NULL) { return; } + + if( getWritePermissions(dir) == 1 ) + flag = 0; + else + flag = 1; + endwin(); while(fgets(buf, PATH_MAX, (FILE*) f)) { @@ -1185,7 +1224,10 @@ void moveFiles(char *present_dir) pid_t pid = fork(); if(pid == 0) { - execlp("mv", "mv", "-v", buf, present_dir, (char *)0); + if(flag == 0) + execlp("mv", "mv", "-v", buf, present_dir, (char *)0); + else + execlp("sudo", "sudo", "mv", "-v", buf, present_dir, (char *)0); exit(1); } else @@ -1548,6 +1590,8 @@ int main(int argc, char* argv[]) int t = 0; for( i=start; i