On Jun 02 07:16:52, dera...@openbsd.org wrote:
> Your diff completely breaks a majority of the ways people use it.

Does that mean people mostly use
the undocumented obsolete syntax
that obsolete() keeps supported?


> Jan Stary <h...@stare.cz> wrote:
> 
> > # 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