#include "lib/cmdline/popt_common.h"
#include "system/dir.h"
#include "system/filesys.h"
-#include "build.h"
-#include "ldb/include/ldb.h"
-#include "registry/registry.h"
#include "ntvfs/ntvfs.h"
#include "ntptr/ntptr.h"
#include "auth/gensec/gensec.h"
+#include "auth/gensec/schannel_state.h"
#include "smbd/process_model.h"
-#include "smbd/service.h"
#include "param/secrets.h"
#include "smbd/pidfile.h"
-#include "cluster/ctdb/ctdb_cluster.h"
+#include "param/param.h"
+#include "dsdb/samdb/samdb.h"
+#include "auth/session.h"
+#include "lib/messaging/irpc.h"
+#include "librpc/gen_ndr/ndr_irpc.h"
+#include "cluster/cluster.h"
/*
recursively delete a directory tree
range locking system. So instead of putting the burden on tdb to
cleanup tmp files, this function deletes them.
*/
-static void cleanup_tmp_files(void)
+static void cleanup_tmp_files(struct loadparm_context *lp_ctx)
{
char *path;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
- path = smbd_tmp_path(mem_ctx, NULL);
+ path = smbd_tmp_path(mem_ctx, lp_ctx, NULL);
recursive_delete(path);
talloc_free(mem_ctx);
kill(-getpgrp(), SIGTERM);
}
#endif
+ DEBUG(0,("Exiting pid %d on SIGTERM\n", (int)getpid()));
exit(0);
}
static void setup_signals(void)
{
/* we are never interested in SIGPIPE */
- BlockSignals(True,SIGPIPE);
+ BlockSignals(true,SIGPIPE);
#if defined(SIGFPE)
/* we are never interested in SIGFPE */
- BlockSignals(True,SIGFPE);
+ BlockSignals(true,SIGFPE);
#endif
/* We are no longer interested in USR1 */
- BlockSignals(True, SIGUSR1);
+ BlockSignals(true, SIGUSR1);
#if defined(SIGUSR2)
/* We are no longer interested in USR2 */
- BlockSignals(True,SIGUSR2);
+ BlockSignals(true,SIGUSR2);
#endif
/* POSIX demands that signals are inherited. If the invoking process has
* these signals masked, we will have problems, as we won't recieve them. */
- BlockSignals(False, SIGHUP);
- BlockSignals(False, SIGTERM);
+ BlockSignals(false, SIGHUP);
+ BlockSignals(false, SIGTERM);
CatchSignal(SIGHUP, sig_hup);
CatchSignal(SIGTERM, sig_term);
/*
handle io on stdin
*/
-static void server_stdin_handler(struct event_context *event_ctx, struct fd_event *fde,
- uint16_t flags, void *private)
+static void server_stdin_handler(struct tevent_context *event_ctx, struct tevent_fd *fde,
+ uint16_t flags, void *private_data)
{
- const char *binary_name = private;
+ const char *binary_name = (const char *)private_data;
uint8_t c;
if (read(0, &c, 1) == 0) {
DEBUG(0,("%s: EOF on stdin - terminating\n", binary_name));
#if HAVE_GETPGRP
if (getpgrp() == getpid()) {
+ DEBUG(0,("Sending SIGTERM from pid %d\n", (int)getpid()));
kill(-getpgrp(), SIGTERM);
}
#endif
/*
die if the user selected maximum runtime is exceeded
*/
-_NORETURN_ static void max_runtime_handler(struct event_context *ev, struct timed_event *te,
- struct timeval t, void *private)
+_NORETURN_ static void max_runtime_handler(struct tevent_context *ev,
+ struct tevent_timer *te,
+ struct timeval t, void *private_data)
{
- const char *binary_name = private;
+ const char *binary_name = (const char *)private_data;
DEBUG(0,("%s: maximum runtime exceeded - terminating\n", binary_name));
exit(0);
}
+/*
+ pre-open the key databases. This saves a lot of time in child
+ processes
+ */
+static void prime_ldb_databases(struct tevent_context *event_ctx)
+{
+ TALLOC_CTX *db_context;
+ db_context = talloc_new(event_ctx);
+
+ samdb_connect(db_context, event_ctx, cmdline_lp_ctx, system_session(cmdline_lp_ctx));
+ privilege_connect(db_context, event_ctx, cmdline_lp_ctx);
+ schannel_db_connect(db_context, event_ctx, cmdline_lp_ctx);
+
+ /* we deliberately leave these open, which allows them to be
+ * re-used in ldb_wrap_connect() */
+}
+
+
+/*
+ called when a fatal condition occurs in a child task
+ */
+static NTSTATUS samba_terminate(struct irpc_message *msg,
+ struct samba_terminate *r)
+{
+ DEBUG(0,("samba_terminate: %s\n", r->in.reason));
+ exit(1);
+}
+
+/*
+ setup messaging for the top level samba (parent) task
+ */
+static NTSTATUS setup_parent_messaging(struct tevent_context *event_ctx,
+ struct loadparm_context *lp_ctx)
+{
+ struct messaging_context *msg;
+ NTSTATUS status;
+
+ msg = messaging_init(talloc_autofree_context(),
+ lp_messaging_path(event_ctx, lp_ctx),
+ cluster_id(0, SAMBA_PARENT_TASKID),
+ lp_iconv_convenience(lp_ctx),
+ event_ctx);
+ NT_STATUS_HAVE_NO_MEMORY(msg);
+
+ irpc_add_name(msg, "samba");
+
+ status = IRPC_REGISTER(msg, irpc, SAMBA_TERMINATE,
+ samba_terminate, NULL);
+
+ return status;
+}
+
+
+
/*
main server.
*/
bool opt_interactive = false;
int opt;
poptContext pc;
- init_module_fn static_init[] = STATIC_service_MODULES;
+ extern NTSTATUS server_service_wrepl_init(void);
+ extern NTSTATUS server_service_kdc_init(void);
+ extern NTSTATUS server_service_ldap_init(void);
+ extern NTSTATUS server_service_web_init(void);
+ extern NTSTATUS server_service_ldap_init(void);
+ extern NTSTATUS server_service_winbind_init(void);
+ extern NTSTATUS server_service_nbtd_init(void);
+ extern NTSTATUS server_service_auth_init(void);
+ extern NTSTATUS server_service_cldapd_init(void);
+ extern NTSTATUS server_service_smb_init(void);
+ extern NTSTATUS server_service_drepl_init(void);
+ extern NTSTATUS server_service_kcc_init(void);
+ extern NTSTATUS server_service_dnsupdate_init(void);
+ extern NTSTATUS server_service_rpc_init(void);
+ extern NTSTATUS server_service_ntp_signd_init(void);
+ extern NTSTATUS server_service_samba3_smb_init(void);
+ init_module_fn static_init[] = { STATIC_service_MODULES };
init_module_fn *shared_init;
- struct event_context *event_ctx;
+ struct tevent_context *event_ctx;
+ uint16_t stdin_event_flags;
NTSTATUS status;
const char *model = "standard";
int max_runtime = 0;
model = poptGetOptArg(pc);
break;
default:
- d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
+ fprintf(stderr, "\nInvalid option %s: %s\n\n",
poptBadOption(pc, 0), poptStrerror(opt));
poptPrintUsage(pc, stderr, 0);
- exit(1);
+ return 1;
}
}
if (opt_daemon && opt_interactive) {
- d_fprintf(stderr,"\nERROR: "
+ fprintf(stderr,"\nERROR: "
"Option -i|--interactive is not allowed together with -D|--daemon\n\n");
poptPrintUsage(pc, stderr, 0);
- exit(1);
+ return 1;
} else if (!opt_interactive) {
/* default is --daemon */
opt_daemon = true;
umask(0);
DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
- DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2007\n"));
+ DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2010\n"));
if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
DEBUGADD(0,("sizeof(uint16_t) = %u, sizeof(uint32_t) %u, sizeof(uint64_t) = %u\n",
(unsigned int)sizeof(uint16_t), (unsigned int)sizeof(uint32_t), (unsigned int)sizeof(uint64_t)));
- exit(1);
+ return 1;
}
if (opt_daemon) {
DEBUG(3,("Becoming a daemon.\n"));
- become_daemon(true);
+ become_daemon(true, false);
}
- cleanup_tmp_files();
+ cleanup_tmp_files(cmdline_lp_ctx);
- if (!directory_exist(lp_lockdir())) {
- mkdir(lp_lockdir(), 0755);
+ if (!directory_exist(lp_lockdir(cmdline_lp_ctx))) {
+ mkdir(lp_lockdir(cmdline_lp_ctx), 0755);
}
- pidfile_create(binary_name);
+ pidfile_create(lp_piddir(cmdline_lp_ctx), binary_name);
/* Do *not* remove this, until you have removed
* passdb/secrets.c, and proved that Samba still builds... */
/* Setup the SECRETS subsystem */
- if (!secrets_init()) {
- exit(1);
+ if (secrets_init(talloc_autofree_context(), cmdline_lp_ctx) == NULL) {
+ return 1;
}
- ldb_global_init(); /* FIXME: */
-
- share_init();
-
- gensec_init(); /* FIXME: */
+ gensec_init(cmdline_lp_ctx); /* FIXME: */
- ntptr_init(); /* FIXME: maybe run this in the initialization function
+ ntptr_init(cmdline_lp_ctx); /* FIXME: maybe run this in the initialization function
of the spoolss RPC server instead? */
- ntvfs_init(); /* FIXME: maybe run this in the initialization functions
+ ntvfs_init(cmdline_lp_ctx); /* FIXME: maybe run this in the initialization functions
of the SMB[,2] server instead? */
- process_model_init();
+ process_model_init(cmdline_lp_ctx);
- shared_init = load_samba_modules(NULL, "service");
+ shared_init = load_samba_modules(NULL, cmdline_lp_ctx, "service");
run_init_functions(static_init);
run_init_functions(shared_init);
/* the event context is the top level structure in smbd. Everything else
should hang off that */
- event_ctx = event_context_init(talloc_autofree_context());
+ event_ctx = s4_event_context_init(talloc_autofree_context());
- /* initialise clustering if needed */
- cluster_ctdb_init(event_ctx, model);
+ /* setup this as the default context */
+ s4_event_context_set_default(event_ctx);
+
+ if (event_ctx == NULL) {
+ DEBUG(0,("Initializing event context failed\n"));
+ return 1;
+ }
if (opt_interactive) {
- /* catch EOF on stdin */
+ /* terminate when stdin goes away */
+ stdin_event_flags = TEVENT_FD_READ;
+ } else {
+ /* stay alive forever */
+ stdin_event_flags = 0;
+ }
+
+ /* catch EOF on stdin */
#ifdef SIGTTIN
- signal(SIGTTIN, SIG_IGN);
+ signal(SIGTTIN, SIG_IGN);
#endif
- event_add_fd(event_ctx, event_ctx, 0, EVENT_FD_READ,
- server_stdin_handler,
- discard_const(binary_name));
+ tevent_add_fd(event_ctx, event_ctx, 0, stdin_event_flags,
+ server_stdin_handler,
+ discard_const(binary_name));
+
+ if (max_runtime) {
+ tevent_add_timer(event_ctx, event_ctx,
+ timeval_current_ofs(max_runtime, 0),
+ max_runtime_handler,
+ discard_const(binary_name));
}
+ prime_ldb_databases(event_ctx);
- if (max_runtime) {
- event_add_timed(event_ctx, event_ctx,
- timeval_current_ofs(max_runtime, 0),
- max_runtime_handler,
- discard_const(binary_name));
+ status = setup_parent_messaging(event_ctx, cmdline_lp_ctx);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("Failed to setup parent messaging - %s\n", nt_errstr(status)));
+ return 1;
}
DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
- status = server_service_startup(event_ctx, model, lp_server_services());
+
+ status = server_service_startup(event_ctx, cmdline_lp_ctx, model,
+ lp_server_services(cmdline_lp_ctx));
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Starting Services failed - %s\n", nt_errstr(status)));
return 1;
/* wait for events - this is where smbd sits for most of its
life */
- event_loop_wait(event_ctx);
+ tevent_loop_wait(event_ctx);
/* as everything hangs off this event context, freeing it
should initiate a clean shutdown of all services */
return 0;
}
- int main(int argc, const char *argv[])
+int main(int argc, const char *argv[])
{
- return binary_smbd_main("smbd", argc, argv);
+ return binary_smbd_main("samba", argc, argv);
}