Updated from canonical source location in GnuPG.
authorWerner Koch <wk@gnupg.org>
Sat, 24 Nov 2001 21:22:18 +0000 (21:22 +0000)
committerWerner Koch <wk@gnupg.org>
Sat, 24 Nov 2001 21:22:18 +0000 (21:22 +0000)
trunk/assuan/README.1st [new file with mode: 0644]
trunk/assuan/assuan-buffer.c
trunk/assuan/assuan-defs.h
trunk/assuan/assuan.h

diff --git a/trunk/assuan/README.1st b/trunk/assuan/README.1st
new file mode 100644 (file)
index 0000000..bb52959
--- /dev/null
@@ -0,0 +1 @@
+Please don't modify it here but in the copy which comes with GnuPG.
\ No newline at end of file
index 912272f187ad6f3f4f581048e542d67adbf8f676..f3fe2b188def7263246d1848b82290cb188d4462 100644 (file)
@@ -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--;
index 8723fd315f4fa8e9673643bb1a194aa07a2f8db0..05e548cb612188a094e3558d5b105e0abb0ba9c0 100644 (file)
@@ -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 {
index 5154d56f99ac4c6f7dec6bc85f93591898ee9a71..a5ae8ae06b5deea0c86f88450896e44be82b59b1 100644 (file)
@@ -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,