{
static struct messaging_context *ctx;
- if (!ctx && !(ctx = messaging_init(NULL, server_id_self(),
- winbind_event_context()))) {
- smb_panic("Could not init winbind messaging context");
+ if (ctx == NULL) {
+ ctx = messaging_init(NULL, server_id_self(),
+ winbind_event_context());
+ }
+ if (ctx == NULL) {
+ DEBUG(0, ("Could not init winbind messaging context.\n"));
}
return ctx;
}
/* Reload configuration */
-static bool reload_services_file(void)
+static bool reload_services_file(const char *logfile)
{
bool ret;
}
}
+ /* if this is a child, restore the logfile to the special
+ name - <domain>, idmap, etc. */
+ if (logfile && *logfile) {
+ lp_set_logfile(logfile);
+ }
+
reopen_logs();
ret = lp_load(get_dyn_CONFIGFILE(),False,False,True,True);
if (!wcache_invalidate_cache()) {
DEBUG(0, ("invalidating the cache failed; revalidate the cache\n"));
- /* Close the cache to be able to valdite the cache */
- close_winbindd_cache();
- /*
- * Ensure all cache and idmap caches are consistent
- * before we initialize the cache again.
- */
- if (winbindd_validate_cache() < 0) {
- DEBUG(0, ("winbindd cache tdb corrupt and no backup "
- "could be restore.\n"));
- }
-
- /* Initialize cache again. */
- if (!initialize_winbindd_cache()) {
+ if (!winbindd_cache_validate_and_initialize()) {
exit(1);
}
}
/* Handle the signal by unlinking socket and exiting */
-static void terminate(void)
+static void terminate(bool is_parent)
{
- char *path = NULL;
-
- /* Remove socket file */
- if (asprintf(&path, "%s/%s",
+ if (is_parent) {
+ /* When parent goes away we should
+ * remove the socket file. Not so
+ * when children terminate.
+ */
+ char *path = NULL;
+
+ if (asprintf(&path, "%s/%s",
get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME) > 0) {
- unlink(path);
- SAFE_FREE(path);
+ unlink(path);
+ SAFE_FREE(path);
+ }
}
idmap_close();
{
/* Flush various caches */
flush_caches();
- reload_services_file();
+ reload_services_file((const char *) private_data);
}
/* React on 'smbcontrol winbindd shutdown' in the same way as on SIGTERM*/
{ WINBINDD_SID_TO_GID, winbindd_sid_to_gid, "SID_TO_GID" },
{ WINBINDD_UID_TO_SID, winbindd_uid_to_sid, "UID_TO_SID" },
{ WINBINDD_GID_TO_SID, winbindd_gid_to_sid, "GID_TO_SID" },
-#if 0 /* DISABLED until we fix the interface in Samba 3.0.26 --jerry */
- { WINBINDD_SIDS_TO_XIDS, winbindd_sids_to_unixids, "SIDS_TO_XIDS" },
-#endif /* end DISABLED */
{ WINBINDD_ALLOCATE_UID, winbindd_allocate_uid, "ALLOCATE_UID" },
{ WINBINDD_ALLOCATE_GID, winbindd_allocate_gid, "ALLOCATE_GID" },
{ WINBINDD_SET_MAPPING, winbindd_set_mapping, "SET_MAPPING" },
static void request_recv(void *private_data, bool success);
static void request_main_recv(void *private_data, bool success);
static void request_finished(struct winbindd_cli_state *state);
-void request_finished_cont(void *private_data, bool success);
static void response_main_sent(void *private_data, bool success);
static void response_extra_sent(void *private_data, bool success);
struct winbindd_cli_state *state =
talloc_get_type_abort(private_data, struct winbindd_cli_state);
- if (state->mem_ctx != NULL) {
- talloc_destroy(state->mem_ctx);
- state->mem_ctx = NULL;
- }
+ TALLOC_FREE(state->mem_ctx);
if (!success) {
state->finished = True;
}
if (state->response.length == sizeof(state->response)) {
- if (state->mem_ctx != NULL) {
- talloc_destroy(state->mem_ctx);
- state->mem_ctx = NULL;
- }
+ TALLOC_FREE(state->mem_ctx);
setup_async_read(&state->fd_event, &state->request,
sizeof(uint32), request_len_recv, state);
request_finished(state);
}
-void request_finished_cont(void *private_data, bool success)
-{
- struct winbindd_cli_state *state =
- talloc_get_type_abort(private_data, struct winbindd_cli_state);
-
- if (success)
- request_ok(state);
- else
- request_error(state);
-}
-
static void request_len_recv(void *private_data, bool success)
{
struct winbindd_cli_state *state =
SAFE_FREE(state->response.extra_data.data);
- if (state->mem_ctx != NULL) {
- talloc_destroy(state->mem_ctx);
- state->mem_ctx = NULL;
- }
+ TALLOC_FREE(state->mem_ctx);
remove_fd_event(&state->fd_event);
return False;
}
+/* check if HUP has been received and reload files */
+void winbind_check_sighup(const char *logfile)
+{
+ if (do_sighup) {
+
+ DEBUG(3, ("got SIGHUP\n"));
+
+ flush_caches();
+ reload_services_file(logfile);
+
+ do_sighup = False;
+ }
+}
+
+/* check if TERM has been received */
+void winbind_check_sigterm(bool is_parent)
+{
+ if (do_sigterm)
+ terminate(is_parent);
+}
+
/* Process incoming clients on listen_sock. We use a tricky non-blocking,
non-forking, non-threaded model which allows us to handle many
simultaneous connections while remaining impervious to many denial of
/* Check signal handling things */
- if (do_sigterm)
- terminate();
-
- if (do_sighup) {
-
- DEBUG(3, ("got SIGHUP\n"));
-
- flush_caches();
- reload_services_file();
-
- do_sighup = False;
- }
+ winbind_check_sigterm(true);
+ winbind_check_sighup(NULL);
if (do_sigusr2) {
print_winbindd_status();
DEBUG(0,("winbindd version %s started.\n", SAMBA_VERSION_STRING));
DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
- if (!reload_services_file()) {
+ if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
+ DEBUG(0, ("error opening config file\n"));
+ exit(1);
+ }
+
+ /* Initialise messaging system */
+
+ if (winbind_messaging_context() == NULL) {
+ exit(1);
+ }
+
+ if (!reload_services_file(NULL)) {
DEBUG(0, ("error opening config file\n"));
exit(1);
}
namecache_enable();
- /* Winbind daemon initialisation */
-
- if ( ! NT_STATUS_IS_OK(idmap_init_cache()) ) {
- DEBUG(1, ("Could not init idmap cache!\n"));
- }
-
/* Unblock all signals we are interested in as they may have been
blocked by the parent process. */
TimeInit();
- /* Initialise messaging system */
-
- if (winbind_messaging_context() == NULL) {
- DEBUG(0, ("unable to initialize messaging system\n"));
+ if (!reinit_after_fork(winbind_messaging_context(), false)) {
+ DEBUG(0,("reinit_after_fork() failed\n"));
exit(1);
}
/*
* Ensure all cache and idmap caches are consistent
- * before we startup.
+ * and initialized before we startup.
*/
- if (winbindd_validate_cache() < 0) {
- DEBUG(0, ("corrupted tdb found, trying to restore backup\n"));
- }
-
- /* Initialize cache (ensure version is correct). */
- if (!initialize_winbindd_cache()) {
+ if (!winbindd_cache_validate_and_initialize()) {
exit(1);
}
+ /* get broadcast messages */
+ claim_connection(NULL,"",FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP);
+
/* React on 'smbcontrol winbindd reload-config' in the same way
as to SIGHUP signal */
messaging_register(winbind_messaging_context(), NULL,
MSG_WINBIND_DUMP_DOMAIN_LIST,
winbind_msg_dump_domain_list);
+ /* Register handler for MSG_DEBUG. */
+ messaging_register(winbind_messaging_context(), NULL,
+ MSG_DEBUG,
+ winbind_msg_debug);
+
netsamlogon_cache_init(); /* Non-critical */
/* clear the cached list of trusted domains */
wcache_tdc_clear();
if (!init_domain_list()) {
- DEBUG(0,("unable to initalize domain list\n"));
+ DEBUG(0,("unable to initialize domain list\n"));
exit(1);
}