bozo: do not fail silently on unknown bosserver options
[openafs.git] / src / bozo / bosserver.c
index 9f5b74e..f97745c 100644 (file)
@@ -74,6 +74,7 @@ const char *DoPidFiles = NULL;
 #ifndef AFS_NT40_ENV
 int DoSyslogFacility = LOG_DAEMON;
 #endif
+int DoTransarcLogs = 0;
 static afs_int32 nextRestart;
 static afs_int32 nextDay;
 
@@ -82,9 +83,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 +773,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"
@@ -795,9 +858,9 @@ main(int argc, char **argv, char **envp)
     afs_int32 numClasses;
     int DoPeerRPCStats = 0;
     int DoProcessRPCStats = 0;
+    struct stat sb;
 #ifndef AFS_NT40_ENV
     int nofork = 0;
-    struct stat sb;
 #endif
 #ifdef AFS_AIX32_ENV
     struct sigaction nsa;
@@ -933,10 +996,19 @@ main(int argc, char **argv, char **envp)
            DoPidFiles = (argv[code]+10);
        } else if (strncmp(argv[code], "-pidfiles", 9) == 0) {
            DoPidFiles = AFSDIR_LOCAL_DIR;
+       } else if (strcmp(argv[code], "-transarc-logs") == 0) {
+           DoTransarcLogs = 1;
        }
        else {
 
            /* hack to support help flag */
+           int ec;
+           if (strcmp(argv[code], "-help") == 0 || strcmp(argv[code], "-h") == 0)
+               ec = 0; /* It is not an error to ask for usage. */
+           else {
+               printf("Unrecognized option: %s\n", argv[code]);
+               ec = 1;
+           }
 
 #ifndef AFS_NT40_ENV
            printf("Usage: bosserver [-noauth] [-log] "
@@ -948,6 +1020,7 @@ main(int argc, char **argv, char **envp)
                   "[-enable_peer_stats] [-enable_process_stats] "
                   "[-cores=<none|path>] \n"
                   "[-pidfiles[=path]] "
+                  "[-transarc-logs] "
                   "[-nofork] " "[-help]\n");
 #else
            printf("Usage: bosserver [-noauth] [-log] "
@@ -962,7 +1035,7 @@ main(int argc, char **argv, char **envp)
 #endif
            fflush(stdout);
 
-           exit(0);
+           exit(ec);
        }
     }
     if (auditFileName) {
@@ -976,19 +1049,26 @@ main(int argc, char **argv, char **envp)
     }
 #endif
 
-    if ((!DoSyslog)
-#ifndef AFS_NT40_ENV
-       && ((lstat(AFSDIR_BOZLOG_FILE, &sb) == 0) &&
-       !(S_ISFIFO(sb.st_mode)))
-#endif
-       ) {
-       if (asprintf(&oldlog, "%s.old", AFSDIR_BOZLOG_FILE) < 0) {
-           printf("bosserver: out of memory\n");
-           exit(1);
+    /* create useful dirs */
+    i = CreateDirs(DoCore);
+    if (i) {
+       printf("bosserver: could not set up directories, code %d\n", i);
+       exit(1);
+    }
+
+    if (!DoSyslog) {
+       /* Support logging to named pipes by not renaming. */
+       if (DoTransarcLogs
+           && (lstat(AFSDIR_SERVER_BOZLOG_FILEPATH, &sb) == 0)
+           && !(S_ISFIFO(sb.st_mode))) {
+           if (asprintf(&oldlog, "%s.old", AFSDIR_SERVER_BOZLOG_FILEPATH) < 0) {
+               printf("bosserver: out of memory\n");
+               exit(1);
+           }
+           rk_rename(AFSDIR_SERVER_BOZLOG_FILEPATH, oldlog);
+           free(oldlog);
        }
-       rk_rename(AFSDIR_BOZLOG_FILE, oldlog);  /* try rename first */
-       free(oldlog);
-       bozo_logFile = fopen(AFSDIR_BOZLOG_FILE, "a");
+       bozo_logFile = fopen(AFSDIR_SERVER_BOZLOG_FILEPATH, "a");
        if (!bozo_logFile) {
            printf("bosserver: can't initialize log file (%s).\n",
                   AFSDIR_SERVER_BOZLOG_FILEPATH);
@@ -1014,13 +1094,6 @@ main(int argc, char **argv, char **envp)
     }
 #endif /* ! AFS_NT40_ENV */
 
-    /* create useful dirs */
-    i = CreateDirs(DoCore);
-    if (i) {
-       printf("bosserver: could not set up directories, code %d\n", i);
-       exit(1);
-    }
-
     /* Write current state of directory permissions to log file */
     DirAccessOK();
 
@@ -1038,36 +1111,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 +1150,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) {