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.


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