summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar John Kohl <jtkohl@mit.edu>1988-02-28 08:00:55 +0000
committerGravatar John Kohl <jtkohl@mit.edu>1988-02-28 08:00:55 +0000
commit02a0b3ade0daa8b8cfcad6d63eb738dd0ddec56d (patch)
tree975b383577ceb1fd218ee649288f02fe9a9af346
parentf3409ff3eead2d6443b0ef62547bf8d7639f20bc (diff)
add hostm_dump_hosts routine to dump the state to a file. Also
added interlock protect code.
-rw-r--r--server/hostm.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/server/hostm.c b/server/hostm.c
index 1ca3baf..ef6a554 100644
--- a/server/hostm.c
+++ b/server/hostm.c
@@ -6,7 +6,7 @@
* $Source$
* $Author$
*
- * Copyright (c) 1987 by the Massachusetts Institute of Technology.
+ * Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
@@ -54,6 +54,9 @@ static char rcsid_hostm_s_c[] = "$Header$";
* void hostm_deathgram(sin, server)
* struct sockaddr_in *sin;
* ZServerDesc_t *server;
+ *
+ * void hostm_dump_hosts(fp)
+ * FILE *fp;
*/
/*
@@ -202,6 +205,7 @@ ZServerDesc_t *server;
{
register ZClientList_t *clist = NULLZCLT, *clt;
losinghost *lhp, *lhp2;
+ int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */
zdbug((LOG_DEBUG,"hostm_flush"));
@@ -229,6 +233,7 @@ ZServerDesc_t *server;
uloc_hflush(&host->zh_addr.sin_addr);
host_detach(&host->zh_addr.sin_addr, server);
/* XXX tell other servers */
+ (void) sigsetmask(omask);
return;
}
@@ -327,6 +332,7 @@ host_lost(which)
losinghost *which;
{
ZServerDesc_t *server;
+ int omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
zdbug((LOG_DEBUG,"lost host %s",
inet_ntoa(which->lh_host->zh_addr.sin_addr)));
@@ -335,6 +341,7 @@ losinghost *which;
zdbug((LOG_DEBUG,"no server"));
xremque(which);
xfree(which);
+ (void) sigsetmask(omask);
return;
}
xremque(which);
@@ -342,6 +349,7 @@ losinghost *which;
xfree(which);
/* XXX tell other servers */
+ (void) sigsetmask(omask);
return;
}
@@ -354,9 +362,11 @@ host_not_losing(who)
struct sockaddr_in *who;
{
losinghost *lhp, *lhp2;
+ int omask;
if (!losing_hosts)
return;
+ omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
for (lhp = losing_hosts->q_forw;
lhp != losing_hosts;)
if (lhp->lh_host->zh_addr.sin_addr.s_addr == who->sin_addr.s_addr) {
@@ -379,6 +389,8 @@ struct sockaddr_in *who;
lhp = lhp2->q_forw;
} else
lhp = lhp->q_forw;
+ (void) sigsetmask(omask);
+ return;
}
@@ -392,6 +404,8 @@ hostm_transfer(host, server)
ZHostList_t *host;
ZServerDesc_t *server;
{
+ int omask;
+
/* we need to unlink and relink him, and change the table entry */
zdbug((LOG_DEBUG, "hostm_transfer 0x%x to 0x%x", host, server));
@@ -400,6 +414,7 @@ ZServerDesc_t *server;
if (hostm_find_server(&host->zh_addr.sin_addr) == server)
return;
+ omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
/* remove from old server's queue */
xremque(host);
@@ -409,6 +424,7 @@ ZServerDesc_t *server;
/* insert in our queue */
xinsque(host, server->zs_hosts);
+ (void) sigsetmask(omask);
return;
}
@@ -424,15 +440,18 @@ ZServerDesc_t *server;
{
register ZHostList_t *hlist;
register ZClientList_t *clist;
+ int omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
/* allocate a header */
if (!(hlist = (ZHostList_t *)xmalloc(sizeof(ZHostList_t)))) {
syslog(LOG_WARNING, "hm_attach malloc");
+ (void) sigsetmask(omask);
return(ENOMEM);
}
/* set up */
if (!(clist = (ZClientList_t *)xmalloc(sizeof(ZClientList_t)))) {
xfree(hlist);
+ (void) sigsetmask(omask);
return(ENOMEM);
}
clist->q_forw = clist->q_back = clist;
@@ -447,6 +466,7 @@ ZServerDesc_t *server;
/* chain in to the end of the list */
xinsque(hlist, server->zs_hosts->q_back);
+ (void) sigsetmask(omask);
return(ZERR_NONE);
}
@@ -463,9 +483,11 @@ ZServerDesc_t *server;
{
/* undo what we did in host_attach */
register ZHostList_t *hlist;
+ int omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
if (hostm_find_server(addr) != server) {
syslog(LOG_WARNING, "host_detach: wrong server");
+ (void) sigsetmask(omask);
return;
}
@@ -481,6 +503,7 @@ ZServerDesc_t *server;
remove_host(hlist);
xfree(hlist);
+ (void) sigsetmask(omask);
return;
}
@@ -672,6 +695,7 @@ ZServerDesc_t *server;
{
struct hostlist *oldlist;
register int i = 0;
+ int omask;
#ifdef DEBUG
char buf[512];
@@ -685,6 +709,8 @@ ZServerDesc_t *server;
if (hostm_find_host(&host->zh_addr.sin_addr))
return;
+ omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
+
num_hosts++;
oldlist = all_hosts;
@@ -696,6 +722,7 @@ ZServerDesc_t *server;
if (!oldlist) { /* this is the first */
all_hosts[0].host = host;
all_hosts[0].server_index = server - otherservers;
+ (void) sigsetmask(omask);
return;
}
@@ -715,6 +742,7 @@ ZServerDesc_t *server;
i++;
}
xfree(oldlist);
+ (void) sigsetmask(omask);
#ifdef DEBUG
if (zdebug) {
register int i = 0;
@@ -739,15 +767,18 @@ ZHostList_t *host;
{
struct hostlist *oldlist;
register int i = 0;
+ int omask;
zdbug((LOG_DEBUG,"remove_host %s", inet_ntoa(host->zh_addr.sin_addr)));
if (!hostm_find_host(&host->zh_addr.sin_addr))
return;
+ omask = sigblock(sigmask(SIGFPE)); /* don't start db dumps */
if (--num_hosts == 0) {
zdbug((LOG_DEBUG,"last host"));
xfree(all_hosts);
all_hosts = NULLHLT;
+ (void) sigsetmask(omask);
return;
}
@@ -772,5 +803,26 @@ ZHostList_t *host;
i++;
}
xfree(oldlist);
+ (void) sigsetmask(omask);
+ return;
+}
+
+/*
+ * Assumes that SIGFPE is blocked when called; this is true if called from a
+ * signal handler
+ */
+
+void
+hostm_dump_hosts(fp)
+FILE *fp;
+{
+ register int i;
+ char buf[512], scratch[64];
+ for (i = 0; i < num_hosts; i++) {
+ (void) fprintf(fp, "%s/%d:\n",
+ inet_ntoa((all_hosts[i].host)->zh_addr.sin_addr),
+ all_hosts[i].server_index);
+ client_dump_clients(fp,(all_hosts[i].host)->zh_clients);
+ }
return;
}