The branch, master has been updated via 72e65a0... s3:winbindd Provide a winbindd_register_handlers() helper function for s3compat via f5c0f90... s3:winbindd Split helper functions to allow s3compat to call them via 7f70b53... s3:Winbindd Move winbindd_event_context to a different file via cdf0704... s3:winbindd Rename 'children' to 'winbindd_children' and make static via 4ef847a... s3:libsmb/namecache Remove namecache_enable() via 426d92e... s3:smbd Remove calls to namecache_enable() via 82fb4eb... s3:winbindd Remove call to namecache_enable(). via 468fb4f... s3:auth Make get_ntlm_challenge more like Samba4 from 1101c62... Pass more SMB2 oplock tests. Only oplock stream tests left to fix.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 72e65a05213e857b4aaef9951df318c10e9774ae Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 21:37:30 2010 +1000 s3:winbindd Provide a winbindd_register_handlers() helper function for s3compat This function provides a useful entry point for s3compat to set things up in winbindd. Andrew Bartlett commit f5c0f90da5f5372ca6b7a72daa8d073a2444a068 Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 21:31:18 2010 +1000 s3:winbindd Split helper functions to allow s3compat to call them This provides a more useful entry point for s3compat. Andrew Bartlett commit 7f70b53dd65941ad7c2153947e3c6ea13b28b281 Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 20:24:42 2010 +1000 s3:Winbindd Move winbindd_event_context to a different file This allows this function to be easily replaced in s3compat Andrew Bartlett commit cdf07042728efc2d2bfeb56d1a8cdecc516a2411 Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 20:22:06 2010 +1000 s3:winbindd Rename 'children' to 'winbindd_children' and make static commit 4ef847a3b7031147711751f96e002f120bb05f04 Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 10:04:30 2010 +1000 s3:libsmb/namecache Remove namecache_enable() No caller honours the return value, and this call only prints a DEBUG(). Removing this reduces the number of initialisation boilerplate calls s3compat has to make. Andrew Bartlett commit 426d92eedbe002624ab8553d23ec9ea1465acefa Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 10:02:52 2010 +1000 s3:smbd Remove calls to namecache_enable() This only prints a DEBUG() Andrew Bartlett commit 82fb4ebca761521bddf3a8a76b41b061569995e4 Author: Andrew Bartlett <abart...@samba.org> Date: Tue May 11 09:59:48 2010 +1000 s3:winbindd Remove call to namecache_enable(). This call only prints a DEBUG() Andrew Bartlett commit 468fb4fee49aa0cd1919fcd3803d2490e2ac568d Author: Andrew Bartlett <abart...@samba.org> Date: Mon Dec 14 19:43:59 2009 +1100 s3:auth Make get_ntlm_challenge more like Samba4 This helps with the upcoming NTLMSSP merge, and allows errors to be returned. Andrew Bartlett ----------------------------------------------------------------------- Summary of changes: source3/Makefile.in | 1 + source3/auth/auth.c | 5 +- source3/include/auth.h | 4 +- source3/libsmb/namecache.c | 28 -- source3/smbd/server.c | 2 - source3/winbindd/winbindd.c | 261 ++++++++++---------- source3/winbindd/winbindd_dual.c | 18 +- .../{smbd/noquotas.c => winbindd/winbindd_event.c} | 32 ++-- source3/winbindd/winbindd_proto.h | 7 +- 9 files changed, 166 insertions(+), 192 deletions(-) copy source3/{smbd/noquotas.c => winbindd/winbindd_event.c} (57%) Changeset truncated at 500 lines: diff --git a/source3/Makefile.in b/source3/Makefile.in index 5e63602..06e288c 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1155,6 +1155,7 @@ IDMAP_ADEX_OBJ = \ WINBINDD_OBJ1 = \ winbindd/winbindd.o \ + winbindd/winbindd_event.o \ winbindd/winbindd_group.o \ winbindd/winbindd_util.o \ winbindd/winbindd_cache.o \ diff --git a/source3/auth/auth.c b/source3/auth/auth.c index 317fe30..b4995ce 100644 --- a/source3/auth/auth.c +++ b/source3/auth/auth.c @@ -76,7 +76,7 @@ static struct auth_init_function_entry *auth_find_backend_entry(const char *name Returns a const char of length 8 bytes. ****************************************************************************/ -static void get_ntlm_challenge(struct auth_context *auth_context, +static NTSTATUS get_ntlm_challenge(struct auth_context *auth_context, uint8_t chal[8]) { DATA_BLOB challenge = data_blob_null; @@ -87,7 +87,7 @@ static void get_ntlm_challenge(struct auth_context *auth_context, DEBUG(5, ("get_ntlm_challenge (auth subsystem): returning previous challenge by module %s (normal)\n", auth_context->challenge_set_by)); memcpy(chal, auth_context->challenge.data, 8); - return; + return NT_STATUS_OK; } auth_context->challenge_may_be_modified = False; @@ -138,6 +138,7 @@ static void get_ntlm_challenge(struct auth_context *auth_context, auth_context->challenge_set_by=challenge_set_by; memcpy(chal, auth_context->challenge.data, 8); + return NT_STATUS_OK; } diff --git a/source3/include/auth.h b/source3/include/auth.h index efae56a..09ad631 100644 --- a/source3/include/auth.h +++ b/source3/include/auth.h @@ -91,8 +91,8 @@ struct auth_context { /* What order are the various methods in? Try to stop it changing under us */ struct auth_methods *auth_method_list; - void (*get_ntlm_challenge)(struct auth_context *auth_context, - uint8_t chal[8]); + NTSTATUS (*get_ntlm_challenge)(struct auth_context *auth_context, + uint8_t chal[8]); NTSTATUS (*check_ntlm_password)(const struct auth_context *auth_context, const struct auth_usersupplied_info *user_info, struct auth_serversupplied_info **server_info); diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c index dcfc609..174ea1b 100644 --- a/source3/libsmb/namecache.c +++ b/source3/libsmb/namecache.c @@ -26,34 +26,6 @@ #define NBTKEY_FMT "NBT/%s#%02X" /** - * Initialise namecache system. Function calls gencache - * initialisation function to perform necessary actions - * - * @return true upon successful initialisation of the cache or - * false on failure - **/ - -bool namecache_enable(void) -{ - /* - * Check if name caching disabled by setting the name cache - * timeout to zero. - */ - - if (lp_name_cache_timeout() == 0) { - DEBUG(5, ("namecache_enable: disabling netbios name cache\n")); - return False; - } - - /* I leave it for now, though I don't think we really - * need this (mimir, 27.09.2002) */ - DEBUG(5, ("namecache_enable: enabling netbios namecache, timeout %d " - "seconds\n", lp_name_cache_timeout())); - - return True; -} - -/** * Generates a key for netbios name lookups on basis of * netbios name and type. * The caller must free returned key string when finished. diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 5d4aca1..2c20750 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1309,8 +1309,6 @@ extern void build_options(bool screen); exit(1); } - namecache_enable(); - if (!W_ERROR_IS_OK(registry_init_full())) exit(1); diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index f651e60..1c87a14 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -37,16 +37,6 @@ static bool interactive = False; extern bool override_logfile; -struct event_context *winbind_event_context(void) -{ - static struct event_context *ctx; - - if (!ctx && !(ctx = event_context_init(NULL))) { - smb_panic("Could not init winbind event context"); - } - return ctx; -} - struct messaging_context *winbind_messaging_context(void) { static struct messaging_context *ctx; @@ -773,40 +763,23 @@ void request_ok(struct winbindd_cli_state *state) /* Process a new connection by adding it to the client connection list */ -static void new_connection(int listen_sock, bool privileged) +void winbindd_accepted_new_connection(int accepted_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(sock); + close(accepted_sock); return; } - state->sock = sock; + state->sock = accepted_sock; state->out_queue = tevent_queue_create(state, "winbind client reply"); if (state->out_queue == NULL) { - close(sock); + close(accepted_sock); TALLOC_FREE(state); return; } @@ -819,16 +792,40 @@ static void new_connection(int listen_sock, bool privileged) WINBINDD_MAX_EXTRA_DATA); if (req == NULL) { TALLOC_FREE(state); - close(sock); + close(accepted_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( @@ -1013,6 +1010,106 @@ bool winbindd_use_cache(void) return !opt_nocache; } +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)) + exit(1); + if (!winbindd_setup_sig_hup_handler(NULL)) + exit(1); + if (!winbindd_setup_sig_chld_handler()) + exit(1); + if (!winbindd_setup_sig_usr2_handler()) + exit(1); + + CatchSignal(SIGPIPE, SIG_IGN); /* Ignore sigpipe */ + + /* + * Ensure all cache and idmap caches are consistent + * and initialized before we startup. + */ + if (!winbindd_cache_validate_and_initialize()) { + exit(1); + } + + /* get broadcast messages */ + + 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 */ + messaging_register(winbind_messaging_context(), NULL, + MSG_SMB_CONF_UPDATED, msg_reload_services); + messaging_register(winbind_messaging_context(), NULL, + MSG_SHUTDOWN, msg_shutdown); + + /* Handle online/offline messages. */ + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_OFFLINE, winbind_msg_offline); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_ONLINE, winbind_msg_online); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus); + + messaging_register(winbind_messaging_context(), NULL, + MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list); + + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_VALIDATE_CACHE, + winbind_msg_validate_cache); + + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_DUMP_DOMAIN_LIST, + winbind_msg_dump_domain_list); + + /* Register handler for MSG_DEBUG. */ + messaging_register(winbind_messaging_context(), NULL, + MSG_DEBUG, + winbind_msg_debug); + + netsamlogon_cache_init(); /* Non-critical */ + + /* clear the cached list of trusted domains */ + + wcache_tdc_clear(); + + if (!init_domain_list()) { + DEBUG(0,("unable to initialize domain list\n")); + exit(1); + } + + init_idmap_child(); + init_locator_child(); + + smb_nscd_flush_user_cache(); + smb_nscd_flush_group_cache(); + + te = tevent_add_timer(winbind_event_context(), NULL, timeval_zero(), + rescan_trusted_domains, NULL); + if (te == NULL) { + DEBUG(0, ("Could not trigger rescan_trusted_domains()\n")); + exit(1); + } + +} + /* Main function */ int main(int argc, char **argv, char **envp) @@ -1041,7 +1138,6 @@ int main(int argc, char **argv, char **envp) poptContext pc; int opt; TALLOC_CTX *frame = talloc_stackframe(); - struct tevent_timer *te; /* glibc (?) likes to print "User defined signal 1" and exit if a SIGUSR[12] is received before a handler is installed */ @@ -1166,10 +1262,6 @@ int main(int argc, char **argv, char **envp) return False; } - /* Enable netbios namecache */ - - namecache_enable(); - /* Unblock all signals we are interested in as they may have been blocked by the parent process. */ @@ -1197,93 +1289,7 @@ 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); - } - - /* Setup signal handlers */ - - if (!winbindd_setup_sig_term_handler(true)) - exit(1); - if (!winbindd_setup_sig_hup_handler(NULL)) - exit(1); - if (!winbindd_setup_sig_chld_handler()) - exit(1); - if (!winbindd_setup_sig_usr2_handler()) - exit(1); - - CatchSignal(SIGPIPE, SIG_IGN); /* Ignore sigpipe */ - - /* - * Ensure all cache and idmap caches are consistent - * and initialized before we startup. - */ - if (!winbindd_cache_validate_and_initialize()) { - exit(1); - } - - /* get broadcast messages */ - - 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 */ - messaging_register(winbind_messaging_context(), NULL, - MSG_SMB_CONF_UPDATED, msg_reload_services); - messaging_register(winbind_messaging_context(), NULL, - MSG_SHUTDOWN, msg_shutdown); - - /* Handle online/offline messages. */ - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_OFFLINE, winbind_msg_offline); - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_ONLINE, winbind_msg_online); - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus); - - messaging_register(winbind_messaging_context(), NULL, - MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list); - - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_VALIDATE_CACHE, - winbind_msg_validate_cache); - - messaging_register(winbind_messaging_context(), NULL, - MSG_WINBIND_DUMP_DOMAIN_LIST, - winbind_msg_dump_domain_list); - - /* Register handler for MSG_DEBUG. */ - messaging_register(winbind_messaging_context(), NULL, - MSG_DEBUG, - winbind_msg_debug); - - netsamlogon_cache_init(); /* Non-critical */ - - /* clear the cached list of trusted domains */ - - wcache_tdc_clear(); - - if (!init_domain_list()) { - DEBUG(0,("unable to initialize domain list\n")); - exit(1); - } - - init_idmap_child(); - init_locator_child(); - - smb_nscd_flush_user_cache(); - smb_nscd_flush_group_cache(); + winbindd_register_handlers(); /* setup listen sockets */ @@ -1292,13 +1298,6 @@ int main(int argc, char **argv, char **envp) exit(1); } - te = tevent_add_timer(winbind_event_context(), NULL, timeval_zero(), - rescan_trusted_domains, NULL); - if (te == NULL) { - DEBUG(0, ("Could not trigger rescan_trusted_domains()\n")); - exit(1); - } - TALLOC_FREE(frame); /* Loop waiting for requests */ while (1) { diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index c622b3c..2ae32e7 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -422,13 +422,13 @@ void setup_child(struct winbindd_domain *domain, struct winbindd_child *child, SMB_ASSERT(child->rpccli != NULL); } -struct winbindd_child *children = NULL; +static struct winbindd_child *winbindd_children = NULL; void winbind_child_died(pid_t pid) { struct winbindd_child *child; - for (child = children; child != NULL; child = child->next) { + for (child = winbindd_children; child != NULL; child = child->next) { if (child->pid == pid) { break; } @@ -441,7 +441,7 @@ void winbind_child_died(pid_t pid) /* This will be re-added in fork_domain_child() */ - DLIST_REMOVE(children, child); + DLIST_REMOVE(winbindd_children, child); close(child->sock); child->sock = -1; @@ -476,7 +476,7 @@ void winbind_msg_debug(struct messaging_context *msg_ctx, debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data); - for (child = children; child != NULL; child = child->next) { + for (child = winbindd_children; child != NULL; child = child->next) { DEBUG(10,("winbind_msg_debug: sending message to pid %u.\n", (unsigned int)child->pid)); @@ -521,7 +521,7 @@ void winbind_msg_offline(struct messaging_context *msg_ctx, set_domain_offline(domain); } - for (child = children; child != NULL; child = child->next) { + for (child = winbindd_children; child != NULL; child = child->next) { /* Don't send message to internal children. We've already done so above. */ if (!child->domain || winbindd_internal_child(child)) { @@ -596,7 +596,7 @@ void winbind_msg_online(struct messaging_context *msg_ctx, -- Samba Shared Repository