diff options
Diffstat (limited to '')
-rw-r--r-- | jnlib/w32-afunix.c (renamed from util/assuan-socket.c) | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/util/assuan-socket.c b/jnlib/w32-afunix.c index 4d79792ce..84d799f1f 100644 --- a/util/assuan-socket.c +++ b/jnlib/w32-afunix.c @@ -1,5 +1,5 @@ -/* assuan-socket.c - * Copyright (C) 2004 Free Software Foundation, Inc. +/* w32-afunix.c + * Copyright (C) 2004 g10 Code GmbH * * This file is part of GnuPG. * @@ -18,68 +18,50 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ - -/* Please note that this is a stripped down and modified version of - the orginal Assuan code from libassuan. */ - -#include <config.h> +#ifdef _WIN32 #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" + +#include "w32-afunix.h" int -_assuan_close (int fd) +_w32_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) +_w32_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) +_w32_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; + int port; unaddr = (struct sockaddr_un *)addr; fp = fopen (unaddr->sun_path, "rb"); if (!fp) - return -1; + return -1; fscanf (fp, "%d", &port); fclose (fp); + /* XXX: set errno in this case */ if (port < 0 || port > 65535) - return -1; + return -1; myaddr.sin_family = AF_INET; myaddr.sin_port = port; @@ -91,7 +73,45 @@ _assuan_sock_connect (int sockfd, struct sockaddr * addr, int addrlen) unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr; return connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr); -#endif } +int +_w32_sock_bind (int sockfd, struct sockaddr * addr, int addrlen) +{ + 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 /*_WIN32*/ |