static struct messaging_context *ctx;
if (ctx == NULL) {
- ctx = messaging_init(NULL, server_id_self(),
+ ctx = messaging_init(NULL, procid_self(),
winbind_event_context());
}
if (ctx == NULL) {
}
}
+static void flush_caches_noinit(void)
+{
+ /*
+ * We need to invalidate cached user list entries on a SIGHUP
+ * otherwise cached access denied errors due to restrict anonymous
+ * hang around until the sequence number changes.
+ * NB
+ * Skip uninitialized domains when flush cache.
+ * If domain is not initialized, it means it is never
+ * used or never become online. look, wcache_invalidate_cache()
+ * -> get_cache() -> init_dc_connection(). It causes a lot of traffic
+ * for unused domains and large traffic for primay domain's DC if there
+ * are many domains..
+ */
+
+ if (!wcache_invalidate_cache_noinit()) {
+ DEBUG(0, ("invalidating the cache failed; revalidate the cache\n"));
+ if (!winbindd_cache_validate_and_initialize()) {
+ exit(1);
+ }
+ }
+}
+
/* Handle the signal by unlinking socket and exiting */
static void terminate(bool is_parent)
#endif
if (is_parent) {
+ serverid_deregister_self();
pidfile_unlink();
}
const char *file = (const char *)private_data;
DEBUG(1,("Reloading services after SIGHUP\n"));
- flush_caches();
+ flush_caches_noinit();
reload_services_file(file);
}
{
uint8 ret;
pid_t child_pid;
- struct sigaction act;
- struct sigaction oldact;
DEBUG(10, ("winbindd_msg_validate_cache: got validate-cache "
"message.\n"));
* so we don't block the main winbindd and the validation
* code can safely use fork/waitpid...
*/
- CatchChild();
child_pid = sys_fork();
if (child_pid == -1) {
/* child */
+ if (!winbindd_reinit_after_fork(NULL)) {
+ _exit(0);
+ }
+
/* install default SIGCHLD handler: validation code uses fork/waitpid */
- ZERO_STRUCT(act);
- act.sa_handler = SIG_DFL;
-#ifdef SA_RESTART
- /* We *want* SIGALRM to interrupt a system call. */
- act.sa_flags = SA_RESTART;
-#endif
- sigemptyset(&act.sa_mask);
- sigaddset(&act.sa_mask,SIGCHLD);
- sigaction(SIGCHLD,&act,&oldact);
+ CatchSignal(SIGCHLD, SIG_DFL);
ret = (uint8)winbindd_validate_cache_nobackup();
DEBUG(10, ("winbindd_msg_validata_cache: got return value %d\n", ret));
/* PAM auth functions */
- { WINBINDD_PAM_AUTH, winbindd_pam_auth, "PAM_AUTH" },
{ WINBINDD_PAM_AUTH_CRAP, winbindd_pam_auth_crap, "AUTH_CRAP" },
{ WINBINDD_PAM_CHAUTHTOK, winbindd_pam_chauthtok, "CHAUTHTOK" },
{ WINBINDD_PAM_LOGOFF, winbindd_pam_logoff, "PAM_LOGOFF" },
/* Credential cache access */
{ WINBINDD_CCACHE_NTLMAUTH, winbindd_ccache_ntlm_auth, "NTLMAUTH" },
+ { WINBINDD_CCACHE_SAVE, winbindd_ccache_save, "CCACHE_SAVE" },
/* WINS functions */
winbindd_check_machine_acct_send, winbindd_check_machine_acct_recv },
{ WINBINDD_PING_DC, "PING_DC",
winbindd_ping_dc_send, winbindd_ping_dc_recv },
+ { WINBINDD_PAM_AUTH, "PAM_AUTH",
+ winbindd_pam_auth_send, winbindd_pam_auth_recv },
{ 0, NULL, NULL, NULL }
};
/* Remember who asked us. */
state->pid = state->request->pid;
+ state->cmd_name = "unknown request";
+ state->recv_fn = NULL;
+
/* Process command */
for (atable = async_nonpriv_table; atable->send_req; atable += 1) {
if (atable->send_req != NULL) {
struct tevent_req *req;
- DEBUG(10, ("process_request: Handling async request %s\n",
- atable->cmd_name));
+ state->cmd_name = atable->cmd_name;
+ state->recv_fn = atable->recv_req;
+
+ DEBUG(10, ("process_request: Handling async request %d:%s\n",
+ (int)state->pid, state->cmd_name));
req = atable->send_req(state->mem_ctx, winbind_event_context(),
state, state->request);
return;
}
tevent_req_set_callback(req, wb_request_done, state);
- state->recv_fn = atable->recv_req;
return;
}
if (state->request->cmd == table->cmd) {
DEBUG(10,("process_request: request fn %s\n",
table->winbindd_cmd_name ));
+ state->cmd_name = table->winbindd_cmd_name;
table->fn(state);
break;
}
req, struct winbindd_cli_state);
NTSTATUS status;
- state->response = talloc_zero(state, struct winbindd_response);
+ state->response = talloc_zero(state->mem_ctx,
+ struct winbindd_response);
if (state->response == NULL) {
+ DEBUG(0, ("wb_request_done[%d:%s]: talloc_zero failed - removing client\n",
+ (int)state->pid, state->cmd_name));
remove_client(state);
return;
}
status = state->recv_fn(req, state->response);
TALLOC_FREE(req);
+
+ DEBUG(10,("wb_request_done[%d:%s]: %s\n",
+ (int)state->pid, state->cmd_name, nt_errstr(status)));
+
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(10, ("returning %s\n", nt_errstr(status)));
request_error(state);
return;
}
state->out_queue, state->sock,
state->response);
if (req == NULL) {
+ DEBUG(10,("request_finished[%d:%s]: wb_resp_write_send() failed\n",
+ (int)state->pid, state->cmd_name));
remove_client(state);
return;
}
if (ret == -1) {
close(state->sock);
state->sock = -1;
- DEBUG(2, ("Could not write response to client: %s\n",
- strerror(err)));
+ DEBUG(2, ("Could not write response[%d:%s] to client: %s\n",
+ (int)state->pid, state->cmd_name, strerror(err)));
remove_client(state);
return;
}
+ DEBUG(10,("winbind_client_response_written[%d:%s]: delivered response "
+ "to client\n", (int)state->pid, state->cmd_name));
+
TALLOC_FREE(state->mem_ctx);
state->response = NULL;
+ state->cmd_name = "no request";
+ state->recv_fn = NULL;
req = wb_req_read_send(state, winbind_event_context(), state->sock,
WINBINDD_MAX_EXTRA_DATA);
BlockSignals(False, SIGCHLD);
if (!interactive)
- become_daemon(Fork, no_process_group);
+ become_daemon(Fork, no_process_group, log_stdout);
pidfile_create("winbindd");
}
/* get broadcast messages */
- claim_connection(NULL,"",FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP);
+
+ if (!serverid_register_self(FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP)) {
+ DEBUG(1, ("Could not register myself in serverid.tdb\n"));
+ exit(1);
+ }
/* React on 'smbcontrol winbindd reload-config' in the same way
as to SIGHUP signal */