sacc

sacc (saccomys): simple gopher client.
Log | Files | Refs | LICENSE

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:
common.h | 2+-
sacc.c | 19++++++++++++-------
ui_ti.c | 10++++++++--
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)