diff options
-rw-r--r-- | docs-xml/smbdotconf/printing/printcapcachetime.xml | 4 | ||||
-rw-r--r-- | source3/include/local.h | 1 | ||||
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/librpc/idl/messaging.idl | 1 | ||||
-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 | ||||
-rw-r--r-- | source3/web/swat.c | 13 |
10 files changed, 79 insertions, 47 deletions
diff --git a/docs-xml/smbdotconf/printing/printcapcachetime.xml b/docs-xml/smbdotconf/printing/printcapcachetime.xml index 7dcd1b62d4..e9e0c98aec 100644 --- a/docs-xml/smbdotconf/printing/printcapcachetime.xml +++ b/docs-xml/smbdotconf/printing/printcapcachetime.xml @@ -5,9 +5,7 @@ xmlns:samba="http://www.samba.org/samba/DTD/samba-doc"> <description> <para>This option specifies the number of seconds before the printing - subsystem is again asked for the known printers. If the value - is greater than 60 the initial waiting time is set to 60 seconds - to allow an earlier first rescan of the printing subsystem. + subsystem is again asked for the known printers. </para> <para>Setting this parameter to 0 disables any rescanning for new diff --git a/source3/include/local.h b/source3/include/local.h index a8889af376..bb73840757 100644 --- a/source3/include/local.h +++ b/source3/include/local.h @@ -139,6 +139,7 @@ #define LPQ_LOCK_TIMEOUT (5) #define NMBD_INTERFACES_RELOAD (120) #define NMBD_UNEXPECTED_TIMEOUT (15) +#define SMBD_HOUSEKEEPING_INTERVAL SMBD_SELECT_TIMEOUT /* the following are in milliseconds */ #define LOCK_RETRY_TIMEOUT (100) diff --git a/source3/include/proto.h b/source3/include/proto.h index 91d3ef165e..338c27db03 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -5405,6 +5405,8 @@ void reload_printers(struct tevent_context *ev, struct messaging_context *msg_ctx); bool reload_services(struct messaging_context *msg_ctx, int smb_sock, bool test); +void reload_pcap_change_notify(struct tevent_context *ev, + struct messaging_context *msg_ctx); void exit_server(const char *const explanation); void exit_server_cleanly(const char *const explanation); void exit_server_fault(void); diff --git a/source3/librpc/idl/messaging.idl b/source3/librpc/idl/messaging.idl index 9041d2284d..faa9a6ef0c 100644 --- a/source3/librpc/idl/messaging.idl +++ b/source3/librpc/idl/messaging.idl @@ -45,6 +45,7 @@ interface messaging MSG_PRINTERDATA_INIT_RESET = 0x0204, MSG_PRINTER_UPDATE = 0x0205, MSG_PRINTER_MOD = 0x0206, + MSG_PRINTER_PCAP = 0x0207, /* smbd messages */ MSG_SMB_CONF_UPDATED = 0x0301, 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); +} diff --git a/source3/web/swat.c b/source3/web/swat.c index 1cbecd4675..93fe36827c 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -30,6 +30,7 @@ #include "includes.h" #include "popt_common.h" #include "web/swat_proto.h" +#include "printing/pcap.h" static int demo_mode = False; static int passwd_only = False; @@ -491,8 +492,10 @@ static int save_reload(int snum) return 0; } iNumNonAutoPrintServices = lp_numservices(); - pcap_cache_reload(server_event_context(), server_messaging_context(), - &load_printers); + if (pcap_cache_loaded()) { + load_printers(server_event_context(), + server_messaging_context()); + } return 1; } @@ -1436,8 +1439,10 @@ const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid) reopen_logs(); load_interfaces(); iNumNonAutoPrintServices = lp_numservices(); - pcap_cache_reload(server_event_context(), server_messaging_context(), - &load_printers); + if (pcap_cache_loaded()) { + load_printers(server_event_context(), + server_messaging_context()); + } cgi_setup(get_dyn_SWATDIR(), !demo_mode); |