aboutsummaryrefslogtreecommitdiffstats
path: root/jnlib/w32-afunix.c
diff options
context:
space:
mode:
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*/