extern bool override_logfile;
+struct tevent_context *winbind_event_context(void)
+{
+ static struct tevent_context *ev = NULL;
+
+ if (ev != NULL) {
+ return ev;
+ }
+
+ /*
+ * Note we MUST use the NULL context here, not the autofree context,
+ * to avoid side effects in forked children exiting.
+ */
+ ev = samba_tevent_context_init(NULL);
+ if (ev == NULL) {
+ smb_panic("Could not init winbindd's messaging context.\n");
+ }
+ return ev;
+}
+
struct messaging_context *winbind_messaging_context(void)
{
- struct messaging_context *msg_ctx = server_messaging_context();
- if (likely(msg_ctx != NULL)) {
- return msg_ctx;
+ static struct messaging_context *msg = NULL;
+
+ if (msg != NULL) {
+ return msg;
}
- smb_panic("Could not init winbindd's messaging context.\n");
- return NULL;
+
+ /*
+ * Note we MUST use the NULL context here, not the autofree context,
+ * to avoid side effects in forked children exiting.
+ */
+ msg = messaging_init(NULL, winbind_event_context());
+ if (msg == NULL) {
+ smb_panic("Could not init winbindd's messaging context.\n");
+ }
+ return msg;
}
/* Reload configuration */
char *path = NULL;
if (asprintf(&path, "%s/%s",
- get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME) > 0) {
+ lp_winbindd_socket_directory(), WINBINDD_SOCKET_NAME) > 0) {
unlink(path);
SAFE_FREE(path);
}
#endif
if (is_parent) {
- serverid_deregister(procid_self());
+ struct messaging_context *msg = winbind_messaging_context();
+ struct server_id self = messaging_server_id(msg);
+ serverid_deregister(self);
pidfile_unlink(lp_piddir(), "winbindd");
}
bool *is_parent;
if (foreground) {
+ struct stat st;
+
is_parent = talloc(winbind_event_context(), bool);
if (!is_parent) {
return false;
/* 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
+ Only do this on a pipe or socket, no other device.
*/
- tevent_add_fd(winbind_event_context(), is_parent, 0, TEVENT_FD_READ, winbindd_stdin_handler, is_parent);
+ if (fstat(0, &st) != 0) {
+ return false;
+ }
+ if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
+ tevent_add_fd(winbind_event_context(),
+ is_parent,
+ 0,
+ TEVENT_FD_READ,
+ winbindd_stdin_handler,
+ is_parent);
+ }
}
return true;
* Winbindd socket accessor functions
*/
-const char *get_winbind_pipe_dir(void)
-{
- return lp_parm_const_string(-1, "winbindd", "socket dir", get_dyn_WINBINDD_SOCKET_DIR());
-}
-
char *get_winbind_priv_pipe_dir(void)
{
return state_path(WINBINDD_PRIV_SOCKET_SUBDIR);
pub_state->privileged = false;
pub_state->fd = create_pipe_sock(
- get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755);
+ lp_winbindd_socket_directory(), WINBINDD_SOCKET_NAME, 0755);
if (pub_state->fd == -1) {
goto failed;
}
messaging_register(msg_ctx, NULL,
MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus);
+ /* Handle domain online/offline messages for domains */
+ messaging_register(winbind_messaging_context(), NULL,
+ MSG_WINBIND_DOMAIN_OFFLINE, winbind_msg_domain_offline);
+ messaging_register(winbind_messaging_context(), NULL,
+ MSG_WINBIND_DOMAIN_ONLINE, winbind_msg_domain_online);
+
messaging_register(msg_ctx, NULL,
MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list);
talloc_enable_null_tracking();
frame = talloc_stackframe();
+ /*
+ * We want total control over the permissions on created files,
+ * so set our umask to 0.
+ */
+ umask(0);
+
setup_logging("winbindd", DEBUG_DEFAULT_STDOUT);
/* glibc (?) likes to print "User defined signal 1" and exit if a