From 5e360e33275b8fd1f2c4010adb133070c89189b3 Mon Sep 17 00:00:00 2001 From: "David C. Jedlinsky" Date: Tue, 6 Oct 1987 16:36:56 +0000 Subject: Split hm.c into two more subfiles. --- zhm/zhm.c | 327 +++++--------------------------------------------------------- 1 file changed, 22 insertions(+), 305 deletions(-) (limited to 'zhm/zhm.c') diff --git a/zhm/zhm.c b/zhm/zhm.c index 2786a92..9aecd1c 100644 --- a/zhm/zhm.c +++ b/zhm/zhm.c @@ -13,44 +13,26 @@ #include "hm.h" -#ifndef lint -#ifndef SABER static char rcsid_hm_c[] = "$Header$"; -#endif SABER -#endif lint #include #include -#include -#include -#include #include #include #include -#ifdef vax -#define MACHINE "vax" -#define ok -#endif vax -#ifdef ibm032 -#define MACHINE "rt" -#define ok -#endif ibm032 -#ifndef ok -#define MACHINE "unknown" -#endif ok - -int hmdebug = 0; /* %&*^@ kerberos stole debug variable!!! */ -int no_server = 1, timeout_type = 0, serv_loop = 0; -int booting = 1; -int nserv = 0, nclt = 0, nservchang = 0, sig_type = 0; +int hmdebug = 0; /* kerberos stole variable called 'debug' */ +int no_server = 1, nservchang = 0, nserv = 0, nclt = 0; +int booting = 1, timeout_type = 0; long starttime; +u_short cli_port; struct sockaddr_in cli_sin, serv_sin, from; +char **serv_list, **cur_serv_list; +char prim_serv[MAXHOSTNAMELEN], cur_serv[MAXHOSTNAMELEN]; +int sig_type = 0; struct hostent *hp; -char **serv_list, **cur_serv_list, **clust_info; -u_short cli_port; -char hostname[MAXHOSTNAMELEN], cur_serv[MAXHOSTNAMELEN]; -char prim_serv[MAXHOSTNAMELEN], loopback[4]; +char **clust_info; +char hostname[MAXHOSTNAMELEN], loopback[4]; char *PidFile = "/etc/athena/hm.pid"; extern int errno; @@ -66,7 +48,7 @@ char *argv[]; ZPacket_t packet; ZNotice_t notice; Code_t ret; - int optch, pak_len; + int pak_len; extern int optind; /* Override server argument? */ @@ -75,7 +57,7 @@ char *argv[]; exit(-1); } *prim_serv = NULL; - if ((optch = getopt(argc, argv, "d")) != EOF) + if (getopt(argc, argv, "d") != EOF) hmdebug++; if (optind <= argc) { (void)strcpy(prim_serv, argv[optind]); @@ -114,6 +96,7 @@ char *argv[]; break; case SIGHUP: sig_type = 0; + syslog(LOG_INFO, "Flushing this client..."); send_flush_notice(HM_FLUSH); break; case SIGTERM: @@ -288,67 +271,6 @@ char *upcase(s) return(r); } -/* Argument is whether we are actually booting, or just attaching - after a server switch */ -send_boot_notice(op) - char *op; -{ - ZNotice_t notice; - Code_t ret; - - /* Set up server notice */ - notice.z_kind = HMCTL; - notice.z_port = cli_port; - notice.z_class = ZEPHYR_CTL_CLASS; - notice.z_class_inst = ZEPHYR_CTL_HM; - notice.z_opcode = op; - notice.z_sender = "HM"; - notice.z_recipient = ""; - notice.z_default_format = 0; - notice.z_message_len = 0; - - /* Notify server that this host is here */ - if ((ret = ZSetDestAddr(&serv_sin)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - if ((ret = ZSendNotice(¬ice, ZNOAUTH)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "sending startup notice"); - } - timeout_type = BOOTING; - (void)alarm(SERV_TIMEOUT); -} - -/* Argument is whether we are detaching or really going down */ -send_flush_notice(op) - char *op; -{ - ZNotice_t notice; - Code_t ret; - - /* Set up server notice */ - notice.z_kind = HMCTL; - notice.z_port = cli_port; - notice.z_class = ZEPHYR_CTL_CLASS; - notice.z_class_inst = ZEPHYR_CTL_HM; - notice.z_opcode = op; - notice.z_sender = "HM"; - notice.z_recipient = ""; - notice.z_default_format = 0; - notice.z_message_len = 0; - - /* Tell server to lose us */ - if ((ret = ZSetDestAddr(&serv_sin)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - if ((ret = ZSendNotice(¬ice, ZNOAUTH)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "sending flush notice"); - } -} - void detach() { /* detach from terminal and fork. */ @@ -372,215 +294,23 @@ void detach() } } -find_next_server(sugg_serv) - char *sugg_serv; -{ - struct hostent *hp; - int done = 0; - char **parse = serv_list; - - if (sugg_serv) { - do { - if (!strcmp(*parse, sugg_serv)) - done = 1; - } while ((done == 0) && (*++parse != NULL)); - } - if (done) { - if (hmdebug) - syslog(LOG_DEBUG, "Suggested server: %s\n", sugg_serv); - hp = gethostbyname(sugg_serv); - DPR2 ("Server = %s\n", sugg_serv); - (void)strcpy(cur_serv, sugg_serv); - } else { - if ((++serv_loop > 3) && (strcmp(cur_serv, prim_serv))) { - serv_loop = 0; - hp = gethostbyname(prim_serv); - DPR2 ("Server = %s\n", prim_serv); - (void)strcpy(cur_serv, prim_serv); - } else - do { - if (*++cur_serv_list == NULL) - cur_serv_list = serv_list; - if (strcmp(*cur_serv_list, cur_serv)) { - hp = gethostbyname(*cur_serv_list); - DPR2 ("Server = %s\n", *cur_serv_list); - (void)strcpy(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; -{ - if ((bcmp(&serv_sin.sin_addr, &from.sin_addr, 4) != 0) || - (serv_sin.sin_port != from.sin_port)) { - syslog (LOG_INFO, "Bad notice from port %u.", notice->z_port); - } else { - /* This is our server, handle the notice */ - booting = 0; - DPR ("A notice came in from the server.\n"); - nserv++; - switch(notice->z_kind) { - case HMCTL: - hm_control(notice); - break; - case SERVNAK: - case SERVACK: - send_back(notice); - break; - default: - syslog (LOG_INFO, "Bad notice kind!?"); - break; - } - } -} - -hm_control(notice) - ZNotice_t *notice; -{ - Code_t ret; - struct hostent *hp; - char suggested_server[64]; - long addr; - - DPR("Control message!\n"); - if (!strcmp(notice->z_opcode, SERVER_SHUTDOWN)) { - if (notice->z_message_len) { - addr = inet_addr(notice->z_message); - if ((hp = gethostbyaddr(&addr, - 4, - AF_INET)) != NULL) { - (void)strcpy(suggested_server, hp->h_name); - new_server(suggested_server); - } else - new_server(NULL); - } - else - new_server(NULL); - } else if (!strcmp(notice->z_opcode, SERVER_PING)) { - if (no_server) - (void)alarm(0); - notice->z_kind = HMACK; - if ((ret = ZSetDestAddr(&serv_sin)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - if ((ret = ZSendRawNotice(notice)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "sending ACK"); - } - if (no_server) { - no_server = 0; - retransmit_queue(&serv_sin); - } - } else - syslog (LOG_INFO, "Bad control message."); -} - -send_back(notice) - ZNotice_t *notice; -{ - ZNotice_Kind_t kind; - struct sockaddr_in repl; - Code_t ret; - - if (no_server) - (void)alarm(0); - if (!strcmp(notice->z_opcode, HM_BOOT) || - !strcmp(notice->z_opcode, HM_ATTACH)) { - /* ignore message, just an ack from boot */ - } else { - if (remove_notice_from_queue(notice, &kind, - &repl) != ZERR_NONE) { - syslog (LOG_INFO, "Hey! This packet isn't in my queue!"); - } else { - /* check if client wants an ACK, and send it */ - if (kind == ACKED) { - DPR2 ("Client ACK port: %u\n", ntohs(repl.sin_port)); - if ((ret = ZSetDestAddr(&repl)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - if ((ret = ZSendRawNotice(notice)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "sending ACK"); - } - } - } - } - if (no_server) { - no_server = 0; - retransmit_queue(&serv_sin); - } -} - -transmission_tower(notice, packet, pak_len) - ZNotice_t *notice; - caddr_t packet; - int pak_len; +new_server(sugg_serv) + char *sugg_serv; { - ZNotice_t gack; - Code_t ret; - struct sockaddr_in gsin; - int tleft; - - nclt++; - if (notice->z_kind == HMCTL) { - if (!strcmp(notice->z_opcode, CLIENT_FLUSH)) - send_flush_notice(HM_FLUSH); - else if (!strcmp(notice->z_opcode, CLIENT_NEW_SERVER)) - new_server(NULL); - else - syslog (LOG_INFO, "Bad control notice from client."); - } else - if (notice->z_kind != UNSAFE) { - gack = *notice; - gack.z_kind = HMACK; - gack.z_message_len = 0; - gsin = cli_sin; - gsin.sin_port = from.sin_port; - if (gack.z_port == 0) - gack.z_port = from.sin_port; - DPR2 ("Client Port = %u\n", ntohs(gack.z_port)); - notice->z_port = gack.z_port; - if ((ret = ZSetDestAddr(&gsin)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - /* Bounce ACK to library */ - if ((ret = ZSendRawNotice(&gack)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "sending raw notice"); - } - } - if (!no_server) { - DPR2 ("Server Port = %u\n", ntohs(serv_sin.sin_port)); - if ((ret = ZSetDestAddr(&serv_sin)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "setting destination"); - } - if ((ret = ZSendRawNotice(notice)) != ZERR_NONE) { - Zperr(ret); - com_err("hm", ret, "while sending raw notice"); - } - if ((tleft = alarm(0)) > 0) - (void)alarm(tleft); - else { - timeout_type = NOTICES; - (void)alarm(NOTICE_TIMEOUT); - } - } - (void)add_notice_to_queue(notice, packet, &gsin, pak_len); + no_server = 1; + syslog (LOG_INFO, "Server went down, finding new server."); + send_flush_notice(HM_DETACH); + find_next_server(sugg_serv); + if (booting) + send_boot_notice(HM_BOOT); + else + send_boot_notice(HM_ATTACH); } send_stats(notice, sin) @@ -634,19 +364,6 @@ send_stats(notice, sin) free(list[i]); } -new_server(sugg_serv) - char *sugg_serv; -{ - no_server = 1; - syslog (LOG_INFO, "Server went down, finding new server."); - send_flush_notice(HM_DETACH); - find_next_server(sugg_serv); - if (booting) - send_boot_notice(HM_BOOT); - else - send_boot_notice(HM_ATTACH); -} - void handle_timeout() { switch(timeout_type) { -- cgit v1.2.3