#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <strings.h>
#include <elfedit.h>
#include "_elfedit.h"
#include "msg.h"
static const char *
mod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
{
Msg msg = (Msg)hdl;
return (MSG_INTL(msg));
}
typedef enum {
SYS_OPT_F_ALL = 1,
SYS_OPT_F_FORCE = 2,
SYS_OPT_F_SYNOPSIS = 4,
} dyn_opt_t;
static void
get_obj_state_info(void *obj_state, const char **file, int *fd, Elf **elf)
{
if (state.elf.elfclass == ELFCLASS32) {
elfedit32_obj_state_t *s = (elfedit32_obj_state_t *)obj_state;
*file = s->os_file;
*fd = s->os_fd;
*elf = s->os_elf;
} else {
elfedit64_obj_state_t *s = (elfedit64_obj_state_t *)obj_state;
*file = s->os_file;
*fd = s->os_fd;
*elf = s->os_elf;
}
}
static void
cmd_help_synopsis(elfeditGC_module_t *mod, elfeditGC_cmd_t *cmd)
{
char name_buf[128];
const char *name;
const char **cmd_name;
if (cmd->cmd_name[1] == NULL) {
name = *cmd->cmd_name;
} else {
const char *cname;
int need_comma = 0;
name = name_buf;
(void) snprintf(name_buf, sizeof (name_buf),
MSG_ORIG(MSG_HLPFMT_MULTNAM), cmd->cmd_name[0]);
for (cmd_name = cmd->cmd_name + 1;
*cmd_name; cmd_name++) {
if (need_comma)
(void) strlcat(name_buf,
MSG_ORIG(MSG_STR_COMMA_SP),
sizeof (name_buf));
need_comma = 1;
cname = (cmd_name[0][0] == '\0') ?
MSG_INTL(MSG_HLPFMT_MODDEFCMD) : *cmd_name;
(void) strlcat(name_buf, cname,
sizeof (name_buf));
}
(void) strlcat(name_buf, MSG_ORIG(MSG_STR_CPAREN),
sizeof (name_buf));
}
elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMSUMHDR), name,
(* mod->mod_i18nhdl_to_str)(cmd->cmd_desc));
elfedit_printf(MSG_INTL(MSG_HLPFMT_SUMSYNOPSIS),
elfedit_format_command_usage(mod, cmd,
MSG_ORIG(MSG_STR_HLPSUMINDENT),
strlen(MSG_ORIG(MSG_STR_HLPSUMINDENT))));
}
static void
cmd_help_showmod(elfeditGC_module_t *mod)
{
elfeditGC_cmd_t *cmd;
elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMDSCHDR),
mod->mod_name, (* mod->mod_i18nhdl_to_str)(mod->mod_desc));
for (cmd = mod->mod_cmds; cmd->cmd_func != NULL; cmd++) {
if (cmd != mod->mod_cmds)
elfedit_printf(MSG_ORIG(MSG_STR_NL));
elfedit_printf(MSG_ORIG(MSG_STR_NL));
cmd_help_synopsis(mod, cmd);
}
}
static void
write_help_str(const char *str, const char *prefix)
{
size_t i;
if (str == NULL)
return;
while (*str) {
i = strcspn(str, MSG_ORIG(MSG_STR_NL));
if (*(str + i) != '\0')
i++;
elfedit_printf(prefix);
elfedit_write(str, i);
str += i;
}
}
static void
write_optarg(elfeditGC_module_t *mod, const char *title,
elfedit_cmd_optarg_t *optarg)
{
int cnt;
int len;
const char *help;
elfedit_optarg_item_t item;
elfedit_printf(title);
for (cnt = 0; optarg->oa_name != NULL; cnt++) {
elfedit_next_optarg(&optarg, &item);
if (cnt > 0)
elfedit_printf(MSG_ORIG(MSG_STR_NL));
elfedit_printf(MSG_ORIG(MSG_STR_HLPINDENT));
len = strlen(item.oai_name);
help = elfedit_optarg_helpstr(mod, &item);
if (item.oai_flags & ELFEDIT_CMDOA_F_VALUE) {
len += 1 + strlen(item.oai_vname);
elfedit_printf(MSG_ORIG(MSG_STR_HLPOPTARG2),
item.oai_name, item.oai_vname);
} else {
elfedit_printf(MSG_ORIG(MSG_STR_HLPOPTARG),
item.oai_name);
}
if (len > 3)
elfedit_printf(MSG_ORIG(MSG_STR_NL));
write_help_str(help, MSG_ORIG(MSG_STR_TAB));
}
}
static elfedit_cmdret_t
cmd_help(void *obj_state, int argc, const char *argv[])
{
#define INITIAL_ITEM_ALLOC 4
typedef struct {
elfeditGC_cmd_t *cmd;
elfeditGC_module_t *cmd_mod;
elfeditGC_module_t *mod;
} ITEM;
static ITEM *item;
static int item_cnt;
MODLIST_T *modlist;
int dispcnt;
size_t i;
elfeditGC_module_t *mod;
elfeditGC_cmd_t *cmd;
int minus_s = 0;
elfedit_getopt_state_t getopt_state;
ITEM *cur_item;
elfedit_getopt_init(&getopt_state, &argc, &argv);
while (elfedit_getopt(&getopt_state) != NULL)
minus_s = 1;
elfedit_pager_init();
if (argc == 0) {
if (minus_s) {
elfedit_load_modpath();
for (modlist = state.modlist; modlist;
modlist = modlist->ml_next) {
cmd_help_showmod(modlist->ml_mod);
if (modlist->ml_next != NULL) {
elfedit_printf(MSG_ORIG(MSG_STR_NL));
elfedit_printf(MSG_ORIG(MSG_STR_NL));
}
}
return (ELFEDIT_CMDRET_NONE);
}
elfedit_printf(MSG_INTL(MSG_SYS_HELP_HELP_NOARG));
return (ELFEDIT_CMDRET_NONE);
}
if (argc > item_cnt) {
int n = (item_cnt == 0) ? INITIAL_ITEM_ALLOC : item_cnt;
while (n < argc)
n *= 2;
item = elfedit_realloc(MSG_INTL(MSG_ALLOC_HELPITEM), item,
n * sizeof (*item));
item_cnt = n;
}
dispcnt = 0;
for (i = 0; i < argc; i++) {
const char *colon = strchr(argv[i], ':');
if (colon == NULL) {
item[i].cmd =
elfedit_find_command(argv[i], 0, &item[i].cmd_mod);
if (item[i].cmd != NULL)
dispcnt++;
item[i].mod = elfedit_load_module(argv[i],
item[i].cmd == NULL, 0);
if (item[i].mod != NULL)
dispcnt++;
} else if (*(colon + 1) == '\0') {
char buf[ELFEDIT_MAXMODNAM + 1];
const char *str = argv[i];
int len = colon - str;
item[i].cmd = NULL;
if (len < sizeof (buf)) {
(void) strncpy(buf, str, len);
buf[len] = '\0';
str = buf;
}
item[i].mod = elfedit_load_module(str, 1, 0);
dispcnt++;
} else {
item[i].cmd =
elfedit_find_command(argv[i], 1, &item[i].cmd_mod);
dispcnt++;
item[i].mod = NULL;
}
}
for (cur_item = item; argc--; argv++, cur_item++) {
if (cur_item->mod != NULL) {
if (dispcnt > 1)
elfedit_printf(MSG_ORIG(MSG_HLPFMT_MULTIHDR),
*argv);
cmd_help_showmod(cur_item->mod);
if ((dispcnt > 1) && (argc > 0))
elfedit_printf(MSG_INTL(MSG_HLPFMT_MULTIEND),
argv[0], argv[1]);
elfedit_printf(MSG_ORIG(MSG_STR_NL));
}
if (cur_item->cmd == NULL)
continue;
cmd = cur_item->cmd;
mod = cur_item->cmd_mod;
if (dispcnt > 1)
elfedit_printf(MSG_ORIG(MSG_HLPFMT_MULTIHDR), *argv);
if (minus_s) {
cmd_help_synopsis(mod, cmd);
continue;
}
elfedit_printf(MSG_INTL(MSG_HLPFMT_MOD), mod->mod_name,
(* mod->mod_i18nhdl_to_str)(mod->mod_desc));
elfedit_printf(MSG_INTL(MSG_HLPFMT_NAME),
*cmd->cmd_name,
(* mod->mod_i18nhdl_to_str)(cmd->cmd_desc));
elfedit_printf(MSG_INTL(MSG_HLPFMT_SYNOPSIS),
elfedit_format_command_usage(mod, cmd,
MSG_ORIG(MSG_STR_HLPUSEINDENT),
strlen(MSG_ORIG(MSG_STR_HLPINDENT))));
if (cmd->cmd_name[1] != NULL) {
const char **alias = cmd->cmd_name + 1;
elfedit_printf(MSG_INTL(MSG_HLPFMT_ALIASES));
do {
elfedit_printf(
MSG_ORIG(MSG_STR_HLPINDENT));
elfedit_printf(
MSG_ORIG(MSG_FMT_MODCMD),
mod->mod_name, *alias);
if (**alias == '\0')
elfedit_printf(
MSG_INTL(MSG_HLPFMT_DEFCMD));
elfedit_printf(MSG_ORIG(MSG_STR_NL));
alias++;
} while (*alias);
}
elfedit_printf(MSG_INTL(MSG_HLPFMT_DESC));
write_help_str(
(* mod->mod_i18nhdl_to_str)(cmd->cmd_help),
MSG_ORIG(MSG_STR_HLPINDENT));
if (cmd->cmd_args != NULL)
write_optarg(mod, MSG_INTL(MSG_HLPFMT_ARGS),
cmd->cmd_args);
if (cmd->cmd_opt != NULL)
write_optarg(mod, MSG_INTL(MSG_HLPFMT_OPT),
cmd->cmd_opt);
if ((dispcnt > 1) && (argc > 0))
elfedit_printf(MSG_INTL(MSG_HLPFMT_MULTIEND),
argv[0], argv[1]);
elfedit_printf(MSG_ORIG(MSG_STR_NL));
}
return (ELFEDIT_CMDRET_NONE);
#undef INITIAL_ITEM_ALLOC
}
static void
cpl_help(void *obj_state, void *cpldata, int argc, const char *argv[],
int num_opt)
{
elfedit_cpl_command(cpldata);
}
static elfedit_cmdret_t
cmd_load(void *obj_state, int argc, const char *argv[])
{
elfedit_getopt_state_t getopt_state;
elfedit_getopt_ret_t *getopt_ret;
struct stat statbuf;
elfedit_getopt_init(&getopt_state, &argc, &argv);
while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
switch (getopt_ret->gor_idmask) {
case SYS_OPT_F_ALL:
elfedit_load_modpath();
break;
}
}
for (; argc-- > 0; argv++) {
if ((stat(*argv, &statbuf) == 0) &&
(statbuf.st_mode & S_IFDIR)) {
elfedit_load_moddir(*argv, 1, 1);
} else {
(void) elfedit_load_module(*argv, 1, 1);
}
}
return (0);
}
static void
cpl_load(void *obj_state, void *cpldata, int argc, const char *argv[],
int num_opt)
{
elfedit_cpl_module(cpldata, 1);
}
static elfedit_cmdret_t
cmd_quit(void *obj_state, int argc, const char *argv[])
{
elfedit_getopt_state_t getopt_state;
elfedit_getopt_ret_t *getopt_ret;
int force = 0;
const char *file;
int fd;
Elf *elf;
elfedit_getopt_init(&getopt_state, &argc, &argv);
while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
switch (getopt_ret->gor_idmask) {
case SYS_OPT_F_FORCE:
force = 1;
break;
}
}
if (argc != 0)
elfedit_command_usage();
if (state.file.present) {
if (!(state.flags & ELFEDIT_F_READONLY) && state.file.dirty &&
!force)
elfedit_msg(ELFEDIT_MSG_ERR,
MSG_INTL(MSG_ERR_NODIRTYQUIT));
get_obj_state_info(obj_state, &file, &fd, &elf);
(void) close(fd);
(void) elf_end(elf);
free(obj_state);
}
elfedit_exit(0);
return (0);
}
static elfedit_cmdret_t
cmd_status(void *obj_state, int argc, const char *argv[])
{
MODLIST_T *modlist;
const char *s;
size_t i;
if (argc > 0)
elfedit_command_usage();
elfedit_pager_init();
if (state.file.present == 0) {
elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILENONE));
} else if (state.flags & ELFEDIT_F_READONLY) {
elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILERO),
state.file.infile);
} else {
elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILE), state.file.infile);
elfedit_printf(MSG_INTL(MSG_HLPFMT_OUTFILE),
state.file.outfile);
}
if (state.file.dirty)
elfedit_printf(MSG_INTL(MSG_HLPFMT_CNGPENDING));
elfedit_printf(MSG_INTL(MSG_HLPFMT_VARHDR));
elfedit_printf(MSG_INTL(MSG_HLPFMT_AFLG),
(state.flags & ELFEDIT_F_AUTOPRINT) ? MSG_ORIG(MSG_STR_ON) :
MSG_ORIG(MSG_STR_OFF));
elfedit_printf(MSG_INTL(MSG_HLPFMT_DFLG),
(state.flags & ELFEDIT_F_DEBUG) ? MSG_ORIG(MSG_STR_ON) :
MSG_ORIG(MSG_STR_OFF));
elfedit_printf(MSG_INTL(MSG_HLPFMT_OFLG),
elfedit_atoconst_value_to_str(ELFEDIT_CONST_OUTSTYLE,
state.outstyle, 1));
elfedit_printf(MSG_INTL(MSG_HLPFMT_PATHHDR));
for (i = 0; i < state.modpath.n; i++)
elfedit_printf(MSG_ORIG(MSG_HLPFMT_PATHELT),
state.modpath.seg[i]);
elfedit_printf(MSG_INTL(MSG_HLPFMT_MODHDR));
for (modlist = state.modlist; modlist;
modlist = modlist->ml_next) {
s = modlist->ml_path ? modlist->ml_path :
MSG_INTL(MSG_FMT_BUILTIN);
elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMDSCCOL),
modlist->ml_mod->mod_name, s);
}
return (ELFEDIT_CMDRET_NONE);
}
static elfedit_cmdret_t
cmd_set(void *obj_state, int argc, const char *argv[])
{
if ((argc != 2) || (strlen(argv[0]) > 1))
elfedit_command_usage();
switch (**argv) {
case 'a':
case 'A':
if (elfedit_atobool(argv[1], MSG_INTL(MSG_SYSSET_A)))
state.flags |= ELFEDIT_F_AUTOPRINT;
else
state.flags &= ~ELFEDIT_F_AUTOPRINT;
break;
case 'd':
case 'D':
if (elfedit_atobool(argv[1], MSG_INTL(MSG_SYSSET_D)))
state.flags |= ELFEDIT_F_DEBUG;
else
state.flags &= ~ELFEDIT_F_DEBUG;
break;
case 'o':
case 'O':
if (elfedit_atooutstyle(argv[1], &state.outstyle) == 0)
elfedit_msg(ELFEDIT_MSG_ERR,
MSG_INTL(MSG_ERR_BADOSTYLE), argv[1]);
break;
default:
elfedit_command_usage();
}
return (0);
}
static void
cpl_set(void *obj_state, void *cpldata, int argc, const char *argv[],
int num_opt)
{
const char *s;
argc -= num_opt;
argv += num_opt;
if ((argc < 1) || (argc > 2))
return;
if (argc == 1) {
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_A), 1);
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_D), 1);
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_O), 1);
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_W), 1);
return;
}
s = argv[0];
if (strlen(s) > 1)
return;
switch (*s) {
case 'a':
case 'A':
case 'd':
case 'D':
case 'w':
case 'W':
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_BOOL);
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_0), 1);
elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_1), 1);
break;
case 'o':
case 'O':
elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_OUTSTYLE);
break;
}
}
static elfedit_cmdret_t
cmd_unload(void *obj_state, int argc, const char *argv[])
{
elfedit_getopt_state_t getopt_state;
elfedit_getopt_ret_t *getopt_ret;
MODLIST_T *moddef;
int do_all = 0;
elfedit_getopt_init(&getopt_state, &argc, &argv);
while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
switch (getopt_ret->gor_idmask) {
case SYS_OPT_F_ALL:
do_all = 1;
break;
}
}
if (do_all) {
if (argc > 0)
elfedit_command_usage();
while (state.modlist != NULL) {
for (moddef = state.modlist; moddef != NULL;
moddef = moddef->ml_next)
if (moddef->ml_dl_hdl != NULL) break;
if (moddef == NULL)
break;
elfedit_unload_module(moddef->ml_mod->mod_name);
}
return (0);
}
for (; argc-- > 0; argv++)
elfedit_unload_module(*argv);
return (0);
}
static void
cpl_unload(void *obj_state, void *cpldata, int argc, const char *argv[],
int num_opt)
{
elfedit_cpl_module(cpldata, 0);
}
static elfedit_cmdret_t
cmd_write(void *obj_state, int argc, const char *argv[])
{
const char *file;
int fd;
Elf *elf;
if (argc != 0)
elfedit_command_usage();
if (state.file.present != 0) {
if (state.flags & ELFEDIT_F_READONLY)
elfedit_msg(ELFEDIT_MSG_ERR,
MSG_INTL(MSG_ERR_READONLY));
get_obj_state_info(obj_state, &file, &fd, &elf);
if (elf_update(elf, ELF_C_WRITE) == -1)
elfedit_msg(ELFEDIT_MSG_ERR, MSG_INTL(MSG_ERR_LIBELF),
file, MSG_ORIG(MSG_ELF_UPDATE),
elf_errmsg(elf_errno()));
state.file.unlink_on_exit = 0;
}
return (ELFEDIT_CMDRET_FLUSH);
}
MODLIST_T *
elfedit_sys_init(elfedit_module_version_t version)
{
static const char *name_help[] = { MSG_ORIG(MSG_SYS_CMD_HELP),
MSG_ORIG(MSG_SYS_CMD_HELP_A1), MSG_ORIG(MSG_SYS_CMD_HELP_A2),
NULL };
static elfedit_cmd_optarg_t opt_help[] = {
{ MSG_ORIG(MSG_STR_MINUS_S),
ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_HELP_S), 0,
SYS_OPT_F_SYNOPSIS, 0 },
{ NULL }
};
static elfedit_cmd_optarg_t arg_help[] = {
{ MSG_ORIG(MSG_STR_ARG),
ELFEDIT_I18NHDL(MSG_ARGDESC_HELP_ARG),
ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
{ NULL }
};
static const char *name_load[] = {
MSG_ORIG(MSG_SYS_CMD_LOAD), NULL };
static elfedit_cmd_optarg_t opt_load[] = {
{ MSG_ORIG(MSG_STR_MINUS_A),
ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_LOAD_A), 0,
SYS_OPT_F_ALL, 0 },
{ NULL }
};
static elfedit_cmd_optarg_t arg_load[] = {
{ MSG_ORIG(MSG_STR_MODNAME),
ELFEDIT_I18NHDL(MSG_ARGDESC_LOAD_MODNAME),
ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
{ NULL }
};
static const char *name_quit[] = { MSG_ORIG(MSG_SYS_CMD_QUIT),
MSG_ORIG(MSG_SYS_CMD_QUIT_A1), MSG_ORIG(MSG_SYS_CMD_QUIT_A2),
NULL };
static elfedit_cmd_optarg_t opt_quit[] = {
{ MSG_ORIG(MSG_STR_MINUS_F),
ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_QUIT_F), 0,
SYS_OPT_F_FORCE, 0 },
{ NULL }
};
static const char *name_status[] = {
MSG_ORIG(MSG_SYS_CMD_STATUS), NULL };
static const char *name_set[] = {
MSG_ORIG(MSG_SYS_CMD_SET), NULL };
static elfedit_cmd_optarg_t arg_set[] = {
{ MSG_ORIG(MSG_STR_OPTION),
ELFEDIT_I18NHDL(MSG_ARGDESC_SET_OPTION), 0 },
{ MSG_ORIG(MSG_STR_VALUE),
ELFEDIT_I18NHDL(MSG_ARGDESC_SET_VALUE), 0 },
{ NULL }
};
static const char *name_unload[] = {
MSG_ORIG(MSG_SYS_CMD_UNLOAD), NULL };
static elfedit_cmd_optarg_t opt_unload[] = {
{ MSG_ORIG(MSG_STR_MINUS_A),
ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_UNLOAD_A), 0,
SYS_OPT_F_ALL, 0},
{ NULL }
};
static elfedit_cmd_optarg_t arg_unload[] = {
{ MSG_ORIG(MSG_STR_MODNAME),
ELFEDIT_I18NHDL(MSG_ARGDESC_UNLOAD_MODNAME),
ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
{ NULL }
};
static const char *name_write[] = { MSG_ORIG(MSG_SYS_CMD_WRITE),
MSG_ORIG(MSG_SYS_CMD_WRITE_A1), MSG_ORIG(MSG_SYS_CMD_WRITE_A2),
NULL };
static elfedit_cmd_t cmds[] = {
{ (elfedit_cmd_func_t *)cmd_help,
(elfedit_cmdcpl_func_t *)cpl_help, name_help,
ELFEDIT_I18NHDL(MSG_SYS_DESC_HELP),
ELFEDIT_I18NHDL(MSG_SYS_HELP_HELP),
opt_help, arg_help },
{ (elfedit_cmd_func_t *)cmd_load,
(elfedit_cmdcpl_func_t *)cpl_load, name_load,
ELFEDIT_I18NHDL(MSG_SYS_DESC_LOAD),
ELFEDIT_I18NHDL(MSG_SYS_HELP_LOAD),
opt_load, arg_load },
{ (elfedit_cmd_func_t *)cmd_quit, NULL, name_quit,
ELFEDIT_I18NHDL(MSG_SYS_DESC_QUIT),
ELFEDIT_I18NHDL(MSG_SYS_HELP_QUIT),
opt_quit, NULL },
{ (elfedit_cmd_func_t *)cmd_status, NULL, name_status,
ELFEDIT_I18NHDL(MSG_SYS_DESC_STATUS),
ELFEDIT_I18NHDL(MSG_SYS_HELP_STATUS),
NULL, NULL },
{ (elfedit_cmd_func_t *)cmd_set,
(elfedit_cmdcpl_func_t *)cpl_set, name_set,
ELFEDIT_I18NHDL(MSG_SYS_DESC_SET),
ELFEDIT_I18NHDL(MSG_SYS_HELP_SET),
NULL, arg_set },
{ (elfedit_cmd_func_t *)cmd_unload,
(elfedit_cmdcpl_func_t *)cpl_unload, name_unload,
ELFEDIT_I18NHDL(MSG_SYS_DESC_UNLOAD),
ELFEDIT_I18NHDL(MSG_SYS_HELP_UNLOAD),
opt_unload, arg_unload },
{ (elfedit_cmd_func_t *)cmd_write, NULL, name_write,
ELFEDIT_I18NHDL(MSG_SYS_DESC_WRITE),
ELFEDIT_I18NHDL(MSG_SYS_HELP_WRITE),
NULL, NULL},
{ NULL }
};
static elfedit_module_t module = {
ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_SYS),
ELFEDIT_I18NHDL(MSG_MOD_SYS_DESC),
cmds, mod_i18nhdl_to_str };
static MODLIST_T moddef = {
NULL,
(elfeditGC_module_t *)&module,
NULL,
NULL
};
return (&moddef);
}