Skip to content

Commit 772991a

Browse files
dotzengitster
authored andcommitted
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 <[email protected]> Signed-off-by: Erik Faye-Lund <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent ca20906 commit 772991a

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

compat/mingw.c

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,10 @@ int mingw_getnameinfo(const struct sockaddr *sa, socklen_t salen,
11751175
int mingw_socket(int domain, int type, int protocol)
11761176
{
11771177
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);
11791182
if (s == INVALID_SOCKET) {
11801183
/*
11811184
* WSAGetLastError() values are regular BSD error codes
@@ -1205,6 +1208,45 @@ int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz)
12051208
return connect(s, sa, sz);
12061209
}
12071210

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+
12081250
#undef rename
12091251
int mingw_rename(const char *pold, const char *pnew)
12101252
{

compat/mingw.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
typedef int pid_t;
99
typedef int uid_t;
10+
typedef int socklen_t;
1011
#define hstrerror strerror
1112

1213
#define S_IFLNK 0120000 /* Symbolic link */
@@ -47,6 +48,9 @@ typedef int uid_t;
4748
#define F_SETFD 2
4849
#define FD_CLOEXEC 0x1
4950

51+
#define EAFNOSUPPORT WSAEAFNOSUPPORT
52+
#define ECONNABORTED WSAECONNABORTED
53+
5054
struct passwd {
5155
char *pw_name;
5256
char *pw_gecos;
@@ -225,6 +229,18 @@ int mingw_socket(int domain, int type, int protocol);
225229
int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz);
226230
#define connect mingw_connect
227231

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+
228244
int mingw_rename(const char*, const char*);
229245
#define rename mingw_rename
230246

0 commit comments

Comments
 (0)