Use a default filename for downloaditem. - sacc - sacc(omys), simple console go… | |
git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
LICENSE | |
--- | |
commit bdb2f6a27c4d8e74a49c7ca2764207a1f63b3646 | |
parent ae8b3fb2dda1bdc6750a38595c4c77ace2907c6c | |
Author: Quentin Rameau <[email protected]> | |
Date: Mon, 17 Jul 2017 16:56:00 +0200 | |
Use a default filename for downloaditem. | |
Also fix a potention use-after-free there. | |
Diffstat: | |
M common.h | 2 +- | |
M sacc.c | 19 ++++++++++++------- | |
M ui_ti.c | 10 ++++++++-- | |
M ui_txt.c | 9 +++++++-- | |
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) |