summaryrefslogtreecommitdiff
path: root/zhm/zhm.c
diff options
context:
space:
mode:
authorGravatar David C. Jedlinsky <opus@mit.edu>1987-07-20 12:11:54 +0000
committerGravatar David C. Jedlinsky <opus@mit.edu>1987-07-20 12:11:54 +0000
commitf7c0c646d5ca6e554c7c74f05c2157053fc1e47b (patch)
tree97006742bd8ad2d89b3951cab8d606fc7efba18a /zhm/zhm.c
parentbd765b4398dbb7cf8177b3c411aa287611d458c8 (diff)
Looks for a new server on SIGHUP.
Returns whether in process of finding new server or not in STAT request.
Diffstat (limited to 'zhm/zhm.c')
-rw-r--r--zhm/zhm.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/zhm/zhm.c b/zhm/zhm.c
index 2bddde1..db2a629 100644
--- a/zhm/zhm.c
+++ b/zhm/zhm.c
@@ -29,7 +29,7 @@ static char rcsid_hm_c[] = "$Header$";
#include <sys/file.h>
int no_server = 1, timeout_type = 0, serv_loop = 0;
-int nserv = 0, nclt = 0, nservchang = 0;
+int nserv = 0, nclt = 0, nservchang = 0, sig_type = 0;
struct sockaddr_in cli_sin, serv_sin, from;
struct hostent *hp;
char **serv_list, **cur_serv_list, **clust_info;
@@ -41,6 +41,7 @@ extern int errno;
extern char *index();
void init_hm(), detach(), handle_timeout(), resend_notices(), die_gracefully();
+void set_sig_type();
char *upcase();
main(argc, argv)
@@ -111,6 +112,21 @@ char *argv[];
}
}
}
+ } else {
+ switch(sig_type) {
+ case SIGHUP:
+ new_server();
+ break;
+ case SIGTERM:
+ die_gracefully();
+ break;
+ case SIGALRM:
+ handle_timeout();
+ break;
+ default:
+ syslog (LOG_INFO, "Unknown system interrupt.");
+ break;
+ }
}
}
}
@@ -193,8 +209,9 @@ void init_hm()
send_boot_notice(HM_BOOT);
- (void)signal (SIGALRM, handle_timeout);
- (void)signal (SIGTERM, die_gracefully);
+ (void)signal (SIGHUP, set_sig_type);
+ (void)signal (SIGALRM, set_sig_type);
+ (void)signal (SIGTERM, set_sig_type);
}
char *upcase(s)
@@ -290,23 +307,34 @@ detach()
find_next_server()
{
struct hostent *hp;
+ int done = 0;
- if (++serv_loop > 3) {
+ if ((++serv_loop > 3) && (strcmp(cur_serv, prim_serv))) {
serv_loop = 0;
hp = gethostbyname(prim_serv);
DPR2 ("Server = %s\n", prim_serv);
cur_serv = prim_serv;
- } else {
+ } else
+ do {
if (*++cur_serv_list == NULL)
cur_serv_list = serv_list;
- hp = gethostbyname(*cur_serv_list);
- DPR2 ("Server = %s\n", *cur_serv_list);
- cur_serv = *cur_serv_list;
- }
+ if (strcmp(*cur_serv_list, cur_serv)) {
+ hp = gethostbyname(*cur_serv_list);
+ DPR2 ("Server = %s\n", *cur_serv_list);
+ cur_serv = *cur_serv_list;
+ done = 1;
+ }
+ } while (done == 0);
bcopy(hp->h_addr, &serv_sin.sin_addr, hp->h_length);
nservchang++;
}
+void set_sig_type(sig)
+ int sig;
+{
+ sig_type = sig;
+}
+
server_manager(notice)
ZNotice_t *notice;
{
@@ -454,7 +482,7 @@ send_stats(notice, sin)
Code_t ret;
ZPacket_t bfr;
char *list[10];
- int len, i, nitems = 6;
+ int len, i, nitems = 7;
if ((ret = ZSetDestAddr(sin)) != ZERR_NONE) {
Zperr(ret);
@@ -474,6 +502,11 @@ send_stats(notice, sin)
sprintf(list[4], "%d", nservchang);
list[5] = (char *)malloc(64);
strcpy(list[5], rcsid_hm_c);
+ list[6] = (char *)malloc(64);
+ if (no_server)
+ sprintf(list[6], "yes");
+ else
+ sprintf(list[6], "no");
if ((ret = ZFormatRawNoticeList(notice, list, nitems, bfr,
Z_MAXPKTLEN, &len)) != ZERR_NONE) {