tPlumb items on explicit plumb or first download - sacc - sacc(omys), simple console gopher client (mirror) HTML git clone https://git.parazyd.org/sacc DIR Log DIR Files DIR Refs DIR LICENSE --- DIR commit 74347a93e3ab3f90c310b2f4d457fb9717401c65 DIR parent d03c161c2aa47bf254336a7098caf428a4d58134 HTML Author: Quentin Rameau <quinq@fifth.space> Date: Wed, 26 Jul 2017 16:37:51 +0200 Plumb items on explicit plumb or first download Diffstat: M sacc.c | 59 ++++++++++++++++++------------- 1 file changed, 35 insertions(+), 24 deletions(-) --- DIR diff --git a/sacc.c b/sacc.c t@@ -481,45 +481,56 @@ plumb(char *url) static void plumbitem(Item *item) { - char *file, *path; + char *file, *path, *tag; mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP; int dest; - if (!item->tag) { - if (file = strrchr(item->selector, '/')) - ++file; - else - file = item->selector; + if (file = strrchr(item->selector, '/')) + ++file; + else + file = item->selector; - path = uiprompt("Download %s to (^D cancel, <empty> plumb): ", - file); - if (!path) - return; - if (path[1]) { - path[strlen(path)-1] = '\0'; - dest = open(path, O_WRONLY|O_CREAT|O_EXCL, mode); - if (dest < 0) { - printf("Can't open destination file %s: %s\n", - path, strerror(errno)); - errno = 0; - goto cleanup; - } - } else { + path = uiprompt("Download %s to (^D cancel, <empty> plumb): ", + file); + if (!path) + return; + + if ((tag = item->tag) && access(tag, R_OK) < 0) { + clear(&item->tag); + tag = NULL; + } + + if (path[1]) { + path[strlen(path)-1] = '\0'; + + if (tag && !strcmp(tag, path)) + goto cleanup; + + if ((dest = open(path, O_WRONLY|O_CREAT|O_EXCL, mode)) < 0) { + printf("Can't open destination file %s: %s\n", + path, strerror(errno)); + errno = 0; + goto cleanup; + } + } else { + clear(&path); + + if (!tag) { path = xstrdup("/tmp/sacc/img-XXXXXX"); if ((dest = mkstemp(path)) < 0) die("mkstemp: %s: %s", path, strerror(errno)); } + } - if (!download(item, dest)) - goto cleanup; + if (path && (!download(item, dest) || tag)) + goto cleanup; + if (!tag) item->tag = path; - } plumb(item->tag); return; - cleanup: free(path); return;