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 |