sacc

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

commit 17674fcc4257afa53e81fdeab49b21f0f57528c7
parent 34fd4f17068b408353bb6ae1df3eb4a58c259e25
Author: Quentin Rameau <quinq@fifth.space>
Date:   Mon,  8 Feb 2021 22:59:52 +0100

Close connection when a single-dot line is read

This approach instead of always warning that something might have been
wrong in case the message isn't terminated single-dot line is more
forgiving as not all gopher server follow that aspect of the standard.

Diffstat:
Msacc.c | 17+++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/sacc.c b/sacc.c @@ -377,8 +377,6 @@ molddiritem(char *raw) s = nl; nl = p+1; } - if (!strcmp(s, ".\r\n") || !strcmp(s, ".\n")) - --nitems; if (!nitems) { diag("Couldn't parse dir item"); return NULL; @@ -421,6 +419,17 @@ getrawitem(int sock) do { bs -= n; buf += n; + + if (buf - raw >= 5) { + if (strncmp(buf-5, "\r\n.\r\n", 5) == 0) { + buf[-3] = '\0'; + break; + } + } else if (buf - raw == 3 && strncmp(buf-3, ".\r\n", 3)) { + buf[-3] = '\0'; + break; + } + if (bs < 1) { raw = xreallocarray(raw, ++bn, BUFSIZ); buf = raw + (bn-1) * BUFSIZ; @@ -611,10 +620,6 @@ fetchitem(Item *item) if (raw == NULL || !*raw) { diag("Empty response from server"); clear(&raw); - } else if ((r = strrchr(raw, '.')) == NULL || strcmp(r, ".\r\n")) { - diag("Incomplete response from server"); - } else { - *r = '\0'; } return ((item->raw = raw) != NULL);