summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat/mingw.c46
-rw-r--r--compat/mingw.h9
2 files changed, 55 insertions, 0 deletions
diff --git a/compat/mingw.c b/compat/mingw.c
index 2677e78626..d184c582eb 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -432,6 +432,52 @@ char **env_setenv(char **env, const char *name)
return env;
}
+/* 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) {
+ /*
+ * WSAGetLastError() values are regular BSD error codes
+ * biased by WSABASEERR.
+ * However, strerror() does not know about networking
+ * specific errors, which are values beginning at 38 or so.
+ * Therefore, we choose to leave the biased error code
+ * in errno so that _if_ someone looks up the code somewhere,
+ * then it is at least the number that are usually listed.
+ */
+ errno = WSAGetLastError();
+ return -1;
+ }
+ /* 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
int mingw_rename(const char *pold, const char *pnew)
{
diff --git a/compat/mingw.h b/compat/mingw.h
index 0879894c68..1017632a24 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -148,6 +148,15 @@ int mingw_open (const char *filename, int oflags, ...);
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