salvaged: Fix "-parallel all<number>" parsing
[openafs.git] / src / vol / salvaged.c
index 6464ef6..54c4a63 100644 (file)
 #endif
 #endif
 #else /* AFS_VFSINCL_ENV */
-#ifdef AFS_OSF_ENV
-#include <ufs/inode.h>
-#else /* AFS_OSF_ENV */
 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_XBSD_ENV) && !defined(AFS_DARWIN_ENV)
 #include <sys/inode.h>
 #endif
-#endif
 #endif /* AFS_VFSINCL_ENV */
 #endif /* AFS_SGI_ENV */
 #ifdef AFS_AIX_ENV
@@ -138,7 +134,7 @@ static pthread_cond_t worker_cv;
 static void * SalvageChildReaperThread(void *);
 static int DoSalvageVolume(struct SalvageQueueNode * node, int slot);
 
-static void SalvageServer(int argc, char **argv);
+static void SalvageServer(int argc, char **argv, struct logOptions *logopts);
 static void SalvageClient(VolumeId vid, char * pname);
 
 static int Reap_Child(char * prog, int * pid, int * status);
@@ -183,7 +179,8 @@ enum optionsList {
     OPT_syslog,
     OPT_syslogfacility,
     OPT_logfile,
-    OPT_client
+    OPT_client,
+    OPT_transarc_logs
 };
 
 static int
@@ -194,6 +191,9 @@ handleit(struct cmd_syndesc *opts, void *arock)
     VolumeId vid = 0;
     struct cmdline_rock *rock = (struct cmdline_rock *)arock;
     char *optstring = NULL;
+    struct logOptions logopts;
+
+    memset(&logopts, 0, sizeof(logopts));
 
 #ifdef AFS_SGI_VNODE_GLUE
     if (afs_init_kernel_config(-1) < 0) {
@@ -208,13 +208,16 @@ handleit(struct cmd_syndesc *opts, void *arock)
     cmd_OptionAsFlag(opts, OPT_inodes, &ListInodeOption);
     cmd_OptionAsFlag(opts, OPT_oktozap, &OKToZap);
     cmd_OptionAsFlag(opts, OPT_rootinodes, &ShowRootFiles);
+    cmd_OptionAsFlag(opts, OPT_salvagedirs, &RebuildDirs);
     cmd_OptionAsFlag(opts, OPT_blockreads, &forceR);
     if (cmd_OptionAsString(opts, OPT_parallel, &optstring) == 0) {
+       char *input = optstring;
        if (strncmp(optstring, "all", 3) == 0) {
            PartsPerDisk = 1;
+           input += 3;
        }
-       if (strlen(optstring) != 0) {
-           Parallel = atoi(optstring);
+       if (strlen(input) != 0) {
+           Parallel = atoi(input);
            if (Parallel < 1)
                Parallel = 1;
            if (Parallel > MAXPARALLEL) {
@@ -253,12 +256,34 @@ handleit(struct cmd_syndesc *opts, void *arock)
        free(optstring);
        optstring = NULL;
     }
-#ifndef AFS_NT40_ENV           /* ignore options on NT */
+
+#ifdef HAVE_SYSLOG
     if (cmd_OptionPresent(opts, OPT_syslog)) {
-       serverLogSyslog = 1;
-    }
-    cmd_OptionAsInt(opts, OPT_syslogfacility, &serverLogSyslogFacility);
+       if (cmd_OptionPresent(opts, OPT_logfile)) {
+           fprintf(stderr, "Invalid options: -syslog and -logfile are exclusive.\n");
+           return -1;
+       }
+       if (cmd_OptionPresent(opts, OPT_transarc_logs)) {
+           fprintf(stderr, "Invalid options: -syslog and -transarc-logs are exclusive.\n");
+           return -1;
+       }
+       logopts.lopt_dest = logDest_syslog;
+       logopts.lopt_facility = LOG_DAEMON;
+       logopts.lopt_tag = "salvageserver";
+       cmd_OptionAsInt(opts, OPT_syslogfacility, &logopts.lopt_facility);
+    } else
 #endif
+    {
+       logopts.lopt_dest = logDest_file;
+       if (cmd_OptionPresent(opts, OPT_transarc_logs)) {
+           logopts.lopt_rotateOnOpen = 1;
+           logopts.lopt_rotateStyle = logRotate_old;
+       }
+       if (cmd_OptionPresent(opts, OPT_logfile))
+           cmd_OptionAsString(opts, OPT_logfile, (char**)&logopts.lopt_filename);
+       else
+           logopts.lopt_filename = AFSDIR_SERVER_SALSRVLOG_FILEPATH;
+    }
 
     if (cmd_OptionPresent(opts, OPT_client)) {
        if (cmd_OptionAsString(opts, OPT_partition, &optstring) == 0) {
@@ -287,7 +312,7 @@ handleit(struct cmd_syndesc *opts, void *arock)
        SalvageClient(vid, pname);
 
     } else {  /* salvageserver mode */
-       SalvageServer(rock->argc, rock->argv);
+       SalvageServer(rock->argc, rock->argv, &logopts);
     }
     return (0);
 }
@@ -393,7 +418,7 @@ main(int argc, char **argv)
     cmd_AddParmAtOffset(ts, OPT_orphans, "-orphans", CMD_SINGLE, CMD_OPTIONAL,
            "ignore | remove | attach");
 
-#if !defined(AFS_NT40_ENV)
+#ifdef HAVE_SYSLOG
     cmd_AddParmAtOffset(ts, OPT_syslog, "-syslog", CMD_FLAG, CMD_OPTIONAL,
            "Write salvage log to syslogs");
     cmd_AddParmAtOffset(ts, OPT_syslogfacility, "-syslogfacility", CMD_SINGLE,
@@ -406,9 +431,12 @@ main(int argc, char **argv)
     cmd_AddParmAtOffset(ts, OPT_logfile, "-logfile", CMD_SINGLE, CMD_OPTIONAL,
            "Location of log file ");
 
+    cmd_AddParmAtOffset(ts, OPT_transarc_logs, "-transarc-logs", CMD_FLAG,
+                       CMD_OPTIONAL, "enable Transarc style logging");
+
     err = cmd_Dispatch(argc, argv);
     Exit(err);
-    return 0; /* not reached */
+    AFS_UNREACHED(return 0);
 }
 
 static void
@@ -474,7 +502,7 @@ SalvageClient(VolumeId vid, char * pname)
 static int * child_slot;
 
 static void
-SalvageServer(int argc, char **argv)
+SalvageServer(int argc, char **argv, struct logOptions *logopts)
 {
     int pid, ret;
     struct SalvageQueueNode * node;
@@ -486,7 +514,7 @@ SalvageServer(int argc, char **argv)
     /* All entries to the log will be appended.  Useful if there are
      * multiple salvagers appending to the log.
      */
-    OpenLog(AFSDIR_SERVER_SALSRVLOG_FILEPATH);
+    OpenLog(logopts);
     SetupLogSignals();
 
     Log("%s\n", cml_version_number);
@@ -580,7 +608,8 @@ SalvageServer(int argc, char **argv)
 static int
 DoSalvageVolume(struct SalvageQueueNode * node, int slot)
 {
-    char *childLog;
+    char *filename = NULL;
+    struct logOptions logopts;
     struct DiskPartition64 * partP;
 
     /* do not allow further forking inside salvager */
@@ -591,13 +620,17 @@ DoSalvageVolume(struct SalvageQueueNode * node, int slot)
      * another thread may have held the lock when fork was
      * called!
      */
-    if (asprintf(&childLog, "%s.%d",
+    memset(&logopts, 0, sizeof(logopts));
+    logopts.lopt_dest = logDest_file;
+    logopts.lopt_rotateStyle = logRotate_none;
+    if (asprintf(&filename, "%s.%d",
                 AFSDIR_SERVER_SLVGLOG_FILEPATH, getpid()) < 0) {
        fprintf(stderr, "out of memory\n");
        return ENOMEM;
     }
-    OpenLog(childLog);
-    free(childLog);
+    logopts.lopt_filename = filename;
+    OpenLog(&logopts);
+    free(filename);
 
     if (node->command.sop.parent <= 0) {
        Log("salvageServer: invalid volume id specified; salvage aborted\n");
@@ -673,7 +706,7 @@ SalvageChildReaperThread(void * args)
        opr_cv_broadcast(&worker_cv);
     }
 
-    return NULL;
+    AFS_UNREACHED(return(NULL));
 }
 
 static int
@@ -722,8 +755,8 @@ SalvageLogCleanupThread(void * arg)
        }
     }
 
-    opr_mutex_exit(&worker_lock);
-    return NULL;
+    AFS_UNREACHED(opr_mutex_exit(&worker_lock));
+    AFS_UNREACHED(return(NULL));
 }
 
 #define LOG_XFER_BUF_SIZE 65536
@@ -740,7 +773,7 @@ SalvageLogCleanup(int pid)
     }
 
     buf = calloc(1, LOG_XFER_BUF_SIZE);
-    if (buf != NULL) {
+    if (buf == NULL) {
        Log("Unable to write child log: out of memory\n");
        goto done;
     }