From 03455519e70253cb86007ac5a8960999e9aa5fa4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 14 Dec 2011 13:25:20 +0100 Subject: [PATCH] s3:smbd: pass smbd_server_connection and a snumused function pointer to reload_services() metze --- source3/rpc_server/spoolss/srv_spoolss_nt.c | 12 +++++++++++- source3/smbd/negprot.c | 4 ++-- source3/smbd/process.c | 8 ++++---- source3/smbd/proto.h | 3 ++- source3/smbd/reply.c | 2 +- source3/smbd/server.c | 6 +++--- source3/smbd/server_reload.c | 20 +++++++++----------- source3/smbd/sesssetup.c | 10 +++++----- source3/smbd/smb2_sesssetup.c | 2 +- source3/torture/vfstest.c | 2 +- 10 files changed, 39 insertions(+), 30 deletions(-) diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 491d96566a8..87df5659c78 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -6202,6 +6202,16 @@ static WERROR add_port_hook(TALLOC_CTX *ctx, struct security_token *token, const /**************************************************************************** ****************************************************************************/ +static bool spoolss_conn_snum_used(struct smbd_server_connection *sconn, + int snum) +{ + /* + * As we do not know if we are embedded in the file server process + * or not, we have to pretend that all shares are in use. + */ + return true; +} + static bool add_printer_hook(TALLOC_CTX *ctx, struct security_token *token, struct spoolss_SetPrinterInfo2 *info2, const char *remote_machine, @@ -6260,7 +6270,7 @@ static bool add_printer_hook(TALLOC_CTX *ctx, struct security_token *token, /* reload our services immediately */ become_root(); - reload_services(msg_ctx, -1, false); + reload_services(NULL, spoolss_conn_snum_used, false); unbecome_root(); numlines = 0; diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index ae9ce5a2cfc..52ef96d5fc9 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -714,7 +714,7 @@ void reply_negprot(struct smb_request *req) } /* possibly reload - change of architecture */ - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); /* moved from the netbios session setup code since we don't have that when the client connects to port 445. Of course there is a small @@ -740,7 +740,7 @@ void reply_negprot(struct smb_request *req) if(choice != -1) { fstrcpy(remote_proto,supported_protocols[protocol].short_name); - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); supported_protocols[protocol].proto_reply_fn(req, choice); DEBUG(3,("Selected protocol %s\n",supported_protocols[protocol].proto_name)); } else { diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 2b35680949b..c4482677818 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -908,7 +908,7 @@ static void smbd_sig_hup_handler(struct tevent_context *ev, change_to_root_user(); DEBUG(1,("Reloading services after SIGHUP\n")); - reload_services(sconn->msg_ctx, sconn->sock, false); + reload_services(sconn, conn_snum_used, false); } void smbd_setup_sig_hup_handler(struct smbd_server_connection *sconn) @@ -938,7 +938,7 @@ static void smbd_conf_updated(struct messaging_context *msg, DEBUG(10,("smbd_conf_updated: Got message saying smb.conf was " "updated. Reloading.\n")); change_to_root_user(); - reload_services(sconn->msg_ctx, sconn->sock, False); + reload_services(sconn, conn_snum_used, false); } static NTSTATUS smbd_server_connection_loop_once(struct tevent_context *ev_ctx, @@ -2221,7 +2221,7 @@ static void check_reload(struct smbd_server_connection *sconn, time_t t) } if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) { - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); last_smb_conf_reload_time = t; } } @@ -3183,7 +3183,7 @@ void smbd_process(struct tevent_context *ev_ctx, /* this is needed so that we get decent entries in smbstatus for port 445 connects */ set_remote_machine_name(remaddr, false); - reload_services(sconn->msg_ctx, sconn->sock, true); + reload_services(sconn, conn_snum_used, true); /* * Before the first packet, check the global hosts allow/ hosts deny diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 2fd59a1f471..92b1443a98d 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -955,7 +955,8 @@ void init_sec_ctx(void); struct memcache *smbd_memcache(void); void delete_and_reload_printers(struct tevent_context *ev, struct messaging_context *msg_ctx); -bool reload_services(struct messaging_context *msg_ctx, int smb_sock, +bool reload_services(struct smbd_server_connection *sconn, + bool (*snumused) (struct smbd_server_connection *, int), bool test); void exit_server(const char *const explanation); void exit_server_cleanly(const char *const explanation); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index a06e7b83391..d9b75007078 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -606,7 +606,7 @@ void reply_special(struct smbd_server_connection *sconn, char *inbuf, size_t inb add_session_user(sconn, get_remote_machine_name()); } - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); reopen_logs(); sconn->nbt.got_session = true; diff --git a/source3/smbd/server.c b/source3/smbd/server.c index e58128ea58e..369b7ab450d 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -99,7 +99,7 @@ static void smbd_parent_conf_updated(struct messaging_context *msg, DEBUG(10,("smbd_parent_conf_updated: Got message saying smb.conf was " "updated. Reloading.\n")); change_to_root_user(); - reload_services(msg, -1, false); + reload_services(NULL, NULL, false); printing_subsystem_update(ev_ctx, msg, false); } @@ -910,7 +910,7 @@ static void smbd_parent_sig_hup_handler(struct tevent_context *ev, change_to_root_user(); DEBUG(1,("parent: Reloading services after SIGHUP\n")); - reload_services(parent->msg_ctx, -1, false); + reload_services(NULL, NULL, false); printing_subsystem_update(parent->ev_ctx, parent->msg_ctx, true); } @@ -1138,7 +1138,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(NULL, -1, False)) { + if (!reload_services(NULL, NULL, false)) { exit(1); } diff --git a/source3/smbd/server_reload.c b/source3/smbd/server_reload.c index 0c2ea2c5b12..f15f80e13fa 100644 --- a/source3/smbd/server_reload.c +++ b/source3/smbd/server_reload.c @@ -106,7 +106,8 @@ void delete_and_reload_printers(struct tevent_context *ev, Reload the services file. **************************************************************************/ -bool reload_services(struct messaging_context *msg_ctx, int smb_sock, +bool reload_services(struct smbd_server_connection *sconn, + bool (*snumused) (struct smbd_server_connection *, int), bool test) { bool ret; @@ -125,25 +126,22 @@ bool reload_services(struct messaging_context *msg_ctx, int smb_sock, if (test && !lp_file_list_changed()) return(True); - if (msg_ctx) { - lp_killunused(msg_ctx_to_sconn(msg_ctx), conn_snum_used); - } else { - lp_killunused(NULL, NULL); - } + lp_killunused(sconn, snumused); ret = lp_load(get_dyn_CONFIGFILE(), False, False, True, True); /* perhaps the config filename is now set */ - if (!test) - reload_services(msg_ctx, smb_sock, True); + if (!test) { + reload_services(sconn, snumused, true); + } reopen_logs(); load_interfaces(); - if (smb_sock != -1) { - set_socket_options(smb_sock,"SO_KEEPALIVE"); - set_socket_options(smb_sock, lp_socket_options()); + if (sconn != NULL) { + set_socket_options(sconn->sock, "SO_KEEPALIVE"); + set_socket_options(sconn->sock, lp_socket_options()); } mangle_reset_cache(); diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 5fa571a0e9c..889361acb8d 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -341,7 +341,7 @@ static void reply_spnego_kerberos(struct smb_request *req, sub_set_smb_name(real_username); /* reload services so that the new %U is taken into account */ - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); ret = make_session_info_krb5(mem_ctx, user, domain, real_username, pw, @@ -377,7 +377,7 @@ static void reply_spnego_kerberos(struct smb_request *req, ret = NT_STATUS_LOGON_FAILURE; } else { /* current_user_info is changed on new vuid */ - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); SSVAL(req->outbuf, smb_vwv3, 0); @@ -462,7 +462,7 @@ static void reply_spnego_ntlmssp(struct smb_request *req, } /* current_user_info is changed on new vuid */ - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); SSVAL(req->outbuf, smb_vwv3, 0); @@ -1574,7 +1574,7 @@ void reply_sesssetup_and_X(struct smb_request *req) sub_set_smb_name(sub_user); - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); if (lp_security() == SEC_SHARE) { char *sub_user_mapped = NULL; @@ -1727,7 +1727,7 @@ void reply_sesssetup_and_X(struct smb_request *req) } /* current_user_info is changed on new vuid */ - reload_services(sconn->msg_ctx, sconn->sock, True); + reload_services(sconn, conn_snum_used, true); } data_blob_free(&nt_resp); diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c index 64fa4460591..f2ce989eb60 100644 --- a/source3/smbd/smb2_sesssetup.c +++ b/source3/smbd/smb2_sesssetup.c @@ -209,7 +209,7 @@ static NTSTATUS smbd_smb2_session_setup_krb5(struct smbd_smb2_session *session, sub_set_smb_name(real_username); /* reload services so that the new %U is taken into account */ - reload_services(smb2req->sconn->msg_ctx, smb2req->sconn->sock, true); + reload_services(smb2req->sconn, conn_snum_used, true); status = make_session_info_krb5(session, user, domain, real_username, pw, diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c index 3ed49c021e5..01deba00d30 100644 --- a/source3/torture/vfstest.c +++ b/source3/torture/vfstest.c @@ -451,7 +451,7 @@ int main(int argc, char *argv[]) lp_load_initial_only(get_dyn_CONFIGFILE()); /* TODO: check output */ - reload_services(NULL, -1, False); + reload_services(NULL, NULL, false); /* the following functions are part of the Samba debugging facilities. See lib/debug.c */ -- 2.34.1