diff options
-rw-r--r-- | src/ChangeLog | 17 | ||||
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/assuan-buffer.c | 21 | ||||
-rw-r--r-- | src/assuan-client.c | 12 | ||||
-rw-r--r-- | src/assuan-connect.c | 7 | ||||
-rw-r--r-- | src/assuan-defs.h | 48 | ||||
-rw-r--r-- | src/assuan-domain-connect.c | 75 | ||||
-rw-r--r-- | src/assuan-domain-server.c | 4 | ||||
-rw-r--r-- | src/assuan-handler.c | 4 | ||||
-rw-r--r-- | src/assuan-inquire.c | 4 | ||||
-rw-r--r-- | src/assuan-io.c | 23 | ||||
-rw-r--r-- | src/assuan-listen.c | 24 | ||||
-rw-r--r-- | src/assuan-pipe-connect.c | 25 | ||||
-rw-r--r-- | src/assuan-socket-connect.c | 28 | ||||
-rw-r--r-- | src/assuan-socket-server.c | 24 | ||||
-rw-r--r-- | src/assuan-socket.c | 133 | ||||
-rw-r--r-- | src/assuan-util.c | 12 | ||||
-rw-r--r-- | 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 <[email protected]> + + * 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 <[email protected]> + + * 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 <[email protected]> * 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; +} + |