Index: sbin/dkctl/dkctl.c =================================================================== RCS file: /cvsroot/src/sbin/dkctl/dkctl.c,v retrieving revision 1.16 diff -u -r1.16 dkctl.c --- sbin/dkctl/dkctl.c 17 Jun 2006 02:16:19 -0000 1.16 +++ sbin/dkctl/dkctl.c 5 Dec 2007 03:51:35 -0000 @@ -78,13 +78,15 @@ int open_flags; }; +struct command *lookup(const char *); void usage(void); +void run(int, char *[]); +void showall(void); int fd; /* file descriptor for device */ const char *dvname; /* device name */ char dvname_store[MAXPATHLEN]; /* for opendisk(3) */ const char *cmdname; /* command user issued */ -const char *argnames; /* helpstring; expected arguments */ int yesno(const char *); @@ -100,6 +102,10 @@ void disk_listwedges(int, char *[]); void disk_strategy(int, char *[]); +void disk_foreachwedges(int, char *[], void (*)(struct dkwedge_list *)); +void disk_listwedges_cb(struct dkwedge_list *); +void disk_getwedgeinfo_cb(struct dkwedge_info *); + struct command commands[] = { { "getcache", "", @@ -160,37 +166,58 @@ int main(int argc, char *argv[]) { - int i; /* Must have at least: device command */ - if (argc < 3) + if (argc < 2) usage(); - /* Skip program name, get and skip device name and command. */ dvname = argv[1]; - cmdname = argv[2]; - argv += 3; - argc -= 3; + if (argc == 2) + showall(); + else { + /* Skip program name, get and skip device name and command. */ + cmdname = argv[2]; + argv += 3; + argc -= 3; + run(argc, argv); + } - /* Look up and call the command. */ - for (i = 0; commands[i].cmd_name != NULL; i++) - if (strcmp(cmdname, commands[i].cmd_name) == 0) - break; - if (commands[i].cmd_name == NULL) - errx(1, "unknown command: %s", cmdname); + exit(0); +} + +void +run(int argc, char *argv[]) +{ + struct command *command; - argnames = commands[i].arg_names; + command = lookup(cmdname); /* Open the device. */ - fd = opendisk(dvname, commands[i].open_flags, dvname_store, + fd = opendisk(dvname, command->open_flags, dvname_store, sizeof(dvname_store), 0); if (fd == -1) err(1, "%s", dvname); - dvname = dvname_store; - (*commands[i].cmd_func)(argc, argv); - exit(0); + (*command->cmd_func)(argc, argv); + + /* Close the device. */ + (void)close(fd); +} + +struct command * +lookup(const char *name) +{ + int i; + + /* Look up and call the command. */ + for (i = 0; commands[i].cmd_name != NULL; i++) + if (strcmp(name, commands[i].cmd_name) == 0) + break; + if (commands[i].cmd_name == NULL) + errx(1, "unknown command: %s", name); + + return &commands[i]; } void @@ -210,6 +237,26 @@ } void +showall(void) +{ + printf("strategy:\n"); + cmdname = "strategy"; + run(0, NULL); + + putchar('\n'); + + printf("cache:\n"); + cmdname = "getcache"; + run(0, NULL); + + putchar('\n'); + + printf("wedges:\n"); + cmdname = "listwedges"; + run(0, NULL); +} + +void disk_strategy(int argc, char *argv[]) { struct disk_strategy odks;