osi-audit-locking-fix-20060201
[openafs.git] / src / viced / viced.c
index 58c5b22..086960d 100644 (file)
@@ -28,8 +28,8 @@ RCSID
 #include <sys/types.h>
 #include <afs/procmgmt.h>      /* signal(), kill(), wait(), etc. */
 #include <sys/stat.h>
-#ifdef AFS_NT40_ENV
 #include <fcntl.h>
+#ifdef AFS_NT40_ENV
 #include <io.h>
 #include <windows.h>
 #include <WINNT/afsevent.h>
@@ -95,6 +95,17 @@ RCSID
 #endif
 #include <rx/rx_globals.h>
 
+#ifdef O_LARGEFILE
+#define afs_stat       stat64
+#define afs_fstat      fstat64
+#define afs_open       open64
+#define afs_fopen      fopen64
+#else /* !O_LARGEFILE */
+#define afs_stat       stat
+#define afs_fstat      fstat
+#define afs_open       open
+#define afs_fopen      fopen
+#endif /* !O_LARGEFILE */
 
 extern int BreakVolumeCallBacks(), InitCallBack();
 extern int BreakVolumeCallBacks(), InitCallBack(), BreakLaterCallBacks();
@@ -109,6 +120,7 @@ static void CheckSignal(void);
 extern int GetKeysFromToken();
 extern int RXAFS_ExecuteRequest();
 extern int RXSTATS_ExecuteRequest();
+afs_int32 Do_VLRegisterRPC();
 
 int eventlog = 0, rxlog = 0;
 FILE *debugFile;
@@ -208,11 +220,11 @@ static void
 CheckDescriptors()
 {
 #ifndef AFS_NT40_ENV
-    struct stat status;
+    struct afs_stat status;
     register int tsize = getdtablesize();
     register int i;
     for (i = 0; i < tsize; i++) {
-       if (fstat(i, &status) != -1) {
+       if (afs_fstat(i, &status) != -1) {
            printf("%d: dev %x, inode %u, length %u, type/mode %x\n", i,
                   status.st_dev, status.st_ino, status.st_size,
                   status.st_mode);
@@ -298,11 +310,18 @@ ResetCheckDescriptors(void)
 #if defined(AFS_PTHREAD_ENV)
     softsig_signal(SIGTERM, CheckDescriptors_Signal);
 #else
-    signal(SIGTERM, CheckDescriptors_Signal);
+    (void)signal(SIGTERM, CheckDescriptors_Signal);
 #endif
 #endif
 }
 
+#if defined(AFS_PTHREAD_ENV)
+char *
+threadNum(void)
+{
+    return pthread_getspecific(rx_thread_id_key);
+}
+#endif
 
 /* proc called by rxkad module to get a key */
 static int
@@ -354,12 +373,12 @@ static void
 CheckAdminName()
 {
     int fd = 0;
-    struct stat status;
+    struct afs_stat status;
 
-    if ((stat("/AdminName", &status)) ||       /* if file does not exist */
+    if ((afs_stat("/AdminName", &status)) ||   /* if file does not exist */
        (status.st_size <= 0) ||        /* or it is too short */
        (status.st_size >= (MAXADMINNAME)) ||   /* or it is too long */
-       !(fd = open("/AdminName", O_RDONLY, 0))) {      /* or the open fails */
+       !(fd = afs_open("/AdminName", O_RDONLY, 0))) {  /* or the open fails */
        strcpy(adminName, "System:Administrators");     /* use the default name */
     } else {
        (void)read(fd, adminName, status.st_size);      /* use name from the file */
@@ -412,7 +431,7 @@ FiveMinuteCheckLWP()
            Do_VLRegisterRPC();
        /* Force wakeup in case we missed something; pthreads does timedwait */
 #ifndef AFS_PTHREAD_ENV
-       LWP_NoYieldSignal(&fsync_wait);
+       LWP_NoYieldSignal(fsync_wait);
 #endif
        if (printBanner && (++msg & 1)) {       /* Every 10 minutes */
            time_t now = FT_ApproxTime();
@@ -470,7 +489,8 @@ FsyncCheckLWP()
     assert(pthread_mutex_init(&fsync_glock_mutex, NULL) == 0);
 #endif
 
-    FSYNC_LOCK while (1) {
+    while (1) {
+       FSYNC_LOCK;
 #ifdef AFS_PTHREAD_ENV
        /* rounding is fine */
        fsync_next.tv_nsec = 0;
@@ -482,9 +502,10 @@ FsyncCheckLWP()
        if (code != 0 && code != ETIMEDOUT)
            ViceLog(0, ("pthread_cond_timedwait returned %d\n", code));
 #else /* AFS_PTHREAD_ENV */
-       if ((code = LWP_WaitProcess(&fsync_wait)) != LWP_SUCCESS)
+       if ((code = LWP_WaitProcess(fsync_wait)) != LWP_SUCCESS)
            ViceLog(0, ("LWP_WaitProcess returned %d\n", code));
 #endif /* AFS_PTHREAD_ENV */
+       FSYNC_UNLOCK;
        ViceLog(2, ("Checking for fsync events\n"));
        do {
            code = BreakLaterCallBacks();
@@ -626,7 +647,6 @@ void
 ShutDownAndCore(int dopanic)
 {
     time_t now = time(0);
-    char *tstr;
     char tbuffer[32];
 
     ViceLog(0,
@@ -693,6 +713,7 @@ FlagMsg()
     /* default supports help flag */
 
     strcpy(buffer, "Usage: fileserver ");
+    strcpy(buffer, "[-auditlog <log path>] ");
     strcat(buffer, "[-d <debug level>] ");
     strcat(buffer, "[-p <number of processes>] ");
     strcat(buffer, "[-spare <number of spare blocks>] ");
@@ -714,6 +735,9 @@ FlagMsg()
     strcat(buffer, "[-rxpck <number of rx extra packets>] ");
     strcat(buffer, "[-rxdbg (enable rx debugging)] ");
     strcat(buffer, "[-rxdbge (enable rxevent debugging)] ");
+#if AFS_PTHREAD_ENV
+    strcat(buffer, "[-vattachpar <number of volume attach threads>] ");
+#endif
 #ifdef AFS_AIX32_ENV
     strcat(buffer, "[-m <min percentage spare in partition>] ");
 #endif
@@ -726,6 +750,7 @@ FlagMsg()
     strcat(buffer, "[-realm <Kerberos realm name>] ");
     strcat(buffer, "[-udpsize <size of socket buffer in bytes>] ");
     strcat(buffer, "[-sendsize <size of send buffer in bytes>] ");
+    strcat(buffer, "[-abortthreshold <abort threshold>] ");
 /*   strcat(buffer, "[-enable_peer_stats] "); */
 /*   strcat(buffer, "[-enable_process_stats] "); */
     strcat(buffer, "[-help]\n");
@@ -844,11 +869,19 @@ ParseArgs(int argc, char *argv[])
 
     for (i = 1; i < argc; i++) {
        if (!strcmp(argv[i], "-d")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -d\n"); 
+               return -1; 
+           }
            debuglevel = atoi(argv[++i]);
            LogLevel = debuglevel;
        } else if (!strcmp(argv[i], "-banner")) {
            printBanner = 1;
        } else if (!strcmp(argv[i], "-implicit")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -implicit\n"); 
+               return -1; 
+           }
            implicitAdminRights = ParseRights(argv[++i]);
            if (implicitAdminRights < 0)
                return implicitAdminRights;
@@ -862,6 +895,10 @@ ParseArgs(int argc, char *argv[])
            int lwps_max =
                max_fileserver_thread() - FILESERVER_HELPER_THREADS;
            Sawlwps = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -p\n"); 
+               return -1; 
+           }
            lwps = atoi(argv[++i]);
            if (lwps > lwps_max)
                lwps = lwps_max;
@@ -869,41 +906,95 @@ ParseArgs(int argc, char *argv[])
                lwps = 6;
        } else if (!strcmp(argv[i], "-b")) {
            Sawbufs = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -b\n"); 
+               return -1; 
+           }
            buffs = atoi(argv[++i]);
        } else if (!strcmp(argv[i], "-l")) {
            Sawlarge = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -l\n"); 
+               return -1; 
+           }
            large = atoi(argv[++i]);
        } else if (!strcmp(argv[i], "-vc")) {
            SawVC = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -vc\n"); 
+               return -1; 
+           }
            volcache = atoi(argv[++i]);
        } else if (!strcmp(argv[i], "-novbc")) {
            novbc = 1;
        } else if (!strcmp(argv[i], "-rxpck")) {
            Sawrxpck = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -rxpck\n"); 
+               return -1; 
+           }
            rxpackets = atoi(argv[++i]);
+#ifdef AFS_PTHREAD_ENV
+       } else if (!strcmp(argv[i], "-vattachpar")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -vattachpar\n"); 
+               return -1; 
+           }
+           vol_attach_threads = atoi(argv[++i]);
+#endif /* AFS_PTHREAD_ENV */
        } else if (!strcmp(argv[i], "-s")) {
            Sawsmall = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -s\n"); 
+               return -1; 
+           }
            nSmallVns = atoi(argv[++i]);
        } else if (!strcmp(argv[i], "-abortthreshold")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -abortthreshold\n"); 
+               return -1; 
+           }
            abort_threshold = atoi(argv[++i]);
-       } else if (!strcmp(argv[i], "-k"))
+       } else if (!strcmp(argv[i], "-k")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -k\n"); 
+               return -1; 
+           }
            stack = atoi(argv[++i]);
+       }
 #if defined(AFS_SGI_ENV)
        else if (!strcmp(argv[i], "-lock")) {
            SawLock = 1;
        }
 #endif
        else if (!strcmp(argv[i], "-spare")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -spare\n"); 
+               return -1; 
+           }
            BlocksSpare = atoi(argv[++i]);
            SawSpare = 1;
        } else if (!strcmp(argv[i], "-pctspare")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -pctspare\n"); 
+               return -1; 
+           }
            PctSpare = atoi(argv[++i]);
            BlocksSpare = 0;    /* has non-zero default */
            SawPctSpare = 1;
-       } else if (!strcmp(argv[i], "-w"))
+       } else if (!strcmp(argv[i], "-w")) {
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -w\n"); 
+               return -1; 
+           }
            fiveminutes = atoi(argv[++i]);
-       else if (!strcmp(argv[i], "-hr")) {
-           int hr = atoi(argv[++i]);
+       } else if (!strcmp(argv[i], "-hr")) {
+           int hr;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -hr\n"); 
+               return -1; 
+           }
+           hr = atoi(argv[++i]);
            if ((hr < 1) || (hr > 36)) {
                printf
                    ("host acl refresh interval of %d hours is invalid; hours must be between 1 and 36\n\n",
@@ -917,6 +1008,10 @@ ParseArgs(int argc, char *argv[])
            eventlog = 1;
        else if (!strcmp(argv[i], "-cb")) {
            Sawcbs = 1;
+            if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -cb\n"); 
+               return -1; 
+           }
            numberofcbs = atoi(argv[++i]);
            if ((numberofcbs < 10000) || (numberofcbs > 2147483647)) {
                printf
@@ -926,6 +1021,10 @@ ParseArgs(int argc, char *argv[])
            }
        } else if (!strcmp(argv[i], "-busyat")) {
            Sawbusy = 1;
+           if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -busyat\n"); 
+               return -1; 
+           }
            busy_threshold = atoi(argv[++i]);
            if (busy_threshold < 10) {
                printf
@@ -938,6 +1037,10 @@ ParseArgs(int argc, char *argv[])
 #ifdef AFS_AIX32_ENV
        else if (!strcmp(argv[i], "-m")) {
            extern int aixlow_water;
+           if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -m\n"); 
+               return -1; 
+           }
            aixlow_water = atoi(argv[++i]);
            if ((aixlow_water < 0) || (aixlow_water > 30)) {
                printf("space reserved %d% invalid; must be between 0-30%\n",
@@ -949,14 +1052,27 @@ ParseArgs(int argc, char *argv[])
        else if (!strcmp(argv[i], "-nojumbo")) {
            rxJumbograms = 0;
        } else if (!strcmp(argv[i], "-realm")) {
-           extern char local_realm[AFS_REALM_SZ];
+           extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
+           extern int  num_lrealms;
+           if ((i + 1) >= argc) {
+               fprintf(stderr, "missing argument for -realm\n"); 
+               return -1; 
+           }
            if (strlen(argv[++i]) >= AFS_REALM_SZ) {
                printf
                    ("-realm argument must contain fewer than %d characters.\n",
                     AFS_REALM_SZ);
                return -1;
            }
-           strncpy(local_realm, argv[i], AFS_REALM_SZ);
+           if (num_lrealms == -1) 
+               num_lrealms = 0;
+           if (num_lrealms >= AFS_NUM_LREALMS) {
+               printf
+                   ("a maximum of %d -realm arguments can be specified.\n",
+                    AFS_NUM_LREALMS);
+               return -1;
+           }
+           strncpy(local_realms[num_lrealms++], argv[i], AFS_REALM_SZ);
        } else if (!strcmp(argv[i], "-udpsize")) {
            if ((i + 1) >= argc) {
                printf("You have to specify -udpsize <integer value>\n");
@@ -986,6 +1102,36 @@ ParseArgs(int argc, char *argv[])
        } else if (!strcmp(argv[i], "-enable_process_stats")) {
            rx_enableProcessRPCStats();
        }
+       else if (strcmp(argv[i], "-auditlog") == 0) {
+           int tempfd, flags;
+           FILE *auditout;
+           char oldName[MAXPATHLEN];
+           char *fileName = argv[++i];
+           
+#ifndef AFS_NT40_ENV
+           struct stat statbuf;
+           
+           if ((lstat(fileName, &statbuf) == 0) 
+               && (S_ISFIFO(statbuf.st_mode))) {
+               flags = O_WRONLY | O_NONBLOCK;
+           } else 
+#endif
+           {
+               strcpy(oldName, fileName);
+               strcat(oldName, ".old");
+               renamefile(fileName, oldName);
+               flags = O_WRONLY | O_TRUNC | O_CREAT;
+           }
+           tempfd = open(fileName, flags, 0666);
+           if (tempfd > -1) {
+               auditout = fdopen(tempfd, "a");
+               if (auditout) {
+                   osi_audit_file(auditout);
+               } else
+                   printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+           } else
+               printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+       }
 #ifndef AFS_NT40_ENV
        else if (strcmp(argv[i], "-syslog") == 0) {
            /* set syslog logging flag */
@@ -995,6 +1141,10 @@ ParseArgs(int argc, char *argv[])
            serverLogSyslogFacility = atoi(argv[i] + 8);
        }
 #endif
+       else if (strcmp(argv[i], "-mrafslogs") == 0) {
+           /* set syslog logging flag */
+           mrafsStyleLogs = 1;
+       } 
        else {
            return (-1);
        }
@@ -1048,17 +1198,17 @@ ParseArgs(int argc, char *argv[])
 static void
 NewParms(int initializing)
 {
-    static struct stat sbuf;
+    static struct afs_stat sbuf;
     register int i, fd;
     char *parms;
     char *argv[MAXPARMS];
     register int argc;
 
-    if (!(stat("/vice/file/parms", &sbuf))) {
+    if (!(afs_stat("/vice/file/parms", &sbuf))) {
        parms = (char *)malloc(sbuf.st_size);
        if (!parms)
            return;
-       fd = open("parms", O_RDONLY, 0666);
+       fd = afs_open("parms", O_RDONLY, 0666);
        if (fd <= 0) {
            ViceLog(0, ("Open for parms failed with errno = %d\n", errno));
            return;
@@ -1219,15 +1369,15 @@ ReadSysIdFile()
 {
     afs_int32 fd, nentries, i;
     struct versionStamp vsn;
-    struct stat status;
+    struct afs_stat status;
     afsUUID uuid;
 
-    if ((stat(AFSDIR_SERVER_SYSID_FILEPATH, &status))
+    if ((afs_stat(AFSDIR_SERVER_SYSID_FILEPATH, &status))
        || (status.st_size <= 0)) {
        ViceLog(0, ("%s: doesn't exist\n", AFSDIR_SERVER_SYSID_FILEPATH));
        return ENOENT;
     }
-    if (!(fd = open(AFSDIR_SERVER_SYSID_FILEPATH, O_RDONLY, 0))) {
+    if (!(fd = afs_open(AFSDIR_SERVER_SYSID_FILEPATH, O_RDONLY, 0))) {
        ViceLog(0,
                ("%s: can't open (%d)\n", AFSDIR_SERVER_SYSID_FILEPATH,
                 errno));
@@ -1293,20 +1443,20 @@ ReadSysIdFile()
 afs_int32
 WriteSysIdFile()
 {
-    afs_int32 fd, nentries, i;
+    afs_int32 fd, i;
     struct versionStamp vsn;
-    struct stat status;
+    struct afs_stat status;
     afsUUID uuid;
 
-    if (!stat(AFSDIR_SERVER_SYSID_FILEPATH, &status)) {
+    if (!afs_stat(AFSDIR_SERVER_SYSID_FILEPATH, &status)) {
        /*
         * File exists; keep the old one around
         */
        renamefile(AFSDIR_SERVER_SYSID_FILEPATH,
                   AFSDIR_SERVER_OLDSYSID_FILEPATH);
     }
-    fd = open(AFSDIR_SERVER_SYSID_FILEPATH, O_WRONLY | O_TRUNC | O_CREAT,
-             0666);
+    fd = afs_open(AFSDIR_SERVER_SYSID_FILEPATH, O_WRONLY | O_TRUNC | O_CREAT,
+                 0666);
     if (fd < 1) {
        ViceLog(0,
                ("%s: can't create (%d)\n", AFSDIR_SERVER_SYSID_FILEPATH,
@@ -1376,7 +1526,7 @@ Do_VLRegisterRPC()
     if (code) {
        if (code == VL_MULTIPADDR) {
            ViceLog(0,
-                   ("VL_RegisterAddrs rpc failed; The ethernet address exist on a different server; repair it\n"));
+                   ("VL_RegisterAddrs rpc failed; The IP address exists on a different server; repair it\n"));
            ViceLog(0,
                    ("VL_RegisterAddrs rpc failed; See VLLog for details\n"));
            return code;
@@ -1400,9 +1550,7 @@ Do_VLRegisterRPC()
 afs_int32
 InitVL()
 {
-    int (*old) ();
     afs_int32 code;
-    afs_int32 cnt, i;
     extern int rxi_numNetAddrs;
     extern afs_uint32 rxi_NetAddrs[];
 
@@ -1463,14 +1611,12 @@ InitVL()
 int
 main(int argc, char *argv[])
 {
-    int i;
     afs_int32 code;
-    FILE *file;
     char tbuffer[32];
     struct rx_securityClass *sc[4];
     struct rx_service *tservice;
 #ifdef AFS_PTHREAD_ENV
-    pthread_t parentPid, serverPid;
+    pthread_t serverPid;
     pthread_attr_t tattr;
 #else /* AFS_PTHREAD_ENV */
     PROCESS parentPid, serverPid;
@@ -1481,6 +1627,7 @@ main(int argc, char *argv[])
     struct rlimit rlim;                /* max number of open file descriptors */
 #endif
     int curLimit;
+    time_t t;
 
 #ifdef AFS_AIX32_ENV
     struct sigaction nsa;
@@ -1491,6 +1638,7 @@ main(int argc, char *argv[])
     sigaction(SIGABRT, &nsa, NULL);
     sigaction(SIGSEGV, &nsa, NULL);
 #endif
+    osi_audit_init();
 
     /* Initialize dirpaths */
     if (!(initAFSDirPath() & AFSDIR_SERVER_PATHS_OK)) {
@@ -1502,7 +1650,7 @@ main(int argc, char *argv[])
        exit(2);
     }
 #ifndef AFS_QUIETFS_ENV
-    console = fopen("/dev/console", "w");
+    console = afs_fopen("/dev/console", "w");
 #endif
 
     if (ParseArgs(argc, argv)) {
@@ -1530,7 +1678,9 @@ main(int argc, char *argv[])
     NewParms(1);
 
     /* Open FileLog on stdout, stderr, fd 1 and fd2 (for perror), sigh. */
+#ifndef AFS_NT40_ENV
     serverLogSyslogTag = "fileserver";
+#endif
     OpenLog(AFSDIR_SERVER_FILELOG_FILEPATH);
     SetupLogSignals();
 
@@ -1617,6 +1767,10 @@ main(int argc, char *argv[])
        V_BreakVolumeCallbacks = BreakVolumeCallBacksLater;
     }
 
+#ifdef AFS_PTHREAD_ENV
+    SetLogThreadNumProgram( threadNum );
+#endif
+
     /* initialize libacl routines */
     acl_Initialize(ACL_VERSION);
 
@@ -1653,11 +1807,11 @@ main(int argc, char *argv[])
     sc[1] = 0;                 /* rxvab_NewServerSecurityObject(key1, 0) */
     sc[2] = rxkad_NewServerSecurityObject(rxkad_clear, NULL, get_key, NULL);
     sc[3] = rxkad_NewServerSecurityObject(rxkad_crypt, NULL, get_key, NULL);
-    tservice =
-       rx_NewService( /* port */ 0, /* service id */ 1, /*service name */
-                     "AFS",
-                     /* security classes */ sc, /* numb sec classes */ 4,
-                     RXAFS_ExecuteRequest);
+    tservice = rx_NewService( /* port */ 0, /* service id */ 1,        /*service name */
+                            "AFS",
+                                                       /* security classes */ sc,
+                                                       /* numb sec classes */
+                            4, RXAFS_ExecuteRequest);
     if (!tservice) {
        ViceLog(0,
                ("Failed to initialize RX, probably two servers running.\n"));
@@ -1687,7 +1841,7 @@ main(int argc, char *argv[])
 
     /* Some rx debugging */
     if (rxlog || eventlog) {
-       debugFile = fopen("rx_dbg", "w");
+       debugFile = afs_fopen("rx_dbg", "w");
        if (rxlog)
            rx_debugFile = debugFile;
        if (eventlog)
@@ -1783,9 +1937,10 @@ main(int argc, char *argv[])
     TM_GetTimeOfDay(&tp, 0);
 
 #ifndef AFS_QUIETFS_ENV
-    if (console != NULL) {
+    if (console != NULL) { 
+        time_t t = tp.tv_sec;
        fprintf(console, "File server has started at %s\r",
-               afs_ctime(&tp.tv_sec, tbuffer, sizeof(tbuffer)));
+               afs_ctime(&t, tbuffer, sizeof(tbuffer)));
     }
 #endif
 
@@ -1806,7 +1961,7 @@ main(int argc, char *argv[])
     } else {
        char hoststr[16];
        memcpy(&FS_HostAddr_NBO, he->h_addr, 4);
-       afs_inet_ntoa_r(FS_HostAddr_NBO, hoststr);
+       (void)afs_inet_ntoa_r(FS_HostAddr_NBO, hoststr);
        FS_HostAddr_HBO = ntohl(FS_HostAddr_NBO);
        ViceLog(0,
                ("FileServer %s has address %s (0x%x or 0x%x in host byte order)\n",
@@ -1819,12 +1974,13 @@ main(int argc, char *argv[])
 #if defined(AFS_PTHREAD_ENV) && !defined(AFS_NT40_ENV)
     softsig_signal(SIGQUIT, ShutDown_Signal);
 #else
-    signal(SIGQUIT, ShutDown_Signal);
+    (void)signal(SIGQUIT, ShutDown_Signal);
 #endif
 
+    t = tp.tv_sec;
     ViceLog(0,
            ("File Server started %s",
-            afs_ctime(&tp.tv_sec, tbuffer, sizeof(tbuffer))));
+            afs_ctime(&t, tbuffer, sizeof(tbuffer))));
 #if FS_STATS_DETAILED
     afs_FullPerfStats.det.epoch.tv_sec = StartTime = tp.tv_sec;
 #endif