summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/common/cbasetypes.h4
-rw-r--r--src/common/socket.c11
3 files changed, 16 insertions, 2 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index a234ebf57..58bf624c1 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,9 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2008/06/16
+ * Made the socket limit not be set in cygwin, which has bogus behavior. (bugreport:1684) [FlavioJS]
+ * Made the socket limit be set to the maximum allowed value when setting to FD_SETSIZE fails.
2008/06/14
* Fixed Icewall not restoring the original cell type [ultramage]
* Fixed PF_FOGWALL working on Boss monsters. [Brainstorm]
diff --git a/src/common/cbasetypes.h b/src/common/cbasetypes.h
index 2a2d958ff..f94e9c6e7 100644
--- a/src/common/cbasetypes.h
+++ b/src/common/cbasetypes.h
@@ -33,6 +33,10 @@
#define MINGW
#endif
+#if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && !defined(CYGWIN)
+#define CYGWIN
+#endif
+
// __APPLE__ is the only predefined macro on MacOS X
#if defined(__APPLE__)
#define __DARWIN__
diff --git a/src/common/socket.c b/src/common/socket.c
index 7addc271b..022a4ae72 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1204,7 +1204,9 @@ void socket_init(void)
return;
}
}
-#elif defined(HAVE_SETRLIMIT)
+#elif defined(HAVE_SETRLIMIT) && !defined(CYGWIN)
+ // NOTE: getrlimit and setrlimit have bogus behaviour in cygwin.
+ // "Number of fds is virtually unlimited in cygwin" (sys/param.h)
{// set socket limit to FD_SETSIZE
struct rlimit rlp;
if( 0 == getrlimit(RLIMIT_NOFILE, &rlp) )
@@ -1215,8 +1217,13 @@ void socket_init(void)
rlp.rlim_max = FD_SETSIZE;
if( 0 != setrlimit(RLIMIT_NOFILE, &rlp) )
{// failed
+ // set to maximum allowed
getrlimit(RLIMIT_NOFILE, &rlp);
- ShowWarning("socket_init: %s - failed to set socket limit to %d (current limit %d).\n", strerror(errno), FD_SETSIZE, (int)rlp.rlim_cur);
+ rlp.rlim_cur = rlp.rlim_max;
+ setrlimit(RLIMIT_NOFILE, &rlp);
+ // report limit
+ getrlimit(RLIMIT_NOFILE, &rlp);
+ ShowWarning("socket_init: failed to set socket limit to %d (current limit %d).\n", FD_SETSIZE, (int)rlp.rlim_cur);
}
}
}