summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Stein <jcs@cvs.openbsd.org>2021-11-20 03:13:38 +0000
committerJoshua Stein <jcs@cvs.openbsd.org>2021-11-20 03:13:38 +0000
commit363a2f7d9e7141898d0af93a8a725c8ed299fc56 (patch)
tree7f09c13de775616f55e61ceafe113e29476ae058
parent26312d90c4fe73bed255cb7b312ade38a5159c79 (diff)
When cmdfile is specified, use lines from it for all input, not just
commands. This allows complex actions like changing device parameters to be done with a command file.
-rw-r--r--usr.sbin/config/config.87
-rw-r--r--usr.sbin/config/main.c10
-rw-r--r--usr.sbin/config/misc.c22
-rw-r--r--usr.sbin/config/ukcutil.c70
4 files changed, 46 insertions, 63 deletions
diff --git a/usr.sbin/config/config.8 b/usr.sbin/config/config.8
index ab48c1314ed..d098faa3242 100644
--- a/usr.sbin/config/config.8
+++ b/usr.sbin/config/config.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: config.8,v 1.74 2021/11/02 22:26:46 kn Exp $
+.\" $OpenBSD: config.8,v 1.75 2021/11/20 03:13:37 jcs Exp $
.\" $NetBSD: config.8,v 1.10 1996/08/31 20:58:16 mycroft Exp $
.\"
.\" Copyright (c) 1980, 1991, 1993
@@ -30,7 +30,7 @@
.\"
.\" from: @(#)config.8 8.2 (Berkeley) 4/19/94
.\"
-.Dd $Mdocdate: November 2 2021 $
+.Dd $Mdocdate: November 20 2021 $
.Dt CONFIG 8
.Os
.Sh NAME
@@ -110,7 +110,8 @@ directories above the build directory).
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.
+Read commands and answers 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
diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c
index d00bfded2b0..cde1006efbe 100644
--- a/usr.sbin/config/main.c
+++ b/usr.sbin/config/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.62 2021/01/26 18:23:49 deraadt Exp $ */
+/* $OpenBSD: main.c,v 1.63 2021/11/20 03:13:37 jcs Exp $ */
/* $NetBSD: main.c,v 1.22 1997/02/02 21:12:33 thorpej Exp $ */
/*
@@ -131,7 +131,8 @@ int pflag = 0;
char *sflag = NULL;
char *bflag = NULL;
char *startdir;
-char *cmdfile;
+char *cmdfile = NULL;
+FILE *cmdfp = NULL;
int
main(int argc, char *argv[])
@@ -211,6 +212,11 @@ main(int argc, char *argv[])
#ifdef MAKE_BOOTSTRAP
errx(1, "UKC not available in this binary");
#else
+ if (cmdfile != NULL) {
+ cmdfp = fopen(cmdfile, "r");
+ if (cmdfp == NULL)
+ err(1, "open %s", cmdfile);
+ }
return (ukc(argv[0], outfile, uflag, fflag));
#endif
}
diff --git a/usr.sbin/config/misc.c b/usr.sbin/config/misc.c
index d309300057d..840662e03e3 100644
--- a/usr.sbin/config/misc.c
+++ b/usr.sbin/config/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.10 2019/05/14 13:44:25 tedu Exp $ */
+/* $OpenBSD: misc.c,v 1.11 2021/11/20 03:13:37 jcs Exp $ */
/*
* Copyright (c) 1997 Tobias Weingartner
@@ -62,32 +62,42 @@ int
ask_cmd(cmd_t *cmd)
{
char lbuf[100];
+ extern FILE *cmdfp;
/* Get input */
- if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
+ if (fgets(lbuf, sizeof lbuf, cmdfp ? cmdfp : stdin) == NULL) {
+ if (cmdfp) {
+ cmd->cmd[0] = '\0';
+ return -1;
+ }
errx(1, "eof");
+ }
+ if (cmdfp)
+ printf("%s", lbuf);
return parse_cmd(cmd, lbuf);
}
int
ask_yn(const char *str)
{
+ extern FILE *cmdfp;
int ch, first;
printf("%s [n] ", str);
fflush(stdout);
- first = ch = getchar();
- if (verbose) {
+ first = ch = getc(cmdfp ? cmdfp : stdin);
+ if (verbose || (cmdfp && ch != EOF)) {
printf("%c", ch);
fflush(stdout);
}
while (ch != '\n' && ch != EOF) {
- ch = getchar();
+ ch = getc(cmdfp ? cmdfp : stdin);
if (verbose) {
printf("%c\n", ch);
fflush(stdout);
- }
+ } else if (cmdfp)
+ putchar('\n');
}
if (ch == EOF || first == EOF)
errx(1, "eof");
diff --git a/usr.sbin/config/ukcutil.c b/usr.sbin/config/ukcutil.c
index be117c6bd84..90cfb8a784c 100644
--- a/usr.sbin/config/ukcutil.c
+++ b/usr.sbin/config/ukcutil.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ukcutil.c,v 1.25 2019/09/06 21:30:31 cheloha Exp $ */
+/* $OpenBSD: ukcutil.c,v 1.26 2021/11/20 03:13:37 jcs Exp $ */
/*
* Copyright (c) 1999-2001 Mats O Jansson. All rights reserved.
@@ -1295,49 +1295,6 @@ add_history(int devno, short unit, short state, int newno)
}
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;
@@ -1347,21 +1304,26 @@ config(void)
/* Set up command table pointer */
cmd.table = cmd_table;
- if (cmdfile != NULL) {
- return config_fromfile(cmdfile);
- }
-
- printf("Enter 'help' for information\n");
+ if (cmdfile == NULL)
+ printf("Enter 'help' for information\n");
/* Edit cycle */
do {
+ char lbuf[100];
+
again:
- printf("ukc> ");
- fflush(stdout);
+ /* Get input */
+ if (cmdfile == NULL) {
+ printf("ukc> ");
+ fflush(stdout);
+ }
ask_cmd(&cmd);
- if (cmd.cmd[0] == '\0')
+ if (cmd.cmd[0] == '\0') {
+ if (cmdfile != NULL)
+ return 1;
goto again;
+ }
for (i = 0; cmd_table[i].cmd != NULL; i++)
if (strstr(cmd_table[i].cmd, cmd.cmd) ==
cmd_table[i].cmd)
@@ -1373,6 +1335,10 @@ again:
/* Check for valid command */
if (cmd_table[i].cmd == NULL) {
+ if (cmdfile == NULL) {
+ printf("Invalid command '%s'\n", cmd.cmd);
+ exit(1);
+ }
printf("Invalid command '%s'. Try 'help'.\n", cmd.cmd);
continue;
} else