diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/globals.c | 1 | ||||
-rw-r--r-- | source3/smbd/globals.h | 1 | ||||
-rw-r--r-- | source3/smbd/process.c | 45 | ||||
-rw-r--r-- | source3/smbd/server.c | 47 | ||||
-rw-r--r-- | source3/smbd/server_reload.c | 11 |
5 files changed, 65 insertions, 40 deletions
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c index aac30ea9c1..ca978844fc 100644 --- a/source3/smbd/globals.c +++ b/source3/smbd/globals.c @@ -54,7 +54,6 @@ struct msg_state *smbd_msg_state = NULL; bool logged_ioctl_message = false; -pid_t mypid = 0; time_t last_smb_conf_reload_time = 0; time_t last_printer_reload_time = 0; /**************************************************************************** diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index cb97cb5cd1..7771049bde 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -61,7 +61,6 @@ extern bool logged_ioctl_message; extern int trans_num; -extern pid_t mypid; extern time_t last_smb_conf_reload_time; extern time_t last_printer_reload_time; /**************************************************************************** diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 2992576702..e5b6f68199 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -943,6 +943,9 @@ static void smbd_sig_hup_handler(struct tevent_context *ev, change_to_root_user(); DEBUG(1,("Reloading services after SIGHUP\n")); reload_services(msg_ctx, smbd_server_conn->sock, False); + if (am_parent) { + pcap_cache_reload(ev, msg_ctx, &reload_pcap_change_notify); + } } void smbd_setup_sig_hup_handler(struct tevent_context *ev, @@ -2222,48 +2225,15 @@ void chain_reply(struct smb_request *req) static void check_reload(struct smbd_server_connection *sconn, time_t t) { - time_t printcap_cache_time = (time_t)lp_printcap_cache_time(); - if(last_smb_conf_reload_time == 0) { + if (last_smb_conf_reload_time == 0) { last_smb_conf_reload_time = t; - /* Our printing subsystem might not be ready at smbd start up. - Then no printer is available till the first printers check - is performed. A lower initial interval circumvents this. */ - if ( printcap_cache_time > 60 ) - last_printer_reload_time = t - printcap_cache_time + 60; - else - last_printer_reload_time = t; - } - - if (mypid != getpid()) { /* First time or fork happened meanwhile */ - /* randomize over 60 second the printcap reload to avoid all - * process hitting cupsd at the same time */ - int time_range = 60; - - last_printer_reload_time += random() % time_range; - mypid = getpid(); } if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) { reload_services(sconn->msg_ctx, sconn->sock, True); last_smb_conf_reload_time = t; } - - /* 'printcap cache time = 0' disable the feature */ - - if ( printcap_cache_time != 0 ) - { - /* see if it's time to reload or if the clock has been set back */ - - if ( (t >= last_printer_reload_time+printcap_cache_time) - || (t-last_printer_reload_time < 0) ) - { - DEBUG( 3,( "Printcap cache time expired.\n")); - pcap_cache_reload(server_event_context(), - sconn->msg_ctx, &reload_printers); - last_printer_reload_time = t; - } - } } static bool fd_is_readable(int fd) @@ -2493,13 +2463,16 @@ static bool housekeeping_fn(const struct timeval *now, void *private_data) { struct smbd_server_connection *sconn = talloc_get_type_abort( private_data, struct smbd_server_connection); + + DEBUG(5, ("housekeeping\n")); + change_to_root_user(); /* update printer queue caches if necessary */ update_monitored_printq_cache(sconn->msg_ctx); /* check if we need to reload services */ - check_reload(sconn, time(NULL)); + check_reload(sconn, time_mono(NULL)); /* Change machine password if neccessary. */ attempt_machine_password_change(); @@ -3106,7 +3079,7 @@ void smbd_process(struct smbd_server_connection *sconn) } if (!(event_add_idle(smbd_event_context(), NULL, - timeval_set(SMBD_SELECT_TIMEOUT, 0), + timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0), "housekeeping", housekeeping_fn, sconn))) { DEBUG(0, ("Could not add housekeeping event\n")); exit(1); diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 16aa055b35..d1c4eafb04 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -102,8 +102,26 @@ static void smb_conf_updated(struct messaging_context *msg, "updated. Reloading.\n")); change_to_root_user(); reload_services(msg, smbd_server_conn->sock, False); + if (am_parent) { + pcap_cache_reload(server_event_context(), msg, + &reload_pcap_change_notify); + } } +/******************************************************************* + What to do when printcap is updated. + ********************************************************************/ + +static void smb_pcap_updated(struct messaging_context *msg, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + DEBUG(10,("Got message saying pcap was updated. Reloading.\n")); + change_to_root_user(); + reload_printers(server_event_context(), msg); +} /******************************************************************* Delete a statcache entry. @@ -579,6 +597,26 @@ static bool smbd_open_one_socket(struct smbd_parent_context *parent, return true; } +static bool smbd_parent_housekeeping(const struct timeval *now, void *private_data) +{ + time_t printcap_cache_time = (time_t)lp_printcap_cache_time(); + time_t t = time_mono(NULL); + + DEBUG(5, ("parent housekeeping\n")); + + /* if periodic printcap rescan is enabled, see if it's time to reload */ + if ((printcap_cache_time != 0) + && (t >= (last_printer_reload_time + printcap_cache_time))) { + DEBUG( 3,( "Printcap cache time expired.\n")); + pcap_cache_reload(server_event_context(), + smbd_messaging_context(), + &reload_pcap_change_notify); + last_printer_reload_time = t; + } + + return true; +} + /**************************************************************************** Open the socket communication. ****************************************************************************/ @@ -713,6 +751,14 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent, return false; } + if (!(event_add_idle(smbd_event_context(), NULL, + timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0), + "parent_housekeeping", smbd_parent_housekeeping, + NULL))) { + DEBUG(0, ("Could not add parent_housekeeping event\n")); + return false; + } + /* Listen to messages */ messaging_register(msg_ctx, NULL, MSG_SMB_SAM_SYNC, msg_sam_sync); @@ -724,6 +770,7 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent, messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete); messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug); + messaging_register(msg_ctx, NULL, MSG_PRINTER_PCAP, smb_pcap_updated); brl_register_msgs(msg_ctx); #ifdef CLUSTER_SUPPORT diff --git a/source3/smbd/server_reload.c b/source3/smbd/server_reload.c index 2b74e7a0d4..bdca29d0bf 100644 --- a/source3/smbd/server_reload.c +++ b/source3/smbd/server_reload.c @@ -114,8 +114,6 @@ bool reload_services(struct messaging_context *msg_ctx, int smb_sock, ret = lp_load(get_dyn_CONFIGFILE(), False, False, True, True); - pcap_cache_reload(server_event_context(), msg_ctx, &reload_printers); - /* perhaps the config filename is now set */ if (!test) reload_services(msg_ctx, smb_sock, True); @@ -137,3 +135,12 @@ bool reload_services(struct messaging_context *msg_ctx, int smb_sock, return(ret); } + +/**************************************************************************** + Notify smbds of new printcap data +**************************************************************************/ +void reload_pcap_change_notify(struct tevent_context *ev, + struct messaging_context *msg_ctx) +{ + message_send_all(msg_ctx, MSG_PRINTER_PCAP, NULL, 0, NULL); +} |