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");