On Sat, 11 May 2019 11:18:02 -0400
"Ted Unangst" <[email protected]> wrote:

> This adds a new option to config, -c cmdfile, that allows reading commands
> from a file instead of stdin. This makes it easier to script.

Interesting. Can the cmdfile be /bsd ?
So something like config -u but without the need of /dev/mem ?


> Index: config.8
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/config/config.8,v
> retrieving revision 1.66
> diff -u -p -r1.66 config.8
> --- config.8  25 Apr 2018 12:01:11 -0000      1.66
> +++ config.8  11 May 2019 15:16:45 -0000
> @@ -43,6 +43,7 @@
>  .Op Fl s Ar srcdir
>  .Op Ar config-file
>  .Nm config
> +.Op Fl c Ar cmdfile
>  .Op Fl u
>  .Op Fl f | o Ar outfile
>  .Fl e
> @@ -103,6 +104,9 @@ directories above the build directory).
>  .Pp
>  For kernel modification, the options are as follows:
>  .Bl -tag -width Ds
> +.It Fl c Ar cmdfile
> +Read commands from the specified file instead of the standard input.
> +Save and quit automatically when the end of file is reached.
>  .It Fl e
>  Allows the modification of kernel device configuration (see
>  .Xr boot_config 8 ) .
> Index: main.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/config/main.c,v
> retrieving revision 1.59
> diff -u -p -r1.59 main.c
> --- main.c    22 Jun 2017 15:57:16 -0000      1.59
> +++ main.c    11 May 2019 15:00:34 -0000
> @@ -82,7 +82,7 @@ usage(void)
>  
>       fprintf(stderr,
>               "usage: %s [-p] [-b builddir] [-s srcdir] [config-file]\n"
> -             "       %s [-u] [-f | -o outfile] -e infile\n",
> +             "       %s [-c cmdfile] [-u] [-f | -o outfile] -e infile\n",
>               __progname, __progname);
>  
>       exit(1);
> @@ -92,6 +92,7 @@ int pflag = 0;
>  char *sflag = NULL;
>  char *bflag = NULL;
>  char *startdir;
> +char *cmdfile;
>  
>  int
>  main(int argc, char *argv[])
> @@ -105,9 +106,11 @@ main(int argc, char *argv[])
>               err(1, "pledge");
>  
>       pflag = eflag = uflag = fflag = 0;
> -     while ((ch = getopt(argc, argv, "epfb:s:o:u")) != -1) {
> +     while ((ch = getopt(argc, argv, "c:epfb:s:o:u")) != -1) {
>               switch (ch) {
> -
> +             case 'c':
> +                     cmdfile = optarg;
> +                     break;
>               case 'o':
>                       outfile = optarg;
>                       break;
> Index: misc.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/config/misc.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 misc.c
> --- misc.c    2 Oct 2011 22:20:49 -0000       1.9
> +++ misc.c    11 May 2019 15:08:56 -0000
> @@ -38,13 +38,10 @@
>  extern int verbose;
>  
>  int
> -ask_cmd(cmd_t *cmd)
> +parse_cmd(cmd_t *cmd, char *lbuf)
>  {
> -     char lbuf[100], *cp, *buf;
> +     char *cp, *buf;
>  
> -     /* Get input */
> -     if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
> -             errx(1, "eof");
>       lbuf[strcspn(lbuf, "\n")] = '\0';
>       if (verbose)
>               printf("%s\n", lbuf);
> @@ -59,6 +56,17 @@ ask_cmd(cmd_t *cmd)
>       strlcpy(cmd->args, buf, sizeof cmd->args);
>  
>       return (0);
> +}
> +
> +int
> +ask_cmd(cmd_t *cmd)
> +{
> +     char lbuf[100];
> +
> +     /* Get input */
> +     if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
> +             errx(1, "eof");
> +     return parse_cmd(cmd, lbuf);
>  }
>  
>  int
> Index: misc.h
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/config/misc.h,v
> retrieving revision 1.4
> diff -u -p -r1.4 misc.h
> --- misc.h    3 Jun 2003 00:52:35 -0000       1.4
> +++ misc.h    11 May 2019 15:10:04 -0000
> @@ -33,6 +33,7 @@
>  
>  /* Prototypes */
>  int ask_cmd(cmd_t *);
> +int parse_cmd(cmd_t *, char *);
>  int ask_yn(const char *);
>  
>  #endif /* _MISC_H */
> Index: ukcutil.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/config/ukcutil.c,v
> retrieving revision 1.23
> diff -u -p -r1.23 ukcutil.c
> --- ukcutil.c 27 Sep 2017 15:14:52 -0000      1.23
> +++ ukcutil.c 11 May 2019 15:14:25 -0000
> @@ -29,6 +29,7 @@
>  #include <sys/device.h>
>  
>  #include <ctype.h>
> +#include <err.h>
>  #include <errno.h>
>  #include <limits.h>
>  #include <nlist.h>
> @@ -1295,13 +1296,61 @@ add_history(int devno, short unit, short
>  }
>  
>  int
> +config_fromfile(const char *cmdfile) {
> +     FILE *fp;
> +     cmd_t cmd;
> +     int i;
> +
> +     fp = fopen(cmdfile, "r");
> +     if (fp == NULL)
> +             err(1, "open %s", cmdfile);
> +
> +     /* Set up command table pointer */
> +     cmd.table = cmd_table;
> +
> +     /* Edit cycle */
> +     do {
> +             char lbuf[100];
> +
> +             /* Get input */
> +             if (fgets(lbuf, sizeof lbuf, fp) == NULL)
> +                     break;
> +             parse_cmd(&cmd, lbuf);
> +
> +             if (cmd.cmd[0] == '\0')
> +                     continue;
> +             for (i = 0; cmd_table[i].cmd != NULL; i++)
> +                     if (strstr(cmd_table[i].cmd, cmd.cmd) ==
> +                         cmd_table[i].cmd)
> +                             break;
> +
> +             /* Check for valid command */
> +             if (cmd_table[i].cmd == NULL) {
> +                     printf("Invalid command '%s'\n", cmd.cmd);
> +                     exit(1);
> +             }
> +             strlcpy(cmd.cmd, cmd_table[i].cmd, sizeof cmd.cmd);
> +
> +             /* Call function */
> +             cmd_table[i].fcn(&cmd);
> +
> +     } while (1);
> +     return 1;
> +}
> +
> +int
>  config(void)
>  {
> +     extern char *cmdfile;
>       cmd_t cmd;
>       int i, st;
>  
>       /* Set up command table pointer */
>       cmd.table = cmd_table;
> +
> +     if (cmdfile != NULL) {
> +             return config_fromfile(cmdfile);
> +     }
>  
>       printf("Enter 'help' for information\n");
>  
> 

Reply via email to