2389 [bug] Move the "working directory writable" check to after
the ns_os_changeuser() call. [RT #18326]
+2386. [func] Add warning about too small 'open files' limit.
+ [RT #18269]
+
--- 9.3.6b1 released ---
2385. [bug] A condition variable in socket.c could leak in
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: server.c,v 1.339.2.15.2.81 2008/07/18 01:41:01 marka Exp $ */
+/* $Id: server.c,v 1.339.2.15.2.82 2008/08/01 02:12:46 jinmei Exp $ */
#include <config.h>
in_port_t listen_port, udpport_low, udpport_high;
isc_portset_t *v4portset = NULL;
isc_portset_t *v6portset = NULL;
+ isc_resourcevalue_t nfiles;
int i;
ns_aclconfctx_init(&aclconfctx);
*/
set_limits(maps);
+ /*
+ * Check if max number of open sockets that the system allows is
+ * sufficiently large. Failing this condition is not necessarily fatal,
+ * but may cause subsequent runtime failures for a busy recursive
+ * server.
+ */
+ result = isc_resource_getcurlimit(isc_resource_openfiles, &nfiles);
+ if (result == ISC_R_SUCCESS) {
+ unsigned int maxsocks;
+
+ result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &maxsocks);
+ if (result == ISC_R_SUCCESS &&
+ (isc_resourcevalue_t)maxsocks > nfiles) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "max open files "
+ "(%" ISC_PRINT_QUADFORMAT "u)"
+ " is smaller than max sockets (%u)",
+ nfiles, maxsocks);
+ }
+ }
+
/*
* Configure various server options.
*/
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.h,v 1.4.206.1 2004/03/06 08:14:47 marka Exp $ */
+/* $Id: resource.h,v 1.4.206.2 2008/08/01 02:12:46 jinmei Exp $ */
#ifndef ISC_RESOURCE_H
#define ISC_RESOURCE_H 1
* ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
*/
+isc_result_t
+isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value);
+/*%<
+ * Same as isc_resource_getlimit(), but returns the current (soft) limit.
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_RESOURCE_H */
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.h,v 1.54.12.12 2008/07/23 23:36:22 marka Exp $ */
+/* $Id: socket.h,v 1.54.12.13 2008/08/01 02:12:46 jinmei Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
* ISC_R_UNEXPECTED
*/
+isc_result_t
+isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp);
+/*%<
+ * Returns in "*nsockp" the maximum number of sockets this manager may open.
+ *
+ * Requires:
+ *
+ *\li '*manager' is a valid isc_socketmgr_t.
+ *\li 'nsockp' is not NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOTIMPLEMENTED
+ */
+
void
isc_socketmgr_destroy(isc_socketmgr_t **managerp);
/*
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.c,v 1.11.206.5 2008/07/28 22:52:09 marka Exp $ */
+/* $Id: resource.c,v 1.11.206.6 2008/08/01 02:12:46 jinmei Exp $ */
#include <config.h>
return (result);
}
+
+isc_result_t
+isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
+ int unixresult;
+ int unixresource;
+ struct rlimit rl;
+ isc_result_t result;
+
+ result = resource2rlim(resource, &unixresource);
+ if (result == ISC_R_SUCCESS) {
+ unixresult = getrlimit(unixresource, &rl);
+ INSIST(unixresult == 0);
+ *value = rl.rlim_cur;
+ }
+
+ return (result);
+}
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.207.2.19.2.47 2008/07/24 10:14:49 fdupont Exp $ */
+/* $Id: socket.c,v 1.207.2.19.2.48 2008/08/01 02:12:46 jinmei Exp $ */
#include <config.h>
return (result);
}
+isc_result_t
+isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
+ REQUIRE(VALID_MANAGER(manager));
+ REQUIRE(nsockp != NULL);
+
+ *nsockp = manager->maxsocks;
+
+ return (ISC_R_SUCCESS);
+}
+
void
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
isc_socketmgr_t *manager;
isc_ratelimiter_shutdown
isc_region_compare
isc_resource_getlimit
+isc_resource_getcurlimit
isc_resource_setlimit
isc_result_register
isc_result_totext
isc_socket_sendv
isc_socketmgr_create
isc_socketmgr_destroy
+isc_socketmgr_getmaxsockets
isc_stdio_close
isc_stdio_flush
isc_stdio_open
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.c,v 1.2.12.6 2007/08/28 07:19:17 tbox Exp $ */
+/* $Id: resource.c,v 1.2.12.7 2008/08/01 02:12:46 jinmei Exp $ */
#include <config.h>
*value = WIN32_MAX_OPEN_FILES;
return (ISC_R_SUCCESS);
}
+
+isc_result_t
+isc_resource_getcurlimit(isc_resource_t resource, isc_resourcevalue_t *value) {
+ return (isc_resource_getlimit(resource, value));
+}
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.5.2.13.2.33 2008/07/24 10:14:49 fdupont Exp $ */
+/* $Id: socket.c,v 1.5.2.13.2.34 2008/08/01 02:12:46 jinmei Exp $ */
/* This code has been rewritten to take advantage of Windows Sockets
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
return (ISC_R_SUCCESS);
}
+isc_result_t
+isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
+ REQUIRE(VALID_MANAGER(manager));
+ REQUIRE(nsockp != NULL);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+
void
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
isc_socketmgr_t *manager;