From 64f0348a3f994334abe64a4d4896109c3c8c9039 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 13 Dec 1997 14:16:07 +0000 Subject: This is it ! The mega-merge of the JRA_NMBD_REWRITE branch back into the main tree. For the cvs logs of all the files starting nmbd_*.c, look in the JRA_NMBD_REWRITE branch. That branch has now been discontinued. Jeremy. (This used to be commit d80b0cb645f81d16734929a0b27a91c6650499bb) --- source3/nmbd/nmbd.c | 811 +++++++++++++++++++++++++++++----------------------- 1 file changed, 448 insertions(+), 363 deletions(-) (limited to 'source3/nmbd/nmbd.c') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index a34e2caf42..11cd50cd76 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -34,8 +34,8 @@ pstring servicesf = CONFIGFILE; extern pstring scope; -int ClientNMB = -1; -int ClientDGRAM = -1; +int ClientNMB = -1; +int ClientDGRAM = -1; int global_nmb_port = -1; extern pstring myhostname; @@ -49,47 +49,47 @@ static BOOL is_daemon = False; /* what server type are we currently */ -time_t StartupTime =0; +time_t StartupTime = 0; extern struct in_addr ipzero; - /**************************************************************************** +/**************************************************************************** ** catch a sigterm - ****************************************************************************/ + **************************************************************************** */ static int sig_term() { BlockSignals(True,SIGTERM); DEBUG(0,("Got SIGTERM: going down...\n")); - /* write out wins.dat file if samba is a WINS server */ - dump_names(); + /* Write out wins.dat file if samba is a WINS server */ + wins_write_database(); - /* remove all samba names, with wins server if necessary. */ - remove_my_names(); + /* Remove all SELF registered names. */ + release_my_names(); - /* announce all server entries as 0 time-to-live, 0 type */ - /* XXXX don't care if we never receive a response back... yet */ + /* Announce all server entries as 0 time-to-live, 0 type. */ announce_my_servers_removed(); - /* XXXX other things: if we are a master browser, force an election? */ - exit(0); /* Keep compiler happy.. */ return 0; -} +} /* sig_term */ -/**************************************************************************** -catch a sighup -****************************************************************************/ +/**************************************************************************** ** + catch a sighup + **************************************************************************** */ static int sig_hup(void) { - BlockSignals(True,SIGHUP); + BlockSignals( True, SIGHUP ); + + DEBUG( 0, ( "Got SIGHUP dumping debug info.\n" ) ); + + write_browse_list( 0, True ); - DEBUG(0,("Got SIGHUP (reload not implemented)\n")); - dump_names(); - reload_services(True); + dump_all_namelists(); + reload_services( True ); set_samba_nb_type(); @@ -98,239 +98,294 @@ static int sig_hup(void) signal(SIGHUP,SIGNAL_CAST sig_hup); #endif return(0); -} +} /* sig_hup */ -/**************************************************************************** -catch a sigpipe -****************************************************************************/ +/**************************************************************************** ** + catch a sigpipe + **************************************************************************** */ static int sig_pipe(void) { - BlockSignals(True,SIGPIPE); + BlockSignals( True, SIGPIPE ); - DEBUG(0,("Got SIGPIPE\n")); - if (!is_daemon) + DEBUG( 0, ("Got SIGPIPE\n") ); + if ( !is_daemon ) exit(1); - BlockSignals(False,SIGPIPE); + BlockSignals( False, SIGPIPE ); return(0); -} +} /* sig_pipe */ #if DUMP_CORE -/******************************************************************* -prepare to dump a core file - carefully! -********************************************************************/ +/**************************************************************************** ** + prepare to dump a core file - carefully! + **************************************************************************** */ static BOOL dump_core(void) { char *p; pstring dname; - pstrcpy(dname,debugf); - if ((p=strrchr(dname,'/'))) *p=0; - strcat(dname,"/corefiles"); - mkdir(dname,0700); - sys_chown(dname,getuid(),getgid()); - chmod(dname,0700); - if (chdir(dname)) return(False); - umask(~(0700)); + pstrcpy( dname, debugf ); + if ((p=strrchr(dname,'/'))) + *p=0; + strcat( dname, "/corefiles" ); + mkdir( dname, 0700 ); + sys_chown( dname, getuid(), getgid() ); + chmod( dname, 0700 ); + if ( chdir(dname) ) + return( False ); + umask( ~(0700) ); #ifndef NO_GETRLIMIT #ifdef RLIMIT_CORE { struct rlimit rlp; - getrlimit(RLIMIT_CORE, &rlp); - rlp.rlim_cur = MAX(4*1024*1024,rlp.rlim_cur); - setrlimit(RLIMIT_CORE, &rlp); - getrlimit(RLIMIT_CORE, &rlp); - DEBUG(3,("Core limits now %d %d\n",rlp.rlim_cur,rlp.rlim_max)); + getrlimit( RLIMIT_CORE, &rlp ); + rlp.rlim_cur = MAX( 4*1024*1024, rlp.rlim_cur ); + setrlimit( RLIMIT_CORE, &rlp ); + getrlimit( RLIMIT_CORE, &rlp ); + DEBUG( 3, ( "Core limits now %d %d\n", rlp.rlim_cur, rlp.rlim_max ) ); } #endif #endif - DEBUG(0,("Dumping core in %s\n",dname)); - return(True); -} + DEBUG( 0, ( "Dumping core in %s\n",dname ) ); + return( True ); +} /* dump_core */ #endif -/**************************************************************************** -possibly continue after a fault -****************************************************************************/ +/**************************************************************************** ** + possibly continue after a fault + **************************************************************************** */ static void fault_continue(void) { #if DUMP_CORE dump_core(); #endif -} +} /* fault_continue */ -/******************************************************************* - expire old names from the namelist and server list - ******************************************************************/ +/**************************************************************************** ** + expire old names from the namelist and server list + **************************************************************************** */ static void expire_names_and_servers(time_t t) { static time_t lastrun = 0; - if (!lastrun) lastrun = t; - if (t < lastrun + 5) return; + if ( !lastrun ) + lastrun = t; + if ( t < (lastrun + 5) ) + return; lastrun = t; - + + /* + * Expire any timed out names on all the broadcast + * subnets and those registered with the WINS server. + * (nmbd_namelistdb.c) + */ expire_names(t); - expire_servers(t); -} -/***************************************************************************** + /* + * Go through all the broadcast subnets and for each + * workgroup known on that subnet remove any expired + * server names. If a workgroup has an empty serverlist + * and has itself timed out then remove the workgroup. + * (nmbd_workgroupdb.c) + */ + expire_workgroups_and_servers(t); +} /* expire_names_and_servers */ + +/**************************************************************************** ** reload the services file - **************************************************************************/ + **************************************************************************** */ BOOL reload_services(BOOL test) { BOOL ret; extern fstring remote_machine; - strcpy(remote_machine,"nmbd"); + strcpy( remote_machine, "nmbd" ); - if (lp_loaded()) + if ( lp_loaded() ) + { + pstring fname; + pstrcpy( fname,lp_configfile()); + if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) - { - pstrcpy(servicesf,fname); - test = False; - } + pstrcpy(servicesf,fname); + test = False; } + } - if (test && !lp_file_list_changed()) + if ( test && !lp_file_list_changed() ) return(True); - ret = lp_load(servicesf,True); + ret = lp_load( servicesf, True ); /* perhaps the config filename is now set */ - if (!test) { - DEBUG(3,("services not loaded\n")); - reload_services(True); + if ( !test ) + { + DEBUG( 3, ( "services not loaded\n" ) ); + reload_services( True ); } /* Do a sanity check for a misconfigured nmbd */ - if(lp_wins_support() && *lp_wins_server()) { + if( lp_wins_support() && *lp_wins_server() ) + { DEBUG(0,("ERROR: both 'wins support = true' and 'wins server = ' \ cannot be set in the smb.conf file. nmbd aborting.\n")); exit(10); } return(ret); -} - - - -/**************************************************************************** -load a netbios hosts file -****************************************************************************/ -static void load_hosts_file(char *fname) -{ - FILE *f = fopen(fname,"r"); - pstring line; - if (!f) { - DEBUG(2,("Can't open lmhosts file %s\n",fname)); - return; - } - - while (!feof(f)) - { - pstring ip,name,flags,extra; - struct subnet_record *d; - char *ptr; - int count = 0; - struct in_addr ipaddr; - enum name_source source = LMHOSTS; - - if (!fgets_slash(line,sizeof(pstring),f)) continue; - - if (*line == '#') continue; - - strcpy(ip,""); - strcpy(name,""); - strcpy(flags,""); - - ptr = line; - - if (next_token(&ptr,ip ,NULL)) ++count; - if (next_token(&ptr,name ,NULL)) ++count; - if (next_token(&ptr,flags,NULL)) ++count; - if (next_token(&ptr,extra,NULL)) ++count; - - if (count <= 0) continue; - - if (count > 0 && count < 2) { - DEBUG(0,("Ill formed hosts line [%s]\n",line)); - continue; - } - - if (count >= 4) { - DEBUG(0,("too many columns in %s (obsolete syntax)\n",fname)); - continue; - } - - DEBUG(4, ("lmhost entry: %s %s %s\n", ip, name, flags)); - - if (strchr(flags,'G') || strchr(flags,'S')) { - DEBUG(0,("group flag in %s ignored (obsolete)\n",fname)); - continue; - } - - if (strchr(flags,'M')) { - source = SELF; - pstrcpy(myname,name); - } - - ipaddr = *interpret_addr2(ip); - d = find_subnet_all(ipaddr); - if (d) { - add_netbios_entry(d,name,0x00,NB_ACTIVE,0,source,ipaddr,True); - add_netbios_entry(d,name,0x20,NB_ACTIVE,0,source,ipaddr,True); - } - } - - fclose(f); -} +} /* reload_services */ - -/**************************************************************************** - The main select loop. - ***************************************************************************/ +/**************************************************************************** ** + The main select loop. + **************************************************************************** */ static void process(void) { BOOL run_election; - while (True) - { - time_t t = time(NULL); - run_election = check_elections(); - if(listen_for_packets(run_election)) - return; - - run_packet_queue(); - run_elections(t); - - announce_host(t); - announce_master(t); - announce_remote(t); - browse_sync_remote(t); - - query_refresh_names(t); - - expire_names_and_servers(t); - expire_netbios_response_entries(t); - refresh_my_names(t); - - write_browse_list(t); - do_browser_lists(t); - check_master_browser(t); - add_domain_names(t); - } -} + while( True ) + { + time_t t = time(NULL); + + /* + * 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)) + 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); + + /* + * 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); + + /* + * Go through the repsonse record queue and time out or re-transmit + * and expired entries. + * (nmbd_packets.c) + */ + retransmit_or_expire_response_records(t); + } +} /* process */ -/**************************************************************************** - open the socket communication -****************************************************************************/ +/**************************************************************************** ** + open the socket communication + **************************************************************************** */ static BOOL open_sockets(BOOL isdaemon, int port) { /* The sockets opened here will be used to receive broadcast @@ -340,29 +395,29 @@ static BOOL open_sockets(BOOL isdaemon, int port) now deprecated. */ - if (isdaemon) + if ( isdaemon ) ClientNMB = open_socket_in(SOCK_DGRAM, port,0,0); else ClientNMB = 0; ClientDGRAM = open_socket_in(SOCK_DGRAM,DGRAM_PORT,3,0); - if (ClientNMB == -1) - return(False); + if ( ClientNMB == -1 ) + return( False ); - signal(SIGPIPE, SIGNAL_CAST sig_pipe); + signal( SIGPIPE, SIGNAL_CAST sig_pipe ); - set_socket_options(ClientNMB,"SO_BROADCAST"); - set_socket_options(ClientDGRAM,"SO_BROADCAST"); + set_socket_options( ClientNMB, "SO_BROADCAST" ); + set_socket_options( ClientDGRAM, "SO_BROADCAST" ); - DEBUG(3,("open_sockets: Broadcast sockets opened.\n")); - return True; -} + DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) ); + return( True ); +} /* open_sockets */ -/**************************************************************************** - initialise connect, service and file structs -****************************************************************************/ +/**************************************************************************** ** + initialise connect, service and file structs + **************************************************************************** */ static BOOL init_structs() { extern fstring local_machine; @@ -372,102 +427,108 @@ static BOOL init_structs() int nodup; pstring nbname; - if (! *myname) { - fstrcpy(myname,myhostname); - p = strchr(myname,'.'); - if (p) *p = 0; + if (! *myname) + { + fstrcpy( myname, myhostname ); + p = strchr( myname, '.' ); + if (p) + *p = 0; } - strupper(myname); + strupper( myname ); /* Add any NETBIOS name aliases. Ensure that the first entry - is equal to myname. */ + is equal to myname. + */ /* Work out the max number of netbios aliases that we have */ - ptr=lp_netbios_aliases(); - for (namecount=0; next_token(&ptr,nbname,NULL); namecount++) + ptr = lp_netbios_aliases(); + for( namecount=0; next_token(&ptr,nbname,NULL); namecount++ ) ; - if (*myname) - namecount++; + if ( *myname ) + namecount++; /* Allocate space for the netbios aliases */ - if((my_netbios_names=(char **)malloc(sizeof(char *)*(namecount+1))) == NULL) + my_netbios_names = (char **)malloc( sizeof(char *) * (namecount+1) ); + if( NULL == my_netbios_names ) { - DEBUG(0,("init_structs: malloc fail.\n")); - return False; + DEBUG( 0, ( "init_structs: malloc fail.\n" ) ); + return( False ); } /* Use the myname string first */ namecount=0; - if (*myname) + if ( *myname ) my_netbios_names[namecount++] = myname; - ptr=lp_netbios_aliases(); - while (next_token(&ptr,nbname,NULL)) { - strupper(nbname); + ptr = lp_netbios_aliases(); + while ( next_token( &ptr, nbname, NULL ) ) + { + strupper( nbname ); /* Look for duplicates */ nodup=1; - for(n=0; n 1 && (*argv[1] != '-')) { + while (argc > 1 && (*argv[1] != '-')) + { argv++; argc--; } - fault_setup(fault_continue); + fault_setup( fault_continue ); - signal(SIGHUP ,SIGNAL_CAST sig_hup); - signal(SIGTERM,SIGNAL_CAST sig_term); + signal( SIGHUP, SIGNAL_CAST sig_hup ); + signal( SIGTERM, SIGNAL_CAST sig_term ); - while ((opt = getopt(argc, argv, "as:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:f:")) != EOF) + while((opt = getopt(argc, argv, "as:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:f:")) != EOF) { switch (opt) - { + { case 'f': strncpy(pidFile, optarg, sizeof(pidFile)); break; - case 's': - pstrcpy(servicesf,optarg); - break; - case 'N': - case 'B': - case 'I': - case 'C': - case 'G': - DEBUG(0,("Obsolete option '%c' used\n",opt)); - break; - case 'H': - pstrcpy(host_file,optarg); - break; - case 'n': - pstrcpy(myname,optarg); - strupper(myname); - break; - case 'l': - sprintf(debugf,"%s.nmb",optarg); - break; - case 'i': - pstrcpy(scope,optarg); - strupper(scope); - break; - case 'a': - { - extern BOOL append_log; - append_log = !append_log; - } - break; - case 'D': - is_daemon = True; - break; - case 'd': - DEBUGLEVEL = atoi(optarg); - break; - case 'p': - global_nmb_port = atoi(optarg); - break; - case 'h': - usage(argv[0]); - exit(0); - break; - default: - if (!is_a_socket(0)) { - usage(argv[0]); - } - break; - } + case 's': + pstrcpy(servicesf,optarg); + break; + case 'N': + case 'B': + case 'I': + case 'C': + case 'G': + DEBUG(0,("Obsolete option '%c' used\n",opt)); + break; + case 'H': + pstrcpy(host_file,optarg); + break; + case 'n': + pstrcpy(myname,optarg); + strupper(myname); + break; + case 'l': + sprintf(debugf,"%s.nmb",optarg); + break; + case 'i': + pstrcpy(scope,optarg); + strupper(scope); + break; + case 'a': + { + extern BOOL append_log; + append_log = !append_log; + } + break; + case 'D': + is_daemon = True; + break; + case 'd': + DEBUGLEVEL = atoi(optarg); + break; + case 'p': + global_nmb_port = atoi(optarg); + break; + case 'h': + usage(argv[0]); + exit(0); + break; + default: + if (!is_a_socket(0)) + { + usage(argv[0]); + } + break; + } } DEBUG(1,("%s netbios nameserver version %s started\n",timestring(),VERSION)); DEBUG(1,("Copyright Andrew Tridgell 1994-1997\n")); - if(!get_myname(myhostname,NULL)) + if( !get_myname( myhostname, NULL) ) { DEBUG(0,("Unable to get my hostname - exiting.\n")); return -1; } -#ifndef SYNC_DNS - start_async_dns(); -#endif - - if (!reload_services(False)) - return(-1); + if ( !reload_services(False) ) + return(-1); codepage_initialise(lp_client_code_page()); if(!init_structs()) return -1; - reload_services(True); + reload_services( True ); - pstrcpy(myworkgroup, lp_workgroup()); + fstrcpy( myworkgroup, lp_workgroup() ); - if (strequal(myworkgroup,"*")) { + if (strequal(myworkgroup,"*")) + { DEBUG(0,("ERROR: a workgroup name of * is no longer supported\n")); exit(1); } set_samba_nb_type(); - if (!is_daemon && !is_a_socket(0)) { + if (!is_daemon && !is_a_socket(0)) + { DEBUG(0,("standard input is not a socket, assuming -D option\n")); is_daemon = True; } - if (is_daemon) { + if (is_daemon) + { DEBUG(2,("%s becoming a daemon\n",timestring())); become_daemon(); } - if (!directory_exist(lp_lockdir(), NULL)) { - mkdir(lp_lockdir(), 0755); + if (!directory_exist(lp_lockdir(), NULL)) + { + mkdir(lp_lockdir(), 0755); } if (*pidFile) - { - int fd; - char buf[20]; + { + int fd; + char buf[20]; - if ((fd = open(pidFile, #ifdef O_NONBLOCK - O_NONBLOCK | + fd = open( pidFile, O_NONBLOCK | O_CREAT | O_WRONLY | O_TRUNC, 0644 ); +#else + fd = open( pidFile, O_CREAT | O_WRONLY | O_TRUNC, 0644 ); #endif - O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0) - { - DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno))); - exit(1); - } - if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False) - { - DEBUG(0,("ERROR: nmbd is already running\n")); - exit(1); - } - sprintf(buf, "%u\n", (unsigned int) getpid()); - if (write(fd, buf, strlen(buf)) < 0) - { - DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno))); - exit(1); - } - /* Leave pid file open & locked for the duration... */ + if ( fd < 0 ) + { + DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno))); + exit(1); } + if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False) + { + DEBUG(0,("ERROR: nmbd is already running\n")); + exit(1); + } + sprintf(buf, "%u\n", (unsigned int) getpid()); + if (write(fd, buf, strlen(buf)) < 0) + { + DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno))); + exit(1); + } + /* Leave pid file open & locked for the duration... */ + } - DEBUG(3,("Opening sockets %d\n", global_nmb_port)); + DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) ); - if (!open_sockets(is_daemon,global_nmb_port)) return 1; + if ( !open_sockets( is_daemon, global_nmb_port ) ) + return 1; + /* Determine all the IP addresses we have. */ load_interfaces(); - add_my_subnets(myworkgroup); - - add_my_names(); - DEBUG(3,("Checked names\n")); - - load_netbios_names(); - - DEBUG(3,("Loaded names\n")); + /* Create an nmbd subnet record for each of the above. */ + if( False == create_subnets() ) + { + DEBUG(0,("ERROR: Failed when creating subnet lists. Exiting.\n")); + exit(1); + } - if (*host_file) { - load_hosts_file(host_file); + /* Load in any static local names. */ + if ( *host_file ) + { + load_lmhosts_file(host_file); DEBUG(3,("Loaded hosts file\n")); } - write_browse_list(time(NULL)); + /* If we are acting as a WINS server, initialise data structures. */ + if( !initialise_wins() ) + { + DEBUG( 0, ( "nmbd: Failed when initialising WINS server.\n" ) ); + exit(1); + } - DEBUG(3,("Dumped names\n")); + /* + * Register nmbd primary workgroup and nmbd names on all + * the broadcast subnets, and on the WINS server (if specified). + * Also initiate the startup of our primary workgroup (start + * elections if we are setup as being able to be a local + * master browser. + */ + + if( False == register_my_workgroup_and_names() ) + { + DEBUG(0,("ERROR: Failed when creating my my workgroup. Exiting.\n")); + exit(1); + } /* We can only take sigterm signals in the select. */ - BlockSignals(True,SIGTERM); + BlockSignals( True, SIGTERM ); process(); close_sockets(); @@ -663,4 +746,6 @@ static void usage(char *pname) if (dbf) fclose(dbf); return(0); -} +} /* main */ + +/* ========================================================================== */ -- cgit