summaryrefslogtreecommitdiff
path: root/zhm/zhm.c
diff options
context:
space:
mode:
authorGravatar David C. Jedlinsky <opus@mit.edu>1987-07-22 20:44:00 +0000
committerGravatar David C. Jedlinsky <opus@mit.edu>1987-07-22 20:44:00 +0000
commitf9a830e1f38d3bd10a932f2970f272b3fc019be3 (patch)
treee5e5b0773f823c016c40ee77a14a827a37a0ea7f /zhm/zhm.c
parent2650ecdbf0bb8b23d5018e6d17837fad16e0bd05 (diff)
Bug fix -- now actually @u(does) change to the suggested server.
Diffstat (limited to 'zhm/zhm.c')
-rw-r--r--zhm/zhm.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/zhm/zhm.c b/zhm/zhm.c
index 7cc9c52..b63f782 100644
--- a/zhm/zhm.c
+++ b/zhm/zhm.c
@@ -40,6 +40,7 @@ static char rcsid_hm_c[] = "$Header$";
#define MACHINE "unknown"
#endif ok
+int hmdebug = 0; /* Goddamned kerberos stole debug variable!!! */
int no_server = 1, timeout_type = 0, serv_loop = 0;
int nserv = 0, nclt = 0, nservchang = 0, sig_type = 0;
long starttime;
@@ -55,7 +56,7 @@ extern char *index();
void init_hm(), detach(), handle_timeout(), resend_notices(), die_gracefully();
void set_sig_type();
-char *upcase();
+char *upcase(), *convert();
main(argc, argv)
char *argv[];
@@ -63,6 +64,8 @@ char *argv[];
ZPacket_t packet;
ZNotice_t notice;
Code_t ret;
+ int optch;
+ extern int optind;
/* Override server argument? */
if (gethostname(hostname, MAXHOSTNAMELEN) < 0) {
@@ -70,8 +73,10 @@ char *argv[];
exit(-1);
}
(void)strcpy(prim_serv, "");
- if (argc > 1)
- (void)strcpy(prim_serv, argv[1]);
+ if ((optch = getopt(argc, argv, "d")) != EOF)
+ hmdebug++;
+ if (optind <= argc)
+ (void)strcpy(prim_serv, argv[optind]);
else {
if ((clust_info = hes_resolve(hostname, "CLUSTER")) == NULL) {
printf("No hesiod information available.\n");
@@ -209,6 +214,8 @@ void init_hm()
fprintf(fp, "%d\n", getpid());
(void) fclose(fp);
}
+ if (hmdebug)
+ syslog(LOG_DEBUG, "Debugging on.");
#endif DEBUG
bzero(&serv_sin, sizeof(struct sockaddr_in));
@@ -246,6 +253,26 @@ char *upcase(s)
return(r);
}
+/* This must first change the \0 at the end of addr to a '.' */
+char *convert(addr)
+ caddr_t addr;
+{
+ static char result[4];
+ char *c, *r;
+ int i;
+
+ *index(addr, '\0') = '.';
+ c = addr;
+ for (i=0; i<4; i++) {
+ if ((r = index(c, '.')) > 0) {
+ *r = '\0';
+ result[i] = (char)atoi(c);
+ c = r+1;
+ }
+ }
+ return(result);
+}
+
/* Argument is whether we are actually booting, or just attaching
after a server switch */
send_boot_notice(op)
@@ -340,9 +367,11 @@ find_next_server(sugg_serv)
} 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);
- cur_serv = sugg_serv;
+ strcpy(cur_serv, sugg_serv);
} else {
if ((++serv_loop > 3) && (strcmp(cur_serv, prim_serv))) {
serv_loop = 0;
@@ -401,12 +430,12 @@ hm_control(notice)
{
Code_t ret;
struct hostent *hp;
- char *suggested_server;
+ char suggested_server[64];
DPR("Control message!\n");
if (!strcmp(notice->z_opcode, SERVER_SHUTDOWN)) {
- if ((hp = gethostbyaddr(notice->z_message,
- notice->z_message_len,
+ if ((hp = gethostbyaddr(convert(notice->z_message),
+ 4,
AF_INET)) != NULL) {
strcpy(suggested_server, hp->h_name);
new_server(suggested_server);