X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Fio-layer%2Fsockets.c;h=60429573c07f8f6e66f4b37aa6d0a80aa8428b74;hb=ca327b1162f17986d5c41c1ac1dd3aec6c89744b;hp=285a1798e743ea5830b977d38824340088af206e;hpb=8f59998c4f744c7b78cf6cdd7f5849f99902c4b8;p=mono.git diff --git a/mono/io-layer/sockets.c b/mono/io-layer/sockets.c index 285a1798e74..60429573c07 100644 --- a/mono/io-layer/sockets.c +++ b/mono/io-layer/sockets.c @@ -45,11 +45,13 @@ #include #include -#include #include #ifdef HAVE_SYS_SENDFILE_H #include #endif +#ifdef HAVE_NETDB_H +#include +#endif #if 0 #define DEBUG(...) g_message(__VA_ARGS__) @@ -346,7 +348,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, } fds.fd = fd; - fds.events = POLLOUT; + fds.events = MONO_POLLOUT; while (mono_poll (&fds, 1, -1) == -1 && !_wapi_thread_cur_apc_pending ()) { if (errno != EINTR) { @@ -778,6 +780,10 @@ int _wapi_setsockopt(guint32 fd, int level, int optname, gpointer handle = GUINT_TO_POINTER (fd); int ret; const void *tmp_val; +#if defined (__linux__) + /* This has its address taken so it cannot be moved to the if block which uses it */ + int bufsize = 0; +#endif struct timeval tv; if (startup_count == 0) { @@ -805,7 +811,7 @@ int _wapi_setsockopt(guint32 fd, int level, int optname, * buffer sizes "to allow space for bookkeeping * overhead." */ - int bufsize = *((int *) optval); + bufsize = *((int *) optval); bufsize /= 2; tmp_val = &bufsize; @@ -902,6 +908,7 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, if (fd == -1 && domain == AF_INET && type == SOCK_RAW && protocol == 0) { /* Retry with protocol == 4 (see bug #54565) */ + // https://bugzilla.novell.com/show_bug.cgi?id=MONO54565 socket_handle.protocol = 4; fd = socket (AF_INET, SOCK_RAW, 4); } @@ -927,6 +934,7 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, /* .net seems to set this by default for SOCK_STREAM, not for * SOCK_DGRAM (see bug #36322) + * https://bugzilla.novell.com/show_bug.cgi?id=MONO36322 * * It seems winsock has a rather different idea of what * SO_REUSEADDR means. If it's set, then a new socket can be @@ -937,6 +945,7 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, * behaves as though any other system would when SO_REUSEADDR * is true, so we don't need to do anything else here. See * bug 53992. + * https://bugzilla.novell.com/show_bug.cgi?id=MONO53992 */ { int ret, true = 1; @@ -973,45 +982,6 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, return(fd); } -struct hostent *_wapi_gethostbyname(const char *hostname) -{ - struct hostent *he; - - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(NULL); - } - - he = gethostbyname (hostname); - if (he == NULL) { - DEBUG ("%s: gethostbyname error: %s", __func__, - strerror (h_errno)); - - switch(h_errno) { - case HOST_NOT_FOUND: - WSASetLastError (WSAHOST_NOT_FOUND); - break; -#if NO_ADDRESS != NO_DATA - case NO_ADDRESS: -#endif - case NO_DATA: - WSASetLastError (WSANO_DATA); - break; - case NO_RECOVERY: - WSASetLastError (WSANO_RECOVERY); - break; - case TRY_AGAIN: - WSASetLastError (WSATRY_AGAIN); - break; - default: - g_warning ("%s: Need to translate %d into winsock error", __func__, h_errno); - break; - } - } - - return(he); -} - static gboolean socket_disconnect (guint32 fd) { struct _WapiHandle_socket *socket_handle; @@ -1291,13 +1261,13 @@ WSAIoctl (guint32 fd, gint32 command, keepalivetime /= 1000; if (keepalivetime == 0 || rem >= 500) keepalivetime++; - ret = setsockopt (fd, SOL_TCP, TCP_KEEPIDLE, &keepalivetime, sizeof (uint32_t)); + ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepalivetime, sizeof (uint32_t)); if (ret == 0) { rem = keepaliveinterval % 1000; keepaliveinterval /= 1000; if (keepaliveinterval == 0 || rem >= 500) keepaliveinterval++; - ret = setsockopt (fd, SOL_TCP, TCP_KEEPINTVL, &keepaliveinterval, sizeof (uint32_t)); + ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepaliveinterval, sizeof (uint32_t)); } if (ret != 0) { gint errnum = errno;