extern bool override_logfile;
extern struct winbindd_methods cache_methods;
+static struct winbindd_child *children = NULL;
+
/* Read some data from a client connection */
static NTSTATUS child_read_request(struct winbindd_cli_state *state)
req, struct wb_child_request_state);
struct tevent_req *subreq;
- if ((state->child->pid == 0) && (!fork_domain_child(state->child))) {
+ if ((state->child->sock == -1) && (!fork_domain_child(state->child))) {
tevent_req_error(req, errno);
return;
}
ret = wb_simple_trans_recv(subreq, state, &state->response, &err);
TALLOC_FREE(subreq);
if (ret == -1) {
+ /*
+ * The basic parent/child communication broke, close
+ * our socket
+ */
+ close(state->child->sock);
+ state->child->sock = -1;
+ DLIST_REMOVE(children, state->child);
tevent_req_error(req, err);
return;
}
"logname == NULL");
}
- child->domain = NULL;
+ child->sock = -1;
+ child->domain = domain;
child->table = table;
child->queue = tevent_queue_create(NULL, "winbind_child");
SMB_ASSERT(child->queue != NULL);
SMB_ASSERT(child->rpccli != NULL);
}
-struct winbindd_child *children = NULL;
-
void winbind_child_died(pid_t pid)
{
struct winbindd_child *child;
/* This will be re-added in fork_domain_child() */
DLIST_REMOVE(children, child);
-
- close(child->sock);
- child->sock = -1;
child->pid = 0;
}
TALLOC_CTX *mem_ctx;
const char *message;
struct server_id *sender;
-
+
DEBUG(5,("winbind_msg_onlinestatus received.\n"));
if (!data->data) {
if (mem_ctx == NULL) {
return;
}
-
+
message = collect_onlinestatus(mem_ctx);
if (message == NULL) {
talloc_destroy(mem_ctx);
logfilename))
return false;
+ /* Stop zombies in children */
+ CatchChild();
+
/* Don't handle the same messages as our parent. */
messaging_deregister(winbind_messaging_context(),
MSG_SMB_CONF_UPDATED, NULL);
DEBUG(10, ("Child process %d\n", (int)sys_getpid()));
- /* Stop zombies in children */
- CatchChild();
-
state.sock = fdpair[0];
close(fdpair[1]);
FD_ZERO(&r_fds);
FD_ZERO(&w_fds);
+
+ if (state.sock < 0 || state.sock >= FD_SETSIZE) {
+ TALLOC_FREE(frame);
+ perror("EBADF");
+ _exit(1);
+ }
+
FD_SET(state.sock, &r_fds);
maxfd = state.sock;
+ /*
+ * Initialize this high as event_add_to_select_args()
+ * uses a timeval_min() on this and next_event. Fix
+ * from Roel van Meer <rolek@alt001.com>.
+ */
+ t.tv_sec = 999999;
+ t.tv_usec = 0;
+
event_add_to_select_args(winbind_event_context(), &now,
&r_fds, &w_fds, &t, &maxfd);
tp = get_timed_events_timeout(winbind_event_context(), &t);