summaryrefslogtreecommitdiff
path: root/zhm/zhm.c
diff options
context:
space:
mode:
authorGravatar John Kohl <jtkohl@mit.edu>1988-11-28 09:11:39 +0000
committerGravatar John Kohl <jtkohl@mit.edu>1988-11-28 09:11:39 +0000
commit4bbe91fedcef7c94045cfd679834c40064d74eff (patch)
tree9ff856eb49fbac04ce89197cf065c5fc11586952 /zhm/zhm.c
parent22b59a82bc617d3570168e0b7d1d3a9c756693a3 (diff)
deal with no primary server by randomly selecting one from the list
Diffstat (limited to 'zhm/zhm.c')
-rw-r--r--zhm/zhm.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/zhm/zhm.c b/zhm/zhm.c
index 6aad551..992be05 100644
--- a/zhm/zhm.c
+++ b/zhm/zhm.c
@@ -60,13 +60,13 @@ char *argv[];
Code_t ret;
int opt, pak_len;
extern int optind;
- register int i;
+ register int i, j;
if (gethostname(hostname, MAXHOSTNAMELEN) < 0) {
printf("Can't find my hostname?!\n");
exit(-1);
}
- *prim_serv = '\0';
+ prim_serv[0] = '\0';
while ((opt = getopt(argc, argv, "drhi")) != EOF)
switch(opt) {
case 'd':
@@ -100,7 +100,6 @@ char *argv[];
if (optind < argc) {
if ((hp = gethostbyname(argv[optind++])) == NULL) {
printf("Unknown server name: %s\n", prim_serv);
- *prim_serv = NULL;
} else
(void) strcpy(prim_serv, hp->h_name);
/* argc-optind is the # of other servers on the command line */
@@ -118,7 +117,6 @@ char *argv[];
}
#ifdef HESIOD
else {
- register int j;
if ((clust_info = hes_resolve(hostname, "CLUSTER")) == NULL) {
zcluster = NULL;
@@ -165,12 +163,15 @@ char *argv[];
sleep(30);
}
clust_info = (char **)malloc(2*sizeof(char *));
- clust_info[0] = prim_serv;
- j = 1;
+ if (prim_serv[0]) {
+ clust_info[0] = prim_serv;
+ j = 1;
+ } else
+ j = 0;
for (i = 0; serv_list[i]; i++)
/* copy in non-duplicates */
/* assume the names returned in the sloc are full domain names */
- if (strcasecmp(prim_serv, serv_list[i])) {
+ if (!prim_serv[0] || strcasecmp(prim_serv, serv_list[i])) {
clust_info = (char **) realloc(clust_info,
(j+2) * sizeof(char *));
clust_info[j++] = strsave(serv_list[i]);
@@ -178,6 +179,10 @@ char *argv[];
clust_info[j] = NULL;
serv_list = clust_info;
}
+ if (!prim_serv[0]) {
+ srandom(time((long *) 0));
+ (void) strcpy(prim_serv, serv_list[random() % j]);
+ }
#endif HESIOD
if (*prim_serv == NULL) {
printf("No valid primary server found, exiting.\n");