diff options
| author | Werner Koch <[email protected]> | 2005-08-19 16:34:42 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2005-08-19 16:34:42 +0000 | 
| commit | 01baed5b70d549290ad3f1df10158ee400ed489b (patch) | |
| tree | 32efeafe1efff02d8e58fc2a16dda294facdf42b | |
| parent | Changes to allow building a W32 DLL (diff) | |
| download | gpgme-01baed5b70d549290ad3f1df10158ee400ed489b.tar.gz gpgme-01baed5b70d549290ad3f1df10158ee400ed489b.zip | |
Added missing files and fixed stuff from the recent merged.  I did only
tests on W32 at that time.
| -rw-r--r-- | assuan/ChangeLog | 6 | ||||
| -rw-r--r-- | assuan/Makefile.am | 2 | ||||
| -rw-r--r-- | assuan/assuan-pipe-connect.c | 2 | ||||
| -rw-r--r-- | assuan/assuan-socket.c | 134 | ||||
| -rw-r--r-- | assuan/assuan.h | 2 | ||||
| -rw-r--r-- | assuan/funopen.c | 63 | ||||
| -rw-r--r-- | gpgme/Makefile.am | 2 | 
7 files changed, 210 insertions, 1 deletions
| diff --git a/assuan/ChangeLog b/assuan/ChangeLog index 22c5189b..1627e4a1 100644 --- a/assuan/ChangeLog +++ b/assuan/ChangeLog @@ -1,3 +1,9 @@ +2005-08-19  Werner Koch  <[email protected]> + +	* funopen.c, assuan-socket.c: Copied from libassuan CVS. +	* assuan-pipe-connect.c (assuan_pipe_connect2): Add missing +	declaration of PID. +  2005-08-09  Werner Koch  <[email protected]>  	* README.1st: Adjusted to cope with changes done in upstream Assuan. diff --git a/assuan/Makefile.am b/assuan/Makefile.am index 8c4d88cf..b88b7dc5 100644 --- a/assuan/Makefile.am +++ b/assuan/Makefile.am @@ -44,6 +44,8 @@ libassuan_la_SOURCES = \  	assuan-socket-server.c \  	assuan-pipe-connect.c \  	assuan-socket-connect.c  \ +	assuan-socket.c \ +	funopen.c \  	assuan-io.c \  	assuan-domain-connect.c \  	assuan-domain-server.c \ diff --git a/assuan/assuan-pipe-connect.c b/assuan/assuan-pipe-connect.c index 4ce3862a..cbc131f7 100644 --- a/assuan/assuan-pipe-connect.c +++ b/assuan/assuan-pipe-connect.c @@ -467,6 +467,8 @@ assuan_pipe_connect2 (assuan_context_t *ctx,    if ((*ctx)->pid == 0)      {  #ifdef _ASSUAN_USE_DOUBLE_FORK       +      pid_t pid; +        if ((pid = fork ()) == 0)  #endif  	{ diff --git a/assuan/assuan-socket.c b/assuan/assuan-socket.c new file mode 100644 index 00000000..005f7307 --- /dev/null +++ b/assuan/assuan-socket.c @@ -0,0 +1,134 @@ +/* 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> +#include <stdio.h> +#ifdef HAVE_W32_SYSTEM +#include <windows.h> +#include <io.h> +#else +#include <sys/types.h> +#include <sys/socket.h> +#endif +#include "assuan-defs.h" + +int +_assuan_close (int fd) +{ +#ifndef HAVE_W32_SYSTEM +  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 HAVE_W32_SYSTEM +  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 HAVE_W32_SYSTEM +  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 HAVE_W32_SYSTEM +  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/assuan/assuan.h b/assuan/assuan.h index 47404705..68336edc 100644 --- a/assuan/assuan.h +++ b/assuan/assuan.h @@ -58,6 +58,8 @@ ssize_t _gpgme_ath_waitpid (pid_t pid, int *status, int options);  #ifdef HAVE_W32_SYSTEM  int _gpgme_ath_accept (int s, void *addr, int *length_ptr);  #else /*!HAVE_W32_SYSTEM*/ +struct sockaddr; +struct msghdr;  ssize_t _gpgme_ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,                             struct timeval *timeout);  int _gpgme_ath_accept (int s, struct sockaddr *addr, socklen_t *length_ptr); diff --git a/assuan/funopen.c b/assuan/funopen.c new file mode 100644 index 00000000..47f33701 --- /dev/null +++ b/assuan/funopen.c @@ -0,0 +1,63 @@ +/* funopen.c - Replacement for funopen. + * Copyright (C) 2003 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 + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> + + +/* Replacement for the *BSD function: + +  FILE *funopen (void *cookie, +                 int (*readfn)(void *, char *, int), +                 int (*writefn)(void *, const char *, int), +                 fpos_t (*seekfn)(void *, fpos_t, int), +                 int (*closefn)(void *)); + +  The functions to provide my either be NULL if not required or +  similar to the unistd function with the exception of using the +  cookie instead of the fiel descripor. +*/ + + +#ifdef HAVE_FOPENCOOKIE +FILE * +_assuan_funopen(void *cookie, +                cookie_read_function_t *readfn, +                cookie_write_function_t *writefn, +                cookie_seek_function_t *seekfn, +                cookie_close_function_t *closefn) +{ +  cookie_io_functions_t io = { NULL }; + +  io.read = readfn; +  io.write = writefn; +  io.seek = seekfn; +  io.close = closefn; + +   return fopencookie (cookie, +		      readfn ? ( writefn ? "rw" : "r" ) +		      : ( writefn ? "w" : ""), io); +} +#else +#error No known way to implement funopen. +#endif diff --git a/gpgme/Makefile.am b/gpgme/Makefile.am index 5fd79ddd..9f1727d7 100644 --- a/gpgme/Makefile.am +++ b/gpgme/Makefile.am @@ -20,7 +20,7 @@  ## Process this file with automake to produce Makefile.in  EXTRA_DIST = gpgme-config.in gpgme.m4 mkstatus libgpgme.vers \ -	     versioninfo.rc.in gpgme.de +	     versioninfo.rc.in gpgme.def  BUILT_SOURCES = status-table.h  MOSTLYCLEANFILES = status-table.h  bin_SCRIPTS = gpgme-config | 
