From dc8410cbcf316179b1ed7b0a524ed699296f4907 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sat, 24 Nov 2001 21:22:18 +0000 Subject: [PATCH] Updated from canonical source location in GnuPG. --- assuan/README.1st | 1 + assuan/assuan-buffer.c | 36 +++++++++++++++++++++++++++++------- assuan/assuan-defs.h | 4 ++++ assuan/assuan.h | 1 + 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 assuan/README.1st diff --git a/assuan/README.1st b/assuan/README.1st new file mode 100644 index 0000000..bb52959 --- /dev/null +++ b/assuan/README.1st @@ -0,0 +1 @@ +Please don't modify it here but in the copy which comes with GnuPG. \ No newline at end of file diff --git a/assuan/assuan-buffer.c b/assuan/assuan-buffer.c index 912272f..f3fe2b1 100644 --- a/assuan/assuan-buffer.c +++ b/assuan/assuan-buffer.c @@ -78,7 +78,7 @@ readline (int fd, char *buf, size_t buflen, int *r_nread, int *eof) for (; n && *p != '\n'; n--, p++) ; if (n) - break; + break; /* at least one full line available - that's enough for now */ } return 0; @@ -95,7 +95,26 @@ _assuan_read_line (ASSUAN_CONTEXT ctx) if (ctx->inbound.eof) return -1; - rc = readline (ctx->inbound.fd, line, LINELENGTH, &nread, &ctx->inbound.eof); + if (ctx->inbound.attic.linelen) + { + memcpy (line, ctx->inbound.attic.line, ctx->inbound.attic.linelen); + nread = ctx->inbound.attic.linelen; + ctx->inbound.attic.linelen = 0; + for (n=0; n < nread && line[n] != '\n'; n++) + ; + if (n < nread) + rc = 0; /* found another line in the attic */ + else + { /* read the rest */ + n = nread; + assert (n < LINELENGTH); + rc = readline (ctx->inbound.fd, line + n, LINELENGTH - n, + &nread, &ctx->inbound.eof); + } + } + else + rc = readline (ctx->inbound.fd, line, LINELENGTH, + &nread, &ctx->inbound.eof); if (rc) return ASSUAN_Read_Error; if (!nread) @@ -104,15 +123,18 @@ _assuan_read_line (ASSUAN_CONTEXT ctx) return -1; } - for (n=nread-1; n>=0 ; n--) + for (n=0; n < nread; n++) { if (line[n] == '\n') { - if (n != nread-1) + if (n+1 < nread) { - fprintf (stderr, "DBG-assuan: %d bytes left over after read\n", - nread-1 - n); - /* fixme: store them for the next read */ + n++; + /* we have to copy the rest because the handlers are + allowed to modify the passed buffer */ + memcpy (ctx->inbound.attic.line, line+n, nread-n); + ctx->inbound.attic.linelen = nread-n; + n--; } if (n && line[n-1] == '\r') n--; diff --git a/assuan/assuan-defs.h b/assuan/assuan-defs.h index 8723fd3..05e548c 100644 --- a/assuan/assuan-defs.h +++ b/assuan/assuan-defs.h @@ -45,6 +45,10 @@ struct assuan_context_s { int linelen; /* w/o CR, LF - might not be the same as strlen(line) due to embedded nuls. However a nul is always written at this pos */ + struct { + char line[LINELENGTH]; + int linelen ; + } attic; } inbound; struct { diff --git a/assuan/assuan.h b/assuan/assuan.h index 5154d56..a5ae8ae 100644 --- a/assuan/assuan.h +++ b/assuan/assuan.h @@ -52,6 +52,7 @@ typedef enum { ASSUAN_Line_Not_Terminated = 108, ASSUAN_No_Input = 109, ASSUAN_No_Output = 110, + ASSUAN_Canceled = 111, ASSUAN_Cert_Revoked = 301, ASSUAN_No_CRL_For_Cert = 302, -- 2.26.2