free(p);
}
+
+/*****************************************************************
+set our open file limit to the max and return the limit
+*****************************************************************/
+int set_maxfiles(void)
+{
+#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
+ struct rlimit rlp;
+ getrlimit(RLIMIT_NOFILE, &rlp);
+ /* Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
+ * account for the extra fd we need
+ * as well as the log files and standard
+ * handles etc. */
+ rlp.rlim_cur = rlp.rlim_max;
+ setrlimit(RLIMIT_NOFILE, &rlp);
+ getrlimit(RLIMIT_NOFILE, &rlp);
+ return rlp.rlim_cur;
+#else
+ /* just guess ... */
+ return 1024;
+#endif
+}
+
void file_init(void)
{
- real_max_open_files = lp_max_open_files();
-
-#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
- {
- struct rlimit rlp;
- getrlimit(RLIMIT_NOFILE, &rlp);
- /* Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
- * account for the extra fd we need
- * as well as the log files and standard
- * handles etc. */
- rlp.rlim_cur = (real_max_open_files+MAX_OPEN_FUDGEFACTOR>rlp.rlim_max)?
- rlp.rlim_max:real_max_open_files+MAX_OPEN_FUDGEFACTOR;
- setrlimit(RLIMIT_NOFILE, &rlp);
- getrlimit(RLIMIT_NOFILE, &rlp);
- if(rlp.rlim_cur != (real_max_open_files + MAX_OPEN_FUDGEFACTOR))
- DEBUG(0,("file_init: Maximum number of open files requested per session \
-was %d, actual files available per session = %d\n",
- real_max_open_files, (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR ));
-
- DEBUG(2,("Maximum number of open files per session is %d\n",
- (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR));
-
- real_max_open_files = (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR;
- }
-#endif
+ int real_max_open_files, lim;
- file_bmap = bitmap_allocate(real_max_open_files);
+ lim = set_maxfiles();
+ lim = MIN(lim, lp_max_open_files());
+ real_max_open_files = lim - MAX_OPEN_FUDGEFACTOR;
+
+ file_bmap = bitmap_allocate(real_max_open_files);
+
if (!file_bmap) {
exit_server("out of memory in file_init");
}
-
+
/*
* Ensure that pipe_handle_oppset is set correctly.
*/