summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
committerGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
commit0398e01a5032434abef05a26e2f9eeb058fecb31 (patch)
tree33357d7224ffe50ca69fae66053d80df4a150510
parent6c547bc312ef528815040e42ca5e80233ff98265 (diff)
Don't do signal blocking; simply set a semaphore flag indicating it is
in critical code, and let the main loop deal with the flag being set. This saves on context switches into the kernel for this rare condition.
-rw-r--r--server/bdump.c91
-rw-r--r--server/client.c38
-rw-r--r--server/hostm.c224
-rw-r--r--server/main.c72
-rw-r--r--server/server.c39
-rw-r--r--server/subscr.c107
-rw-r--r--server/uloc.c141
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(&notice, 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;