iClose connection when a single-dot line is read - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 17674fcc4257afa53e81fdeab49b21f0f57528c7 /scm/sacc/commit/17674fcc4257afa53e81fdeab49b21f0f57528c7.gph bitreich.org 70 1parent 34fd4f17068b408353bb6ae1df3eb4a58c259e25 /scm/sacc/commit/34fd4f17068b408353bb6ae1df3eb4a58c259e25.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Mon, 8 Feb 2021 22:59:52 +0100 Err bitreich.org 70 i Err bitreich.org 70 iClose connection when a single-dot line is read Err bitreich.org 70 i Err bitreich.org 70 iThis approach instead of always warning that something might have been Err bitreich.org 70 iwrong in case the message isn't terminated single-dot line is more Err bitreich.org 70 iforgiving as not all gopher server follow that aspect of the standard. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M sacc.c | 17 +++++++++++------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 11 insertions(+), 6 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -377,8 +377,6 @@ molddiritem(char *raw) Err bitreich.org 70 i s = nl; Err bitreich.org 70 i nl = p+1; Err bitreich.org 70 i } Err bitreich.org 70 i- if (!strcmp(s, ".\r\n") || !strcmp(s, ".\n")) Err bitreich.org 70 i- --nitems; Err bitreich.org 70 i if (!nitems) { Err bitreich.org 70 i diag("Couldn't parse dir item"); Err bitreich.org 70 i return NULL; Err bitreich.org 70 i@@ -421,6 +419,17 @@ getrawitem(int sock) Err bitreich.org 70 i do { Err bitreich.org 70 i bs -= n; Err bitreich.org 70 i buf += n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (buf - raw >= 5) { Err bitreich.org 70 i+ if (strncmp(buf-5, "\r\n.\r\n", 5) == 0) { Err bitreich.org 70 i+ buf[-3] = '\0'; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else if (buf - raw == 3 && strncmp(buf-3, ".\r\n", 3)) { Err bitreich.org 70 i+ buf[-3] = '\0'; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (bs < 1) { Err bitreich.org 70 i raw = xreallocarray(raw, ++bn, BUFSIZ); Err bitreich.org 70 i buf = raw + (bn-1) * BUFSIZ; Err bitreich.org 70 i@@ -611,10 +620,6 @@ fetchitem(Item *item) Err bitreich.org 70 i if (raw == NULL || !*raw) { Err bitreich.org 70 i diag("Empty response from server"); Err bitreich.org 70 i clear(&raw); Err bitreich.org 70 i- } else if ((r = strrchr(raw, '.')) == NULL || strcmp(r, ".\r\n")) { Err bitreich.org 70 i- diag("Incomplete response from server"); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- *r = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i return ((item->raw = raw) != NULL); Err bitreich.org 70 .