The branch, master has been updated via e466bb4 s3: Remove smbd_server_fd() via e784e16 s3: Remove two uses of smbd_server_fd() via 5a6be0b s3: Remove smbd_server_fd() from srv_netlog_nt via 744cc26 s3: Remove smbd_server_fd() from smbd_register_ips via 5bbc4df s3: Lift smbd_server_fd() from msg_release_ip() via 467208e s3: Lift smbd_server_fd() from release_ip() via 6432383 s3: Remove a use of smbd_server_fd() in smbd main() via 70df6fc s3: Pass sconn to check_reload via babfe23 s3: Pass sconn instead of msg_ctx to housekeeping_fn via 4a58c64 s3: Set the client_id in substitute.c once via 8d256b8 s3: Remove some uses of smbd_server_fd() via 291526b s3: Remove a use of smbd_server_fd from b5ed9c2 s4-kcc: Notify dreplsrv that Topology has changed
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e466bb4af45175a3fe1d6dff54c10d81c4e68257 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:25:22 2010 +0200 s3: Remove smbd_server_fd() This breaks the perfcol_onefs() build. Tim, Steve, this use of smbd_server_fd is replacable by calls into substitute.c. I don't have a onefs environment around to build a fix, so I've decided to insert an #error, making it not compile. The fix should be pretty obvious, you can get the socket data via "%I" and "%i" substitutions. commit e784e160ec899a32b673dfaa77fa12c8f27d296c Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:21:07 2010 +0200 s3: Remove two uses of smbd_server_fd() Actually, this is a bit cheating. But those two files depend on smbd_server_conn anyway, it does not make things worse. commit 5a6be0b3149e43bad14bb75c308ced904909dc58 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:19:42 2010 +0200 s3: Remove smbd_server_fd() from srv_netlog_nt This is not actually used. If it was to be activated, we'd have to pass in a pipes_struct. commit 744cc264517ac440d606570f6e36b8aa1ba836f3 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:16:08 2010 +0200 s3: Remove smbd_server_fd() from smbd_register_ips commit 5bbc4df1680342a5d0678462bac66d5e536219f6 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:12:43 2010 +0200 s3: Lift smbd_server_fd() from msg_release_ip() commit 467208e9f417158e97941ddabcec001fac36ab3a Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 17:09:56 2010 +0200 s3: Lift smbd_server_fd() from release_ip() commit 64323839261f66cfcb81e524e727c129961c573c Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:58:54 2010 +0200 s3: Remove a use of smbd_server_fd() in smbd main() The effect this might have is that we set the socket options a bit later in inetd mode. commit 70df6fcb2ad99b173ec80bc4b678537dcac036c0 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:57:51 2010 +0200 s3: Pass sconn to check_reload This removes a use of smbd_server_fd() commit babfe237171b0dc7561da0a0867d4b9bef2ee872 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:56:47 2010 +0200 s3: Pass sconn instead of msg_ctx to housekeeping_fn commit 4a58c640cce3b37d5eef62caddd15f64ef8befbe Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:33:00 2010 +0200 s3: Set the client_id in substitute.c once This never changes during a client connection's life, so we can set it once. commit 8d256b8f30e726bec6755712121840d3a4c9b620 Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:19:31 2010 +0200 s3: Remove some uses of smbd_server_fd() The change in behaviour is that we don't detect "socket option" changes anymore when printers are added or removed. commit 291526b9cf54bab0e099896ebb668d24d151b5ab Author: Volker Lendecke <v...@samba.org> Date: Sat Aug 28 16:18:07 2010 +0200 s3: Remove a use of smbd_server_fd This disables different socket options per user for ntlmssp authentiation, a change in behaviour which is exotic enough I believe. ----------------------------------------------------------------------- Summary of changes: source3/auth/auth_ntlmssp.c | 2 +- source3/include/proto.h | 3 +- source3/lib/dummysmbd.c | 5 --- source3/lib/substitute.c | 45 +++++++++++++++++++------- source3/modules/perfcount_onefs.c | 31 ++++++++++-------- source3/rpc_server/srv_netlog_nt.c | 5 +-- source3/rpc_server/srv_spoolss_nt.c | 4 +- source3/smbd/globals.h | 2 +- source3/smbd/process.c | 60 ++++++++++++++++++++++------------- source3/smbd/server.c | 17 ++++------ source3/torture/vfstest.c | 8 +---- 11 files changed, 104 insertions(+), 78 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c index d533ac9..aa7998c 100644 --- a/source3/auth/auth_ntlmssp.c +++ b/source3/auth/auth_ntlmssp.c @@ -122,7 +122,7 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state, /* sub_set_smb_name checks for weird internally */ sub_set_smb_name(auth_ntlmssp_state->ntlmssp_state->user); - reload_services(smbd_messaging_context(), smbd_server_fd(), True); + reload_services(smbd_messaging_context(), -1, True); nt_status = make_user_info_map(&user_info, auth_ntlmssp_state->ntlmssp_state->user, diff --git a/source3/include/proto.h b/source3/include/proto.h index e2d1c94..5b9414f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -816,6 +816,8 @@ const char *get_remote_machine_name(void); void sub_set_smb_name(const char *name); void set_current_user_info(const char *smb_name, const char *unix_name, const char *domain); +void sub_set_socket_ids(const char *peeraddr, const char *peername, + const char *sockaddr); const char *get_current_username(void); void standard_sub_basic(const char *smb_name, const char *domain_name, char *str, size_t len); @@ -5389,7 +5391,6 @@ void server_messaging_context_free(void); /* The following definitions come from smbd/server.c */ -int smbd_server_fd(void); struct event_context *smbd_event_context(void); struct messaging_context *smbd_messaging_context(void); struct memcache *smbd_memcache(void); diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c index eb6bfe9..2ab0ed5 100644 --- a/source3/lib/dummysmbd.c +++ b/source3/lib/dummysmbd.c @@ -23,11 +23,6 @@ #include "includes.h" -int smbd_server_fd(void) -{ - return -1; -} - int find_service(fstring service) { return -1; diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index d7ca184..399ef1d 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -192,6 +192,33 @@ void sub_set_smb_name(const char *name) } } +static char sub_peeraddr[INET6_ADDRSTRLEN]; +static const char *sub_peername = ""; +static char sub_sockaddr[INET6_ADDRSTRLEN]; + +void sub_set_socket_ids(const char *peeraddr, const char *peername, + const char *sockaddr) +{ + const char *addr = peeraddr; + + if (strnequal(addr, "::ffff:", 7)) { + addr += 7; + } + strlcpy(sub_peeraddr, addr, sizeof(sub_peeraddr)); + + sub_peername = SMB_STRDUP(peername); + if (sub_peername == NULL) { + sub_peername = sub_peeraddr; + } + + /* + * Shouldn't we do the ::ffff: cancellation here as well? The + * original code in alloc_sub_basic() did not do it, so I'm + * leaving it out here as well for compatibility. + */ + strlcpy(sub_sockaddr, sockaddr, sizeof(sub_sockaddr)); +} + static const char *get_smb_user_name(void) { return smb_user_name ? smb_user_name : ""; @@ -538,7 +565,6 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name, { char *b, *p, *s, *r, *a_string; fstring pidstr, vnnstr; - char addr[INET6_ADDRSTRLEN]; const char *local_machine_name = get_local_machine_name(); TALLOC_CTX *tmp_ctx = NULL; @@ -593,20 +619,15 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name, a_string = realloc_string_sub(a_string, "%D", r); break; case 'I' : { - int offset = 0; - client_addr(smbd_server_fd(), addr, sizeof(addr)); - if (strnequal(addr,"::ffff:",7)) { - offset = 7; - } - a_string = realloc_string_sub(a_string, "%I", - addr + offset); + a_string = realloc_string_sub( + a_string, "%I", + sub_peeraddr[0] ? sub_peeraddr : "0.0.0.0"); break; } case 'i': a_string = realloc_string_sub( a_string, "%i", - client_socket_addr(smbd_server_fd(), - addr, sizeof(addr))); + sub_sockaddr[0] ? sub_sockaddr : "0.0.0.0"); break; case 'L' : if ( StrnCaseCmp(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) { @@ -622,8 +643,8 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name, a_string = realloc_string_sub(a_string, "%N", automount_server(smb_name)); break; case 'M' : - a_string = realloc_string_sub( - a_string, "%M", client_name(smbd_server_fd())); + a_string = realloc_string_sub(a_string, "%M", + sub_peername); break; case 'R' : a_string = realloc_string_sub(a_string, "%R", remote_proto); diff --git a/source3/modules/perfcount_onefs.c b/source3/modules/perfcount_onefs.c index 75dc145..d693376 100644 --- a/source3/modules/perfcount_onefs.c +++ b/source3/modules/perfcount_onefs.c @@ -302,23 +302,26 @@ static void onefs_smb_statistics_end(struct smb_perfcount_data *pcd) /* get address info once, doesn't change for process */ if (rem_addr == 0) { - struct sockaddr_storage sa; - socklen_t sa_len; - int fd = smbd_server_fd(); - - sa_len = sizeof sa; - if (getpeername(fd, (struct sockaddr *)&sa, &sa_len) == 0 && - sa.ss_family == AF_INET) - rem_addr = ((struct sockaddr_in *)&sa)->sin_addr.s_addr; - else + +#error Isilon, please remove this after testing the code below + + char *addr; + + addr = talloc_sub_basic(talloc_tos(), "", "", "%I"); + if (addr != NULL) { + rem_addr = interpret_addr(addr); + TALLOC_FREE(addr); + } else { rem_addr = ISC_MASKED_ADDR; + } - sa_len = sizeof sa; - if (getsockname(fd, (struct sockaddr *)&sa, &sa_len) == 0 && - sa.ss_family == AF_INET) - loc_addr = ((struct sockaddr_in *)&sa)->sin_addr.s_addr; - else + addr = talloc_sub_basic(talloc_tos(), "", "", "%i"); + if (addr != NULL) { + loc_addr = interpret_addr(addr); + TALLOC_FREE(addr); + } else { loc_addr = ISC_MASKED_ADDR; + } } /* diff --git a/source3/rpc_server/srv_netlog_nt.c b/source3/rpc_server/srv_netlog_nt.c index 73f216f..d0f9dc9 100644 --- a/source3/rpc_server/srv_netlog_nt.c +++ b/source3/rpc_server/srv_netlog_nt.c @@ -600,7 +600,6 @@ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct, union samr_UserInfo *info; struct auth_serversupplied_info *server_info; #if 0 - char addr[INET6_ADDRSTRLEN]; /* * Currently this code is redundent as we already have a filter @@ -612,8 +611,8 @@ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct, */ if (!allow_access(lp_domain_hostsdeny(), lp_domain_hostsallow(), - client_name(smbd_server_fd()), - client_addr(smbd_server_fd(),addr,sizeof(addr)))) { + p->client_id.name, + p->client_id.addr)) { DEBUG(0,("get_md4pw: Workstation %s denied access to domain\n", mach_acct)); return False; } diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 4e97122..6ce377d 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -342,7 +342,7 @@ static WERROR delete_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, /* go ahead and re-read the services immediately */ become_root(); - reload_services(msg_ctx, smbd_server_fd(), false); + reload_services(msg_ctx, -1, false); unbecome_root(); if ( lp_servicenumber( sharename ) > 0 ) @@ -5765,7 +5765,7 @@ static bool add_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, /* reload our services immediately */ become_root(); - reload_services(msg_ctx, smbd_server_fd(), false); + reload_services(msg_ctx, -1, false); unbecome_root(); numlines = 0; diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index 759fead..c4d65aa 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -469,7 +469,7 @@ struct smbd_server_connection { struct { /* - * fd for the fcntl lock mutexing access to smbd_server_fd + * fd for the fcntl lock mutexing access to our sock */ int socket_lock_fd; diff --git a/source3/smbd/process.c b/source3/smbd/process.c index a18f045..51b2e51 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -928,7 +928,7 @@ static void smbd_sig_hup_handler(struct tevent_context *ev, private_data, struct messaging_context); change_to_root_user(); DEBUG(1,("Reloading services after SIGHUP\n")); - reload_services(msg_ctx, smbd_server_fd(), False); + reload_services(msg_ctx, smbd_server_conn->sock, False); } void smbd_setup_sig_hup_handler(struct tevent_context *ev, @@ -2212,7 +2212,7 @@ void chain_reply(struct smb_request *req) Check if services need reloading. ****************************************************************************/ -static void check_reload(struct messaging_context *msg_ctx, time_t t) +static void check_reload(struct smbd_server_connection *sconn, time_t t) { time_t printcap_cache_time = (time_t)lp_printcap_cache_time(); @@ -2237,7 +2237,7 @@ static void check_reload(struct messaging_context *msg_ctx, time_t t) } if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) { - reload_services(msg_ctx, smbd_server_fd(), True); + reload_services(sconn->msg_ctx, sconn->sock, True); last_smb_conf_reload_time = t; } @@ -2251,7 +2251,7 @@ static void check_reload(struct messaging_context *msg_ctx, time_t t) || (t-last_printer_reload_time < 0) ) { DEBUG( 3,( "Printcap cache time expired.\n")); - reload_printers(msg_ctx); + reload_printers(sconn->msg_ctx); last_printer_reload_time = t; } } @@ -2377,10 +2377,8 @@ received when we should release a specific IP ****************************************************************************/ static void release_ip(const char *ip, void *priv) { - char addr[INET6_ADDRSTRLEN]; - char *p = addr; - - client_socket_addr(smbd_server_fd(),addr,sizeof(addr)); + const char *addr = (const char *)priv; + const char *p = addr; if (strncmp("::ffff:", addr, 7) == 0) { p = addr + 7; @@ -2403,7 +2401,10 @@ static void release_ip(const char *ip, void *priv) static void msg_release_ip(struct messaging_context *msg_ctx, void *private_data, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data) { - release_ip((char *)data->data, NULL); + struct smbd_server_connection *sconn = talloc_get_type_abort( + private_data, struct smbd_server_connection); + + release_ip((char *)data->data, sconn->client_id.addr); } #ifdef CLUSTER_SUPPORT @@ -2494,15 +2495,15 @@ static bool deadtime_fn(const struct timeval *now, void *private_data) static bool housekeeping_fn(const struct timeval *now, void *private_data) { - struct messaging_context *msg_ctx = talloc_get_type_abort( - private_data, struct messaging_context); + struct smbd_server_connection *sconn = talloc_get_type_abort( + private_data, struct smbd_server_connection); change_to_root_user(); /* update printer queue caches if necessary */ - update_monitored_printq_cache(msg_ctx); + update_monitored_printq_cache(sconn->msg_ctx); /* check if we need to reload services */ - check_reload(msg_ctx, time(NULL)); + check_reload(sconn, time(NULL)); /* Change machine password if neccessary. */ attempt_machine_password_change(); @@ -2888,6 +2889,27 @@ fail: return false; } +static NTSTATUS smbd_register_ips(struct smbd_server_connection *sconn, + struct sockaddr_storage *srv, + struct sockaddr_storage *clnt) +{ + struct ctdbd_connection *cconn; + char tmp_addr[INET6_ADDRSTRLEN]; + char *addr; + + cconn = messaging_ctdbd_connection(procid_self()); + if (cconn == NULL) { + return NT_STATUS_NO_MEMORY; + } + + client_socket_addr(sconn->sock, addr, sizeof(addr)); + addr = talloc_strdup(cconn, tmp_addr); + if (addr == NULL) { + return NT_STATUS_NO_MEMORY; + } + return ctdbd_register_ips(cconn, srv, clnt, release_ip, addr); +} + /**************************************************************************** Process commands from the client ****************************************************************************/ @@ -3037,7 +3059,7 @@ void smbd_process(struct smbd_server_connection *sconn) /* register our message handlers */ messaging_register(sconn->msg_ctx, NULL, MSG_SMB_FORCE_TDIS, msg_force_tdis); - messaging_register(sconn->msg_ctx, NULL, + messaging_register(sconn->msg_ctx, sconn, MSG_SMB_RELEASE_IP, msg_release_ip); messaging_register(sconn->msg_ctx, NULL, MSG_SMB_CLOSE_FILE, msg_close_file); @@ -3069,8 +3091,7 @@ void smbd_process(struct smbd_server_connection *sconn) if (!(event_add_idle(smbd_event_context(), NULL, timeval_set(SMBD_SELECT_TIMEOUT, 0), - "housekeeping", housekeeping_fn, - sconn->msg_ctx))) { + "housekeeping", housekeeping_fn, sconn))) { DEBUG(0, ("Could not add housekeeping event\n")); exit(1); } @@ -3088,13 +3109,8 @@ void smbd_process(struct smbd_server_connection *sconn) struct sockaddr_storage srv, clnt; if (client_get_tcp_info(&srv, &clnt) == 0) { - NTSTATUS status; - - status = ctdbd_register_ips( - messaging_ctdbd_connection(procid_self()), - &srv, &clnt, release_ip, NULL); - + status = smbd_register_ips(sconn, &srv, &clnt); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("ctdbd_register_ips failed: %s\n", nt_errstr(status))); diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 7d25769..aa0f7e8 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -53,18 +53,12 @@ static_decl_rpc; extern int dcelogin_atmost_once; #endif /* WITH_DFS */ -int smbd_server_fd(void) -{ - return server_fd; -} - static void smbd_set_server_fd(int fd) { struct smbd_server_connection *sconn = smbd_server_conn; + char addr[INET6_ADDRSTRLEN]; const char *name; - server_fd = fd; - sconn->sock = fd; /* @@ -82,6 +76,10 @@ static void smbd_set_server_fd(int fd) } sconn->client_id.name = (name != NULL) ? name : sconn->client_id.addr; + + sub_set_socket_ids(sconn->client_id.addr, sconn->client_id.name, + client_socket_addr(sconn->sock, addr, + sizeof(addr))); } struct event_context *smbd_event_context(void) @@ -102,7 +100,7 @@ static void smb_conf_updated(struct messaging_context *msg, DEBUG(10,("smb_conf_updated: Got message saying smb.conf was " "updated. Reloading.\n")); change_to_root_user(); - reload_services(msg, smbd_server_fd(), False); + reload_services(msg, smbd_server_conn->sock, False); } @@ -1005,8 +1003,7 @@ extern void build_options(bool screen); * Reloading of the printers will not work here as we don't have a * server info and rpc services set up. It will be called later. */ - if (!reload_services(smbd_messaging_context(), smbd_server_fd(), - False)) { + if (!reload_services(smbd_messaging_context(), -1, False)) { exit(1); } diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c index 4d537da..923b547 100644 --- a/source3/torture/vfstest.c +++ b/source3/torture/vfstest.c @@ -410,14 +410,8 @@ void exit_server_cleanly(const char *const reason) exit_server("normal exit"); } -static int server_fd = -1; int last_message = -1; -int smbd_server_fd(void) -{ - return server_fd; -} - struct event_context *smbd_event_context(void) { static struct event_context *ctx; @@ -463,7 +457,7 @@ int main(int argc, char *argv[]) poptFreeContext(pc); /* TODO: check output */ - reload_services(smbd_messaging_context(), smbd_server_fd(), False); + reload_services(smbd_messaging_context(), -1, False); /* the following functions are part of the Samba debugging facilities. See lib/debug.c */ -- Samba Shared Repository