diff options
-rw-r--r-- | server/bdump.c | 91 | ||||
-rw-r--r-- | server/client.c | 38 | ||||
-rw-r--r-- | server/hostm.c | 224 | ||||
-rw-r--r-- | server/main.c | 72 | ||||
-rw-r--r-- | server/server.c | 39 | ||||
-rw-r--r-- | server/subscr.c | 107 | ||||
-rw-r--r-- | server/uloc.c | 141 |
7 files changed, 192 insertions, 520 deletions
diff --git a/server/bdump.c b/server/bdump.c index 0fdb277..e304933 100644 --- a/server/bdump.c +++ b/server/bdump.c @@ -87,12 +87,7 @@ static int net_read P((FILE *f, register char *buf, register int len)); static int net_write P((FILE *f, register char *buf, int len)); static int setup_file_pointers P((void)); static void shutdown_file_pointers P((void)); - -#ifdef POSIX -static void cleanup P((ZServerDesc_t *server, sigset_t *omask)); -#else -static void cleanup P((ZServerDesc_t *server, int *omask)); -#endif +static void cleanup P((ZServerDesc_t *server)); #ifdef KERBEROS static int get_tgt P((void)); @@ -240,10 +235,7 @@ bdump_send() int fromlen = sizeof(from); int on = 1; #ifdef POSIX - sigset_t mask, omask; struct sigaction action; -#else - int omask; #endif #ifdef KERBEROS @@ -272,16 +264,13 @@ bdump_send() #endif #ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); - - action.sa_flags = 0; (void) sigemptyset(&action.sa_mask); + action.sa_flags = 0; action.sa_handler = SIG_IGN; (void) sigaction(SIGPIPE, &action, NULL); + + START_CRITICAL_CODE; #else - omask = sigblock(sigmask(SIGFPE)); /* don't let ascii dumps start */ (void) signal(SIGPIPE, SIG_IGN); /* so we can detect failures */ #endif @@ -349,11 +338,11 @@ bdump_send() { syslog(LOG_ERR, "bdump_send: getkdata: %s", krb_err_txt[retval]); - cleanup(server, &omask); + cleanup(server); return; } if (get_tgt()) { - cleanup(server, &omask); + cleanup(server); return; } if (strcmp(kdata.pname,SERVER_SERVICE) || @@ -362,7 +351,7 @@ bdump_send() { syslog(LOG_ERR, "bdump_send: peer not zephyr: %s.%s@%s", kdata.pname, kdata.pinst, kdata.prealm); - cleanup(server, &omask); + cleanup(server); return; } /* authenticate back */ @@ -371,7 +360,7 @@ bdump_send() { syslog(LOG_ERR,"bdump_send: SendKerberosData: %s", error_message (retval)); - cleanup(server, &omask); + cleanup(server); return; } #else /* !KERBEROS */ @@ -379,7 +368,7 @@ bdump_send() (fromport < (IPPORT_RESERVED / 2))) { syslog(LOG_ERR, "bdump_send: bad port from peer: %d", fromport); - cleanup(server, &omask); + cleanup(server); return; } #endif /* KERBEROS */ @@ -387,19 +376,19 @@ bdump_send() if ((retval = setup_file_pointers()) != 0) { syslog (LOG_WARNING, "bdump_send: can't set up file pointers: %s", error_message (retval)); - cleanup(server, &omask); + cleanup(server); return; } if ((retval = sbd_loop(&from)) != ZERR_NONE) { syslog(LOG_WARNING, "bdump_send: sbd_loop failed: %s", error_message(retval)); - cleanup(server, &omask); + cleanup(server); return; } if ((retval = gbd_loop(server)) != ZERR_NONE) { syslog(LOG_WARNING, "bdump_send: gbd_loop failed: %s", error_message(retval)); - cleanup(server, &omask); + cleanup(server); return; } #if 1 @@ -429,11 +418,7 @@ bdump_send() /* Now that we are finished dumping, send all the queued packets */ server_send_queue(server); #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -450,9 +435,6 @@ bdump_get_v1_guts (notice, auth, who, server) int on = 1; #ifdef POSIX struct sigaction action; - sigset_t mask, omask; -#else - int omask; #endif #ifdef KERBEROS KTEXT_ST ticket; @@ -498,19 +480,13 @@ bdump_get_v1_guts (notice, auth, who, server) server->zs_dumping = 0; return; } -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let ascii dumps start */ -#endif + START_CRITICAL_CODE; #ifndef KERBEROS if (ntohs(from.sin_port) > IPPORT_RESERVED || ntohs(from.sin_port) < IPPORT_RESERVED / 2) { syslog(LOG_ERR, "bdump_get: port not reserved: %d", ntohs(from.sin_port)); - cleanup(server, &omask); + cleanup(server); return; } live_socket = rresvport(&reserved_port); @@ -519,12 +495,12 @@ bdump_get_v1_guts (notice, auth, who, server) #endif /* KERBEROS */ if (live_socket < 0) { syslog(LOG_ERR, "bdump_get: socket: %m"); - cleanup(server, &omask); + cleanup(server); return; } if (connect(live_socket, (struct sockaddr *) &from, sizeof(from))) { syslog(LOG_ERR, "bdump_get: connect: %m"); - cleanup(server, &omask); + cleanup(server); return; } if (setsockopt(live_socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, @@ -540,7 +516,7 @@ bdump_get_v1_guts (notice, auth, who, server) #ifdef KERBEROS /* send an authenticator */ if (get_tgt()) { - cleanup(server, &omask); + cleanup(server); return; } if ((retval = SendKerberosData(live_socket, &ticket, @@ -548,7 +524,7 @@ bdump_get_v1_guts (notice, auth, who, server) { syslog(LOG_ERR,"bdump_get: %s", error_message (retval)); - cleanup(server, &omask); + cleanup(server); return; } #if 1 @@ -561,7 +537,7 @@ bdump_get_v1_guts (notice, auth, who, server) != KSUCCESS) { syslog(LOG_ERR, "bdump_get getkdata: %s",krb_err_txt[retval]); - cleanup(server, &omask); + cleanup(server); return; } /* my_realm is filled in inside get_tgt() */ @@ -572,20 +548,20 @@ bdump_get_v1_guts (notice, auth, who, server) syslog(LOG_ERR, "bdump_get: peer not zephyr in lrealm: %s.%s@%s", kdata.pname, kdata.pinst,kdata.prealm); - cleanup(server, &omask); + cleanup(server); return; } #endif /* KERBEROS */ if ((retval = setup_file_pointers()) != 0) { syslog (LOG_WARNING, "bdump_get: can't set up file pointers: %s", error_message (retval)); - cleanup(server, &omask); + cleanup(server); return; } if ((retval = gbd_loop(server)) != ZERR_NONE) { syslog(LOG_WARNING, "bdump_get: gbd_loop failed: %s", error_message(retval)); - cleanup(server, &omask); + cleanup(server); return; } #if 1 @@ -594,7 +570,7 @@ bdump_get_v1_guts (notice, auth, who, server) if ((retval = sbd_loop(&from)) != ZERR_NONE) { syslog(LOG_WARNING, "sbd_loop failed: %s", error_message(retval)); - cleanup(server, &omask); + cleanup(server); return; } #if 1 @@ -623,11 +599,7 @@ bdump_get_v1_guts (notice, auth, who, server) server_send_queue(server); #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -801,13 +773,8 @@ shutdown_file_pointers () { } static void -cleanup(server, omask) +cleanup(server) ZServerDesc_t *server; -#ifdef POSIX - sigset_t *omask; -#else - int *omask; -#endif { #ifdef POSIX struct sigaction action; @@ -836,11 +803,7 @@ cleanup(server, omask) #ifdef CONCURRENT /* XXX need to flush the server and the updates to it */ #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, omask, (sigset_t *)0); -#else - (void) sigsetmask(*omask); -#endif + END_CRITICAL_CODE; return; } diff --git a/server/client.c b/server/client.c index 1067ae7..c1b129c 100644 --- a/server/client.c +++ b/server/client.c @@ -65,11 +65,6 @@ client_register(notice, who, client, server, wantdefaults) register ZHostList_t *hlp = server->zs_hosts; register ZHostList_t *hlp2; register ZClientList_t *clist; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif /* chain the client's host onto this server's host list */ @@ -129,19 +124,11 @@ client_register(notice, who, client, server, wantdefaults) /* chain him in to the clients list in the host list*/ -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + xinsque(clist, hlp2->zh_clients); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; if (!server->zs_dumping && wantdefaults) /* add default subscriptions only if this is not @@ -165,14 +152,8 @@ client_deregister(client, host, flush) int flush; { ZClientList_t *clients; -#ifdef POSIX - sigset_t mask, omask; - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; /* release any not-acked packets in the rexmit queue */ nack_release(client); @@ -195,12 +176,7 @@ client_deregister(client, host, flush) free_zstring(client->zct_principal); xfree(client); xfree(clients); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, - (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } syslog(LOG_CRIT, "clt_dereg: clt not in host list"); diff --git a/server/hostm.c b/server/hostm.c index aa7a3d5..4a029ea 100644 --- a/server/hostm.c +++ b/server/hostm.c @@ -237,14 +237,8 @@ hostm_flush(host, server) { register ZClientList_t *clist = NULLZCLT, *clt; losinghost *lhp, *lhp2; -#ifdef POSIX - sigset_t mask, omask; - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; if (!host) { syslog(LOG_WARNING, "null host flush"); @@ -283,11 +277,9 @@ hostm_flush(host, server) uloc_hflush(&host->zh_addr.sin_addr); host_detach(host, server); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -399,15 +391,9 @@ host_lost(arg) Code_t retval; char *buffer; int len; -#ifdef POSIX - sigset_t mask, omask; - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + server = hostm_find_server(&which->lh_host->zh_addr.sin_addr); #if 1 zdbug ((LOG_DEBUG,"lost host %s (server %s)", @@ -421,11 +407,7 @@ host_lost(arg) #endif xremque(which); xfree(which); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } xremque(which); @@ -461,11 +443,9 @@ host_lost(arg) server_forward(¬ice, 0, &who); /* unauthentic */ xfree(which); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -478,21 +458,12 @@ host_not_losing(who) struct sockaddr_in *who; { losinghost *lhp, *lhp2; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif if (!losing_hosts) return; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; + for (lhp = losing_hosts->q_forw; lhp != losing_hosts;) if (lhp->lh_host->zh_addr.sin_addr.s_addr == who->sin_addr.s_addr) { @@ -520,11 +491,9 @@ host_not_losing(who) lhp = lhp2->q_forw; } else lhp = lhp->q_forw; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -538,22 +507,12 @@ hostm_lose_ignore(client) ZClient_t *client; { losinghost *lhp, *lhp2; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif if (!losing_hosts) return; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + for (lhp = losing_hosts->q_forw; lhp != losing_hosts;) /* if client matches, remove it */ @@ -573,11 +532,9 @@ hostm_lose_ignore(client) lhp = lhp2->q_forw; } else lhp = lhp->q_forw; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -591,14 +548,7 @@ hostm_transfer(host, server) ZHostList_t *host; ZServerDesc_t *server; { -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif - /* we need to unlink and relink him, and change the table entry */ - #if 1 if (zdebug) syslog (LOG_DEBUG, "hostm_transfer %s to %s", @@ -609,13 +559,8 @@ hostm_transfer(host, server) if (hostm_find_server(&host->zh_addr.sin_addr) == server) return; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + /* remove from old server's queue */ xremque(host); @@ -625,11 +570,9 @@ hostm_transfer(host, server) /* insert in our queue */ xinsque(host, server->zs_hosts); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -645,14 +588,8 @@ host_attach(who, server) { register ZHostList_t *hlist; register ZClientList_t *clist; -#ifdef POSIX - sigset_t mask, omask; - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; #if 0 if (zdebug) @@ -662,21 +599,13 @@ host_attach(who, server) /* allocate a header */ if (!(hlist = (ZHostList_t *) xmalloc(sizeof(ZHostList_t)))) { syslog(LOG_WARNING, "hm_attach alloc"); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(ENOMEM); } /* set up */ if (!(clist = (ZClientList_t *)xmalloc(sizeof(ZClientList_t)))) { xfree(hlist); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(ENOMEM); } clist->zclt_client = NULLZCNT; @@ -692,11 +621,9 @@ host_attach(who, server) /* chain in to the end of the list */ xinsque(hlist, server->zs_hosts->q_back); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return(ZERR_NONE); } @@ -712,20 +639,10 @@ host_detach(host, server) ZServerDesc_t *server; { ZServerDesc_t *server2; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif + + START_CRITICAL_CODE; /* undo what we did in host_attach */ -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif server2 = hostm_find_server (&host->zh_addr.sin_addr); if (server2 != server) { @@ -734,11 +651,7 @@ host_detach(host, server) inet_ntoa (host->zh_addr.sin_addr), server->addr, server2->addr); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -753,11 +666,9 @@ host_detach(host, server) remove_host(host); xfree(host); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } @@ -982,11 +893,6 @@ insert_host(host, server) { struct hostlist *oldlist; register int i = 0; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif #if 0 zdbug ((LOG_DEBUG,"insert_host %s %s", @@ -995,13 +901,7 @@ insert_host(host, server) if (hostm_find_host(&host->zh_addr.sin_addr)) return; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; num_hosts++; oldlist = all_hosts; @@ -1014,11 +914,7 @@ insert_host(host, server) if (!oldlist) { /* this is the first */ all_hosts[0].host = host; all_hosts[0].server_index = server - otherservers; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -1038,11 +934,9 @@ insert_host(host, server) i++; } xfree(oldlist); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + #if defined (DEBUG) && 0 if (zdebug) { register int i = 0; @@ -1065,11 +959,6 @@ remove_host(host) { struct hostlist *oldlist; register int i = 0; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif #if 0 zdbug((LOG_DEBUG,"remove_host %s", inet_ntoa(host->zh_addr.sin_addr))); @@ -1077,24 +966,15 @@ remove_host(host) if (!hostm_find_host(&host->zh_addr.sin_addr)) return; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + if (--num_hosts == 0) { #if 0 zdbug((LOG_DEBUG,"last host")); #endif xfree (all_hosts); all_hosts = NULLHLT; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -1119,11 +999,9 @@ remove_host(host) i++; } xfree (oldlist); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } diff --git a/server/main.c b/server/main.c index 19832b8..b3ec4e4 100644 --- a/server/main.c +++ b/server/main.c @@ -99,9 +99,10 @@ static int do_net_setup P((void)), initialize P((void)); static void usage P((void)), do_reset P((void)); static SIGNAL_RETURN_TYPE bye P((int)), dbug_on P((int)), dbug_off P((int)), - dump_db P((int)), dump_strings P((int)), + sig_dump_db P((int)), sig_dump_strings P((int)), reset P((int)), reap P((int)); static void read_from_dump P((char *dumpfile)); +static void dump_db P((void)), dump_strings P((void)); #ifndef DEBUG static void detach P((void)); @@ -142,6 +143,9 @@ int zalone; struct timeval t_local; /* store current time for other uses */ +static int dump_db_flag = 0; +static int dump_strings_flag = 0; + u_long npackets; /* number of packets processed */ long uptime; /* when we started operations */ static int nofork; @@ -286,10 +290,11 @@ main(argc, argv) action.sa_handler = reap; sigaction(SIGCHLD, &action, NULL); - action.sa_handler = dump_db; + action.sa_handler = sig_dump_db; sigaction(SIGFPE, &action, NULL); + sigaction(SIGXCPU, &action, NULL); - action.sa_handler = dump_strings; + action.sa_handler = sig_dump_strings; sigaction(SIGEMT, &action, NULL); action.sa_handler = reset; @@ -300,15 +305,19 @@ main(argc, argv) (void) signal(SIGUSR1, dbug_on); (void) signal(SIGUSR2, dbug_off); (void) signal(SIGCHLD, reap); - (void) signal(SIGFPE, dump_db); - (void) signal(SIGEMT, dump_strings); + (void) signal(SIGFPE, sig_dump_db); + (void) signal(SIGXCPU, sig_dump_db); + (void) signal(SIGEMT, sig_dump_strings); (void) signal(SIGHUP, reset); #endif /* POSIX */ syslog(LOG_NOTICE, "Ready for action"); + /* Initialize t_local for other uses */ + (void) gettimeofday(&t_local, (struct timezone *)0); /* GO! */ uptime = NOW; + #ifdef DEBUG_MALLOC malloc_inuse(&m_size); #endif @@ -316,11 +325,17 @@ main(argc, argv) if (doreset) do_reset(); + if (dump_db_flag) + dump_db(); + if (dump_strings_flag) + dump_strings(); + + nexthost_tv.tv_usec = 0; tvp = &nexthost_tv; + if (nexttimo != 0L) { nexthost_tv.tv_sec = nexttimo - NOW; - nexthost_tv.tv_usec = 0; - if (nexthost_tv.tv_sec < 0) { + if (nexthost_tv.tv_sec <= 0) { /* timeout has passed! */ /* so we process one timeout, then pop to select, polling for input. This way we get @@ -331,7 +346,7 @@ main(argc, argv) nexthost_tv.tv_sec = 0; } } else { /* no timeouts to process */ - tvp = (struct timeval *) NULL; + nexthost_tv.tv_sec = 15; } readable = interesting; if (msgs_queued()) { @@ -340,8 +355,8 @@ main(argc, argv) nfound = 1; FD_ZERO(&readable); } else - nfound = select(nfildes, &readable, (fd_set *) NULL, - (fd_set *) NULL, tvp); + nfound = select(nfildes, &readable, (fd_set *) 0, + (fd_set *) 0, tvp); /* Initialize t_local for other uses */ (void) gettimeofday(&t_local, (struct timezone *)0); @@ -578,19 +593,26 @@ int fork_for_dump = 0; static SIGNAL_RETURN_TYPE #ifdef __STDC__ -dump_strings (int sig) +sig_dump_strings (int sig) #else -dump_strings(sig) +sig_dump_strings(sig) int sig; #endif { + dump_strings_flag = 1; + SIG_RETURN; +} + +static void dump_strings() +{ FILE *fp; int oerrno = errno; fp = fopen ("/usr/tmp/zephyr.strings", "w"); if (!fp) { syslog (LOG_ERR, "can't open strings dump file: %m"); errno = oerrno; - SIG_RETURN; + dump_strings_flag = 0; + return; } syslog (LOG_INFO, "dumping strings to disk"); print_zstring_table(fp); @@ -599,17 +621,24 @@ dump_strings(sig) else syslog (LOG_INFO, "dump done"); oerrno = errno; - SIG_RETURN; + dump_strings_flag = 0; + return; } static SIGNAL_RETURN_TYPE #ifdef __STDC__ -dump_db(int sig) +sig_dump_db(int sig) #else -dump_db(sig) +sig_dump_db(sig) int sig; #endif { + dump_db_flag = 1; + SIG_RETURN; +} + +static void dump_db() +{ /* dump the in-core database to human-readable form on disk */ FILE *fp; int oerrno = errno; @@ -627,11 +656,15 @@ dump_db(sig) pid = -1; #endif if (pid > 0) - SIG_RETURN; + { + dump_db_flag = 0; + return; + } if ((fp = fopen("/usr/tmp/zephyr.db", "w")) == (FILE *)0) { syslog(LOG_ERR, "can't open dump database"); errno = oerrno; - SIG_RETURN; + dump_db_flag = 0; + return; } syslog(LOG_INFO, "dumping to disk"); server_dump_servers(fp); @@ -644,7 +677,8 @@ dump_db(sig) if (pid == 0) exit (0); errno = oerrno; - SIG_RETURN; + dump_db_flag = 0; + return; } static SIGNAL_RETURN_TYPE diff --git a/server/server.c b/server/server.c index f9a333d..96aaf2e 100644 --- a/server/server.c +++ b/server/server.c @@ -592,30 +592,12 @@ server_register(notice, auth, who) ZServerDesc_t *temp; register int i; long timerval; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif - -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); /* don't let db dumps start */ - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); -#endif if (who->sin_port != sock_sin.sin_port) { #if 0 zdbug((LOG_DEBUG, "srv_register wrong port %d", ntohs(who->sin_port))); #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif return 1; } /* Not yet... talk to ken about authenticators */ @@ -624,11 +606,6 @@ server_register(notice, auth, who) #if 0 zdbug((LOG_DEBUG, "srv_register unauth")); #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif return 1; } #endif /* notdef */ @@ -636,13 +613,11 @@ server_register(notice, auth, who) temp = (ZServerDesc_t *)xmalloc((unsigned) ((nservers + 1) * sizeof(ZServerDesc_t))); if (!temp) { syslog(LOG_CRIT, "srv_reg malloc"); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif return 1; } + + START_CRITICAL_CODE; + (void) memcpy((caddr_t) temp, (caddr_t) otherservers, nservers * sizeof(ZServerDesc_t)); xfree(otherservers); @@ -667,11 +642,9 @@ server_register(notice, auth, who) zdbug((LOG_DEBUG, "srv %s is %s", otherservers[nservers].addr, srv_states[(int) otherservers[nservers].zs_state])); #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return 0; } #endif diff --git a/server/subscr.c b/server/subscr.c index 790e8f5..cb2b110 100644 --- a/server/subscr.c +++ b/server/subscr.c @@ -162,20 +162,11 @@ subscr_subscribe_real(who, newsubs, notice) ZSTRING *sender; ZSubscr_t *subs2, *subs3, *subs; int relation; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif sender = make_zstring(notice->z_sender,0); -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; + for (subs = newsubs->q_forw; subs != newsubs; subs = subs->q_forw) { @@ -245,11 +236,7 @@ subscr_subscribe_real(who, newsubs, notice) if (!(subs3 = (ZSubscr_t *) xmalloc(sizeof(ZSubscr_t)))) { free_subscriptions(newsubs); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(ENOMEM); } @@ -263,11 +250,7 @@ subscr_subscribe_real(who, newsubs, notice) if ((retval = class_register(who, subs)) != ZERR_NONE) { xfree(subs3); free_subscriptions(newsubs); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(retval); } @@ -276,11 +259,8 @@ subscr_subscribe_real(who, newsubs, notice) duplicate: ; } -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; free_subscriptions(newsubs); return(ZERR_NONE); @@ -430,11 +410,6 @@ subscr_cancel(sin, notice) Code_t retval; int found = 0; int relation; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif #if 0 zdbug((LOG_DEBUG,"subscr_cancel")); @@ -448,14 +423,8 @@ subscr_cancel(sin, notice) if (!(subs = extract_subscriptions(notice))) return(ZERR_NONE); /* no subscr -> no error */ - -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + for (subs4 = subs->q_forw; subs4 != subs; subs4 = subs4->q_forw) { for (subs2 = who->zct_subs->q_forw; subs2 != who->zct_subs;) { @@ -493,20 +462,13 @@ subscr_cancel(sin, notice) subs2 = subs2->q_forw) if ((retval = class_register(who, subs2)) != ZERR_NONE) { free_subscriptions(subs); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(retval); } } -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + free_subscriptions(subs); if (found) { #if 0 @@ -530,11 +492,6 @@ subscr_cancel_client(client) ZClient_t *client; { register ZSubscr_t *subs; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif #if 0 zdbug((LOG_DEBUG,"subscr_cancel_client %s", @@ -542,14 +499,9 @@ subscr_cancel_client(client) #endif if (!client->zct_subs) return; - -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + + START_CRITICAL_CODE; + for (subs = client->zct_subs->q_forw; subs != client->zct_subs; subs = client->zct_subs->q_forw) { @@ -577,11 +529,8 @@ subscr_cancel_client(client) xfree(subs); client->zct_subs = NULLZST; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + return; } @@ -597,32 +546,20 @@ struct in_addr *addr; { register ZHostList_t *hosts; register ZClientList_t *clist = NULLZCLT, *clt; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif /* find the host */ if (!(hosts = hostm_find_host(addr))) return(ZSRV_HNOTFOUND); clist = hosts->zh_clients; -#ifdef POSIX - (void) sigemptyset(&mask); - (void) sigaddset(&mask, SIGFPE); - (void) sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + /* flush each one */ for (clt = clist->q_forw; clt != clist; clt = clt->q_forw) (void) subscr_cancel_client(clt->zclt_client); -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return(ZERR_NONE); } #endif diff --git a/server/uloc.c b/server/uloc.c index fcf283b..9c4984c 100644 --- a/server/uloc.c +++ b/server/uloc.c @@ -438,22 +438,11 @@ uloc_hflush(addr) { ZLocation_t *loc; register int i = 0, new_num = 0; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif if (num_locs == 0) return; /* none to flush */ -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; /* slightly inefficient, assume the worst, and allocate enough space */ loc = (ZLocation_t *) xmalloc(num_locs *sizeof(ZLocation_t)); @@ -490,21 +479,16 @@ uloc_hflush(addr) xfree(loc); loc = NULLZLT; num_locs = new_num; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } locations = loc; num_locs = new_num; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + /* all done */ return; } @@ -515,22 +499,11 @@ uloc_flush_client(sin) { ZLocation_t *loc; register int i = 0, new_num = 0; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif if (num_locs == 0) return; /* none to flush */ -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; /* slightly inefficient, assume the worst, and allocate enough space */ loc = (ZLocation_t *) xmalloc(num_locs *sizeof(ZLocation_t)); @@ -568,21 +541,16 @@ uloc_flush_client(sin) xfree(loc); loc = NULLZLT; num_locs = new_num; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + + END_CRITICAL_CODE; + return; } locations = loc; num_locs = new_num; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + #ifdef DEBUG if (zdebug) { register int i; @@ -670,11 +638,6 @@ ulogin_add_user(notice, exposure, who) { ZLocation_t *oldlocs, newloc; register int i; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif if ((oldlocs = ulogin_find(notice,1)) != NULLZLT) { #if 0 @@ -686,13 +649,8 @@ ulogin_add_user(notice, exposure, who) oldlocs = locations; -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + locations = (ZLocation_t *) xmalloc((num_locs +1) * sizeof(ZLocation_t)); if (!locations) { @@ -705,11 +663,7 @@ ulogin_add_user(notice, exposure, who) if (ulogin_setup(notice, locations, exposure, who)) { xfree(locations); locations = NULLZLT; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return 1; } num_locs = 1; @@ -721,11 +675,7 @@ ulogin_add_user(notice, exposure, who) if (ulogin_setup(notice, &newloc, exposure, who)) { xfree(locations); locations = oldlocs; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return 1; } num_locs++; @@ -762,11 +712,7 @@ ulogin_add_user(notice, exposure, who) (int) locations[i].zlt_exposure); } #endif -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return 0; } @@ -990,11 +936,6 @@ ulogin_remove_user(notice, auth, who, err_return) ZLocation_t *loc, *loc2; register int i = 0; exposure_type quiet; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif *err_return = 0; if (!(loc2 = ulogin_find(notice, 1))) { @@ -1014,13 +955,7 @@ ulogin_remove_user(notice, auth, who, err_return) quiet = loc2->zlt_exposure; -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; if (--num_locs == 0) { /* last one */ #if 0 zdbug((LOG_DEBUG,"last loc")); @@ -1028,11 +963,7 @@ ulogin_remove_user(notice, auth, who, err_return) free_loc(locations); xfree(locations); locations = NULLZLT; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return(quiet); } @@ -1063,11 +994,8 @@ ulogin_remove_user(notice, auth, who, err_return) locations = loc; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + #if defined(DEBUG) && 0 if (zdebug) { register int i; @@ -1092,11 +1020,6 @@ ulogin_flush_user(notice) { register ZLocation_t *loc, *loc2; register int i, j, num_match, num_left; -#ifdef POSIX - sigset_t mask, omask; -#else - int omask; -#endif i = num_match = num_left = 0; @@ -1110,13 +1033,8 @@ ulogin_flush_user(notice) /* compute # locations left in the list, after loc2 (inclusive) */ num_left = num_locs - (loc2 - locations); -#ifdef POSIX - sigemptyset(&mask); - sigaddset(&mask, SIGFPE); - sigprocmask(SIG_BLOCK, &mask, &omask); -#else - omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */ -#endif + START_CRITICAL_CODE; + while (num_left && !strcasecmp(loc2[num_match].zlt_user->string, notice->z_class_inst)) { @@ -1133,11 +1051,7 @@ ulogin_flush_user(notice) xfree (locations); locations = NULLZLT; num_locs = 0; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; return; } @@ -1171,11 +1085,8 @@ ulogin_flush_user(notice) locations = loc; num_locs -= num_match; -#ifdef POSIX - (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); -#else - (void) sigsetmask(omask); -#endif + END_CRITICAL_CODE; + #ifdef DEBUG if (zdebug) { register int i; |