summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;