aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/fsdb/fsdb.c8
-rw-r--r--sbin/fsdb/fsdb.h1
-rw-r--r--sbin/fsdb/fsdbutil.c27
3 files changed, 33 insertions, 3 deletions
diff --git a/sbin/fsdb/fsdb.c b/sbin/fsdb/fsdb.c
index 59364cbdee75..3da298ae9435 100644
--- a/sbin/fsdb/fsdb.c
+++ b/sbin/fsdb/fsdb.c
@@ -259,7 +259,11 @@ cmdloop()
else if (cmd_argc >= cmdp->minargc &&
cmd_argc <= cmdp->maxargc)
rval = (*cmdp->handler)(cmd_argc, cmd_argv);
- else
+ else if (cmd_argc >= cmdp->minargc) {
+ strcpy(line, elline);
+ cmd_argv = recrack(line, &cmd_argc, cmdp->maxargc);
+ rval = (*cmdp->handler)(cmd_argc, cmd_argv);
+ } else
rval = argcount(cmdp, cmd_argc, cmd_argv);
known = 1;
break;
@@ -494,7 +498,7 @@ CMDFUNCSTART(rm)
printf("Name `%s' removed\n", argv[1]);
return 0;
} else {
- printf("could not remove name? weird.\n");
+ printf("could not remove name ('%s')? weird.\n", argv[1]);
return 1;
}
}
diff --git a/sbin/fsdb/fsdb.h b/sbin/fsdb/fsdb.h
index a7fd5c41d31d..d884f17da255 100644
--- a/sbin/fsdb/fsdb.h
+++ b/sbin/fsdb/fsdb.h
@@ -55,6 +55,7 @@ extern ino_t curinum;
int argcount __P((struct cmdtable *cmdp, int argc, char *argv[]));
char **crack __P((char *line, int *argc));
+char **recrack __P((char *line, int *argc, int argc_max));
void printstat __P((const char *cp, ino_t inum, struct dinode *dp));
int printactive __P((void));
int checkactive __P((void));
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);