diff --git a/compat/mingw.c b/compat/mingw.c index 306541b246..549669a3dd 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -631,8 +631,22 @@ void env_unsetenv(char **env, const char *name) env[dst] = NULL; } +/* this is the first function to call into WS_32; initialize it */ +#undef gethostbyname +struct hostent *mingw_gethostbyname(const char *host) +{ + WSADATA wsa; + + if (WSAStartup(MAKEWORD(2,2), &wsa)) + die("unable to initialize winsock subsystem, error %d", + WSAGetLastError()); + atexit((void(*)(void)) WSACleanup); + return gethostbyname(host); +} + int mingw_socket(int domain, int type, int protocol) { + int sockfd; SOCKET s = WSASocket(domain, type, protocol, NULL, 0, 0); if (s == INVALID_SOCKET) { /* @@ -647,7 +661,20 @@ int mingw_socket(int domain, int type, int protocol) errno = WSAGetLastError(); return -1; } - return s; + /* convert into a file descriptor */ + if ((sockfd = _open_osfhandle(s, O_RDWR|O_BINARY)) < 0) { + closesocket(s); + return error("unable to make a socket file descriptor: %s", + strerror(errno)); + } + return sockfd; +} + +#undef connect +int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz) +{ + SOCKET s = (SOCKET)_get_osfhandle(sockfd); + return connect(s, sa, sz); } #undef rename diff --git a/connect.c b/connect.c index 0f10c40652..82fb62b080 100644 --- a/connect.c +++ b/connect.c @@ -345,23 +345,7 @@ static int git_tcp_connect_sock(char *host, int flags) static void git_tcp_connect(int fd[2], char *host, int flags) { -#ifndef __MINGW32__ int sockfd = git_tcp_connect_sock(host, flags); -#else - int sockfd; - WSADATA wsa; - - if (WSAStartup(MAKEWORD(2,2), &wsa)) - die("unable to initialize winsock subsystem, error %d", - WSAGetLastError()); - atexit((void(*)(void)) WSACleanup); - - sockfd = git_tcp_connect_sock(host, flags); - /* convert into a file descriptor */ - if ((sockfd = _open_osfhandle(sockfd, O_RDWR|O_BINARY)) < 0) - die("unable to make a socket file descriptor: %s", - strerror(errno)); -#endif fd[0] = sockfd; fd[1] = dup(sockfd); diff --git a/git-compat-util.h b/git-compat-util.h index aab57dfaef..4875d6baa3 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -523,9 +523,15 @@ struct tm *localtime_r(const time_t *timep, struct tm *result); char *mingw_getcwd(char *pointer, int len); #define getcwd mingw_getcwd +struct hostent *mingw_gethostbyname(const char *host); +#define gethostbyname mingw_gethostbyname + int mingw_socket(int domain, int type, int protocol); #define socket mingw_socket +int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); +#define connect mingw_connect + int mingw_rename(const char*, const char*); #define rename mingw_rename diff --git a/git.c b/git.c index e2c79a1efc..f75ba64b1f 100644 --- a/git.c +++ b/git.c @@ -399,8 +399,9 @@ int main(int argc, const char **argv) * if we don't have anything better. */ #ifdef __MINGW32__ - if (!slash) - slash = strrchr(cmd, '\\'); + char *bslash = strrchr(cmd, '\\'); + if (!slash || (bslash && bslash > slash)) + slash = bslash; #endif if (slash) { *slash++ = 0;