Update with current version from newpg.
authorMarcus Brinkmann <mb@g10code.com>
Fri, 29 Mar 2002 21:21:20 +0000 (21:21 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Fri, 29 Mar 2002 21:21:20 +0000 (21:21 +0000)
assuan/ChangeLog
assuan/Makefile.am
assuan/assuan-buffer.c
assuan/assuan-client.c
assuan/assuan-socket-server.c
assuan/assuan.h

index 867f125..b5686c5 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-06  Werner Koch  <wk@gnupg.org>
+
+       * assuan-client.c (_assuan_read_from_server): Detect END.
+       (assuan_transact): Pass it to the data callback.
+
 2002-02-27  Werner Koch  <wk@gnupg.org>
 
        * assuan-client.c (assuan_transact): Add 2 more arguments to
index 10be173..6b6220e 100644 (file)
@@ -26,8 +26,6 @@ MOSTLYCLEANFILES = assuan-errors.c
 
 noinst_LIBRARIES = libassuan.a
 
-
-#libassuan_a_LDFLAGS =
 libassuan_a_SOURCES = \
        assuan.h \
        assuan-defs.h \
index bd08817..e349a69 100644 (file)
@@ -25,7 +25,9 @@
 #include <errno.h>
 #include <unistd.h>
 #include <assert.h>
-
+#ifdef USE_GNU_PTH
+# include <pth.h>
+#endif
 #include "assuan-defs.h"
 
 
@@ -34,7 +36,11 @@ writen ( int fd, const char *buffer, size_t length )
 {
   while (length)
     {
+#ifdef USE_GNU_PTH
+      int nwritten = pth_write (fd, buffer, length);
+#else
       int nwritten = write (fd, buffer, length);
+#endif
       
       if (nwritten < 0)
         {
@@ -59,7 +65,11 @@ readline (int fd, char *buf, size_t buflen, int *r_nread, int *eof)
   *r_nread = 0;
   while (nleft > 0)
     {
+#ifdef USE_GNU_PTH
+      int n = pth_read (fd, buf, nleft);
+#else
       int n = read (fd, buf, nleft);
+#endif
       if (n < 0)
         {
           if (errno == EINTR)
index 41984fd..6c7a6e3 100644 (file)
@@ -95,6 +95,13 @@ _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
       while (line[*off] == ' ')
         ++*off;
     }
+  else if (linelen >= 3
+           && line[0] == 'E' && line[1] == 'N' && line[2] == 'D'
+           && (line[3] == '\0' || line[3] == ' '))
+    {
+      *okay = 5; /* end line */
+      *off = 3;
+    }
   else
     rc = ASSUAN_Invalid_Response;
   return rc;
@@ -201,6 +208,18 @@ assuan_transact (ASSUAN_CONTEXT ctx,
       if (!rc)
         goto again;
     }
+  else if (okay == 5)
+    {
+      if (!data_cb)
+        rc = ASSUAN_No_Data_Callback;
+      else 
+        {
+          rc = data_cb (data_cb_arg, NULL, 0);
+          if (!rc)
+            goto again;
+        }
+    }
 
   return rc;
 }
+
index 6ad6455..39dd84a 100644 (file)
@@ -25,6 +25,9 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <unistd.h>
+#ifdef USE_GNU_PTH
+# include <pth.h>
+#endif
 
 #include "assuan-defs.h"
 
@@ -35,13 +38,28 @@ accept_connection (ASSUAN_CONTEXT ctx)
   struct sockaddr_un clnt_addr;
   size_t len = sizeof clnt_addr;
 
+  ctx->client_pid = (pid_t)-1;
+#ifdef USE_GNU_PTH
+  fd = pth_accept (ctx->listen_fd, (struct sockaddr*)&clnt_addr, &len );
+#else
   fd = accept (ctx->listen_fd, (struct sockaddr*)&clnt_addr, &len );
+#endif
   if (fd == -1)
     {
       ctx->os_errno = errno;
       return ASSUAN_Accept_Failed;
     }
 
+#ifdef HAVE_SO_PEERCRED
+  {
+    struct ucred cr; 
+    int cl = sizeof cr;
+
+    if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl) ) 
+      ctx->client_pid = cr.pid;
+  }
+#endif
+
   ctx->inbound.fd = fd;
   ctx->inbound.eof = 0;
   ctx->inbound.linelen = 0;
index 3c67972..a934001 100644 (file)
@@ -74,6 +74,9 @@ typedef enum {
   ASSUAN_Inquire_Error = 121,
   ASSUAN_Invalid_Option = 122,
   ASSUAN_Invalid_Index = 123,
+  ASSUAN_Unexpected_Status = 124,
+  ASSUAN_Unexpected_Data = 125,
+  ASSUAN_Invalid_Status = 126,
 
   ASSUAN_Not_Confirmed = 128,