mingw: add network-wrappers for daemon
git-daemon requires some socket-functionality that is not yet supported in the Windows-port. This patch adds said functionality, and makes sure WSAStartup gets called by socket(), since it is the first network-call in git-daemon. Signed-off-by: Mike Pape <dotzenlabs@gmail.com> Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Mike Pape committed
Nov 4, 2010 at 02:35 UTC
772991af40e139814368762d4075be324bfdab77
2 files changed
+59
-1
compat/mingw.c
+43
-1
@@ -1175,7 +1175,10 @@ int mingw_getnameinfo(const struct sockaddr *sa, socklen_t salen,
1175
int mingw_socket(int domain, int type, int protocol)
1176
{
1177
int sockfd;
1178
- SOCKET s = WSASocket(domain, type, protocol, NULL, 0, 0);
1178
+ SOCKET s;
1179
+
1180
+ ensure_socket_initialization();
1181
+ s = WSASocket(domain, type, protocol, NULL, 0, 0);
1182
if (s == INVALID_SOCKET) {
1183
/*
1184
* WSAGetLastError() values are regular BSD error codes
@@ -1205,6 +1208,45 @@ int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz)
1208
return connect(s, sa, sz);
1209
}
1210
1211
+#undef bind
1212
+int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz)
1213
+{
1214
+ SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1215
+ return bind(s, sa, sz);
1216
+}
1217
+
1218
+#undef setsockopt
1219
+int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen)
1220
+{
1221
+ SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1222
+ return setsockopt(s, lvl, optname, (const char*)optval, optlen);
1223
+}
1224
+
1225
+#undef listen
1226
+int mingw_listen(int sockfd, int backlog)
1227
+{
1228
+ SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1229
+ return listen(s, backlog);
1230
+}
1231
+
1232
+#undef accept
1233
+int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
1234
+{
1235
+ int sockfd2;
1236
+
1237
+ SOCKET s1 = (SOCKET)_get_osfhandle(sockfd1);
1238
+ SOCKET s2 = accept(s1, sa, sz);
1239
+
1240
+ /* convert into a file descriptor */
1241
+ if ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY)) < 0) {
1242
+ int err = errno;
1243
+ closesocket(s2);
1244
+ return error("unable to make a socket file descriptor: %s",
1245
+ strerror(err));
1246
+ }
1247
+ return sockfd2;
1248
+}
1249
+
1250
#undef rename
1251
int mingw_rename(const char *pold, const char *pnew)
1252
{
compat/mingw.h
+16
@@ -7,6 +7,7 @@
7
8
typedef int pid_t;
9
typedef int uid_t;
10
+typedef int socklen_t;
11
#define hstrerror strerror
12
13
#define S_IFLNK 0120000 /* Symbolic link */
@@ -47,6 +48,9 @@ typedef int uid_t;
48
#define F_SETFD 2
49
#define FD_CLOEXEC 0x1
50
51
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
52
+#define ECONNABORTED WSAECONNABORTED
53
+
54
struct passwd {
55
char *pw_name;
56
char *pw_gecos;
@@ -225,6 +229,18 @@ int mingw_socket(int domain, int type, int protocol);
229
int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz);
230
#define connect mingw_connect
231
232
+int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz);
233
+#define bind mingw_bind
234
+
235
+int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen);
236
+#define setsockopt mingw_setsockopt
237
+
238
+int mingw_listen(int sockfd, int backlog);
239
+#define listen mingw_listen
240
+
241
+int mingw_accept(int sockfd, struct sockaddr *sa, socklen_t *sz);
242
+#define accept mingw_accept
243
+
244
int mingw_rename(const char*, const char*);
245
#define rename mingw_rename
246