Improve a little getrawitem - sacc - sacc (saccomys): simple gopher client. (DIR) Log (DIR) Files (DIR) Refs (DIR) LICENSE --- (DIR) commit 6442aecfc08e934d65b38ec83c76bd8a040370a0 (DIR) parent e8214e1e8d0394f4569e5049f162794d69019a03 (HTM) Author: Quentin Rameau <quinq@fifth.space> Date: Thu, 22 Jun 2017 17:13:24 +0200 Improve a little getrawitem Diffstat: sacc.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) --- (DIR) diff --git a/sacc.c b/sacc.c @@ -223,30 +223,29 @@ molddiritem(char *raw) char * getrawitem(int sock) { - char *item, *buf; - size_t is, bs, ns; + char *raw, *buf; + size_t bn, bs; ssize_t n; - is = bs = BUFSIZ; - item = buf = xmalloc(BUFSIZ+1); + raw = buf = NULL; + bn = bs = n = 0; - while ((n = read(sock, buf, bs)) > 0) { + do { bs -= n; buf += n; - if (bs <= 0) { - ns = is + BUFSIZ; - item = xreallocarray(item, ns+1, 1); - is = ns; - buf = item + is-BUFSIZ; + if (bs <= 1) { + raw = xreallocarray(raw, ++bn, BUFSIZ); + buf = raw + (bn-1) * BUFSIZ; bs = BUFSIZ; } - } + } while ((n = read(sock, buf, bs)) > 0); + if (n < 0) die("Can't read socket: %s", strerror(errno)); *buf = '\0'; - return item; + return raw; } int