aboutsummaryrefslogtreecommitdiff
path: root/sbin/fsdb
diff options
context:
space:
mode:
authorBrian Feldman <green@FreeBSD.org>2002-01-25 18:31:57 +0000
committerBrian Feldman <green@FreeBSD.org>2002-01-25 18:31:57 +0000
commit8660ce229c04f3553fbeaa4ea10dfe9bf384ad93 (patch)
tree61ddf6b7f196d256a0f261988215c65286cb9238 /sbin/fsdb
parentcdd27ea438327769dfe61931b45b8bc2c4ccad54 (diff)
downloadsrc-8660ce229c04f3553fbeaa4ea10dfe9bf384ad93.tar.gz
src-8660ce229c04f3553fbeaa4ea10dfe9bf384ad93.zip
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.
Notes
Notes: svn path=/head/; revision=89791
Diffstat (limited to 'sbin/fsdb')
-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);