summaryrefslogtreecommitdiff
path: root/server/server.c
diff options
context:
space:
mode:
authorGravatar John Kohl <jtkohl@mit.edu>1988-02-28 08:05:08 +0000
committerGravatar John Kohl <jtkohl@mit.edu>1988-02-28 08:05:08 +0000
commit1848efb02dac95d029fd3a81ff0f690b0295ceee (patch)
treedd173644c60ade106a97c7f9f498e6834508d779 /server/server.c
parent50b9393dd5797b027344248379e78125f3ed8547 (diff)
add server_dump_servers and supporting interlock code
Diffstat (limited to 'server/server.c')
-rw-r--r--server/server.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/server/server.c b/server/server.c
index 95c3110..e6d70c7 100644
--- a/server/server.c
+++ b/server/server.c
@@ -61,6 +61,8 @@ static char rcsid_server_s_c[] = "$Header$";
* void server_kill_clt(client);
* ZClient_t *client;
*
+ * void server_dump_servers(fp);
+ * FILE *fp;
*/
static void server_hello(), server_flush(), setup_server();
@@ -113,6 +115,9 @@ server_init()
register int i;
struct in_addr *serv_addr, *server_addrs, limbo_addr;
+ /* we don't need to mask SIGFPE here since when we are called,
+ the signal handler isn't set up yet. */
+
/* talk to hesiod here, set nservers */
if (!(server_addrs = get_server_addrs(&nservers))) {
syslog(LOG_ERR, "No servers?!?");
@@ -188,6 +193,8 @@ server_init()
}
bzero((caddr_t) srv_nacklist, sizeof(ZNotAcked_t));
srv_nacklist->q_forw = srv_nacklist->q_back = srv_nacklist;
+
+ return;
}
/* note: these must match the order given in zserver.h */
@@ -324,16 +331,19 @@ struct sockaddr_in *who;
ZServerDesc_t *temp;
register int i;
long timerval;
+ int omask = sigblock(sigmask(SIGFPE)); /* don't do ascii dumps */
if (who->sin_port != sock_sin.sin_port) {
zdbug((LOG_DEBUG, "srv_register wrong port %d",
ntohs(who->sin_port)));
+ (void) sigsetmask(omask);
return(1);
}
/* Not yet... talk to ken about authenticators */
#ifdef notdef
if (!auth) {
zdbug((LOG_DEBUG, "srv_register unauth"));
+ (void) sigsetmask(omask);
return(1);
}
#endif notdef
@@ -341,6 +351,7 @@ struct sockaddr_in *who;
temp = (ZServerDesc_t *)malloc((unsigned) ((nservers + 1) * sizeof(ZServerDesc_t)));
if (!temp) {
syslog(LOG_CRIT, "srv_reg malloc");
+ (void) sigsetmask(omask);
return(1);
}
bcopy((caddr_t) otherservers, (caddr_t) temp, nservers * sizeof(ZServerDesc_t));
@@ -365,6 +376,7 @@ struct sockaddr_in *who;
zdbug((LOG_DEBUG, "srv %s is %s",
inet_ntoa(otherservers[nservers].zs_addr.sin_addr),
srv_states[(int) otherservers[nservers].zs_state]));
+ (void) sigsetmask(omask);
return(0);
}
#endif notdef
@@ -1517,3 +1529,25 @@ struct sockaddr_in *who;
server_queue(me_server, packlen, pack, auth, who);
return;
}
+
+/*
+ * dump info about servers onto the fp.
+ * assumed to be called with SIGFPE blocked
+ * (true if called from signal handler)
+ */
+void
+server_dump_servers(fp)
+FILE *fp;
+{
+ register int i;
+
+ for (i = 0; i < nservers ; i++) {
+ (void) fprintf(fp, "%d:%s/%s%s\n",
+ i,
+ inet_ntoa(otherservers[i].zs_addr.sin_addr),
+ srv_states[(int) otherservers[i].zs_state],
+ otherservers[i].zs_dumping ? " (DUMPING)" : "");
+ }
+
+ return;
+}