commit bdb2f6a27c4d8e74a49c7ca2764207a1f63b3646
parent ae8b3fb2dda1bdc6750a38595c4c77ace2907c6c
Author: Quentin Rameau <quinq@fifth.space>
Date: Mon, 17 Jul 2017 16:56:00 +0200
Use a default filename for downloaditem.
Also fix a potention use-after-free there.
Diffstat:
4 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/common.h b/common.h
@@ -26,5 +26,5 @@ void display(Item *item);
Item *selectitem(Item *entry);
const char *typedisplay(char t);
void uicleanup(void);
-char *uiprompt(char *s);
+char *uiprompt(char *fmt, ...);
void uisetup(void);
diff --git a/sacc.c b/sacc.c
@@ -357,24 +357,29 @@ connectto(const char *host, const char *port)
static int
downloaditem(Item *item)
{
- char buf[BUFSIZ], *path;
+ char buf[BUFSIZ], *path, *file;
ssize_t r, w;
mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP;
int sock, dest;
- if (!(path = uiprompt("Download file to: ")))
- return 0;
+ if (file = strrchr(item->selector, '/'))
+ ++file;
+ else
+ file = item->selector;
- path[strlen(path)-1] = '\0';
+ if (path = uiprompt("Download file to [%s]: ", file))
+ path[strlen(path)-1] = '\0';
+ else
+ path = xstrdup(file);
- dest = open(path, O_WRONLY|O_CREAT|O_EXCL, mode);
- free(path);
- if (dest < 0) {
+ 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;
}
+ free(path);
sock = connectto(item->host, item->port);
sendselector(sock, item->selector);
diff --git a/ui_ti.c b/ui_ti.c
@@ -1,3 +1,4 @@
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <term.h>
@@ -50,8 +51,9 @@ uicleanup(void)
}
char *
-uiprompt(char *s)
+uiprompt(char *fmt, ...)
{
+ va_list ap;
char *input = NULL;
size_t n = 0;
ssize_t r;
@@ -61,7 +63,11 @@ uiprompt(char *s)
putp(tparm(cursor_address, lines-1, 0));
putp(tparm(clr_eol));
putp(tparm(enter_standout_mode));
- fputs(s, stdout);
+
+ va_start(ap, fmt);
+ vprintf(fmt, ap);
+ va_end(ap);
+
putp(tparm(exit_standout_mode));
tsacc.c_lflag |= (ECHO|ICANON);
diff --git a/ui_txt.c b/ui_txt.c
@@ -1,5 +1,6 @@
#include <ctype.h>
#include <errno.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -69,12 +70,16 @@ printstatus(Item *item, char c)
}
char *
-uiprompt(char *s)
+uiprompt(char *fmt, ...)
{
+ va_list ap;
char *input = NULL;
size_t n = 0;
- fputs(s, stdout);
+ va_start(ap, fmt);
+ vprintf(fmt, ap);
+ va_end(ap);
+
fflush(stdout);
if (getline(&input, &n, stdin) > 1)