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