From 8660ce229c04f3553fbeaa4ea10dfe9bf384ad93 Mon Sep 17 00:00:00 2001 From: Brian Feldman Date: Fri, 25 Jan 2002 18:31:57 +0000 Subject: Allow fsdb the ability to work with entries named with whitespace embedded. This works by retokenizing a line with a split limit so that if the argument count for a command is greater than the number of arguments formed by splitting apart the line of user input, the last argument is instead all of the remainder of the input line. Yes, I needed this capability at one point to fix a filesystem manually, which happened to break with a problematic space-containing directory entry. --- sbin/fsdb/fsdbutil.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'sbin/fsdb/fsdbutil.c') diff --git a/sbin/fsdb/fsdbutil.c b/sbin/fsdb/fsdbutil.c index 3fbc8aa17f5d..ee85a3fe01bb 100644 --- a/sbin/fsdb/fsdbutil.c +++ b/sbin/fsdb/fsdbutil.c @@ -67,6 +67,30 @@ crack(line, argc) return argv; } +char ** +recrack(line, argc, argc_max) + char *line; + int *argc; + int argc_max; +{ + static char *argv[8]; + int i; + char *p, *val; + for (p = line, i = 0; p != NULL && i < 8 && i < argc_max - 1; i++) { + while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') + /**/; + if (val) + argv[i] = val; + else + break; + } + argv[i] = argv[i - 1] + strlen(argv[i - 1]) + 1; + argv[i][strcspn(argv[i], "\n")] = '\0'; + *argc = i + 1; + printf("returning with argc %u\n", *argc); + return argv; +} + int argcount(cmdp, argc, argv) struct cmdtable *cmdp; @@ -74,7 +98,8 @@ argcount(cmdp, argc, argv) char *argv[]; { if (cmdp->minargc == cmdp->maxargc) - warnx("command `%s' takes %u arguments", cmdp->cmd, cmdp->minargc-1); + warnx("command `%s' takes %u arguments, got %u", cmdp->cmd, + cmdp->minargc-1, argc); else warnx("command `%s' takes from %u to %u arguments", cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); -- cgit v1.2.3