OPENAFS-SA-2018-001 backup: use authenticated connection to butc
[openafs.git] / src / bucoord / main.c
index adfffea..d2a5f36 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -9,30 +9,16 @@
 
 #include <afsconfig.h>
 #include <afs/param.h>
+#include <afs/stds.h>
+
+#include <roken.h>
 
-RCSID
-    ("$Header$");
 
-#include <afs/stds.h>
-#include <sys/types.h>
-#include <stdio.h>
-#ifdef AFS_AIX32_ENV
-#include <signal.h>
-#endif
-#ifdef AFS_NT40_ENV
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#endif
-#include <errno.h>
 #include <afs/cmd.h>
 #include <rx/rx.h>
 #include <rx/rx_globals.h>
 #include <lwp.h>
 #include <afs/bubasics.h>
-#include <fcntl.h>
 #include <afs/afsutil.h>
 #include <afs/auth.h>
 #include <afs/cellconfig.h>
@@ -40,58 +26,31 @@ RCSID
 #include <ubik.h>
 #include <afs/cmd.h>
 #include <rx/rxkad.h>
+#include <afs/afsint.h>
 #include <afs/volser.h>                /*VLDB_MAXSERVERS */
 #include <afs/com_err.h>
 #include <lock.h>
 #include <afs/budb.h>
+#include <afs/kautils.h>
+#include <afs/vlserver.h>
+#include <afs/butm.h>
+#include <afs/butx.h>
+#include <afs/tcdata.h>
 
 #include "bc.h"                        /*Backup Coordinator structs and defs */
+#include "bucoord_internal.h"
+#include "bucoord_prototypes.h"
 
-
-int localauth, interact;
+int localauth, interact, nobutcauth;
 char tcell[64];
 
-extern int BC_ExecuteRequest();
-extern int bc_AddDumpCmd();
-extern int bc_AddHostCmd();
-extern int bc_AddVolEntryCmd();
-extern int bc_AddVolSetCmd();
-/* extern int bc_CheckDumpStatCmd(); */
-extern int bc_DeleteDumpCmd();
-extern int bc_DeleteHostCmd();
-extern int bc_DeleteVolEntryCmd();
-extern int bc_DeleteVolSetCmd();
-extern int bc_DiskRestoreCmd();
-extern int bc_VolsetRestoreCmd();
-extern int bc_DumpCmd();
-extern int bc_GetTapeStatusCmd();
-extern int bc_JobsCmd();
-extern int bc_KillCmd();
-extern int bc_LabelTapeCmd();
-extern int bc_ListDumpScheduleCmd();
-extern int bc_ListHostsCmd();
-extern int bc_ListVolSetCmd();
-extern int bc_QuitCmd();
-extern int bc_ReadLabelCmd();
-extern int bc_ScanDumpsCmd();
-extern int bc_SetExpCmd();
-extern int bc_VolRestoreCmd();
-extern int bc_dblookupCmd();
-extern int bc_dbVerifyCmd();
-extern int bc_deleteDumpCmd();
-extern int bc_dumpInfoCmd();
-extern int bc_restoreDbCmd();
-extern int bc_saveDbCmd();
-
-extern PrintError();
-
 /*
  * Global configuration information for the Backup Coordinator.
  */
 struct bc_config *bc_globalConfig;     /*Ptr to global BC configuration info */
 
 struct ubik_client *cstruct;   /* Ptr to Ubik client structure */
-struct ktc_token ttoken;       /* The token */
+time_t tokenExpires;           /* The token's expiration time */
 
 static const char *DefaultConfDir;     /*Default backup config directory */
 static int bcInit = 0;         /* backupInit called yet ? */
@@ -99,7 +58,8 @@ char *whoami = "backup";
 
 /* dummy routine for the audit work.  It should do nothing since audits */
 /* occur at the server level and bos is not a server. */
-osi_audit()
+int
+osi_audit(void)
 {
     return 0;
 }
@@ -109,7 +69,7 @@ osi_audit()
  * in this module.
  */
 void
-InitErrTabs()
+InitErrTabs(void)
 {
     initialize_ACFG_error_table();
     initialize_KA_error_table();
@@ -125,13 +85,12 @@ InitErrTabs()
     initialize_KTC_error_table();
 }
 
-/* 
- * got to account for the errors which are volume related but 
+/*
+ * got to account for the errors which are volume related but
  * not dealt with by standard errno and com_err stuff.
  */
 void
-bc_HandleMisc(code)
-     afs_int32 code;
+bc_HandleMisc(afs_int32 code)
 {
     if (((code <= VMOVED) && (code >= VSALVAGE)) || (code < 0)) {
        switch (code) {
@@ -180,13 +139,12 @@ bc_HandleMisc(code)
 }
 
 /* Return true if line is all whitespace */
-static
-LineIsBlank(aline)
-     register char *aline;
+static int
+LineIsBlank(char *aline)
 {
-    register int tc;
+    int tc;
 
-    while (tc = *aline++)
+    while ((tc = *aline++))
        if ((tc != ' ') && (tc != '\t') && (tc != '\n'))
            return (0);
 
@@ -199,11 +157,10 @@ LineIsBlank(aline)
  */
 
 afs_int32
-bc_InitTextConfig()
+bc_InitTextConfig(void)
 {
     udbClientTextP ctPtr;
     int i;
-    afs_int32 code = 0;
 
     extern struct bc_config *bc_globalConfig;
 
@@ -241,28 +198,26 @@ bc_InitTextConfig()
  */
 
 static int
-backupInit()
+backupInit(void)
 {
-    register afs_int32 code;
+    afs_int32 code;
     static int initd = 0;      /* ever called? */
     PROCESS watcherPid;
     PROCESS pid;               /* LWP process ID */
 
-    extern statusWatcher();
-
     /* Initialization */
     initialize_CMD_error_table();
 
     /* don't run more than once */
     if (initd) {
-       com_err(whoami, 0, "Backup already initialized.");
+       afs_com_err(whoami, 0, "Backup already initialized.");
        return 0;
     }
     initd = 1;
 
-    code = bc_InitConfig(DefaultConfDir);
+    code = bc_InitConfig((char *)DefaultConfDir);
     if (code) {
-       com_err(whoami, code,
+       afs_com_err(whoami, code,
                "Can't initialize from config files in directory '%s'",
                DefaultConfDir);
        return (code);
@@ -273,20 +228,20 @@ backupInit()
      */
     code = LWP_InitializeProcessSupport(LWP_NORMAL_PRIORITY, &pid);
     if (code) {
-       com_err(whoami, code, "; Can't initialize LWP");
+       afs_com_err(whoami, code, "; Can't initialize LWP");
        return (code);
     }
 
     code = rx_Init(htons(0));
     if (code) {
-       com_err(whoami, code, "; Can't initialize Rx");
+       afs_com_err(whoami, code, "; Can't initialize Rx");
        return (code);
     }
 
     rx_SetRxDeadTime(60);
 
     /* VLDB initialization */
-    vldbClientInit(0, localauth, tcell, &cstruct, &ttoken);
+    code = vldbClientInit(0, localauth, tcell, &cstruct, &tokenExpires);
     if (code)
        return (code);
 
@@ -301,7 +256,7 @@ backupInit()
        LWP_CreateProcess(statusWatcher, 20480, LWP_NORMAL_PRIORITY,
                          (void *)2, "statusWatcher", &watcherPid);
     if (code) {
-       com_err(whoami, code, "; Can't create status monitor task");
+       afs_com_err(whoami, code, "; Can't create status monitor task");
        return (code);
     }
 
@@ -330,15 +285,14 @@ backupInit()
  */
 
 static int
-MyBeforeProc(as)
-     register struct cmd_syndesc *as;
+MyBeforeProc(struct cmd_syndesc *as, void *arock)
 {
-    char *rock;
     afs_int32 code;
 
     /* Handling the command line opcode */
     if (!bcInit) {
        localauth = ((as && as->parms[14].items) ? 1 : 0);
+       nobutcauth = ((as && as->parms[16].items) ? 1 : 0);
        if (as && as->parms[15].items)
            strcpy(tcell, as->parms[15].items->data);
        else
@@ -346,14 +300,14 @@ MyBeforeProc(as)
 
        code = backupInit();
        if (code) {
-           com_err(whoami, code, "; Can't initialize backup");
+           afs_com_err(whoami, code, "; Can't initialize backup");
            exit(1);
        }
 
        /* Get initial information from the database */
        code = bc_InitTextConfig();
        if (code) {
-           com_err(whoami, code,
+           afs_com_err(whoami, code,
                    "; Can't obtain configuration text from backup database");
            exit(1);
        }
@@ -373,14 +327,14 @@ extern int dontExecute;           /* declared in commands.c */
 extern char *loadFile;         /* declared in commands.c */
 char lineBuffer[1024];         /* Line typed in by user or read from load file */
 
-/* 
+/*
  * This will dispatch a command.  It holds a recursive loop for the
  * "dump -file" option. This option reads backup commands from a file.
  *
  * Cannot put this code on other side of cmd_Dispatch call (in
  * commands.c) because when make a dispatch call when in a dispatch
  * call, environment is mucked up.
- * 
+ *
  * To avoid multiple processes stepping on each other in the dispatch code,
  * put a lock around it so only 1 process gets in at a time.
  */
@@ -390,12 +344,11 @@ struct Lock dispatchLock; /* lock on the Dispatch call */
 #define unlock_Dispatch()   ReleaseWriteLock(&dispatchLock)
 
 afs_int32
-doDispatch(targc, targv, dispatchCount)
-     char **targv[MAXV];
-     afs_int32 targc;
-     afs_int32 dispatchCount;  /* to prevent infinite recursion */
+doDispatch(afs_int32 targc,
+          char *targv[MAXV],
+          afs_int32 dispatchCount) /* to prevent infinite recursion */
 {
-    char **sargv[MAXV];
+    char *sargv[MAXV];
     afs_int32 sargc;
     afs_int32 code, c;
     FILE *fd;
@@ -414,7 +367,7 @@ doDispatch(targc, targv, dispatchCount)
 
     if (internalLoadFile) {    /* Load a file in */
        if (dispatchCount > MAXRECURSION) {     /* Beware recursive loops. */
-           com_err(whoami, 0, "Potential recursion: will not load file %s",
+           afs_com_err(whoami, 0, "Potential recursion: will not load file %s",
                    internalLoadFile);
            code = -1;
            goto done;
@@ -422,7 +375,7 @@ doDispatch(targc, targv, dispatchCount)
 
        fd = fopen(internalLoadFile, "r");      /* Open the load file */
        if (!fd) {
-           com_err(whoami, errno, "; Cannot open file %s", internalLoadFile);
+           afs_com_err(whoami, errno, "; Cannot open file %s", internalLoadFile);
            code = -1;
            goto done;
        }
@@ -449,7 +402,7 @@ doDispatch(targc, targv, dispatchCount)
                (!noExecute)) { /*      or no execute */
                c = cmd_ParseLine(lineBuffer, sargv, &sargc, MAXV);
                if (c) {
-                   com_err(whoami, c, "; Can't parse line");
+                   afs_com_err(whoami, c, "; Can't parse line");
                } else {
                    doDispatch(sargc, sargv, dispatchCount + 1);        /* Recursive - ignore error */
                    cmd_FreeArgv(sargv);        /* Free up arguments */
@@ -467,40 +420,37 @@ doDispatch(targc, targv, dispatchCount)
 }
 
 int
-bc_interactCmd(as, arock)
-     struct cmd_syndesc *as;
-     char *arock;
+bc_interactCmd(struct cmd_syndesc *as, void *arock)
 {
     interact = 1;
+    return 0;
 }
 
 static void
-add_std_args(ts)
-     register struct cmd_syndesc *ts;
+add_std_args(struct cmd_syndesc *ts)
 {
     cmd_Seek(ts, 14);
     cmd_AddParm(ts, "-localauth", CMD_FLAG, CMD_OPTIONAL,
                "local authentication");
     cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name");
+    cmd_AddParm(ts, "-nobutcauth", CMD_FLAG, CMD_OPTIONAL,
+               "no authentication to butc");
 }
 
-
-main(argc, argv)
-     int argc;
-     char **argv;
+int
+main(int argc, char **argv)
 {                              /*main */
-    char **targv[MAXV];                /*Ptr to parsed argv stuff */
+    char *targv[MAXV];         /*Ptr to parsed argv stuff */
     afs_int32 targc;           /*Num parsed arguments */
     afs_int32 code;            /*Return code */
-    char *tp;                  /*Result of gets() */
-    register struct cmd_syndesc *ts;   /*Ptr to parsed command line */
+    struct cmd_syndesc *ts;    /*Ptr to parsed command line */
     int i;
 
 
 #ifdef AFS_AIX32_ENV
     /*
-     * The following signal action for AIX is necessary so that in case of a 
-     * crash (i.e. core is generated) we can include the user's data section 
+     * The following signal action for AIX is necessary so that in case of a
+     * crash (i.e. core is generated) we can include the user's data section
      * in the core dump. Unfortunately, by default, only a partial core is
      * generated which, in many cases, isn't too useful.
      */
@@ -517,11 +467,21 @@ main(argc, argv)
     /* setup the default backup dir */
     DefaultConfDir = AFSDIR_SERVER_BACKUP_DIRPATH;
     /* Get early warning if the command is interacive mode or not */
-    interact = (((argc < 2) || (argv[1][0] == '-')) ? 1 : 0);
+    if (argc < 2) {
+       interact = 1;
+    } else {
+       interact = 0;
+       if (argv[1][0] == '-') {
+           interact = 1;
+           if (strcmp(argv[1], "-help") == 0) {
+               interact = 0;
+           }
+       }
+    }
 
     cmd_SetBeforeProc(MyBeforeProc, NULL);
 
-    ts = cmd_CreateSyntax("dump", bc_DumpCmd, 0, "start dump");
+    ts = cmd_CreateSyntax("dump", bc_DumpCmd, NULL, 0, "start dump");
     cmd_AddParm(ts, "-volumeset", CMD_SINGLE, CMD_OPTIONAL,
                "volume set name");
     cmd_AddParm(ts, "-dump", CMD_SINGLE, CMD_OPTIONAL, "dump level name");
@@ -530,12 +490,14 @@ main(argc, argv)
     cmd_AddParm(ts, "-at", CMD_LIST, CMD_OPTIONAL, "Date/time to start dump");
     cmd_AddParm(ts, "-append", CMD_FLAG, CMD_OPTIONAL,
                "append to existing dump set");
-    cmd_AddParm(ts, "-n", CMD_FLAG, CMD_OPTIONAL, "don't really execute it");
+    cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL,
+                "list what would be done, don't do it");
+    cmd_AddParmAlias(ts, 5, "-n");
     cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "load file");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("volrestore", bc_VolRestoreCmd, 0,
+    ts = cmd_CreateSyntax("volrestore", bc_VolRestoreCmd, NULL, 0,
                          "restore volume");
     cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
                "destination machine");
@@ -548,11 +510,15 @@ main(argc, argv)
     cmd_AddParm(ts, "-date", CMD_LIST, CMD_OPTIONAL,
                "date from which to restore");
     cmd_AddParm(ts, "-portoffset", CMD_LIST, CMD_OPTIONAL, "TC port offsets");
-    cmd_AddParm(ts, "-n", CMD_FLAG, CMD_OPTIONAL, "don't really execute it");
+    cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL,
+                "list what would be done, don't do it");
+    cmd_AddParmAlias(ts, 6, "-n");
+    cmd_AddParm(ts, "-usedump", CMD_SINGLE, CMD_OPTIONAL,
+               "specify the dumpID to restore from");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("diskrestore", bc_DiskRestoreCmd, 0,
+    ts = cmd_CreateSyntax("diskrestore", bc_DiskRestoreCmd, NULL, 0,
                          "restore partition");
     cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
                "machine to restore");
@@ -566,24 +532,28 @@ main(argc, argv)
                "destination partition");
     cmd_AddParm(ts, "-extension", CMD_SINGLE, CMD_OPTIONAL,
                "new volume name extension");
-    cmd_AddParm(ts, "-n", CMD_FLAG, CMD_OPTIONAL, "don't really execute it");
+    cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL,
+                "list what would be done, don't do it");
+    cmd_AddParmAlias(ts, 11, "-n");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("quit", bc_QuitCmd, 0, "leave the program");
+    cmd_CreateSyntax("quit", bc_QuitCmd, NULL, 0, "leave the program");
 
-    ts = cmd_CreateSyntax("volsetrestore", bc_VolsetRestoreCmd, 0,
+    ts = cmd_CreateSyntax("volsetrestore", bc_VolsetRestoreCmd, NULL, 0,
                          "restore a set of volumes");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "volume set name");
     cmd_AddParm(ts, "-file", CMD_SINGLE, CMD_OPTIONAL, "file name");
     cmd_AddParm(ts, "-portoffset", CMD_LIST, CMD_OPTIONAL, "TC port offset");
     cmd_AddParm(ts, "-extension", CMD_SINGLE, CMD_OPTIONAL,
                "new volume name extension");
-    cmd_AddParm(ts, "-n", CMD_FLAG, CMD_OPTIONAL, "don't really execute it");
+    cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL,
+                "list what would be done, don't do it");
+    cmd_AddParmAlias(ts, 4, "-n");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("addhost", bc_AddHostCmd, 0, "add host to config");
+    ts = cmd_CreateSyntax("addhost", bc_AddHostCmd, NULL, 0, "add host to config");
     cmd_AddParm(ts, "-tapehost", CMD_SINGLE, CMD_REQUIRED,
                "tape machine name");
     cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL,
@@ -591,7 +561,7 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("delhost", bc_DeleteHostCmd, 0,
+    ts = cmd_CreateSyntax("delhost", bc_DeleteHostCmd, NULL, 0,
                          "delete host to config");
     cmd_AddParm(ts, "-tapehost", CMD_SINGLE, CMD_REQUIRED,
                "tape machine name");
@@ -600,29 +570,29 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("listhosts", bc_ListHostsCmd, 0,
+    ts = cmd_CreateSyntax("listhosts", bc_ListHostsCmd, NULL, 0,
                          "list config hosts");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("jobs", bc_JobsCmd, 0, "list running jobs");
+    cmd_CreateSyntax("jobs", bc_JobsCmd, NULL, 0, "list running jobs");
 
-    ts = cmd_CreateSyntax("kill", bc_KillCmd, 0, "kill running job");
+    ts = cmd_CreateSyntax("kill", bc_KillCmd, NULL, 0, "kill running job");
     cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_REQUIRED,
                "job ID or dump set name");
 
-    ts = cmd_CreateSyntax("listvolsets", bc_ListVolSetCmd, 0,
+    ts = cmd_CreateSyntax("listvolsets", bc_ListVolSetCmd, NULL, 0,
                          "list volume sets");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL, "volume set name");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("listdumps", bc_ListDumpScheduleCmd, 0,
+    ts = cmd_CreateSyntax("listdumps", bc_ListDumpScheduleCmd, NULL, 0,
                          "list dump schedules");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("addvolset", bc_AddVolSetCmd, 0,
+    ts = cmd_CreateSyntax("addvolset", bc_AddVolSetCmd, NULL, 0,
                          "create a new volume set");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name");
     cmd_AddParm(ts, "-temporary", CMD_FLAG, CMD_OPTIONAL,
@@ -630,20 +600,20 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("status", bc_GetTapeStatusCmd, 0,
+    ts = cmd_CreateSyntax("status", bc_GetTapeStatusCmd, NULL, 0,
                          "get tape coordinator status");
     cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL,
                "TC port offset");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("delvolset", bc_DeleteVolSetCmd, 0,
+    ts = cmd_CreateSyntax("delvolset", bc_DeleteVolSetCmd, NULL, 0,
                          "delete a volume set");
     cmd_AddParm(ts, "-name", CMD_LIST, CMD_REQUIRED, "volume set name");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("addvolentry", bc_AddVolEntryCmd, 0,
+    ts = cmd_CreateSyntax("addvolentry", bc_AddVolEntryCmd, NULL, 0,
                          "add a new volume entry");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name");
     cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "machine name");
@@ -653,26 +623,26 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("delvolentry", bc_DeleteVolEntryCmd, 0,
+    ts = cmd_CreateSyntax("delvolentry", bc_DeleteVolEntryCmd, NULL, 0,
                          "delete a volume set sub-entry");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_REQUIRED, "volume set name");
     cmd_AddParm(ts, "-entry", CMD_SINGLE, CMD_REQUIRED, "volume set index");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("adddump", bc_AddDumpCmd, 0, "add dump schedule");
+    ts = cmd_CreateSyntax("adddump", bc_AddDumpCmd, NULL, 0, "add dump schedule");
     cmd_AddParm(ts, "-dump", CMD_LIST, CMD_REQUIRED, "dump level name");
     cmd_AddParm(ts, "-expires", CMD_LIST, CMD_OPTIONAL, "expiration date");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("deldump", bc_DeleteDumpCmd, 0,
+    ts = cmd_CreateSyntax("deldump", bc_DeleteDumpCmd, NULL, 0,
                          "delete dump schedule");
     cmd_AddParm(ts, "-dump", CMD_SINGLE, CMD_REQUIRED, "dump level name");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("labeltape", bc_LabelTapeCmd, 0, "label a tape");
+    ts = cmd_CreateSyntax("labeltape", bc_LabelTapeCmd, NULL, 0, "label a tape");
     cmd_AddParm(ts, "-name", CMD_SINGLE, CMD_OPTIONAL,
                "AFS tape name, defaults to NULL");
     cmd_AddParm(ts, "-size", CMD_SINGLE, CMD_OPTIONAL,
@@ -684,14 +654,14 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("readlabel", bc_ReadLabelCmd, 0,
+    ts = cmd_CreateSyntax("readlabel", bc_ReadLabelCmd, NULL, 0,
                          "read the label on tape");
     cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL,
                "TC port offset");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("scantape", bc_ScanDumpsCmd, 0,
+    ts = cmd_CreateSyntax("scantape", bc_ScanDumpsCmd, NULL, 0,
                          "dump information recovery from tape");
     cmd_AddParm(ts, "-dbadd", CMD_FLAG, CMD_OPTIONAL,
                "add information to the database");
@@ -700,34 +670,34 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("volinfo", bc_dblookupCmd, 0,
+    ts = cmd_CreateSyntax("volinfo", bc_dblookupCmd, NULL, 0,
                          "query the backup database");
     cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED, "volume name");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("setexp", bc_SetExpCmd, 0,
+    ts = cmd_CreateSyntax("setexp", bc_SetExpCmd, NULL, 0,
                          "set/clear dump expiration dates");
     cmd_AddParm(ts, "-dump", CMD_LIST, CMD_REQUIRED, "dump level name");
     cmd_AddParm(ts, "-expires", CMD_LIST, CMD_OPTIONAL, "expiration date");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("savedb", bc_saveDbCmd, 0, "save backup database");
+    ts = cmd_CreateSyntax("savedb", bc_saveDbCmd, NULL, 0, "save backup database");
     cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL,
                "TC port offset");
     cmd_AddParm(ts, "-archive", CMD_LIST, CMD_OPTIONAL, "date time");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("restoredb", bc_restoreDbCmd, 0,
+    ts = cmd_CreateSyntax("restoredb", bc_restoreDbCmd, NULL, 0,
                          "restore backup database");
     cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL,
                "TC port offset");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("dumpinfo", bc_dumpInfoCmd, 0,
+    ts = cmd_CreateSyntax("dumpinfo", bc_dumpInfoCmd, NULL, 0,
                          "provide information about a dump in the database");
     cmd_AddParm(ts, "-ndumps", CMD_SINGLE, CMD_OPTIONAL, "no. of dumps");
     cmd_AddParm(ts, "-id", CMD_SINGLE, CMD_OPTIONAL, "dump id");
@@ -736,30 +706,33 @@ main(argc, argv)
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("dbverify", bc_dbVerifyCmd, 0,
+    ts = cmd_CreateSyntax("dbverify", bc_dbVerifyCmd, NULL, 0,
                          "check ubik database integrity");
     cmd_AddParm(ts, "-detail", CMD_FLAG, CMD_OPTIONAL, "additional details");
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("deletedump", bc_deleteDumpCmd, 0,
+    ts = cmd_CreateSyntax("deletedump", bc_deleteDumpCmd, NULL, 0,
                          "delete dumps from the database");
     cmd_AddParm(ts, "-dumpid", CMD_LIST, CMD_OPTIONAL, "dump id");
     cmd_AddParm(ts, "-from", CMD_LIST, CMD_OPTIONAL, "date time");
     cmd_AddParm(ts, "-to", CMD_LIST, CMD_OPTIONAL, "date time");
-    cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "TC port offset");
+    cmd_AddParm(ts, "-portoffset", CMD_SINGLE, CMD_OPTIONAL, "TC port offset");
+    cmd_AddParmAlias(ts, 3, "-port");
     cmd_AddParm(ts, "-groupid", CMD_SINGLE, CMD_OPTIONAL, "group ID");
     cmd_AddParm(ts, "-dbonly", CMD_FLAG, CMD_OPTIONAL,
                "delete the dump from the backup database only");
     cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL,
                "always delete from backup database");
-    cmd_AddParm(ts, "-noexecute", CMD_FLAG, CMD_OPTIONAL,
-               "Just list the dumps");
+    cmd_AddParm(ts, "-noexecute", CMD_FLAG, CMD_OPTIONAL|CMD_HIDDEN, "");
+    cmd_AddParm(ts, "-dryrun", CMD_FLAG, CMD_OPTIONAL,
+               "list the dumps, don't delete anything");
+    cmd_AddParmAlias(ts, 8, "-n");
 
     if (!interact)
        add_std_args(ts);
 
-    ts = cmd_CreateSyntax("interactive", bc_interactCmd, 0,
+    ts = cmd_CreateSyntax("interactive", bc_interactCmd, NULL, 0,
                          "enter interactive mode");
     add_std_args(ts);
 
@@ -801,8 +774,8 @@ main(argc, argv)
        if (!LineIsBlank(lineBuffer)) {
            code = cmd_ParseLine(lineBuffer, targv, &targc, MAXV);
            if (code)
-               com_err(whoami, code, "; Can't parse line: '%s'",
-                       error_message(code));
+               afs_com_err(whoami, code, "; Can't parse line: '%s'",
+                       afs_error_message(code));
            else {
                doDispatch(targc, targv, 1);
                cmd_FreeArgv(targv);