#include #include #include #include #include #include #include #include struct Flags { int use_v; int use_s; char suffix[255]; char skratch_path[4096]; char file_path[4096]; char filename[255]; char editor[255]; }; void set_editor(struct Flags *f) { char *ed; if (f->use_v) ed = getenv("VISUAL"); else ed = getenv("EDITOR"); if (ed) strcpy(f->editor, ed); else strcpy(f->editor, "vi"); } int make_skratch_file(struct Flags *f) { char fp[4096]; int fd = 0; snprintf(fp, sizeof(fp), "%s/%s", f->skratch_path, f->filename); if (!strcmp(f->filename, "skratchXXXXXX")) { fd = mkstemp(fp); close(fd); } if (fd == -1) { printf("ERROR: Couldn't create skratch file!"); return 3; } strcpy(f->file_path, fp); return 0; } int make_skratch_path(struct Flags *f) { char sp[4096]; char *home_path = getenv("HOME"); if (home_path == NULL) { printf("ERROR: No HOME variable set!"); return 1; } snprintf(sp, sizeof(sp), "%s/.skratch", home_path); int result = mkdir(sp, 0755); if (result < 0 && errno != EEXIST) { printf("ERROR: Couldn't create: %s\n", sp); return 2; } strcpy(f->skratch_path, sp); return 0; } int list_files(struct Flags *f, int delete) { DIR *d = opendir(f->skratch_path); if (d == NULL) return 5; struct dirent *dir; if (d) { while ((dir = readdir(d)) != NULL) { char fn[4096]; strcpy(fn,dir->d_name); if (!strcmp(".",fn) || !strcmp("..",fn)) { continue; } if (delete) { char fp[4096]; snprintf(fp, sizeof(fp), "%s/%s", f->skratch_path, dir->d_name); remove(fp); } else printf("%s\n", dir->d_name); } closedir(d); } return 0; } int delete_files(struct Flags *f) { list_files(f, 0); printf("Delete the listed files? [y/N] "); char choice = 'N'; scanf(" %c", &choice); if (choice == 'y' || choice == 'Y') { list_files(f, 1); } return 0; } int main(int argc, char *argv[]) { int delete = 0; struct Flags f = {.use_v = 0, .filename="skratchXXXXXX"}; make_skratch_path(&f); char arg; for (int i = 1; i < argc; i++) { if (argv[i][0] == '-' && strlen(argv[i]) == 2) { arg = argv[i][1]; } else { //set filename if (!strcmp(f.filename,"skratchXXXXXX")) { strcpy(f.filename, argv[i]); continue; } else { printf("INVALID ARGUMENT: %s\n", argv[i]); return 4; } } switch (arg) { case 'c': delete_files(&f); return 0; case 'l': list_files(&f, delete); return 0; case 'v': f.use_v = 1; break; default: printf("Unknown Arg %c",arg); return 5; } } set_editor(&f); make_skratch_file(&f); char *args[2]; args[0] = f.editor; args[1] = f.file_path; execvp(f.editor,args); }