Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/binmiscctl/binmiscctl.c
| Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | |||||
| enum cmd { | enum cmd { | ||||
| CMD_ADD = 0, | CMD_ADD = 0, | ||||
| CMD_REMOVE, | CMD_REMOVE, | ||||
| CMD_DISABLE, | CMD_DISABLE, | ||||
| CMD_ENABLE, | CMD_ENABLE, | ||||
| CMD_LOOKUP, | CMD_LOOKUP, | ||||
| CMD_LIST, | CMD_LIST, | ||||
| CMD_SHORT_ADD, | |||||
| }; | }; | ||||
| extern char *__progname; | extern char *__progname; | ||||
| typedef int (*cmd_func_t)(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); | typedef int (*cmd_func_t)(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); | ||||
| int add_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); | 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 name_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe); | ||||
| int noname_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 { | static const struct { | ||||
| const int token; | const int token; | ||||
| const char *name; | const char *name; | ||||
| cmd_func_t func; | cmd_func_t func; | ||||
| const char *desc; | const char *desc; | ||||
| const char *args; | const char *args; | ||||
| } cmds[] = { | } cmds[] = { | ||||
| Show All 37 Lines | static const struct { | ||||
| }, | }, | ||||
| { | { | ||||
| CMD_LIST, | CMD_LIST, | ||||
| "list", | "list", | ||||
| noname_cmd, | noname_cmd, | ||||
| "List all the binary image activators", | "List all the binary image activators", | ||||
| "" | "" | ||||
| }, | }, | ||||
| { | |||||
| CMD_SHORT_ADD, | |||||
| "short", | |||||
| short_add_cmd, | |||||
| "Short hand for adding TARGET_ARCH (requires 'root' privilege)", | |||||
| "--target_arch <TARGET_ARCH>\n" | |||||
| "\t\tTARGET_ARCH values:\tarmv6, mips, mips64,\n" | |||||
| "\t\t\t\t\tpowerpc, powerpc64, sparc64" | |||||
| }, | |||||
| }; | }; | ||||
| static const struct option | static const struct option | ||||
| add_opts[] = { | add_opts[] = { | ||||
| { "set-enabled", no_argument, NULL, 'e' }, | { "set-enabled", no_argument, NULL, 'e' }, | ||||
| { "interpreter", required_argument, NULL, 'i' }, | { "interpreter", required_argument, NULL, 'i' }, | ||||
| { "mask", required_argument, NULL, 'M' }, | { "mask", required_argument, NULL, 'M' }, | ||||
| { "magic", required_argument, NULL, 'm' }, | { "magic", required_argument, NULL, 'm' }, | ||||
| ▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | if (flags & IBF_USE_MASK) { | ||||
| } | } | ||||
| printf("\n"); | printf("\n"); | ||||
| } | } | ||||
| printf("\n"); | printf("\n"); | ||||
| } | } | ||||
| static int | static int | ||||
| demux_cmd(__unused int argc, char *const argv[]) | demux_cmd(int argc, char *const argv[]) | ||||
| { | { | ||||
| size_t i; | size_t i; | ||||
| optind = 1; | optind = 1; | ||||
| optreset = 1; | optreset = 1; | ||||
| for(i = 0; i < ( sizeof (cmds) / sizeof (cmds[0])); i++) { | for(i = 0; i < ( sizeof (cmds) / sizeof (cmds[0])); i++) { | ||||
| if (!strcasecmp(cmds[i].name, argv[0])) { | 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); | return (i); | ||||
| } | } | ||||
| } | } | ||||
| /* Unknown command */ | /* Unknown command */ | ||||
| return (-1); | return (-1); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | add_cmd(__unused int argc, char *argv[], ximgact_binmisc_entry_t *xbe) | ||||
| if (!xbe->xbe_interpreter) { | if (!xbe->xbe_interpreter) { | ||||
| usage("Error: Missing 'interpreter' argument"); | usage("Error: Missing 'interpreter' argument"); | ||||
| } | } | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| /* | |||||
| * Unlike other cmd functions, this one is called directly from demux_cmd to setup | |||||
| * a fake add_cmd() call. | |||||
| */ | |||||
| int | 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) | name_cmd(__unused int argc, char *argv[], ximgact_binmisc_entry_t *xbe) | ||||
| { | { | ||||
| if (strlen(argv[0]) > IBE_NAME_MAX) | if (strlen(argv[0]) > IBE_NAME_MAX) | ||||
| usage("'%s' string length longer than IBE_NAME_MAX (%d)", | usage("'%s' string length longer than IBE_NAME_MAX (%d)", | ||||
| IBE_NAME_MAX); | IBE_NAME_MAX); | ||||
| strlcpy(&xbe->xbe_name[0], argv[0], IBE_NAME_MAX); | strlcpy(&xbe->xbe_name[0], argv[0], IBE_NAME_MAX); | ||||
| return (0); | return (0); | ||||
| ▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | main(int argc, char **argv) | ||||
| } else | } else | ||||
| xbe_out_szp = &xbe_out_sz; | xbe_out_szp = &xbe_out_sz; | ||||
| if (cmd == CMD_LOOKUP) { | if (cmd == CMD_LOOKUP) { | ||||
| xbe_out_sz = sizeof(xbe_out); | xbe_out_sz = sizeof(xbe_out); | ||||
| xbe_outp = &xbe_out; | xbe_outp = &xbe_out; | ||||
| xbe_out_szp = &xbe_out_sz; | xbe_out_szp = &xbe_out_sz; | ||||
| } | } | ||||
| return 0; | |||||
| error = sysctlbyname(cmd_sysctl_name[cmd], xbe_outp, xbe_out_szp, | error = sysctlbyname(cmd_sysctl_name[cmd], xbe_outp, xbe_out_szp, | ||||
| xbe_inp, xbe_in_sz); | xbe_inp, xbe_in_sz); | ||||
| if (error) | if (error) | ||||
| switch(errno) { | switch(errno) { | ||||
| case EINVAL: | case EINVAL: | ||||
| usage("Invalid interpreter name or --interpreter, " | usage("Invalid interpreter name or --interpreter, " | ||||
| "--magic, --mask, or --size argument value"); | "--magic, --mask, or --size argument value"); | ||||
| ▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines | |||||