summaryrefslogtreecommitdiff
path: root/zhm/zhm.c
diff options
context:
space:
mode:
authorGravatar David C. Jedlinsky <opus@mit.edu>1987-10-06 16:36:56 +0000
committerGravatar David C. Jedlinsky <opus@mit.edu>1987-10-06 16:36:56 +0000
commit5e360e33275b8fd1f2c4010adb133070c89189b3 (patch)
tree551453b9304026b196fa456823d3f95ecf8c4f5d /zhm/zhm.c
parentc846fdeb423937fd9260ba94392e9279dfb5eb83 (diff)
Split hm.c into two more subfiles.
Diffstat (limited to 'zhm/zhm.c')
-rw-r--r--zhm/zhm.c327
1 files changed, 22 insertions, 305 deletions
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 <ctype.h>
#include <signal.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <sys/param.h>
#include <hesiod.h>
#include <sys/ioctl.h>
#include <sys/file.h>
-#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(&notice, 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(&notice, 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) {