bozo: move more initialization code to functions
authorMichael Meffie <mmeffie@sinenomine.net>
Thu, 22 Jan 2015 03:44:32 +0000 (22:44 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Sat, 5 Sep 2015 20:04:39 +0000 (16:04 -0400)
Move the code to create the initial "localcell" configuration and the
code to get the rx bind address out of main and into separate
functions.

Replace the global array of host addresses used to get the rx bind
address with a local variable.

Replace the call to rx_getAllAddr() with rx_getAllAddrMaskMtu(). The
former is not safe to call before rx_InitHost().

Initialize the cell info structure to zeros when creating the initial
"localcell" configuration.

Change-Id: I756aef86018d0cdd499afa58fdea99a7ac0d99df
Reviewed-on: http://gerrit.openafs.org/11690
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Perry Ruiter <pruiter@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/bozo/bosserver.c

index 19db559..76f866a 100644 (file)
@@ -82,9 +82,6 @@ int bozo_newKTs;
 int rxBind = 0;
 int rxkadDisableDotCheck = 0;
 
-#define ADDRSPERSITE 16         /* Same global is in rx/rx_user.c */
-afs_uint32 SHostAddrs[ADDRSPERSITE];
-
 int bozo_isrestricted = 0;
 int bozo_restdisable = 0;
 
@@ -775,6 +772,71 @@ bozo_CreateRxBindFile(afs_uint32 host)
     }
 }
 
+/**
+ * Get an interface address in network byte order, modulo the
+ * NetInfo/NetRestrict configuration files. Return the INADDR_ANY if no
+ * interface address is found.
+ */
+static afs_uint32
+GetRxBindAddress(void)
+{
+    afs_uint32 addr;
+    afs_int32 ccode; /* number of addresses found */
+
+    if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) {
+       char reason[1024];
+       ccode = afsconf_ParseNetFiles(&addr, NULL, NULL, 1, reason,
+                                     AFSDIR_SERVER_NETINFO_FILEPATH,
+                                     AFSDIR_SERVER_NETRESTRICT_FILEPATH);
+    } else {
+       /* Get the first non-loopback address from the kernel. */
+       ccode = rx_getAllAddr(&addr, 1);
+    }
+
+    if (ccode != 1) {
+       addr = htonl(INADDR_ANY);
+    }
+    return addr;
+}
+
+/**
+ * Try to create local cell config file.
+ */
+static struct afsconf_dir *
+CreateLocalCellConfig(void)
+{
+    int code;
+    struct afsconf_dir *tdir = NULL;
+    struct afsconf_cell tcell;
+
+    memset(&tcell, 0, sizeof(tcell));
+    strcpy(tcell.name, "localcell");  /* assume name is big enough for the default value */
+    tcell.numServers = 1;
+    code = gethostname(tcell.hostName[0], MAXHOSTCHARS);
+    if (code) {
+       bozo_Log("failed to get hostname, code %d\n", errno);
+       exit(1);
+    }
+    if (tcell.hostName[0][0] == 0) {
+       bozo_Log("host name not set, can't start\n");
+       bozo_Log("try the 'hostname' command\n");
+       exit(1);
+    }
+    code = afsconf_SetCellInfo(NULL, AFSDIR_SERVER_ETC_DIRPATH, &tcell);
+    if (code) {
+       bozo_Log
+           ("could not create cell database in '%s' (code %d), quitting\n",
+            AFSDIR_SERVER_ETC_DIRPATH, code);
+       exit(1);
+    }
+    tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
+    if (!tdir) {
+       bozo_Log("failed to open newly-created cell database, quitting\n");
+       exit(1);
+    }
+    return tdir;
+}
+
 /* start a process and monitor it */
 
 #include "AFS_component_version_number.c"
@@ -1038,36 +1100,7 @@ main(int argc, char **argv, char **envp)
     /* try to read the key from the config file */
     tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
     if (!tdir) {
-       /* try to create local cell config file */
-       struct afsconf_cell tcell;
-       strcpy(tcell.name, "localcell");
-       tcell.numServers = 1;
-       code = gethostname(tcell.hostName[0], MAXHOSTCHARS);
-       if (code) {
-           bozo_Log("failed to get hostname, code %d\n", errno);
-           exit(1);
-       }
-       if (tcell.hostName[0][0] == 0) {
-           bozo_Log("host name not set, can't start\n");
-           bozo_Log("try the 'hostname' command\n");
-           exit(1);
-       }
-       memset(tcell.hostAddr, 0, sizeof(tcell.hostAddr));      /* not computed */
-       code =
-           afsconf_SetCellInfo(NULL, AFSDIR_SERVER_ETC_DIRPATH,
-                               &tcell);
-       if (code) {
-           bozo_Log
-               ("could not create cell database in '%s' (code %d), quitting\n",
-                AFSDIR_SERVER_ETC_DIRPATH, code);
-           exit(1);
-       }
-       tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
-       if (!tdir) {
-           bozo_Log
-               ("failed to open newly-created cell database, quitting\n");
-           exit(1);
-       }
+       tdir = CreateLocalCellConfig();
     }
     /* opened the cell databse */
     bozo_confdir = tdir;
@@ -1106,19 +1139,7 @@ main(int argc, char **argv, char **envp)
     }
 
     if (rxBind) {
-       afs_int32 ccode;
-       if (AFSDIR_SERVER_NETRESTRICT_FILEPATH ||
-           AFSDIR_SERVER_NETINFO_FILEPATH) {
-           char reason[1024];
-           ccode = afsconf_ParseNetFiles(SHostAddrs, NULL, NULL,
-                                         ADDRSPERSITE, reason,
-                                         AFSDIR_SERVER_NETINFO_FILEPATH,
-                                         AFSDIR_SERVER_NETRESTRICT_FILEPATH);
-        } else {
-            ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE);
-        }
-        if (ccode == 1)
-            host = SHostAddrs[0];
+       host = GetRxBindAddress();
     }
     for (i = 0; i < 10; i++) {
        if (rxBind) {