summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/lib/util.c12
-rw-r--r--source3/smbd/files.c20
-rw-r--r--source3/smbwrapper/smbw.c2
4 files changed, 25 insertions, 13 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 09fe5b0873..d563db3933 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -351,7 +351,7 @@ char *sid_to_string(pstring sidstr_out, DOM_SID *sid);
BOOL string_to_sid(DOM_SID *sidout, char *sidstr);
int str_checksum(const char *s);
void zero_free(void *p, size_t size);
-int set_maxfiles(void);
+int set_maxfiles(int requested_max);
/*The following definitions come from libsmb/clientgen.c */
@@ -1189,7 +1189,7 @@ BOOL trust_password_unlock(void);
BOOL trust_password_delete( char *domain, char *name );
BOOL get_trust_account_password( unsigned char *ret_pwd, time_t *pass_last_set_time);
BOOL set_trust_account_password( unsigned char *md4_new_pwd);
-BOOL trust_get_passwd( unsigned char trust_passwd[16], char *myname, char *domain);
+BOOL trust_get_passwd( unsigned char trust_passwd[16], char *domain, char *myname);
/*The following definitions come from printing/pcap.c */
diff --git a/source3/lib/util.c b/source3/lib/util.c
index c1307336cc..d0cb51f3ca 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -4849,9 +4849,9 @@ void zero_free(void *p, size_t size)
/*****************************************************************
-set our open file limit to the max and return the limit
+set our open file limit to a requested max and return the limit
*****************************************************************/
-int set_maxfiles(void)
+int set_maxfiles(int requested_max)
{
#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
struct rlimit rlp;
@@ -4860,13 +4860,15 @@ int set_maxfiles(void)
* account for the extra fd we need
* as well as the log files and standard
* handles etc. */
- rlp.rlim_cur = rlp.rlim_max;
+ rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
setrlimit(RLIMIT_NOFILE, &rlp);
getrlimit(RLIMIT_NOFILE, &rlp);
return rlp.rlim_cur;
#else
- /* just guess ... */
- return 1024;
+ /*
+ * No way to know - just guess...
+ */
+ return requested_max;
#endif
}
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 4030ad4c49..c369a45bab 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -202,13 +202,23 @@ initialise file structures
void file_init(void)
{
- int lim;
+ int request_max_open_files = lp_max_open_files();
+ int real_lim;
- lim = set_maxfiles();
- lim = MIN(lim, lp_max_open_files());
+ /*
+ * Set the max_open files to be the requested
+ * max plus a fudgefactor to allow for the extra
+ * fd's we need such as log files etc...
+ */
+ real_lim = set_maxfiles(request_max_open_files + MAX_OPEN_FUDGEFACTOR);
+
+ real_max_open_files = real_lim - MAX_OPEN_FUDGEFACTOR;
+
+ if(real_max_open_files != request_max_open_files) {
+ DEBUG(1,("file_init: Information only: requested %d \
+open files, %d are available.\n", request_max_open_files, real_max_open_files));
+ }
- real_max_open_files = lim - MAX_OPEN_FUDGEFACTOR;
-
file_bmap = bitmap_allocate(real_max_open_files);
if (!file_bmap) {
diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c
index d9ff6daa05..9c690ac5fb 100644
--- a/source3/smbwrapper/smbw.c
+++ b/source3/smbwrapper/smbw.c
@@ -100,7 +100,7 @@ void smbw_init(void)
}
smbw_busy--;
- set_maxfiles();
+ set_maxfiles(lp_max_open_files()+10);
errno = eno;
}