commit d2146543349ef8bde18732075dff69de5fd346a3
parent 92b222eb21149fa7fcd4044f53b2139d10527a1a
Author: Quentin Rameau <quinq@fifth.space>
Date:   Tue, 18 Jul 2017 14:29:19 +0200
Download images to temporary file and plumb them
Fix downloaditem() return value
Diffstat:
| common.h | | | 1 | + | 
| 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();
 }