summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/change_trust_pw.c3
-rw-r--r--source3/smbd/chgpasswd.c6
-rw-r--r--source3/smbd/open.c10
-rw-r--r--source3/smbd/server.c49
4 files changed, 37 insertions, 31 deletions
diff --git a/source3/smbd/change_trust_pw.c b/source3/smbd/change_trust_pw.c
index 4773eeff86..227b2d6899 100644
--- a/source3/smbd/change_trust_pw.c
+++ b/source3/smbd/change_trust_pw.c
@@ -82,7 +82,8 @@ NTSTATUS change_trust_account_password( const char *domain, const char *remote_m
goto failed;
}
- nt_status = trust_pw_find_change_and_store_it(netlogon_pipe, netlogon_pipe->mem_ctx, domain);
+ nt_status = trust_pw_find_change_and_store_it(
+ netlogon_pipe, netlogon_pipe, domain);
cli_shutdown(cli);
cli = NULL;
diff --git a/source3/smbd/chgpasswd.c b/source3/smbd/chgpasswd.c
index b2b082363f..2596e73380 100644
--- a/source3/smbd/chgpasswd.c
+++ b/source3/smbd/chgpasswd.c
@@ -249,6 +249,7 @@ static int expect(int master, char *issue, char *expected)
bool match = False;
for (attempts = 0; attempts < 2; attempts++) {
+ NTSTATUS status;
if (!strequal(issue, ".")) {
if (lp_passwd_chat_debug())
DEBUG(100, ("expect: sending [%s]\n", issue));
@@ -269,7 +270,6 @@ static int expect(int master, char *issue, char *expected)
buffer[nread] = 0;
while (True) {
- NTSTATUS status;
status = read_socket_with_timeout(
master, buffer + nread, 1,
sizeof(buffer) - nread - 1,
@@ -305,8 +305,8 @@ static int expect(int master, char *issue, char *expected)
if (match)
break;
- if (len < 0) {
- DEBUG(2, ("expect: %s\n", strerror(errno)));
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(2, ("expect: %s\n", nt_errstr(status)));
return False;
}
}
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index f3ed234c87..0d1dd31cd6 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -72,13 +72,21 @@ static NTSTATUS fd_open(struct connection_struct *conn,
NTSTATUS fd_close(files_struct *fsp)
{
+ int ret;
+
if (fsp->fh->fd == -1) {
return NT_STATUS_OK; /* What we used to call a stat open. */
}
if (fsp->fh->ref_count > 1) {
return NT_STATUS_OK; /* Shared handle. Only close last reference. */
}
- return fd_close_posix(fsp);
+
+ ret = SMB_VFS_CLOSE(fsp);
+ fsp->fh->fd = -1;
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ return NT_STATUS_OK;
}
/****************************************************************************
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index b71d6271f2..59bbfdbc17 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -575,8 +575,6 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
MSG_SMB_INJECT_FAULT, msg_inject_fault);
#endif
- db_tdb2_setup_messaging(smbd_messaging_context(), true);
-
/* now accept incoming connections - forking a new process
for each incoming connection */
DEBUG(2,("waiting for a connection\n"));
@@ -741,17 +739,9 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
sizeof(remaddr)),
false);
- /* Reset the state of the random
- * number generation system, so
- * children do not get the same random
- * numbers as each other */
-
- set_need_random_reseed();
- /* tdb needs special fork handling - remove
- * CLEAR_IF_FIRST flags */
- if (tdb_reopen_all(1) == -1) {
- DEBUG(0,("tdb_reopen_all failed.\n"));
- smb_panic("tdb_reopen_all failed");
+ if (!reinit_after_fork(smbd_messaging_context())) {
+ DEBUG(0,("reinit_after_fork() failed\n"));
+ smb_panic("reinit_after_fork() failed");
}
return True;
@@ -1103,6 +1093,8 @@ extern void build_options(bool screen);
TimeInit();
+ db_tdb2_setup_messaging(NULL, false);
+
#ifdef HAVE_SET_AUTH_PARAMETERS
set_auth_parameters(argc,argv);
#endif
@@ -1226,10 +1218,18 @@ extern void build_options(bool screen);
exit(1);
}
+ if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
+ DEBUG(0, ("error opening config file\n"));
+ exit(1);
+ }
+
+ if (smbd_messaging_context() == NULL)
+ exit(1);
+
/*
* Do this before reload_services.
*/
- db_tdb2_setup_messaging(NULL, false);
+ db_tdb2_setup_messaging(smbd_messaging_context(), true);
if (!reload_services(False))
return(-1);
@@ -1285,10 +1285,12 @@ extern void build_options(bool screen);
if (is_daemon)
pidfile_create("smbd");
- /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
-
- if (smbd_messaging_context() == NULL)
+ if (!reinit_after_fork(smbd_messaging_context())) {
+ DEBUG(0,("reinit_after_fork() failed\n"));
exit(1);
+ }
+
+ /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
if (smbd_memcache() == NULL) {
exit(1);
@@ -1344,8 +1346,10 @@ extern void build_options(bool screen);
smbd is launched via inetd and we fork a copy of
ourselves here */
- if ( is_daemon && !interactive )
- start_background_queue();
+ if (is_daemon && !interactive
+ && lp_parm_bool(-1, "smbd", "backgroundqueue", true)) {
+ start_background_queue();
+ }
if (!open_sockets_smbd(is_daemon, interactive, ports))
exit(1);
@@ -1382,13 +1386,6 @@ extern void build_options(bool screen);
/* Setup aio signal handler. */
initialize_async_io_handler();
- /*
- * For clustering, we need to re-init our ctdbd connection after the
- * fork
- */
- if (!NT_STATUS_IS_OK(messaging_reinit(smbd_messaging_context())))
- exit(1);
-
/* register our message handlers */
messaging_register(smbd_messaging_context(), NULL,
MSG_SMB_FORCE_TDIS, msg_force_tdis);