Fix for latest libgpg-error.
[gnupg.git] / common / w32-afunix.c
1 /* w32-afunix.c - AF_UNIX emulation for Windows (Client only).
2  * Copyright (C) 2004, 2006 g10 Code GmbH
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /* Use of this code is preprecated - you better use the sockt wrappers
21    from libassuan. */
22
23 #ifdef _WIN32
24 #include <stdio.h>
25 #include <stdlib.h>
26 #define WIN32_LEAN_AND_MEAN
27 #include <windows.h>
28 #include <fcntl.h>
29 #include <sys/stat.h>
30 #include <io.h>
31 #include <errno.h>
32
33 #include "w32-afunix.h"
34
35
36
37 /* The buffer for NONCE needs to be at least 16 bytes.  Returns 0 on
38    success. */
39 static int
40 read_port_and_nonce (const char *fname, unsigned short *port, char *nonce)
41 {
42   FILE *fp;
43   char buffer[50], *p;
44   size_t nread;
45   int aval;
46
47   fp = fopen (fname, "rb");
48   if (!fp)
49     return -1;
50   nread = fread (buffer, 1, sizeof buffer - 1, fp);
51   fclose (fp);
52   if (!nread)
53     {
54 #warning remove this file
55       jnlib_set_errno (EIO);
56       return -1;
57     }
58   buffer[nread] = 0;
59   aval = atoi (buffer);
60   if (aval < 1 || aval > 65535)
61     {
62       jnlib_set_errno (EINVAL);
63       return -1;
64     }
65   *port = (unsigned int)aval;
66   for (p=buffer; nread && *p != '\n'; p++, nread--)
67     ;
68   if (*p != '\n' || nread != 17)
69     {
70       jnlib_set_errno (EINVAL);
71       return -1;
72     }
73   p++; nread--;
74   memcpy (nonce, p, 16);
75   return 0;
76 }
77
78
79
80 int
81 _w32_close (int fd)
82 {
83   int rc = closesocket (fd);
84   if (rc && WSAGetLastError () == WSAENOTSOCK)
85       rc = close (fd);
86   return rc;
87 }
88
89
90 int
91 _w32_sock_new (int domain, int type, int proto)
92 {
93   if (domain == AF_UNIX || domain == AF_LOCAL)
94     domain = AF_INET;
95   return socket (domain, type, proto);
96 }
97
98
99 int
100 _w32_sock_connect (int sockfd, struct sockaddr *addr, int addrlen)
101 {
102   struct sockaddr_in myaddr;
103   struct sockaddr_un *unaddr;
104   unsigned short port;
105   char nonce[16];
106   int ret;
107
108   (void)addrlen;
109       
110   unaddr = (struct sockaddr_un *)addr;
111   if (read_port_and_nonce (unaddr->sun_path, &port, nonce))
112     return -1;
113       
114   myaddr.sin_family = AF_INET;
115   myaddr.sin_port = htons (port); 
116   myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
117   
118   /* Set return values.  */
119   unaddr->sun_family = myaddr.sin_family;
120   unaddr->sun_port = myaddr.sin_port;
121   unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr;
122   
123   ret = connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr);
124   if (!ret)
125     {
126       /* Send the nonce. */
127       ret = send (sockfd, nonce, 16, 0);
128       if (ret >= 0 && ret != 16)
129         {
130           jnlib_set_errno (EIO);
131           ret = -1;
132         }
133     }
134   return ret;
135 }
136
137
138 #endif /*_WIN32*/