Index: usr.sbin/binmiscctl/binmiscctl.c =================================================================== --- usr.sbin/binmiscctl/binmiscctl.c +++ usr.sbin/binmiscctl/binmiscctl.c @@ -49,6 +49,7 @@ CMD_ENABLE, CMD_LOOKUP, CMD_LIST, + CMD_SHORT_ADD, }; extern char *__progname; @@ -58,6 +59,7 @@ int add_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); int name_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); int noname_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); +int short_add_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); static const struct { const int token; @@ -111,6 +113,15 @@ "List all the binary image activators", "" }, + { + CMD_SHORT_ADD, + "short", + short_add_cmd, + "Short hand for adding TARGET_ARCH (requires 'root' privilege)", + "--target_arch \n" + "\t\tTARGET_ARCH values:\tarmv6, mips, mips64,\n" + "\t\t\t\t\tpowerpc, powerpc64, sparc64" + }, }; static const struct option @@ -224,7 +235,7 @@ } static int -demux_cmd(__unused int argc, char *const argv[]) +demux_cmd(int argc, char *const argv[]) { size_t i; @@ -233,6 +244,18 @@ for(i = 0; i < ( sizeof (cmds) / sizeof (cmds[0])); i++) { if (!strcasecmp(cmds[i].name, argv[0])) { + if (i == CMD_SHORT_ADD) { + if (argc < 2) { + usage("SHORT requires an architecture argument\n"); + i = -1; + } else { + /* check for valid shorthand arch */ + char *arch = argv[1]; + printf("short hand command detected, setting up argv[1] %s\n", + argv[1]); + i = short_add_cmd(argc, &arch, NULL); + } + } return (i); } } @@ -370,6 +393,60 @@ return (0); } +/* + * Unlike other cmd functions, this one is called directly from demux_cmd to setup + * a fake add_cmd() call. + */ +int +short_add_cmd(__unused int argc, char *argv[], __unused ximgact_binmisc_entry_t *xbe) +{ + __unused char *fake_argv[10]; + __unused int fake_argc[10]; + int i; +#define NUM_SHORTCUTS 6 + __unused const char *supported_target_arch[NUM_SHORTCUTS] = + { + "armv6", + "mips", + "mips64", + "powerpc", + "powerpc64", + "sparc64", + }; + /* + * compare target_arch to our list of + * known short cuts, setup commands and + * execute add_cmd. + * + * Currently known configurations: + * armv6, mips, mips64, powerpc, powerpc64, sparc64 + */ + for (i = 0; i < NUM_SHORTCUTS; i++) + if (!strcmp(supported_target_arch[i], argv[0])) { + printf("Found %s\n", argv[0]); + return(-1); + } + if (i == NUM_SHORTCUTS){ + printf("Unknown shortcut found\n"); + usage("'%s' Unknown shortcut [%s]", argv[1]); + return (-1); + } + /* set name */ + //strlcpy(argv[1], fake_argv[0], IBE_NAME_MAX); + /* set --interpreter */ + //strlcpy(], fake_argv[0], IBE_NAME_MAX); + + /* set --magic */ + /* set --mask */ + /* set --size */ +/* This return ends up changing the cmd issued. + I decided to have this command return CMD_ADD + after it is complete setting up the short hand + for the architecture +*/ + return -1; +} + int name_cmd(__unused int argc, char *argv[], ximgact_binmisc_entry_t *xbe) { @@ -434,6 +511,7 @@ xbe_out_szp = &xbe_out_sz; } + return 0; error = sysctlbyname(cmd_sysctl_name[cmd], xbe_outp, xbe_out_szp, xbe_inp, xbe_in_sz);