#include "winbindd.h"
#include "nsswitch/winbind_client.h"
#include "nsswitch/wb_reqtrans.h"
+#include "ntdomain.h"
#include "../librpc/gen_ndr/srv_lsa.h"
#include "../librpc/gen_ndr/srv_samr.h"
#include "secrets.h"
}
reopen_logs();
- ret = lp_load(get_dyn_CONFIGFILE(),False,False,True,True);
+ ret = lp_load_global(get_dyn_CONFIGFILE());
reopen_logs();
load_interfaces();
terminate(*is_parent);
}
+/*
+ handle stdin becoming readable when we are in --foreground mode
+ */
+static void winbindd_stdin_handler(struct tevent_context *ev,
+ struct tevent_fd *fde,
+ uint16_t flags,
+ void *private_data)
+{
+ char c;
+ if (read(0, &c, 1) != 1) {
+ bool *is_parent = talloc_get_type_abort(private_data, bool);
+
+ /* we have reached EOF on stdin, which means the
+ parent has exited. Shutdown the server */
+ DEBUG(0,("EOF on stdin (is_parent=%d)\n",
+ (int)*is_parent));
+ terminate(*is_parent);
+ }
+}
+
bool winbindd_setup_sig_term_handler(bool parent)
{
struct tevent_signal *se;
return true;
}
+bool winbindd_setup_stdin_handler(bool parent, bool foreground)
+{
+ bool *is_parent;
+
+ if (foreground) {
+ is_parent = talloc(winbind_event_context(), bool);
+ if (!is_parent) {
+ return false;
+ }
+
+ *is_parent = parent;
+
+ /* if we are running in the foreground then look for
+ EOF on stdin, and exit if it happens. This allows
+ us to die if the parent process dies
+ */
+ tevent_add_fd(winbind_event_context(), is_parent, 0, TEVENT_FD_READ, winbindd_stdin_handler, is_parent);
+ }
+
+ return true;
+}
+
static void winbindd_sig_hup_handler(struct tevent_context *ev,
struct tevent_signal *se,
int signum,
{ WINBINDD_CCACHE_NTLMAUTH, winbindd_ccache_ntlm_auth, "NTLMAUTH" },
{ WINBINDD_CCACHE_SAVE, winbindd_ccache_save, "CCACHE_SAVE" },
- /* WINS functions */
-
- { WINBINDD_WINS_BYNAME, winbindd_wins_byname, "WINS_BYNAME" },
- { WINBINDD_WINS_BYIP, winbindd_wins_byip, "WINS_BYIP" },
-
/* End of list */
{ WINBINDD_NUM_CMDS, NULL, "NONE" }
{ WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP, "PAM_CHNG_PSWD_AUTH_CRAP",
winbindd_pam_chng_pswd_auth_crap_send,
winbindd_pam_chng_pswd_auth_crap_recv },
+ { WINBINDD_WINS_BYIP, "WINS_BYIP",
+ winbindd_wins_byip_send, winbindd_wins_byip_recv },
+ { WINBINDD_WINS_BYNAME, "WINS_BYNAME",
+ winbindd_wins_byname_send, winbindd_wins_byname_recv },
{ 0, NULL, NULL, NULL }
};
/* Create new connection structure */
- if ((state = TALLOC_ZERO_P(NULL, struct winbindd_cli_state)) == NULL) {
+ if ((state = talloc_zero(NULL, struct winbindd_cli_state)) == NULL) {
close(sock);
return;
}
char *get_winbind_priv_pipe_dir(void)
{
- return lock_path(WINBINDD_PRIV_SOCKET_SUBDIR);
+ return state_path(WINBINDD_PRIV_SOCKET_SUBDIR);
}
static bool winbindd_setup_listeners(void)
struct winbindd_listen_state *pub_state = NULL;
struct winbindd_listen_state *priv_state = NULL;
struct tevent_fd *fde;
+ int rc;
pub_state = talloc(winbind_event_context(),
struct winbindd_listen_state);
if (pub_state->fd == -1) {
goto failed;
}
+ rc = listen(pub_state->fd, 5);
+ if (rc < 0) {
+ goto failed;
+ }
fde = tevent_add_fd(winbind_event_context(), pub_state, pub_state->fd,
TEVENT_FD_READ, winbindd_listen_fde_handler,
if (priv_state->fd == -1) {
goto failed;
}
+ rc = listen(priv_state->fd, 5);
+ if (rc < 0) {
+ goto failed;
+ }
fde = tevent_add_fd(winbind_event_context(), priv_state,
priv_state->fd, TEVENT_FD_READ,
return !opt_nocache;
}
-void winbindd_register_handlers(void)
+void winbindd_register_handlers(bool foreground)
{
/* Setup signal handlers */
if (!winbindd_setup_sig_term_handler(true))
exit(1);
+ if (!winbindd_setup_stdin_handler(true, foreground))
+ exit(1);
if (!winbindd_setup_sig_hup_handler(NULL))
exit(1);
if (!winbindd_setup_sig_chld_handler())
/* get broadcast messages */
if (!serverid_register(procid_self(),
- FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP)) {
+ FLAG_MSG_GENERAL |
+ FLAG_MSG_WINBIND |
+ FLAG_MSG_DBWRAP)) {
DEBUG(1, ("Could not register myself in serverid.tdb\n"));
exit(1);
}
talloc_enable_null_tracking();
frame = talloc_stackframe();
+ setup_logging("winbindd", DEBUG_DEFAULT_STDOUT);
+
/* glibc (?) likes to print "User defined signal 1" and exit if a
SIGUSR[12] is received before a handler is installed */
SAFE_FREE(lfile);
}
}
+
if (log_stdout) {
setup_logging("winbindd", DEBUG_STDOUT);
} else {
mkdir(lp_lockdir(), 0755);
}
+ if (!directory_exist(lp_piddir())) {
+ mkdir(lp_piddir(), 0755);
+ }
+
/* Setup names. */
if (!init_names())
status = reinit_after_fork(winbind_messaging_context(),
winbind_event_context(),
- procid_self(), false);
+ false);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("reinit_after_fork() failed\n"));
exit(1);
}
- winbindd_register_handlers();
+ winbindd_register_handlers(!Fork);
status = init_system_info();
if (!NT_STATUS_IS_OK(status)) {