Download images to temporary file and plumb them - sacc - sacc(omys), simple console gopher client
git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/
Log
Files
Refs
Tags
LICENSE
---
commit d2146543349ef8bde18732075dff69de5fd346a3
parent 92b222eb21149fa7fcd4044f53b2139d10527a1a
Author: Quentin Rameau 
Date:   Tue, 18 Jul 2017 14:29:19 +0200

Download images to temporary file and plumb them

Fix downloaditem() return value

Diffstat:
  M common.h                            |       1 +
  M sacc.c                              |      65 +++++++++++++++++++++----------

2 files changed, 46 insertions(+), 20 deletions(-)
---
diff --git a/common.h b/common.h
@@ -10,6 +10,7 @@ struct item {
         char *host;
         char *port;
         char *raw;
+        char *tag;
         void *dat;
         Item *entry;
 };
diff --git a/sacc.c b/sacc.c
@@ -97,6 +97,7 @@ clearitem(Item *item)
 {
         Dir *dir;
         Item **items;
+        char *tag;
         size_t i;
 
         if (!item)
@@ -112,6 +113,11 @@ clearitem(Item *item)
                 clear(&item->dat);
         }
 
+        if ((tag = item->tag) &&
+            !strncmp(tag, "/tmp/sacc/img-", 14) && strlen(tag) == 20)
+                unlink(tag);
+
+        clear(&item->tag);
         clear(&item->raw);
 }
 
@@ -355,31 +361,33 @@ connectto(const char *host, const char *port)
 }
 
 static int
-downloaditem(Item *item)
+downloaditem(Item *item, int dest)
 {
         char buf[BUFSIZ], *path, *file;
         ssize_t r, w;
         mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP;
-        int sock, dest;
+        int sock;
 
-        if (file = strrchr(item->selector, '/'))
-                ++file;
-        else
-                file = item->selector;
+        if (dest < 0) {
+                if (file = strrchr(item->selector, '/'))
+                        ++file;
+                else
+                        file = item->selector;
 
-        if (path = uiprompt("Download file to [%s]: ", file))
-                path[strlen(path)-1] = '\0';
-        else
-                path = xstrdup(file);
+                if (path = uiprompt("Download file to [%s]: ", file))
+                        path[strlen(path)-1] = '\0';
+                else
+                        path = xstrdup(file);
 
-        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;
-                free(path);
-                return 0;
+                item->tag = path;
+
+                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;
+                        return 0;
+                }
         }
-        free(path);
 
         sock = connectto(item->host, item->port);
         sendselector(sock, item->selector);
@@ -398,7 +406,7 @@ downloaditem(Item *item)
         close(dest);
         close(sock);
 
-        return (r == 0 && w > 0);
+        return (r == 0 && w == 0);
 }
 
 static int
@@ -452,6 +460,20 @@ plumb(char *url)
 }
 
 static int
+displayimg(Item *item)
+{
+        int tmpfd;
+
+        item->tag = xstrdup("/tmp/sacc/img-XXXXXX");
+
+        if ((tmpfd = mkstemp(item->tag)) < 0)
+                die("mkstemp: %s: %s", item->tag, strerror(errno));
+
+        if (downloaditem(item, tmpfd))
+                plumb(item->tag);
+}
+
+static int
 dig(Item *entry, Item *item)
 {
         if (item->raw) /* already in cache */
@@ -484,7 +506,7 @@ dig(Item *entry, Item *item)
         case '9':
         case 'g':
         case 'I':
-                if (!downloaditem(item))
+                if (!displayimg(item))
                         return 0;
                 break;
         default:
@@ -597,7 +619,7 @@ moldentry(char *url)
         entry->host = host;
         entry->port = port;
         entry->entry = entry;
-        entry->raw = entry->dat = NULL;
+        entry->raw = entry->tag = entry->dat = NULL;
 
         return entry;
 }
@@ -606,6 +628,7 @@ static void
 cleanup(void)
 {
         clearitem(mainentry);
+        rmdir("/tmp/sacc");
         free(mainentry);
         free(mainurl);
         uicleanup();
@@ -616,6 +639,8 @@ setup(void)
 {
         setenv("PAGER", "more", 0);
         atexit(cleanup);
+        if (mkdir("/tmp/sacc", S_IRWXU) < 0 && errno != EEXIST)
+                die("mkdir: %s: %s", "/tmp/sacc", errno);
         uisetup();
 }