The branch, master has been updated via d33c41f... s3:winbindd move reinit_after_fork() back out of winbindd_register_handlers via 19f4229... s3:winbind Make state->mem_ctx a talloc child of state via 61eb56b... s3:winbind tidy up connecting the winbind sockets. via e5ebc52... Revert "s3:winbindd Split helper functions to allow s3compat to call them" from fca69a9... s3-netlogon: Fix crash bug in _netr_NetrEnumerateTrustedDomains().
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d33c41fbf5bd48fe32d82174d8bd25d1651ee374 Author: Andrew Bartlett <abart...@samba.org> Date: Thu May 13 17:07:15 2010 +1000 s3:winbindd move reinit_after_fork() back out of winbindd_register_handlers This particular init function needs to be done in a native Samba3 build, but it turns out to be difficult for s3compat, which has other code listening on the sockets. Andrew Bartlett commit 19f4229fff0f0e350d0eb6e91f674c48c744d214 Author: Andrew Bartlett <abart...@samba.org> Date: Mon May 24 10:11:23 2010 +1000 s3:winbind Make state->mem_ctx a talloc child of state This way everything is destoryed at the conclusion of the connection correctly. Andrew Bartlett Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 61eb56be4ea1f4eb26f63b985aeb52cdb1183328 Author: Andrew Bartlett <abart...@samba.org> Date: Mon May 17 19:34:32 2010 +1000 s3:winbind tidy up connecting the winbind sockets. By putting this code inline in winbindd_setup_listeners() we remove 2 static variables and simplify the code. By putting the get_winbind_priv_pipe_dir() in the same file, we allow it to be reimplemented in s3compat. Andrew Bartlett Signed-off-by: Stefan Metzmacher <me...@samba.org> commit e5ebc52e9fd45346a74e2c421f2471b5e6cab998 Author: Andrew Bartlett <abart...@samba.org> Date: Fri May 14 13:11:48 2010 +1000 Revert "s3:winbindd Split helper functions to allow s3compat to call them" I'm experimenting with a different entry point This reverts commit f5c0f90da5f5372ca6b7a72daa8d073a2444a068. ----------------------------------------------------------------------- Summary of changes: source3/winbindd/winbindd.c | 97 ++++++++++++++++++++----------------- source3/winbindd/winbindd_proto.h | 7 +-- source3/winbindd/winbindd_util.c | 43 ---------------- 3 files changed, 55 insertions(+), 92 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 1c87a14..fcd3145 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -574,7 +574,7 @@ static void process_request(struct winbindd_cli_state *state) struct winbindd_dispatch_table *table = dispatch_table; struct winbindd_async_dispatch_table *atable; - state->mem_ctx = talloc_init("winbind request"); + state->mem_ctx = talloc_named(state, 0, "winbind request"); if (state->mem_ctx == NULL) return; @@ -763,23 +763,40 @@ void request_ok(struct winbindd_cli_state *state) /* Process a new connection by adding it to the client connection list */ -void winbindd_accepted_new_connection(int accepted_sock, bool privileged) +static void new_connection(int listen_sock, bool privileged) { + struct sockaddr_un sunaddr; struct winbindd_cli_state *state; struct tevent_req *req; + socklen_t len; + int sock; + + /* Accept connection */ + + len = sizeof(sunaddr); + + do { + sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr, + &len); + } while (sock == -1 && errno == EINTR); + + if (sock == -1) + return; + + DEBUG(6,("accepted socket %d\n", sock)); /* Create new connection structure */ if ((state = TALLOC_ZERO_P(NULL, struct winbindd_cli_state)) == NULL) { - close(accepted_sock); + close(sock); return; } - state->sock = accepted_sock; + state->sock = sock; state->out_queue = tevent_queue_create(state, "winbind client reply"); if (state->out_queue == NULL) { - close(accepted_sock); + close(sock); TALLOC_FREE(state); return; } @@ -792,40 +809,16 @@ void winbindd_accepted_new_connection(int accepted_sock, bool privileged) WINBINDD_MAX_EXTRA_DATA); if (req == NULL) { TALLOC_FREE(state); - close(accepted_sock); + close(sock); return; } tevent_req_set_callback(req, winbind_client_request_read, state); /* Add to connection list */ - /* Once the client is added here, we can be sure something will close it eventually */ winbindd_add_client(state); } -static void new_connection(int listen_sock, bool privileged) -{ - struct sockaddr_un sunaddr; - socklen_t len; - int sock; - - /* Accept connection */ - - len = sizeof(sunaddr); - - do { - sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr, - &len); - } while (sock == -1 && errno == EINTR); - - if (sock == -1) - return; - - DEBUG(6,("accepted socket %d\n", sock)); - - winbindd_accepted_new_connection(sock, privileged); -} - static void winbind_client_request_read(struct tevent_req *req) { struct winbindd_cli_state *state = tevent_req_callback_data( @@ -945,6 +938,20 @@ static void winbindd_listen_fde_handler(struct tevent_context *ev, new_connection(s->fd, s->privileged); } +/* + * Winbindd socket accessor functions + */ + +const char *get_winbind_pipe_dir(void) +{ + return lp_parm_const_string(-1, "winbindd", "socket dir", WINBINDD_SOCKET_DIR); +} + +char *get_winbind_priv_pipe_dir(void) +{ + return lock_path(WINBINDD_PRIV_SOCKET_SUBDIR); +} + static bool winbindd_setup_listeners(void) { struct winbindd_listen_state *pub_state = NULL; @@ -958,7 +965,8 @@ static bool winbindd_setup_listeners(void) } pub_state->privileged = false; - pub_state->fd = open_winbindd_socket(); + pub_state->fd = create_pipe_sock( + get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755); if (pub_state->fd == -1) { goto failed; } @@ -979,7 +987,8 @@ static bool winbindd_setup_listeners(void) } priv_state->privileged = true; - priv_state->fd = open_winbindd_priv_socket(); + priv_state->fd = create_pipe_sock( + get_winbind_priv_pipe_dir(), WINBINDD_SOCKET_NAME, 0750); if (priv_state->fd == -1) { goto failed; } @@ -1013,18 +1022,6 @@ bool winbindd_use_cache(void) void winbindd_register_handlers(void) { struct tevent_timer *te; - /* Don't use winbindd_reinit_after_fork here as - * we're just starting up and haven't created any - * winbindd-specific resources we must free yet. JRA. - */ - - if (!NT_STATUS_IS_OK(reinit_after_fork(winbind_messaging_context(), - winbind_event_context(), - false))) { - DEBUG(0,("reinit_after_fork() failed\n")); - exit(1); - } - /* Setup signal handlers */ if (!winbindd_setup_sig_term_handler(true)) @@ -1289,6 +1286,18 @@ int main(int argc, char **argv, char **envp) TimeInit(); + /* Don't use winbindd_reinit_after_fork here as + * we're just starting up and haven't created any + * winbindd-specific resources we must free yet. JRA. + */ + + if (!NT_STATUS_IS_OK(reinit_after_fork(winbind_messaging_context(), + winbind_event_context(), + false))) { + DEBUG(0,("reinit_after_fork() failed\n")); + exit(1); + } + winbindd_register_handlers(); /* setup listen sockets */ diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index 8ebbb2a..49e66f2 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -44,7 +44,6 @@ void debug_unix_user_token(int dbg_class, int dbg_lev, uid_t uid, gid_t gid, struct event_context *winbind_event_context(void); /* The following definitions come from winbindd/winbindd.c */ -void winbindd_accepted_new_connection(int accepted_sock, bool privileged); struct messaging_context *winbind_messaging_context(void); void request_error(struct winbindd_cli_state *state); void request_ok(struct winbindd_cli_state *state); @@ -53,6 +52,8 @@ bool winbindd_setup_sig_hup_handler(const char *lfile); bool winbindd_use_idmap_cache(void); bool winbindd_use_cache(void); void winbindd_register_handlers(void); +const char *get_winbind_pipe_dir(void); +char *get_winbind_priv_pipe_dir(void); int main(int argc, char **argv, char **envp); /* The following definitions come from winbindd/winbindd_ads.c */ @@ -417,10 +418,6 @@ char *fill_domain_username_talloc(TALLOC_CTX *ctx, const char *domain, const char *user, bool can_assume); -const char *get_winbind_pipe_dir(void) ; -char *get_winbind_priv_pipe_dir(void) ; -int open_winbindd_socket(void); -int open_winbindd_priv_socket(void); struct winbindd_cli_state *winbindd_client_list(void); void winbindd_add_client(struct winbindd_cli_state *cli); void winbindd_remove_client(struct winbindd_cli_state *cli); diff --git a/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c index 970e599..735a446 100644 --- a/source3/winbindd/winbindd_util.c +++ b/source3/winbindd/winbindd_util.c @@ -1029,49 +1029,6 @@ char *fill_domain_username_talloc(TALLOC_CTX *mem_ctx, } /* - * Winbindd socket accessor functions - */ - -const char *get_winbind_pipe_dir(void) -{ - return lp_parm_const_string(-1, "winbindd", "socket dir", WINBINDD_SOCKET_DIR); -} - -char *get_winbind_priv_pipe_dir(void) -{ - return lock_path(WINBINDD_PRIV_SOCKET_SUBDIR); -} - -/* Open the winbindd socket */ - -static int _winbindd_socket = -1; -static int _winbindd_priv_socket = -1; - -int open_winbindd_socket(void) -{ - if (_winbindd_socket == -1) { - _winbindd_socket = create_pipe_sock( - get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755); - DEBUG(10, ("open_winbindd_socket: opened socket fd %d\n", - _winbindd_socket)); - } - - return _winbindd_socket; -} - -int open_winbindd_priv_socket(void) -{ - if (_winbindd_priv_socket == -1) { - _winbindd_priv_socket = create_pipe_sock( - get_winbind_priv_pipe_dir(), WINBINDD_SOCKET_NAME, 0750); - DEBUG(10, ("open_winbindd_priv_socket: opened socket fd %d\n", - _winbindd_priv_socket)); - } - - return _winbindd_priv_socket; -} - -/* * Client list accessor functions */ -- Samba Shared Repository