# dump /home                                                       
dump: option requires an argument -- h

# dump /music
dump: option requires an argument -- s

# dump /media 
dump: option requires an argument -- d

What? Before passing its options to getopt(),
dump's main() processes them with obsolete():

        Change set of key letters and ordered arguments
        into something getopt(3) will like.

That results in the above. What obsolete options format
is this trying to accomodate? The manpage doesn't say -
the options it describes are perfectly getopt()-likable.
Looking at the CVS log, this was already "obsolete"
in the original 1995 import. Does anyone still use
that undescribed obsolete syntax dump "supports"?

The diff below simply removes the function.
With the diff, dump does the right thing,
i.e. just tries to dump the given fs to rst0.

# dump /home
DUMP: Date of this level 0 dump: Thu Jun  2 14:20:44 2022
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/rsd0a (/home) to /dev/rst0
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 47580129 tape blocks on 1222.00 tape(s).
DUMP: Cannot open output "/dev/rst0".

        Jan


Index: main.c
===================================================================
RCS file: /cvs/src/sbin/dump/main.c,v
retrieving revision 1.62
diff -u -p -r1.62 main.c
--- main.c      21 Jan 2021 00:16:36 -0000      1.62
+++ main.c      2 Jun 2022 12:23:56 -0000
@@ -99,7 +99,6 @@ struct disklabel lab;
 static int sblock_try[] = SBLOCKSEARCH;
 
 static long long numarg(char *, long long, long long);
-static void obsolete(int *, char **[]);
 static void usage(void);
 
 int
@@ -134,7 +133,6 @@ main(int argc, char *argv[])
        if (argc < 2)
                usage();
 
-       obsolete(&argc, &argv);
        while ((ch = getopt(argc, argv, "0123456789aB:b:cd:f:h:ns:ST:uWw")) != 
-1)
                switch (ch) {
                /* dump level */
@@ -700,80 +698,4 @@ getduid(char *path)
        }
 
        return (NULL);
-}
-
-/*
- * obsolete --
- *     Change set of key letters and ordered arguments into something
- *     getopt(3) will like.
- */
-static void
-obsolete(int *argcp, char **argvp[])
-{
-       int argc, flags;
-       char *ap, **argv, *flagsp, **nargv, *p;
-       size_t len;
-
-       /* Setup. */
-       argv = *argvp;
-       argc = *argcp;
-
-       /* Return if no arguments or first argument has leading dash. */
-       ap = argv[1];
-       if (argc == 1 || *ap == '-')
-               return;
-
-       /* Allocate space for new arguments. */
-       if ((*argvp = nargv = calloc(argc + 1, sizeof(char *))) == NULL ||
-           (p = flagsp = malloc(strlen(ap) + 2)) == NULL)
-               err(1, NULL);
-
-       *nargv++ = *argv;
-       argv += 2;
-
-       for (flags = 0; *ap; ++ap) {
-               switch (*ap) {
-               case 'B':
-               case 'b':
-               case 'd':
-               case 'f':
-               case 'h':
-               case 's':
-               case 'T':
-                       if (*argv == NULL) {
-                               warnx("option requires an argument -- %c", *ap);
-                               usage();
-                       }
-                       len = 2 + strlen(*argv) + 1;
-                       if ((nargv[0] = malloc(len)) == NULL)
-                               err(1, NULL);
-                       nargv[0][0] = '-';
-                       nargv[0][1] = *ap;
-                       (void)strlcpy(&nargv[0][2], *argv, len - 2);
-                       ++argv;
-                       ++nargv;
-                       break;
-               default:
-                       if (!flags) {
-                               *p++ = '-';
-                               flags = 1;
-                       }
-                       *p++ = *ap;
-                       break;
-               }
-       }
-
-       /* Terminate flags, or toss the buffer we did not use. */
-       if (flags) {
-               *p = '\0';
-               *nargv++ = flagsp;
-       } else
-               free(flagsp);
-
-       /* Copy remaining arguments. */
-       while ((*nargv++ = *argv++))
-               continue;
-
-       /* Update argument count. */
-       *argcp = nargv - *argvp - 1;
 }

Reply via email to