[Pkg-gnupg-commit] [libassuan] 121/437: 2004-11-23 Timo Schulz <twoaday at g10code.com>

Eric Dorland eric at moszumanska.debian.org
Fri May 22 05:33:32 UTC 2015


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository libassuan.

commit c36b96808391edf9211b1c60b00825f31be7a93c
Author: Timo Schulz <twoaday at freakmail.de>
Date:   Wed Nov 24 07:30:08 2004 +0000

    2004-11-23  Timo Schulz  <twoaday at g10code.com>
    
            * assuan-socket.c (_assuan_sock_connect): Get local port from
            the sun_path[] file.
            (_assuan_sock_bind): Write local port to the sun_path[] file.
            * assuan-socket-connect.c (assuan_socket_connect): Use DIRSEP_C
            for a better portability.
            (assuan-defs.h): Define DIRSEP_C.
    
    2004-11-22  Timo Schulz  <twoaday at g10code.com>
    
            * assuan-io.c (_assuan_simple_read, _assuan_simple_write): W32
            support.
            * assuan-socket.c (_assuan_close): New.
            (_assuan_sock_new): New.
            (_assuan_sock_bind): New.
---
 src/ChangeLog               |  17 ++++++
 src/Makefile.am             |   3 +-
 src/assuan-buffer.c         |  21 ++++---
 src/assuan-client.c         |  12 ++--
 src/assuan-connect.c        |   7 ++-
 src/assuan-defs.h           |  48 ++++++++++++++--
 src/assuan-domain-connect.c |  75 ++++++++++++++++---------
 src/assuan-domain-server.c  |   4 +-
 src/assuan-handler.c        |   4 +-
 src/assuan-inquire.c        |   4 +-
 src/assuan-io.c             |  23 +++++++-
 src/assuan-listen.c         |  24 ++++----
 src/assuan-pipe-connect.c   |  25 +++++----
 src/assuan-socket-connect.c |  28 ++++++----
 src/assuan-socket-server.c  |  24 ++++----
 src/assuan-socket.c         | 133 ++++++++++++++++++++++++++++++++++++++++++++
 src/assuan-util.c           |  12 ++--
 src/stpcpy.c                |  33 +++++++++++
 18 files changed, 391 insertions(+), 106 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 3c0ef6c..7a39bbc 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,20 @@
+2004-11-23  Timo Schulz  <twoaday at g10code.com>
+
+	* assuan-socket.c (_assuan_sock_connect): Get local port from
+	the sun_path[] file.
+	(_assuan_sock_bind): Write local port to the sun_path[] file.
+	* assuan-socket-connect.c (assuan_socket_connect): Use DIRSEP_C
+	for a better portability.
+	(assuan-defs.h): Define DIRSEP_C.
+	
+2004-11-22  Timo Schulz  <twoaday at g10code.com>
+
+	* assuan-io.c (_assuan_simple_read, _assuan_simple_write): W32
+	support.
+	* assuan-socket.c (_assuan_close): New.
+	(_assuan_sock_new): New.
+	(_assuan_sock_bind): New.
+	
 2004-11-16  Werner Koch  <wk at g10code.com>
 
 	* assuan-socket-connect.c (LOG): Fixed macro to print not only the
diff --git a/src/Makefile.am b/src/Makefile.am
index 8e96660..e04bc27 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -49,7 +49,8 @@ libassuan_a_SOURCES = \
 	assuan-io.c \
 	assuan-domain-connect.c \
 	assuan-domain-server.c \
-	assuan-logging.c
+	assuan-logging.c \
+	assuan-socket.c
 
 libassuan_a_LIBADD = @LIBOBJS@
 
diff --git a/src/assuan-buffer.c b/src/assuan-buffer.c
index 6d81441..873178d 100644
--- a/src/assuan-buffer.c
+++ b/src/assuan-buffer.c
@@ -25,6 +25,9 @@
 #include <errno.h>
 #include <unistd.h>
 #include <assert.h>
+#ifdef _WIN32
+#include <process.h>
+#endif
 #include "assuan-defs.h"
 
 static int
@@ -49,12 +52,12 @@ writen (ASSUAN_CONTEXT ctx, const char *buffer, size_t length)
 /* Read an entire line.  */
 static int
 readline (ASSUAN_CONTEXT ctx, char *buf, size_t buflen,
-	  int *r_nread, int *eof)
+	  int *r_nread, int *r_eof)
 {
   size_t nleft = buflen;
   char *p;
 
-  *eof = 0;
+  *r_eof = 0;
   *r_nread = 0;
   while (nleft > 0)
     {
@@ -68,7 +71,7 @@ readline (ASSUAN_CONTEXT ctx, char *buf, size_t buflen,
         }
       else if (!n)
         {
-          *eof = 1;
+          *r_eof = 1;
           break; /* allow incomplete lines */
         }
       p = buf;
@@ -203,10 +206,10 @@ _assuan_read_line (ASSUAN_CONTEXT ctx)
    Returns 0 on success or an assuan error code.
    See also: assuan_pending_line().
 */
-AssuanError
+assuan_error_t
 assuan_read_line (ASSUAN_CONTEXT ctx, char **line, size_t *linelen)
 {
-  AssuanError err;
+  assuan_error_t err;
 
   if (!ctx)
     return ASSUAN_Invalid_Value;
@@ -283,7 +286,7 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix,
 }
 
 
-AssuanError 
+assuan_error_t 
 assuan_write_line (ASSUAN_CONTEXT ctx, const char *line)
 {
   size_t len;
@@ -445,7 +448,7 @@ _assuan_cookie_write_flush (void *cookie)
  * Return value: 0 on success or an error code
  **/
 

-AssuanError
+assuan_error_t
 assuan_send_data (ASSUAN_CONTEXT ctx, const void *buffer, size_t length)
 {
   if (!ctx)
@@ -471,7 +474,7 @@ assuan_send_data (ASSUAN_CONTEXT ctx, const void *buffer, size_t length)
   return 0;
 }
 
-AssuanError
+assuan_error_t
 assuan_sendfd (ASSUAN_CONTEXT ctx, int fd)
 {
   if (! ctx->io->sendfd)
@@ -481,7 +484,7 @@ assuan_sendfd (ASSUAN_CONTEXT ctx, int fd)
   return ctx->io->sendfd (ctx, fd);
 }
 
-AssuanError
+assuan_error_t
 assuan_receivefd (ASSUAN_CONTEXT ctx, int *fd)
 {
   if (! ctx->io->receivefd)
diff --git a/src/assuan-client.c b/src/assuan-client.c
index d5c0ec8..212eb61 100644
--- a/src/assuan-client.c
+++ b/src/assuan-client.c
@@ -32,12 +32,12 @@
 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
 
 
-AssuanError
+assuan_error_t
 _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
 {
   char *line;
   int linelen;
-  AssuanError rc;
+  assuan_error_t rc;
 
   *okay = 0;
   *off = 0;
@@ -126,14 +126,14 @@ _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off)
  * the one one returned by the server in error lines or from the
  * callback functions.
  **/
-AssuanError
+assuan_error_t
 assuan_transact (ASSUAN_CONTEXT ctx,
                  const char *command,
-                 AssuanError (*data_cb)(void *, const void *, size_t),
+                 assuan_error_t (*data_cb)(void *, const void *, size_t),
                  void *data_cb_arg,
-                 AssuanError (*inquire_cb)(void*, const char *),
+                 assuan_error_t (*inquire_cb)(void*, const char *),
                  void *inquire_cb_arg,
-                 AssuanError (*status_cb)(void*, const char *),
+                 assuan_error_t (*status_cb)(void*, const char *),
                  void *status_cb_arg)
 {
   int rc, okay, off;
diff --git a/src/assuan-connect.c b/src/assuan-connect.c
index cedaa66..4774e53 100644
--- a/src/assuan-connect.c
+++ b/src/assuan-connect.c
@@ -29,13 +29,15 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/wait.h>
+#endif
 
 #include "assuan-defs.h"
 
 /* Disconnect and release the context CTX. */
 void
-assuan_disconnect (ASSUAN_CONTEXT ctx)
+assuan_disconnect (assuan_context_t ctx)
 {
   if (ctx)
     {
@@ -49,7 +51,8 @@ assuan_disconnect (ASSUAN_CONTEXT ctx)
 
 /* Return the PID of the perr or -1 if not known. */
 pid_t
-assuan_get_pid (ASSUAN_CONTEXT ctx)
+assuan_get_pid (assuan_context_t ctx)
 {
   return (ctx && ctx->pid)? ctx->pid : -1;
 }
+
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index 7038b16..1b6e18d 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -1,5 +1,5 @@
 /* assuan-defs.c - Internal definitions to Assuan
- *	Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ *	Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
  *
  * This file is part of Assuan.
  *
@@ -22,12 +22,42 @@
 #define ASSUAN_DEFS_H
 
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <sys/un.h>
+#else
+#include <windows.h>
+#endif
 #include <unistd.h>
 
 #include "assuan.h"
 
+#ifndef _WIN32
+#define DIRSEP_C '/'
+#else
+#define DIRSEP_C '\\'
+#endif
+
+#ifdef _WIN32
+#define AF_LOCAL AF_UNIX
+/* we need to prefix the structure with a sockaddr_in header so we can
+   use it later for sendto and recvfrom. */
+struct sockaddr_un
+{
+  short          sun_family;
+  unsigned short sun_port;
+  struct         in_addr sun_addr;
+  char           sun_path[108-2-4]; /* Path name.  */
+};
+
+typedef int ssize_t;
+
+/* missing W32 functions */
+int putc_unlocked (int c, FILE *stream);
+void * memrchr (const void *block, int c, size_t size);
+char * stpcpy (char *dest, const char *src);
+#endif
+
 #define LINELENGTH ASSUAN_LINELENGTH
 
 struct cmdtbl_s
@@ -43,14 +73,14 @@ struct assuan_io
   /* Routine to write to output_fd.  */
   ssize_t (*write) (ASSUAN_CONTEXT, const void *, size_t);
   /* Send a file descriptor.  */
-  AssuanError (*sendfd) (ASSUAN_CONTEXT, int);
+  assuan_error_t (*sendfd) (ASSUAN_CONTEXT, int);
   /* Receive a file descriptor.  */
-  AssuanError (*receivefd) (ASSUAN_CONTEXT, int *);
+  assuan_error_t (*receivefd) (ASSUAN_CONTEXT, int *);
 };  
 
 struct assuan_context_s
 {
-  AssuanError err_no;
+  assuan_error_t err_no;
   const char *err_str;
   int os_errno;  /* last system error number used with certain error codes*/
 
@@ -141,7 +171,7 @@ void _assuan_release_context (ASSUAN_CONTEXT ctx);
 /* Make a connection to the Unix domain socket NAME and return a new
    Assuan context in CTX.  SERVER_PID is currently not used but may
    become handy in the future.  */
-AssuanError _assuan_domain_init (ASSUAN_CONTEXT *r_ctx,
+assuan_error_t _assuan_domain_init (ASSUAN_CONTEXT *r_ctx,
 				 int rendezvousfd,
 				 pid_t peer);
 
@@ -156,7 +186,7 @@ assuan_error_t _assuan_write_line (assuan_context_t ctx, const char *prefix,
                                    const char *line, size_t len);
 
 /*-- assuan-client.c --*/
-AssuanError _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off);
+assuan_error_t _assuan_read_from_server (ASSUAN_CONTEXT ctx, int *okay, int *off);
 
 
 /*-- assuan-util.c --*/
@@ -183,6 +213,12 @@ ssize_t _assuan_simple_read (ASSUAN_CONTEXT ctx, void *buffer, size_t size);
 ssize_t _assuan_simple_write (ASSUAN_CONTEXT ctx, const void *buffer,
 			      size_t size);
 
+/*-- assuan-socket.c --*/
+int _assuan_close (int fd);
+int _assuan_sock_new (int domain, int type, int proto);
+int _assuan_sock_bind (int sockfd, struct sockaddr *addr, int addrlen);
+int _assuan_sock_connect (int sockfd, struct sockaddr *addr, int addrlen);
+
 #ifdef HAVE_FOPENCOOKIE
 /* We have to implement funopen in terms of glibc's fopencookie. */
 FILE *_assuan_funopen(void *cookie,
diff --git a/src/assuan-domain-connect.c b/src/assuan-domain-connect.c
index 33d707f..944768a 100644
--- a/src/assuan-domain-connect.c
+++ b/src/assuan-domain-connect.c
@@ -27,8 +27,12 @@
 #include <stdio.h>
 #include <errno.h>
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <sys/un.h>
+#else
+#include <windows.h>
+#endif
 #if HAVE_SYS_UIO_H
 #include <sys/uio.h>
 #endif
@@ -50,17 +54,21 @@
 # endif
 #endif
 
+#ifdef _WIN32
+#warning implement this
+#define LOG(format, args...)
+#else
 #define LOG(format, args...) \
 	fprintf (assuan_get_assuan_log_stream (), "%s%s" format , \
         assuan_get_assuan_log_prefix (), \
         assuan_get_assuan_log_prefix ()? ": ":"", ## args)
-
+#endif
 
 static void
-do_deinit (ASSUAN_CONTEXT ctx)
+do_deinit (assuan_context_t ctx)
 {
   if (ctx->inbound.fd != -1)
-    close (ctx->inbound.fd);
+    _assuan_close (ctx->inbound.fd);
   ctx->inbound.fd = -1;
   ctx->outbound.fd = -1;
 
@@ -76,7 +84,7 @@ do_deinit (ASSUAN_CONTEXT ctx)
 
       assert (ctx->pendingfdscount > 0);
       for (i = 0; i < ctx->pendingfdscount; i ++)
-	close (ctx->pendingfds[i]);
+	_assuan_close (ctx->pendingfds[i]);
 
       free (ctx->pendingfds);
     }
@@ -87,10 +95,11 @@ do_deinit (ASSUAN_CONTEXT ctx)
 
 /* Read from the socket server.  */
 static ssize_t
-domain_reader (ASSUAN_CONTEXT ctx, void *buf, size_t buflen)
+domain_reader (assuan_context_t ctx, void *buf, size_t buflen)
 {
   int len = ctx->domainbuffersize;
 
+#ifndef _WIN32
  start:
   if (len == 0)
     /* No data is buffered.  */
@@ -216,6 +225,9 @@ domain_reader (ASSUAN_CONTEXT ctx, void *buf, size_t buflen)
       if (len == 0)
 	goto start;
     }
+#else
+  len = recvfrom (ctx->inbound.fd, buf, buflen, 0, NULL, NULL);
+#endif
 
   /* Return some data to the user.  */
 
@@ -234,8 +246,9 @@ domain_reader (ASSUAN_CONTEXT ctx, void *buf, size_t buflen)
 
 /* Write to the domain server.  */
 static ssize_t
-domain_writer (ASSUAN_CONTEXT ctx, const void *buf, size_t buflen)
+domain_writer (assuan_context_t ctx, const void *buf, size_t buflen)
 {
+#ifndef _WIN32
   struct msghdr msg;
   struct iovec iovec;
   ssize_t len;
@@ -256,13 +269,20 @@ domain_writer (ASSUAN_CONTEXT ctx, const void *buf, size_t buflen)
   len = sendmsg (ctx->outbound.fd, &msg, 0);
   if (len < 0)
     LOG ("domain_writer: %s\n", strerror (errno));
-
+#else
+  int len;
+  
+  len = sendto (ctx->outbound.fd, buf, buflen, 0,
+                (struct sockaddr *)&ctx->serveraddr,
+                sizeof (struct sockaddr_in));
+#endif  
   return len;
 }
 
-static AssuanError
-domain_sendfd (ASSUAN_CONTEXT ctx, int fd)
+static assuan_error_t
+domain_sendfd (assuan_context_t ctx, int fd)
 {
+#ifndef _WIN32
   struct msghdr msg;
   struct
   {
@@ -298,11 +318,15 @@ domain_sendfd (ASSUAN_CONTEXT ctx, int fd)
     }
   else
     return 0;
+#else
+  return 0;
+#endif
 }
 
-static AssuanError
-domain_receivefd (ASSUAN_CONTEXT ctx, int *fd)
+static assuan_error_t
+domain_receivefd (assuan_context_t ctx, int *fd)
 {
+#ifndef _WIN32
   if (ctx->pendingfds == 0)
     {
       LOG ("No pending file descriptors!\n");
@@ -323,7 +347,7 @@ domain_receivefd (ASSUAN_CONTEXT ctx, int *fd)
       ctx->pendingfds = realloc (ctx->pendingfds,
 				 ctx->pendingfdscount * sizeof (int));
     }
-
+#endif
   return 0;
 }
 
@@ -332,14 +356,14 @@ domain_receivefd (ASSUAN_CONTEXT ctx, int *fd)
 /* Make a connection to the Unix domain socket NAME and return a new
    Assuan context in CTX.  SERVER_PID is currently not used but may
    become handy in the future.  */
-AssuanError
-_assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
+assuan_error_t
+_assuan_domain_init (assuan_context_t *r_ctx, int rendezvousfd, pid_t peer)
 {
   static struct assuan_io io = { domain_reader, domain_writer,
 				 domain_sendfd, domain_receivefd };
 
-  AssuanError err;
-  ASSUAN_CONTEXT ctx;
+  assuan_error_t err;
+  assuan_context_t ctx;
   int fd;
   size_t len;
   int tries;
@@ -360,7 +384,7 @@ _assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
 
   /* Setup the socket.  */
 
-  fd = socket (PF_LOCAL, SOCK_DGRAM, 0);
+  fd = _assuan_sock_new (PF_LOCAL, SOCK_DGRAM, 0);
   if (fd == -1)
     {
       LOG ("can't create socket: %s\n", strerror (errno));
@@ -391,13 +415,14 @@ _assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
       /* XXX: L_tmpnam must be shorter than sizeof (sun_path)!  */
       assert (L_tmpnam < sizeof (ctx->myaddr.sun_path));
 
+      /* XXX: W32 tmpnam is broken */
       p = tmpnam (buf);
       if (! p)
 	{
 	  LOG ("cannot determine an appropriate temporary file "
-	       "name.  DoS in progress?\n");
+            "name.  DoS in progress?\n");
 	  _assuan_release_context (ctx);
-	  close (fd);
+	  _assuan_close (fd);
 	  return ASSUAN_General_Error;
 	}
 
@@ -407,7 +432,7 @@ _assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
       memcpy (ctx->myaddr.sun_path, buf, len);
       len += offsetof (struct sockaddr_un, sun_path);
 
-      err = bind (fd, (struct sockaddr *) &ctx->myaddr, len);
+      err = _assuan_sock_bind (fd, (struct sockaddr *) &ctx->myaddr, len);
       if (! err)
 	break;
     }
@@ -415,9 +440,9 @@ _assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
   if (err)
     {
       LOG ("can't bind to `%s': %s\n", ctx->myaddr.sun_path,
-	   strerror (errno));
+           strerror (errno));
       _assuan_release_context (ctx);
-      close (fd);
+      _assuan_close (fd);
       return ASSUAN_Connect_Failed;
     }
 
@@ -458,10 +483,10 @@ _assuan_domain_init (ASSUAN_CONTEXT *r_ctx, int rendezvousfd, pid_t peer)
   return 0;
 }
 
-AssuanError
-assuan_domain_connect (ASSUAN_CONTEXT * r_ctx, int rendezvousfd, pid_t peer)
+assuan_error_t
+assuan_domain_connect (assuan_context_t * r_ctx, int rendezvousfd, pid_t peer)
 {
-  AssuanError aerr;
+  assuan_error_t aerr;
   int okay, off;
 
   aerr = _assuan_domain_init (r_ctx, rendezvousfd, peer);
diff --git a/src/assuan-domain-server.c b/src/assuan-domain-server.c
index b62b140..45d53c2 100644
--- a/src/assuan-domain-server.c
+++ b/src/assuan-domain-server.c
@@ -27,12 +27,12 @@
 #include "assuan-defs.h"
 
 /* Initialize a server.  */
-AssuanError
+assuan_error_t
 assuan_init_domain_server (ASSUAN_CONTEXT *r_ctx,
 			   int rendezvousfd,
 			   pid_t peer)
 {
-  AssuanError err;
+  assuan_error_t err;
 
   err = _assuan_domain_init (r_ctx, rendezvousfd, peer);
   if (err)
diff --git a/src/assuan-handler.c b/src/assuan-handler.c
index 02bfde9..e9d7b07 100644
--- a/src/assuan-handler.c
+++ b/src/assuan-handler.c
@@ -135,7 +135,7 @@ std_handler_end (ASSUAN_CONTEXT ctx, char *line)
   return set_error (ctx, Not_Implemented, NULL); 
 }
 
-AssuanError
+assuan_error_t
 assuan_command_parse_fd (ASSUAN_CONTEXT ctx, char *line, int *rfd)
 {
   char *endp;
@@ -657,7 +657,7 @@ assuan_get_data_fp (ASSUAN_CONTEXT ctx)
 
 /* Set the text used for the next OK reponse.  This string is
    automatically reset to NULL after the next command. */
-AssuanError
+assuan_error_t
 assuan_set_okay_line (ASSUAN_CONTEXT ctx, const char *line)
 {
   if (!ctx)
diff --git a/src/assuan-inquire.c b/src/assuan-inquire.c
index 3c7d013..cfb5ca0 100644
--- a/src/assuan-inquire.c
+++ b/src/assuan-inquire.c
@@ -134,11 +134,11 @@ free_membuf (struct membuf *mb)
  * 
  * Return value: 0 on success or an ASSUAN error code
  **/
-AssuanError
+assuan_error_t
 assuan_inquire (ASSUAN_CONTEXT ctx, const char *keyword,
                 unsigned char **r_buffer, size_t *r_length, size_t maxlen)
 {
-  AssuanError rc;
+  assuan_error_t rc;
   struct membuf mb;
   char cmdbuf[LINELENGTH-10]; /* (10 = strlen ("INQUIRE ")+CR,LF) */
   unsigned char *line, *p;
diff --git a/src/assuan-io.c b/src/assuan-io.c
index b10571b..aea327a 100644
--- a/src/assuan-io.c
+++ b/src/assuan-io.c
@@ -1,5 +1,5 @@
 /* assuan-io.c - Wraps the read and write functions.
- *	Copyright (C) 2002 Free Software Foundation, Inc.
+ *	Copyright (C) 2002, 2004 Free Software Foundation, Inc.
  *
  * This file is part of Assuan.
  *
@@ -21,6 +21,9 @@
 #include "assuan-defs.h"
 #include <sys/types.h>
 #include <unistd.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
 
 extern ssize_t pth_read (int fd, void *buffer, size_t size);
 extern ssize_t pth_write (int fd, const void *buffer, size_t size);
@@ -29,13 +32,27 @@ extern ssize_t pth_write (int fd, const void *buffer, size_t size);
 #pragma weak pth_write
 
 ssize_t
-_assuan_simple_read (ASSUAN_CONTEXT ctx, void *buffer, size_t size)
+_assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size)
 {
+  #ifndef _WIN32
   return (pth_read ? pth_read : read) (ctx->inbound.fd, buffer, size);
+  #else
+  return pth_read ? pth_read (ctx->inbound.fd, buffer, size)
+                  : recv (ctx->inbound.fd, buffer, size, 0);
+  #endif
 }
 
 ssize_t
-_assuan_simple_write (ASSUAN_CONTEXT ctx, const void *buffer, size_t size)
+_assuan_simple_write (assuan_context_t ctx, const void *buffer, size_t size)
 {
+  #ifndef _WIN32
   return (pth_write ? pth_write : write) (ctx->outbound.fd, buffer, size);
+  #else
+  return pth_write ? pth_write (ctx->outbound.fd, buffer, size)
+                   : send (ctx->outbound.fd, buffer, size, 0);
+  #endif
 }
+
+
+
+
diff --git a/src/assuan-listen.c b/src/assuan-listen.c
index eb292c5..04f138e 100644
--- a/src/assuan-listen.c
+++ b/src/assuan-listen.c
@@ -26,8 +26,8 @@
 
 #include "assuan-defs.h"
 
-AssuanError
-assuan_set_hello_line (ASSUAN_CONTEXT ctx, const char *line)
+assuan_error_t
+assuan_set_hello_line (assuan_context_t ctx, const char *line)
 {
   if (!ctx)
     return ASSUAN_Invalid_Value;
@@ -66,8 +66,8 @@ assuan_set_hello_line (ASSUAN_CONTEXT ctx, const char *line)
  * Return value: 0 on success or an error if the connection could for
  * some reason not be established.
  **/
-AssuanError
-assuan_accept (ASSUAN_CONTEXT ctx)
+assuan_error_t
+assuan_accept (assuan_context_t ctx)
 {
   int rc;
   const char *p, *pend;
@@ -115,14 +115,14 @@ assuan_accept (ASSUAN_CONTEXT ctx)
 
 
 int
-assuan_get_input_fd (ASSUAN_CONTEXT ctx)
+assuan_get_input_fd (assuan_context_t ctx)
 {
   return ctx? ctx->input_fd : -1;
 }
 
 
 int
-assuan_get_output_fd (ASSUAN_CONTEXT ctx)
+assuan_get_output_fd (assuan_context_t ctx)
 {
   return ctx? ctx->output_fd : -1;
 }
@@ -130,25 +130,25 @@ assuan_get_output_fd (ASSUAN_CONTEXT ctx)
 
 /* Close the fd descriptor set by the command INPUT FD=n.  We handle
    this fd inside assuan so that we can do some initial checks */
-AssuanError
-assuan_close_input_fd (ASSUAN_CONTEXT ctx)
+assuan_error_t
+assuan_close_input_fd (assuan_context_t ctx)
 {
   if (!ctx || ctx->input_fd == -1)
     return ASSUAN_Invalid_Value;
-  close (ctx->input_fd);
+  _assuan_close (ctx->input_fd);
   ctx->input_fd = -1;
   return 0;
 }
 
 /* Close the fd descriptor set by the command OUTPUT FD=n.  We handle
    this fd inside assuan so that we can do some initial checks */
-AssuanError
-assuan_close_output_fd (ASSUAN_CONTEXT ctx)
+assuan_error_t
+assuan_close_output_fd (assuan_context_t ctx)
 {
   if (!ctx || ctx->output_fd == -1)
     return ASSUAN_Invalid_Value;
 
-  close (ctx->output_fd);
+  _assuan_close (ctx->output_fd);
   ctx->output_fd = -1;
   return 0;
 }
diff --git a/src/assuan-pipe-connect.c b/src/assuan-pipe-connect.c
index cf2ce23..321582c 100644
--- a/src/assuan-pipe-connect.c
+++ b/src/assuan-pipe-connect.c
@@ -17,7 +17,7 @@
  * License along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 
  */
-
+#ifndef _WIN32
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -30,7 +30,11 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/wait.h>
+#else
+#include <windows.h>
+#endif
 
 #include "assuan-defs.h"
 
@@ -66,16 +70,16 @@ writen (int fd, const char *buffer, size_t length)
 
 
 static int
-do_finish (ASSUAN_CONTEXT ctx)
+do_finish (assuan_context_t ctx)
 {
   if (ctx->inbound.fd != -1)
     {
-      close (ctx->inbound.fd);
+      _assuan_close (ctx->inbound.fd);
       ctx->inbound.fd = -1;
     }
   if (ctx->outbound.fd != -1)
     {
-      close (ctx->outbound.fd);
+      _assuan_close (ctx->outbound.fd);
       ctx->outbound.fd = -1;
     }
   if (ctx->pid != -1 && ctx->pid)
@@ -87,7 +91,7 @@ do_finish (ASSUAN_CONTEXT ctx)
 }
 
 static void
-do_deinit (ASSUAN_CONTEXT ctx)
+do_deinit (assuan_context_t ctx)
 {
   do_finish (ctx);
 }
@@ -101,14 +105,14 @@ do_deinit (ASSUAN_CONTEXT ctx)
    child right after the fork; ATFORKVALUE is passed as the first
    argument and 0 is passed as the second argument. The ATFORK
    function should only act if the second value is 0. */
-AssuanError
-assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
+assuan_error_t
+assuan_pipe_connect2 (assuan_context_t *ctx, const char *name, char *const argv[],
                       int *fd_child_list,
                       void (*atfork) (void *opaque, int reserved),
                       void *atforkvalue)
 {
   static int fixed_signals = 0;
-  AssuanError err;
+  assuan_error_t err;
   int rp[2];
   int wp[2];
   char mypidstr[50];
@@ -289,9 +293,10 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
    returning it in CTX.  The server filename is NAME, the argument
    vector in ARGV.  FD_CHILD_LIST is a -1 terminated list of file
    descriptors not to close in the child.  */
-AssuanError
-assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
+assuan_error_t
+assuan_pipe_connect (assuan_context_t *ctx, const char *name, char *const argv[],
 		     int *fd_child_list)
 {
   return assuan_pipe_connect2 (ctx, name, argv, fd_child_list, NULL, NULL);
 }
+#endif
diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c
index 49a0a10..3639579 100644
--- a/src/assuan-socket-connect.c
+++ b/src/assuan-socket-connect.c
@@ -24,10 +24,14 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <unistd.h>
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <unistd.h>
+#else
+#include <windows.h>
+#endif
 
 #include "assuan-defs.h"
 
@@ -49,18 +53,22 @@
 #endif
 
  
-
+#ifdef _WIN32
+#warning implement it
+#define LOG(format, args...)
+#else
 #define LOG(format, args...) \
 	fprintf (assuan_get_assuan_log_stream (), "%s%s" format , \
         assuan_get_assuan_log_prefix (), \
         assuan_get_assuan_log_prefix ()? ": ":"", ## args)
+#endif
 
 static int
 do_finish (ASSUAN_CONTEXT ctx)
 {
   if (ctx->inbound.fd != -1)
     {
-      close (ctx->inbound.fd);
+      _assuan_close (ctx->inbound.fd);
     }
   ctx->inbound.fd = -1;
   ctx->outbound.fd = -1;
@@ -75,14 +83,14 @@ do_deinit (ASSUAN_CONTEXT ctx)
 /* Make a connection to the Unix domain socket NAME and return a new
    Assuan context in CTX.  SERVER_PID is currently not used but may
    become handy in the future.  */
-AssuanError
+assuan_error_t
 assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
                        const char *name, pid_t server_pid)
 {
   static struct assuan_io io = { _assuan_simple_read,
 				 _assuan_simple_write };
 
-  AssuanError err;
+  assuan_error_t err;
   ASSUAN_CONTEXT ctx;
   int fd;
   struct sockaddr_un srvr_addr;
@@ -94,7 +102,7 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
 
   /* we require that the name starts with a slash, so that we can
      alter reuse this function for other socket types */
-  if (*name != '/')
+  if (*name != DIRSEP_C)
     return ASSUAN_Invalid_Value;
   if (strlen (name)+1 >= sizeof srvr_addr.sun_path)
     return ASSUAN_Invalid_Value;
@@ -105,7 +113,7 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
   ctx->deinit_handler = do_deinit;
   ctx->finish_handler = do_finish;
 
-  fd = socket (PF_LOCAL, SOCK_STREAM, 0);
+  fd = _assuan_sock_new (PF_LOCAL, SOCK_STREAM, 0);
   if (fd == -1)
     {
       LOG ("can't create socket: %s\n", strerror (errno));
@@ -119,11 +127,11 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
   srvr_addr.sun_path[sizeof (srvr_addr.sun_path) - 1] = 0;
   len = SUN_LEN (&srvr_addr);
 
-  if (connect (fd, (struct sockaddr *) &srvr_addr, len) == -1)
+  if (_assuan_sock_connect (fd, (struct sockaddr *) &srvr_addr, len) == -1)
     {
       LOG ("can't connect to `%s': %s\n", name, strerror (errno));
       _assuan_release_context (ctx);
-      close (fd);
+      _assuan_close (fd);
       return ASSUAN_Connect_Failed;
     }
 
@@ -140,7 +148,7 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
       LOG ("can't connect to server: %s\n", assuan_strerror (err));
     else if (okay != 1)
       {
-	LOG ("can't connect to server: `");
+        /*LOG ("can't connect to server: `");*/
 	_assuan_log_sanitized_string (ctx->inbound.line);
 	fprintf (assuan_get_assuan_log_stream (), "'\n");
 	err = ASSUAN_Connect_Failed;
diff --git a/src/assuan-socket-server.c b/src/assuan-socket-server.c
index e81ee50..7585aa8 100644
--- a/src/assuan-socket-server.c
+++ b/src/assuan-socket-server.c
@@ -22,15 +22,19 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <errno.h>
+#include <unistd.h>
 #include <sys/types.h>
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <unistd.h>
+#else
+#include <windows.h>
+#endif
 
 #include "assuan-defs.h"
 
 static int
-accept_connection_bottom (ASSUAN_CONTEXT ctx)
+accept_connection_bottom (assuan_context_t ctx)
 {
   int fd = ctx->connected_fd;
 
@@ -64,7 +68,7 @@ accept_connection_bottom (ASSUAN_CONTEXT ctx)
 
 
 static int
-accept_connection (ASSUAN_CONTEXT ctx)
+accept_connection (assuan_context_t ctx)
 {
   int fd;
   struct sockaddr_un clnt_addr;
@@ -82,11 +86,11 @@ accept_connection (ASSUAN_CONTEXT ctx)
 }
 
 static int
-finish_connection (ASSUAN_CONTEXT ctx)
+finish_connection (assuan_context_t ctx)
 {
   if (ctx->inbound.fd != -1)
     {
-      close (ctx->inbound.fd);
+      _assuan_close (ctx->inbound.fd);
     }
   ctx->inbound.fd = -1;
   ctx->outbound.fd = -1;
@@ -95,7 +99,7 @@ finish_connection (ASSUAN_CONTEXT ctx)
 
 
 static void
-deinit_socket_server (ASSUAN_CONTEXT ctx)
+deinit_socket_server (assuan_context_t ctx)
 {
   finish_connection (ctx);
 }
@@ -106,9 +110,9 @@ static struct assuan_io io = { _assuan_simple_read,
 /* Initialize a server for the socket LISTEN_FD which has already be
    put into listen mode */
 int
-assuan_init_socket_server (ASSUAN_CONTEXT *r_ctx, int listen_fd)
+assuan_init_socket_server (assuan_context_t *r_ctx, int listen_fd)
 {
-  ASSUAN_CONTEXT ctx;
+  assuan_context_t ctx;
   int rc;
 
   *r_ctx = NULL;
@@ -140,9 +144,9 @@ assuan_init_socket_server (ASSUAN_CONTEXT *r_ctx, int listen_fd)
 
 /* Initialize a server using the already accepted socket FD. */
 int
-assuan_init_connected_socket_server (ASSUAN_CONTEXT *r_ctx, int fd)
+assuan_init_connected_socket_server (assuan_context_t *r_ctx, int fd)
 {
-  ASSUAN_CONTEXT ctx;
+  assuan_context_t ctx;
   int rc;
 
   *r_ctx = NULL;
diff --git a/src/assuan-socket.c b/src/assuan-socket.c
new file mode 100644
index 0000000..1ed92c0
--- /dev/null
+++ b/src/assuan-socket.c
@@ -0,0 +1,133 @@
+/* assuan-socket.c
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+#include <config.h>
+#ifndef _WIN32
+#include <sys/socket.h>
+#else
+#include <stdio.h>
+#include <io.h>
+#include <windows.h>
+#include "assuan-defs.h"
+#endif
+
+int
+_assuan_close (int fd)
+{
+#ifndef _WIN32
+  return close (fd);
+#else
+  int rc = closesocket (fd);
+  if (rc && WSAGetLastError () == WSAENOTSOCK)
+      rc = close (fd);
+  return rc;
+#endif
+}
+
+
+int
+_assuan_sock_new (int domain, int type, int proto)
+{
+#ifndef _WIN32
+  return socket (domain, type, proto);
+#else
+  if (domain == AF_UNIX || domain == AF_LOCAL)
+    domain = AF_INET;
+  return socket (domain, type, proto);
+#endif
+}
+
+
+int
+_assuan_sock_connect (int sockfd, struct sockaddr * addr, int addrlen)
+{
+#ifndef _WIN32
+  return connect (sockfd, addr, addrlen);
+#else
+  struct sockaddr_in myaddr;
+  struct sockaddr_un * unaddr;
+  FILE * fp;
+  int port = 0;
+  
+  unaddr = (struct sockaddr_un *)addr;
+  fp = fopen (unaddr->sun_path, "rb");
+  if (!fp)
+      return -1;
+  fscanf (fp, "%d", &port);
+  fclose (fp);
+  /* XXX: set errno in this case */
+  if (port < 0 || port > 65535)
+      return -1;
+  
+  myaddr.sin_family = AF_INET;
+  myaddr.sin_port = port; 
+  myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+  /* we need this later. */
+  unaddr->sun_family = myaddr.sin_family;
+  unaddr->sun_port = myaddr.sin_port;
+  unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr;
+  
+  return connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr);
+#endif
+}
+
+
+int
+_assuan_sock_bind (int sockfd, struct sockaddr * addr, int addrlen)
+{
+#ifndef _WIN32
+  return bind (sockfd, addr, addrlen);
+#else
+  if (addr->sa_family == AF_LOCAL || addr->sa_family == AF_UNIX)
+    {
+      struct sockaddr_in myaddr;
+      struct sockaddr_un * unaddr;
+      FILE * fp;
+      int len = sizeof myaddr;
+      int rc;
+
+      myaddr.sin_port = 0;
+      myaddr.sin_family = AF_INET;
+      myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+      rc = bind (sockfd, (struct sockaddr *)&myaddr, len);
+      if (rc)
+        return rc;
+      rc = getsockname (sockfd, (struct sockaddr *)&myaddr, &len);
+      if (rc)
+        return rc;
+      unaddr = (struct sockaddr_un *)addr;
+      fp = fopen (unaddr->sun_path, "wb");
+      if (!fp)
+        return -1;
+      fprintf (fp, "%d", myaddr.sin_port);
+      fclose (fp);
+
+      /* we need this later. */
+      unaddr->sun_family = myaddr.sin_family;
+      unaddr->sun_port = myaddr.sin_port;
+      unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr;
+      
+      return 0;
+    }
+  return bind (sockfd, addr, addrlen);
+#endif
+}
+
diff --git a/src/assuan-util.c b/src/assuan-util.c
index e746d1e..b300b43 100644
--- a/src/assuan-util.c
+++ b/src/assuan-util.c
@@ -73,7 +73,7 @@ _assuan_free (void *p)
   can take out a descriptive text.  Inside the assuan code, use the
   macro set_error instead of this function. */
 int
-assuan_set_error (ASSUAN_CONTEXT ctx, int err, const char *text)
+assuan_set_error (assuan_context_t ctx, int err, const char *text)
 {
   ctx->err_no = err;
   ctx->err_str = text;
@@ -81,21 +81,21 @@ assuan_set_error (ASSUAN_CONTEXT ctx, int err, const char *text)
 }
 
 void
-assuan_set_pointer (ASSUAN_CONTEXT ctx, void *pointer)
+assuan_set_pointer (assuan_context_t ctx, void *pointer)
 {
   if (ctx)
     ctx->user_pointer = pointer;
 }
 
 void *
-assuan_get_pointer (ASSUAN_CONTEXT ctx)
+assuan_get_pointer (assuan_context_t ctx)
 {
   return ctx? ctx->user_pointer : NULL;
 }
 
 
 void
-assuan_set_log_stream (ASSUAN_CONTEXT ctx, FILE *fp)
+assuan_set_log_stream (assuan_context_t ctx, FILE *fp)
 {
   if (ctx)
     {
@@ -108,7 +108,7 @@ assuan_set_log_stream (ASSUAN_CONTEXT ctx, FILE *fp)
 
 
 void
-assuan_begin_confidential (ASSUAN_CONTEXT ctx)
+assuan_begin_confidential (assuan_context_t ctx)
 {
   if (ctx)
     {
@@ -117,7 +117,7 @@ assuan_begin_confidential (ASSUAN_CONTEXT ctx)
 }
 
 void
-assuan_end_confidential (ASSUAN_CONTEXT ctx)
+assuan_end_confidential (assuan_context_t ctx)
 {
   if (ctx)
     {
diff --git a/src/stpcpy.c b/src/stpcpy.c
new file mode 100644
index 0000000..1ff48ac
--- /dev/null
+++ b/src/stpcpy.c
@@ -0,0 +1,33 @@
+/* stpcpy.c - Replacement for stpcpy
+ * Copyright (C) 2002 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+char *
+stpcpy (char *dest, const char *src)
+{
+  register char *d = dest;
+  register const char *s = src;
+  
+  do
+    *d++ = *s;
+  while (*s++ != '\0');
+  
+  return d - 1;
+}
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libassuan.git



More information about the Pkg-gnupg-commit mailing list