ubik-serverinit-clones-correction-20081222
[openafs.git] / src / vlserver / vlserver.c
index e30f8d6..02a30b0 100644 (file)
@@ -16,6 +16,8 @@ RCSID
 #include <afs/stds.h>
 #include <sys/types.h>
 #include <signal.h>
+#include <sys/stat.h>
+#include <string.h>
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
@@ -35,14 +37,6 @@ RCSID
 #endif
 #include <stdio.h>
 
-#ifdef HAVE_STRING_H
-#include <string.h>
-#else
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#endif
-
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <rx/rx_globals.h>
@@ -66,29 +60,37 @@ afs_uint32 HostAddress[MAXSERVERID + 1];
 extern int afsconf_CheckAuth();
 extern int afsconf_ServerAuth();
 
-extern afs_int32 ubik_lastYesTime;
-extern afs_int32 ubik_nBuffers;
-
-static CheckSignal();
+static void *CheckSignal(void*);
 int LogLevel = 0;
 int smallMem = 0;
-int rxJumbograms = 1;          /* default is to send and receive jumbo grams */
+int rxJumbograms = 0;          /* default is to not send and receive jumbo grams */
+int rxMaxMTU = -1;
+afs_int32 rxBind = 0;
+int rxkadDisableDotCheck = 0;
+int debuglevel = 0;
+
+#define ADDRSPERSITE 16         /* Same global is in rx/rx_user.c */
+afs_uint32 SHostAddrs[ADDRSPERSITE];
 
 static void
 CheckSignal_Signal()
 {
+#if defined(AFS_PTHREAD_ENV)
+    CheckSignal(0);
+#else
     IOMGR_SoftSig(CheckSignal, 0);
+#endif
 }
 
-static
-CheckSignal()
+static void *
+CheckSignal(void *unused)
 {
     register int i, errorcode;
     struct ubik_trans *trans;
 
     if (errorcode =
        Init_VLdbase(&trans, LOCKREAD, VLGETSTATS - VL_LOWEST_OPCODE))
-       return errorcode;
+       return (void *)errorcode;
     VLog(0, ("Dump name hash table out\n"));
     for (i = 0; i < HASHSIZE; i++) {
        HashNDump(trans, i);
@@ -97,7 +99,7 @@ CheckSignal()
     for (i = 0; i < HASHSIZE; i++) {
        HashIdDump(trans, i);
     }
-    return (ubik_EndTrans(trans));
+    return ((void *)ubik_EndTrans(trans));
 }                              /*CheckSignal */
 
 
@@ -145,6 +147,7 @@ main(argc, argv)
     extern int rx_extraPackets;
     char commandLine[150];
     char clones[MAXHOSTSPERCELL];
+    afs_uint32 host = ntohl(INADDR_ANY);
 
 #ifdef AFS_AIX32_ENV
     /*
@@ -162,11 +165,12 @@ main(argc, argv)
     sigaction(SIGABRT, &nsa, NULL);
     sigaction(SIGSEGV, &nsa, NULL);
 #endif
+    osi_audit_init();
+
     /* Parse command line */
     for (index = 1; index < argc; index++) {
        if (strcmp(argv[index], "-noauth") == 0) {
            noAuth = 1;
-
        } else if (strcmp(argv[index], "-p") == 0) {
            lwps = atoi(argv[++index]);
            if (lwps > MAXLWP) {
@@ -174,9 +178,34 @@ main(argc, argv)
                       lwps, MAXLWP);
                lwps = MAXLWP;
            }
-
+       } else if (strcmp(argv[index], "-d") == 0) {
+           if ((index + 1) >= argc) {
+               fprintf(stderr, "missing argument for -d\n"); 
+               return -1; 
+           }
+           debuglevel = atoi(argv[++index]);
+           LogLevel = debuglevel;
        } else if (strcmp(argv[index], "-nojumbo") == 0) {
            rxJumbograms = 0;
+       } else if (strcmp(argv[index], "-jumbo") == 0) {
+           rxJumbograms = 1;
+       } else if (strcmp(argv[index], "-rxbind") == 0) {
+           rxBind = 1;
+       } else if (strcmp(argv[index], "-allow-dotted-principals") == 0) {
+           rxkadDisableDotCheck = 1;
+       } else if (!strcmp(argv[index], "-rxmaxmtu")) {
+           if ((index + 1) >= argc) {
+               fprintf(stderr, "missing argument for -rxmaxmtu\n"); 
+               return -1; 
+           }
+           rxMaxMTU = atoi(argv[++index]);
+           if ((rxMaxMTU < RX_MIN_PACKET_SIZE) || 
+               (rxMaxMTU > RX_MAX_PACKET_DATA_SIZE)) {
+               printf("rxMaxMTU %d invalid; must be between %d-%d\n",
+                      rxMaxMTU, RX_MIN_PACKET_SIZE, 
+                      RX_MAX_PACKET_DATA_SIZE);
+               return -1;
+           }
 
        } else if (strcmp(argv[index], "-smallmem") == 0) {
            smallMem = 1;
@@ -185,6 +214,10 @@ main(argc, argv)
            extern char rxi_tracename[80];
            strcpy(rxi_tracename, argv[++index]);
 
+       } else if (strcmp(argv[index], "-auditlog") == 0) {
+           char *fileName = argv[++index];
+
+           osi_audit_file(fileName);
        } else if (strcmp(argv[index], "-enable_peer_stats") == 0) {
            rx_enablePeerRPCStats();
        } else if (strcmp(argv[index], "-enable_process_stats") == 0) {
@@ -201,11 +234,15 @@ main(argc, argv)
            /* support help flag */
 #ifndef AFS_NT40_ENV
            printf("Usage: vlserver [-p <number of processes>] [-nojumbo] "
+                  "[-rxmaxmtu <bytes>] [-rxbind] [-allow-dotted-principals] "
+                  "[-auditlog <log path>] [-jumbo] [-d <debug level>] "
                   "[-syslog[=FACILITY]] "
                   "[-enable_peer_stats] [-enable_process_stats] "
                   "[-help]\n");
 #else
            printf("Usage: vlserver [-p <number of processes>] [-nojumbo] "
+                  "[-rxmaxmtu <bytes>] [-rxbind] [-allow-dotted-principals] "
+                  "[-auditlog <log path>] [-jumbo] [-d <debug level>] "
                   "[-enable_peer_stats] [-enable_process_stats] "
                   "[-help]\n");
 #endif
@@ -256,7 +293,7 @@ main(argc, argv)
     }
     memcpy(&myHost, th->h_addr, sizeof(afs_int32));
 
-#if !defined(AFS_HPUX_ENV) && !defined(AFS_NT40_ENV) && !defined(AFS_DJGPP_ENV)
+#if !defined(AFS_HPUX_ENV) && !defined(AFS_NT40_ENV)
     signal(SIGXCPU, CheckSignal_Signal);
 #endif
     /* get list of servers */
@@ -275,6 +312,27 @@ main(argc, argv)
     if (noAuth)
        afsconf_SetNoAuthFlag(tdir, 1);
 
+    if (rxBind) {
+       afs_int32 ccode;
+#ifndef AFS_NT40_ENV
+        if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || 
+            AFSDIR_SERVER_NETINFO_FILEPATH) {
+            char reason[1024];
+            ccode = parseNetFiles(SHostAddrs, NULL, NULL,
+                                 ADDRSPERSITE, reason,
+                                 AFSDIR_SERVER_NETINFO_FILEPATH,
+                                 AFSDIR_SERVER_NETRESTRICT_FILEPATH);
+        } else 
+#endif 
+       {
+            ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE);
+        }
+        if (ccode == 1) {
+            host = SHostAddrs[0];
+           rx_InitHost(host, htons(AFSCONF_VLDBPORT));
+       }
+    }
+
     ubik_nBuffers = 512;
     ubik_CRXSecurityProc = afsconf_ClientAuth;
     ubik_CRXSecurityRock = (char *)tdir;
@@ -283,7 +341,7 @@ main(argc, argv)
     ubik_CheckRXSecurityProc = afsconf_CheckAuth;
     ubik_CheckRXSecurityRock = (char *)tdir;
     code =
-       ubik_ServerInitByInfo(myHost, htons(AFSCONF_VLDBPORT), &info, &clones,
+       ubik_ServerInitByInfo(myHost, htons(AFSCONF_VLDBPORT), &info, clones,
                              vl_dbaseName, &VL_dbase);
     if (code) {
        printf("vlserver: Ubik init failed with code %d\n", code);
@@ -292,6 +350,9 @@ main(argc, argv)
     if (!rxJumbograms) {
        rx_SetNoJumbo();
     }
+    if (rxMaxMTU != -1) {
+       rx_SetMaxMTU(rxMaxMTU);
+    }
     rx_SetRxDeadTime(50);
 
     memset(HostAddress, 0, sizeof(HostAddress));
@@ -300,8 +361,9 @@ main(argc, argv)
     sc[0] = rxnull_NewServerSecurityObject();
     sc[1] = (struct rx_securityClass *)0;
     sc[2] = rxkad_NewServerSecurityObject(0, tdir, afsconf_GetKey, NULL);
+
     tservice =
-       rx_NewService(0, USER_SERVICE_ID, "Vldb server", sc, 3,
+       rx_NewServiceHost(host, 0, USER_SERVICE_ID, "Vldb server", sc, 3,
                      VL_ExecuteRequest);
     if (tservice == (struct rx_service *)0) {
        printf("vlserver: Could not create VLDB_SERVICE rx service\n");
@@ -312,8 +374,13 @@ main(argc, argv)
        lwps = 4;
     rx_SetMaxProcs(tservice, lwps);
 
+    if (rxkadDisableDotCheck) {
+        rx_SetSecurityConfiguration(tservice, RXS_CONFIG_FLAGS,
+                                    (void *)RXS_CONFIG_FLAGS_DISABLE_DOTCHECK);
+    }
+
     tservice =
-       rx_NewService(0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3,
+       rx_NewServiceHost(host, 0, RX_STATS_SERVICE_ID, "rpcstats", sc, 3,
                      RXSTATS_ExecuteRequest);
     if (tservice == (struct rx_service *)0) {
        printf("vlserver: Could not create rpc stats rx service\n");
@@ -335,4 +402,6 @@ main(argc, argv)
     rx_SetRxStatUserOk(vldb_rxstat_userok);
 
     rx_StartServer(1);         /* Why waste this idle process?? */
+
+    return 0; /* not reachable */
 }