static void msg_reload_nmbd_services(int msg_type, struct process_id src, void *buf, size_t len, void *private_data) { write_browse_list( 0, True ); dump_all_namelists(); reload_nmbd_services( True ); reopen_logs(); if(buf) { /* We were called from process() */ /* If reload_interfaces() returned True */ /* we need to shutdown if there are no subnets... */ /* pass this info back to process() */ *((BOOL*)buf) = reload_interfaces(0); } }
static void process(void) { bool run_election; while( True ) { time_t t = time(NULL); TALLOC_CTX *frame = talloc_stackframe(); /* * Check all broadcast subnets to see if * we need to run an election on any of them. * (nmbd_elections.c) */ run_election = check_elections(); /* * Read incoming UDP packets. * (nmbd_packets.c) */ if(listen_for_packets(run_election)) { TALLOC_FREE(frame); return; } /* * Process all incoming packets * read above. This calls the success and * failure functions registered when response * packets arrrive, and also deals with request * packets from other sources. * (nmbd_packets.c) */ run_packet_queue(); /* * Run any elections - initiate becoming * a local master browser if we have won. * (nmbd_elections.c) */ run_elections(t); /* * Send out any broadcast announcements * of our server names. This also announces * the workgroup name if we are a local * master browser. * (nmbd_sendannounce.c) */ announce_my_server_names(t); /* * Send out any LanMan broadcast announcements * of our server names. * (nmbd_sendannounce.c) */ announce_my_lm_server_names(t); /* * If we are a local master browser, periodically * announce ourselves to the domain master browser. * This also deals with syncronising the domain master * browser server lists with ourselves as a local * master browser. * (nmbd_sendannounce.c) */ announce_myself_to_domain_master_browser(t); /* * Fullfill any remote announce requests. * (nmbd_sendannounce.c) */ announce_remote(t); /* * Fullfill any remote browse sync announce requests. * (nmbd_sendannounce.c) */ browse_sync_remote(t); /* * Scan the broadcast subnets, and WINS client * namelists and refresh any that need refreshing. * (nmbd_mynames.c) */ refresh_my_names(t); /* * Scan the subnet namelists and server lists and * expire thos that have timed out. * (nmbd.c) */ expire_names_and_servers(t); /* * Write out a snapshot of our current browse list into * the browse.dat file. This is used by smbd to service * incoming NetServerEnum calls - used to synchronise * browse lists over subnets. * (nmbd_serverlistdb.c) */ write_browse_list(t, False); /* * If we are a domain master browser, we have a list of * local master browsers we should synchronise browse * lists with (these are added by an incoming local * master browser announcement packet). Expire any of * these that are no longer current, and pull the server * lists from each of these known local master browsers. * (nmbd_browsesync.c) */ dmb_expire_and_sync_browser_lists(t); /* * Check that there is a local master browser for our * workgroup for all our broadcast subnets. If one * is not found, start an election (which we ourselves * may or may not participate in, depending on the * setting of the 'local master' parameter. * (nmbd_elections.c) */ check_master_browser_exists(t); /* * If we are configured as a logon server, attempt to * register the special NetBIOS names to become such * (WORKGROUP<1c> name) on all broadcast subnets and * with the WINS server (if used). If we are configured * to become a domain master browser, attempt to register * the special NetBIOS name (WORKGROUP<1b> name) to * become such. * (nmbd_become_dmb.c) */ add_domain_names(t); /* * If we are a WINS server, do any timer dependent * processing required. * (nmbd_winsserver.c) */ initiate_wins_processing(t); /* * If we are a domain master browser, attempt to contact the * WINS server to get a list of all known WORKGROUPS/DOMAINS. * This will only work to a Samba WINS server. * (nmbd_browsesync.c) */ if (lp_enhanced_browsing()) collect_all_workgroup_names_from_wins_server(t); /* * Go through the response record queue and time out or re-transmit * and expired entries. * (nmbd_packets.c) */ retransmit_or_expire_response_records(t); /* * check to see if any remote browse sync child processes have completed */ sync_check_completion(); /* * regularly sync with any other DMBs we know about */ if (lp_enhanced_browsing()) sync_all_dmbs(t); /* check for new network interfaces */ reload_interfaces(t); /* free up temp memory */ TALLOC_FREE(frame); } }