@matheusbsbs / matheus-bagliano / commits / 772991af40
Fork 0

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