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