From 01baed5b70d549290ad3f1df10158ee400ed489b Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 19 Aug 2005 16:34:42 +0000 Subject: [PATCH] Added missing files and fixed stuff from the recent merged. I did only tests on W32 at that time. --- assuan/ChangeLog | 6 ++ assuan/Makefile.am | 2 + assuan/assuan-pipe-connect.c | 2 + assuan/assuan-socket.c | 134 +++++++++++++++++++++++++++++++++++ assuan/assuan.h | 2 + assuan/funopen.c | 63 ++++++++++++++++ gpgme/Makefile.am | 2 +- 7 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 assuan/assuan-socket.c create mode 100644 assuan/funopen.c diff --git a/assuan/ChangeLog b/assuan/ChangeLog index 22c5189..1627e4a 100644 --- a/assuan/ChangeLog +++ b/assuan/ChangeLog @@ -1,3 +1,9 @@ +2005-08-19 Werner Koch + + * 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 * README.1st: Adjusted to cope with changes done in upstream Assuan. diff --git a/assuan/Makefile.am b/assuan/Makefile.am index 8c4d88c..b88b7dc 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 4ce3862..cbc131f 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 0000000..005f730 --- /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 +#include +#ifdef HAVE_W32_SYSTEM +#include +#include +#else +#include +#include +#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 4740470..68336ed 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 0000000..47f3370 --- /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 +#endif + +#include + + +/* 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 5fd79dd..9f1727d 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 -- 2.26.2