d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER START
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The contents of this file are subject to the terms of the
d29b2c4438482eb00488be49a1f5d6835f455546ab * Common Development and Distribution License (the "License").
d29b2c4438482eb00488be49a1f5d6835f455546ab * You may not use this file except in compliance with the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d29b2c4438482eb00488be49a1f5d6835f455546ab * or http://www.opensolaris.org/os/licensing.
d29b2c4438482eb00488be49a1f5d6835f455546ab * See the License for the specific language governing permissions
d29b2c4438482eb00488be49a1f5d6835f455546ab * and limitations under the License.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * When distributing Covered Code, include this CDDL HEADER in each
d29b2c4438482eb00488be49a1f5d6835f455546ab * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d29b2c4438482eb00488be49a1f5d6835f455546ab * If applicable, add the following below this CDDL HEADER, with the
d29b2c4438482eb00488be49a1f5d6835f455546ab * fields enclosed by brackets "[]" replaced with your own identifying
d29b2c4438482eb00488be49a1f5d6835f455546ab * information: Portions Copyright [yyyy] [name of copyright owner]
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER END
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
ba2be53024c0b999e74ba9adcd7d80fec5df8c57ab * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Use is subject to license terms.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab#pragma ident "%Z%%M% %I% %E% SMI"
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <fcntl.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/types.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <sys/stat.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <unistd.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <strings.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include <elfedit.h>
d29b2c4438482eb00488be49a1f5d6835f455546ab#include "_elfedit.h"
d29b2c4438482eb00488be49a1f5d6835f455546ab#include "msg.h"
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * This file provides the builtin sys module. It is similar to the
d29b2c4438482eb00488be49a1f5d6835f455546ab * other modules, but differs in several important ways:
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * - It is built as a static part of elfedit, and not
d29b2c4438482eb00488be49a1f5d6835f455546ab * as a sharable object.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - It must be avaialble before the ELFCLASS of the object
d29b2c4438482eb00488be49a1f5d6835f455546ab * is known, so it is not ELFCLASS specific. We don't build
ba2be53024c0b999e74ba9adcd7d80fec5df8c57ab * it twice with <sys/machelf.h>, as we do for the loadable
ba2be53024c0b999e74ba9adcd7d80fec5df8c57ab * modules. This means that commands need to test for the type
d29b2c4438482eb00488be49a1f5d6835f455546ab * of their obj_state argument at runtime.
d29b2c4438482eb00488be49a1f5d6835f455546ab * - The init function signature is different. We build an entire
d29b2c4438482eb00488be49a1f5d6835f455546ab * module definition statically.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * This function is supplied to elfedit through our elfedit_module_t
d29b2c4438482eb00488be49a1f5d6835f455546ab * definition. It translates the opaque elfedit_i18nhdl_t handles
d29b2c4438482eb00488be49a1f5d6835f455546ab * in our module interface into the actual strings for elfedit to
d29b2c4438482eb00488be49a1f5d6835f455546ab * use.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * note:
d29b2c4438482eb00488be49a1f5d6835f455546ab * This module uses Msg codes for its i18n handle type.
d29b2c4438482eb00488be49a1f5d6835f455546ab * So the translation is simply to use MSG_INTL() to turn
d29b2c4438482eb00488be49a1f5d6835f455546ab * it into a string and return it.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic const char *
d29b2c4438482eb00488be49a1f5d6835f455546abmod_i18nhdl_to_str(elfedit_i18nhdl_t hdl)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab Msg msg = (Msg)hdl;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (MSG_INTL(msg));
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * The sys_opt_t enum specifies a bit value for every optional argument
d29b2c4438482eb00488be49a1f5d6835f455546ab * allowed by a command in this module.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_ALL = 1, /* -a */
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_FORCE = 2, /* -f */
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_SYNOPSIS = 4, /* -s */
d29b2c4438482eb00488be49a1f5d6835f455546ab} dyn_opt_t;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Given a generic (void *) pointer to an obj_state argument, determine
d29b2c4438482eb00488be49a1f5d6835f455546ab * which type it is, and return the st_file, st_fd and st_elf fields.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abget_obj_state_info(void *obj_state, const char **file, int *fd, Elf **elf)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.elf.elfclass == ELFCLASS32) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *s = (elfedit32_obj_state_t *)obj_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab *file = s->os_file;
d29b2c4438482eb00488be49a1f5d6835f455546ab *fd = s->os_fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab *elf = s->os_elf;
d29b2c4438482eb00488be49a1f5d6835f455546ab } else {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *s = (elfedit64_obj_state_t *)obj_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab *file = s->os_file;
d29b2c4438482eb00488be49a1f5d6835f455546ab *fd = s->os_fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab *elf = s->os_elf;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Helper for cmd_help(). Displays synopsis information for one command.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_help_synopsis(elfeditGC_module_t *mod, elfeditGC_cmd_t *cmd)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab char name_buf[128];
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *name;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char **cmd_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cmd->cmd_name[1] == NULL) { /* One name */
d29b2c4438482eb00488be49a1f5d6835f455546ab name = *cmd->cmd_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab } else {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *cname;
d29b2c4438482eb00488be49a1f5d6835f455546ab int need_comma = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab name = name_buf;
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) snprintf(name_buf, sizeof (name_buf),
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_HLPFMT_MULTNAM), cmd->cmd_name[0]);
d29b2c4438482eb00488be49a1f5d6835f455546ab for (cmd_name = cmd->cmd_name + 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab *cmd_name; cmd_name++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (need_comma)
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) strlcat(name_buf,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_COMMA_SP),
d29b2c4438482eb00488be49a1f5d6835f455546ab sizeof (name_buf));
d29b2c4438482eb00488be49a1f5d6835f455546ab need_comma = 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab cname = (cmd_name[0][0] == '\0') ?
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_HLPFMT_MODDEFCMD) : *cmd_name;
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) strlcat(name_buf, cname,
d29b2c4438482eb00488be49a1f5d6835f455546ab sizeof (name_buf));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) strlcat(name_buf, MSG_ORIG(MSG_STR_CPAREN),
d29b2c4438482eb00488be49a1f5d6835f455546ab sizeof (name_buf));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMSUMHDR), name,
d29b2c4438482eb00488be49a1f5d6835f455546ab (* mod->mod_i18nhdl_to_str)(cmd->cmd_desc));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_SUMSYNOPSIS),
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_format_command_usage(mod, cmd,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_HLPSUMINDENT),
d29b2c4438482eb00488be49a1f5d6835f455546ab strlen(MSG_ORIG(MSG_STR_HLPSUMINDENT))));
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Helper for cmd_help(). Displays synopsis information for one module.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_help_showmod(elfeditGC_module_t *mod)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_cmd_t *cmd;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMDSCHDR),
d29b2c4438482eb00488be49a1f5d6835f455546ab mod->mod_name, (* mod->mod_i18nhdl_to_str)(mod->mod_desc));
d29b2c4438482eb00488be49a1f5d6835f455546ab for (cmd = mod->mod_cmds; cmd->cmd_func != NULL; cmd++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cmd != mod->mod_cmds)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd_help_synopsis(mod, cmd);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Given a string containing newline characters, break it into
d29b2c4438482eb00488be49a1f5d6835f455546ab * individual lines, and output each line with the given
d29b2c4438482eb00488be49a1f5d6835f455546ab * prefix string in front.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abwrite_help_str(const char *str, const char *prefix)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t i;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (str == NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab return;
d29b2c4438482eb00488be49a1f5d6835f455546ab while (*str) {
d29b2c4438482eb00488be49a1f5d6835f455546ab i = strcspn(str, MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab if (*(str + i) != '\0')
d29b2c4438482eb00488be49a1f5d6835f455546ab i++;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(prefix);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_write(str, i);
d29b2c4438482eb00488be49a1f5d6835f455546ab str += i;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Given a title, and a NULL terminated list of option/argument
d29b2c4438482eb00488be49a1f5d6835f455546ab * descriptors, output the list contents.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abwrite_optarg(elfeditGC_module_t *mod, const char *title,
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cmd_optarg_t *optarg)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab int cnt;
d29b2c4438482eb00488be49a1f5d6835f455546ab int len;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *help;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_optarg_item_t item;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(title);
d29b2c4438482eb00488be49a1f5d6835f455546ab for (cnt = 0; optarg->oa_name != NULL; cnt++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_next_optarg(&optarg, &item);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Insert a blank line between items */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cnt > 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Indentation */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_HLPINDENT));
d29b2c4438482eb00488be49a1f5d6835f455546ab len = strlen(item.oai_name);
d29b2c4438482eb00488be49a1f5d6835f455546ab help = elfedit_optarg_helpstr(mod, &item);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (item.oai_flags & ELFEDIT_CMDOA_F_VALUE) {
d29b2c4438482eb00488be49a1f5d6835f455546ab len += 1 + strlen(item.oai_vname);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_HLPOPTARG2),
d29b2c4438482eb00488be49a1f5d6835f455546ab item.oai_name, item.oai_vname);
d29b2c4438482eb00488be49a1f5d6835f455546ab } else {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_HLPOPTARG),
d29b2c4438482eb00488be49a1f5d6835f455546ab item.oai_name);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * If name is too long, inject a newline to avoid
d29b2c4438482eb00488be49a1f5d6835f455546ab * crowding the help text.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (len > 3)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Output the help text with a tab prefix */
d29b2c4438482eb00488be49a1f5d6835f455546ab write_help_str(help, MSG_ORIG(MSG_STR_TAB));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:help
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_help(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab#define INITIAL_ITEM_ALLOC 4
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * An array of this type is used to collect the data needed to
d29b2c4438482eb00488be49a1f5d6835f455546ab * generate help output.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab typedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_cmd_t *cmd;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_module_t *cmd_mod; /* Used with cmd */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_module_t *mod;
d29b2c4438482eb00488be49a1f5d6835f455546ab } ITEM;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab static ITEM *item;
d29b2c4438482eb00488be49a1f5d6835f455546ab static int item_cnt;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab MODLIST_T *modlist;
d29b2c4438482eb00488be49a1f5d6835f455546ab int dispcnt;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t i;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_module_t *mod;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfeditGC_cmd_t *cmd;
d29b2c4438482eb00488be49a1f5d6835f455546ab int minus_s = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_state_t getopt_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab ITEM *cur_item;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Process options. The only option accepted is -s, so we
d29b2c4438482eb00488be49a1f5d6835f455546ab * don't even have to check the idmask to know.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_init(&getopt_state, &argc, &argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab while (elfedit_getopt(&getopt_state) != NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab minus_s = 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * This command can produce an arbitrary amount of output, so
d29b2c4438482eb00488be49a1f5d6835f455546ab * run a pager.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_pager_init();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc == 0) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (minus_s) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Force all modules to load so we have data */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_load_modpath();
d29b2c4438482eb00488be49a1f5d6835f455546ab for (modlist = state.modlist; modlist;
d29b2c4438482eb00488be49a1f5d6835f455546ab modlist = modlist->ml_next) {
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd_help_showmod(modlist->ml_mod);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (modlist->ml_next != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab return (ELFEDIT_CMDRET_NONE);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * If no arguments are present, we display a simple
d29b2c4438482eb00488be49a1f5d6835f455546ab * "how to use help" tutorial, which will hopefully
d29b2c4438482eb00488be49a1f5d6835f455546ab * bootstrap the user into a position where they
d29b2c4438482eb00488be49a1f5d6835f455546ab * know how to run the help command, and then find
d29b2c4438482eb00488be49a1f5d6835f455546ab * what they're really after.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_SYS_HELP_HELP_NOARG));
d29b2c4438482eb00488be49a1f5d6835f455546ab return (ELFEDIT_CMDRET_NONE);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * As we process the arguments, we are willing to treat each
d29b2c4438482eb00488be49a1f5d6835f455546ab * one as either a module or a command:
d29b2c4438482eb00488be49a1f5d6835f455546ab * 1) An item without a colon can be a module,
d29b2c4438482eb00488be49a1f5d6835f455546ab * or a command from the sys: module.
d29b2c4438482eb00488be49a1f5d6835f455546ab * 2) An item with a colon, and no command part is
d29b2c4438482eb00488be49a1f5d6835f455546ab * a module, and it can also be the default
d29b2c4438482eb00488be49a1f5d6835f455546ab * command for the module, if it has one. We choose
d29b2c4438482eb00488be49a1f5d6835f455546ab * to only display the module info in this case, since
d29b2c4438482eb00488be49a1f5d6835f455546ab * the use of "" to represent the default command is
d29b2c4438482eb00488be49a1f5d6835f455546ab * an implementation detail, not a user-facing concept.
d29b2c4438482eb00488be49a1f5d6835f455546ab * 3) An item with a colon and a command part can only be
d29b2c4438482eb00488be49a1f5d6835f455546ab * a command.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Note that there are cases where one argument can have two
d29b2c4438482eb00488be49a1f5d6835f455546ab * valid interpretations. In this case, we display them both.
d29b2c4438482eb00488be49a1f5d6835f455546ab *
d29b2c4438482eb00488be49a1f5d6835f455546ab * Pass over the arguments and determine how many distinct
d29b2c4438482eb00488be49a1f5d6835f455546ab * "things" we need to display. At the same time, force any
d29b2c4438482eb00488be49a1f5d6835f455546ab * needed modules to load so that the debug load messages won't
d29b2c4438482eb00488be49a1f5d6835f455546ab * show up in between the displayed items, and save the command
d29b2c4438482eb00488be49a1f5d6835f455546ab * and module definitions we will need to generate the output.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc > item_cnt) {
d29b2c4438482eb00488be49a1f5d6835f455546ab int n = (item_cnt == 0) ? INITIAL_ITEM_ALLOC : item_cnt;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab while (n < argc)
d29b2c4438482eb00488be49a1f5d6835f455546ab n *= 2;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab item = elfedit_realloc(MSG_INTL(MSG_ALLOC_HELPITEM), item,
d29b2c4438482eb00488be49a1f5d6835f455546ab n * sizeof (*item));
d29b2c4438482eb00488be49a1f5d6835f455546ab item_cnt = n;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab dispcnt = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab for (i = 0; i < argc; i++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *colon = strchr(argv[i], ':');
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (colon == NULL) { /* No colon: sys: cmd or module */
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].cmd =
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_find_command(argv[i], 0, &item[i].cmd_mod);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (item[i].cmd != NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab dispcnt++;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Also try to load it as a module. If a command
d29b2c4438482eb00488be49a1f5d6835f455546ab * was found, then this need not succeed. Otherwise,
d29b2c4438482eb00488be49a1f5d6835f455546ab * it has to be a module, and we cause an error
d29b2c4438482eb00488be49a1f5d6835f455546ab * to be issued if not.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].mod = elfedit_load_module(argv[i],
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].cmd == NULL, 0);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (item[i].mod != NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab dispcnt++;
d29b2c4438482eb00488be49a1f5d6835f455546ab } else if (*(colon + 1) == '\0') {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Just colon: Module (and maybe default command) */
d29b2c4438482eb00488be49a1f5d6835f455546ab char buf[ELFEDIT_MAXMODNAM + 1];
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *str = argv[i];
d29b2c4438482eb00488be49a1f5d6835f455546ab int len = colon - str;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].cmd = NULL;
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Strip off the colon */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (len < sizeof (buf)) {
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) strncpy(buf, str, len);
d29b2c4438482eb00488be49a1f5d6835f455546ab buf[len] = '\0';
d29b2c4438482eb00488be49a1f5d6835f455546ab str = buf;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].mod = elfedit_load_module(str, 1, 0);
d29b2c4438482eb00488be49a1f5d6835f455546ab dispcnt++;
d29b2c4438482eb00488be49a1f5d6835f455546ab } else { /* A command */
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].cmd =
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_find_command(argv[i], 1, &item[i].cmd_mod);
d29b2c4438482eb00488be49a1f5d6835f455546ab dispcnt++;
d29b2c4438482eb00488be49a1f5d6835f455546ab item[i].mod = NULL;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Having validated the items, loop over them again and produce
d29b2c4438482eb00488be49a1f5d6835f455546ab * the required help output.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab for (cur_item = item; argc--; argv++, cur_item++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Help for a module? */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cur_item->mod != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (dispcnt > 1)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_MULTIHDR),
d29b2c4438482eb00488be49a1f5d6835f455546ab *argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd_help_showmod(cur_item->mod);
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((dispcnt > 1) && (argc > 0))
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_MULTIEND),
d29b2c4438482eb00488be49a1f5d6835f455546ab argv[0], argv[1]);
d29b2c4438482eb00488be49a1f5d6835f455546ab /* An empty line after the last line of output */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Help for a command? */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cur_item->cmd == NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab continue;
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd = cur_item->cmd;
d29b2c4438482eb00488be49a1f5d6835f455546ab mod = cur_item->cmd_mod;
d29b2c4438482eb00488be49a1f5d6835f455546ab if (dispcnt > 1)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_MULTIHDR), *argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* If -s, display quick synopsis rather than the whole thing */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (minus_s) {
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd_help_synopsis(mod, cmd);
d29b2c4438482eb00488be49a1f5d6835f455546ab continue;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_MOD), mod->mod_name,
d29b2c4438482eb00488be49a1f5d6835f455546ab (* mod->mod_i18nhdl_to_str)(mod->mod_desc));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_NAME),
d29b2c4438482eb00488be49a1f5d6835f455546ab *cmd->cmd_name,
d29b2c4438482eb00488be49a1f5d6835f455546ab (* mod->mod_i18nhdl_to_str)(cmd->cmd_desc));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_SYNOPSIS),
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_format_command_usage(mod, cmd,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_HLPUSEINDENT),
d29b2c4438482eb00488be49a1f5d6835f455546ab strlen(MSG_ORIG(MSG_STR_HLPINDENT))));
d29b2c4438482eb00488be49a1f5d6835f455546ab /* If there are alias names, show them */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cmd->cmd_name[1] != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab const char **alias = cmd->cmd_name + 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_ALIASES));
d29b2c4438482eb00488be49a1f5d6835f455546ab do {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_HLPINDENT));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_FMT_MODCMD),
d29b2c4438482eb00488be49a1f5d6835f455546ab mod->mod_name, *alias);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (**alias == '\0')
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_HLPFMT_DEFCMD));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab alias++;
d29b2c4438482eb00488be49a1f5d6835f455546ab } while (*alias);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_DESC));
d29b2c4438482eb00488be49a1f5d6835f455546ab write_help_str(
d29b2c4438482eb00488be49a1f5d6835f455546ab (* mod->mod_i18nhdl_to_str)(cmd->cmd_help),
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_HLPINDENT));
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cmd->cmd_args != NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab write_optarg(mod, MSG_INTL(MSG_HLPFMT_ARGS),
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd->cmd_args);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (cmd->cmd_opt != NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab write_optarg(mod, MSG_INTL(MSG_HLPFMT_OPT),
d29b2c4438482eb00488be49a1f5d6835f455546ab cmd->cmd_opt);
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((dispcnt > 1) && (argc > 0))
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_MULTIEND),
d29b2c4438482eb00488be49a1f5d6835f455546ab argv[0], argv[1]);
d29b2c4438482eb00488be49a1f5d6835f455546ab /* An empty line after the last line of output */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_STR_NL));
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (ELFEDIT_CMDRET_NONE);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab#undef INITIAL_ITEM_ALLOC
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:help
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_help(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab int num_opt)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * The arguments can be any module or command. Supplying the
d29b2c4438482eb00488be49a1f5d6835f455546ab * commands implicitly supplies the modules too.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_command(cpldata);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:load
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_load(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_state_t getopt_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_ret_t *getopt_ret;
d29b2c4438482eb00488be49a1f5d6835f455546ab struct stat statbuf;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_init(&getopt_state, &argc, &argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (getopt_ret->gor_idmask) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case SYS_OPT_F_ALL:
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_load_modpath();
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* For each remaining argument, load them individually */
d29b2c4438482eb00488be49a1f5d6835f455546ab for (; argc-- > 0; argv++) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Is it a directory? Load everything in it */
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((stat(*argv, &statbuf) == 0) &&
d29b2c4438482eb00488be49a1f5d6835f455546ab (statbuf.st_mode & S_IFDIR)) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_load_moddir(*argv, 1, 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab } else { /* Not a directory. Normal load */
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) elfedit_load_module(*argv, 1, 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:load
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_load(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab int num_opt)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Module names. Note that this causes elfedit to load all
d29b2c4438482eb00488be49a1f5d6835f455546ab * of the modules, which probably makes the current load
d29b2c4438482eb00488be49a1f5d6835f455546ab * operation unnecessary. This could be improved, but I don't
d29b2c4438482eb00488be49a1f5d6835f455546ab * see it as worth the complexity. Explicit load calls are
d29b2c4438482eb00488be49a1f5d6835f455546ab * rare, and the user will usually not use command completion.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_module(cpldata, 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:quit
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_quit(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_state_t getopt_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_ret_t *getopt_ret;
d29b2c4438482eb00488be49a1f5d6835f455546ab int force = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *file;
d29b2c4438482eb00488be49a1f5d6835f455546ab int fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf *elf;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_init(&getopt_state, &argc, &argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (getopt_ret->gor_idmask) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case SYS_OPT_F_FORCE:
d29b2c4438482eb00488be49a1f5d6835f455546ab force = 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc != 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.file.present) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * If session is not READONLY, then refuse to quit if file
d29b2c4438482eb00488be49a1f5d6835f455546ab * needs flushing and -f option was not used.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (!(state.flags & ELFEDIT_F_READONLY) && state.file.dirty &&
d29b2c4438482eb00488be49a1f5d6835f455546ab !force)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_msg(ELFEDIT_MSG_ERR,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_ERR_NODIRTYQUIT));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab get_obj_state_info(obj_state, &file, &fd, &elf);
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) close(fd);
d29b2c4438482eb00488be49a1f5d6835f455546ab (void) elf_end(elf);
d29b2c4438482eb00488be49a1f5d6835f455546ab free(obj_state);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_exit(0);
d29b2c4438482eb00488be49a1f5d6835f455546ab /*NOTREACHED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:status
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_status(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab MODLIST_T *modlist;
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *s;
d29b2c4438482eb00488be49a1f5d6835f455546ab size_t i;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc > 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * This command can produce an arbitrary amount of output, so
d29b2c4438482eb00488be49a1f5d6835f455546ab * run a pager.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_pager_init();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Files */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.file.present == 0) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILENONE));
d29b2c4438482eb00488be49a1f5d6835f455546ab } else if (state.flags & ELFEDIT_F_READONLY) {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILERO),
d29b2c4438482eb00488be49a1f5d6835f455546ab state.file.infile);
d29b2c4438482eb00488be49a1f5d6835f455546ab } else {
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILE), state.file.infile);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_OUTFILE),
d29b2c4438482eb00488be49a1f5d6835f455546ab state.file.outfile);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.file.dirty)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_CNGPENDING));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Option Variables */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_VARHDR));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_AFLG),
d29b2c4438482eb00488be49a1f5d6835f455546ab (state.flags & ELFEDIT_F_AUTOPRINT) ? MSG_ORIG(MSG_STR_ON) :
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_OFF));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_DFLG),
d29b2c4438482eb00488be49a1f5d6835f455546ab (state.flags & ELFEDIT_F_DEBUG) ? MSG_ORIG(MSG_STR_ON) :
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_STR_OFF));
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_OFLG),
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_atoconst_value_to_str(ELFEDIT_CONST_OUTSTYLE,
d29b2c4438482eb00488be49a1f5d6835f455546ab state.outstyle, 1));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Module Load Path */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_PATHHDR));
d29b2c4438482eb00488be49a1f5d6835f455546ab for (i = 0; i < state.modpath.n; i++)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_PATHELT),
d29b2c4438482eb00488be49a1f5d6835f455546ab state.modpath.seg[i]);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Currently Loaded Modules */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_MODHDR));
d29b2c4438482eb00488be49a1f5d6835f455546ab for (modlist = state.modlist; modlist;
d29b2c4438482eb00488be49a1f5d6835f455546ab modlist = modlist->ml_next) {
d29b2c4438482eb00488be49a1f5d6835f455546ab s = modlist->ml_path ? modlist->ml_path :
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_FMT_BUILTIN);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_ORIG(MSG_HLPFMT_NAMDSCCOL),
d29b2c4438482eb00488be49a1f5d6835f455546ab modlist->ml_mod->mod_name, s);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (ELFEDIT_CMDRET_NONE);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:set
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_set(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((argc != 2) || (strlen(argv[0]) > 1))
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (**argv) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'a':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'A':
d29b2c4438482eb00488be49a1f5d6835f455546ab if (elfedit_atobool(argv[1], MSG_INTL(MSG_SYSSET_A)))
d29b2c4438482eb00488be49a1f5d6835f455546ab state.flags |= ELFEDIT_F_AUTOPRINT;
d29b2c4438482eb00488be49a1f5d6835f455546ab else
d29b2c4438482eb00488be49a1f5d6835f455546ab state.flags &= ~ELFEDIT_F_AUTOPRINT;
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'd':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'D':
d29b2c4438482eb00488be49a1f5d6835f455546ab if (elfedit_atobool(argv[1], MSG_INTL(MSG_SYSSET_D)))
d29b2c4438482eb00488be49a1f5d6835f455546ab state.flags |= ELFEDIT_F_DEBUG;
d29b2c4438482eb00488be49a1f5d6835f455546ab else
d29b2c4438482eb00488be49a1f5d6835f455546ab state.flags &= ~ELFEDIT_F_DEBUG;
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'o':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'O':
d29b2c4438482eb00488be49a1f5d6835f455546ab if (elfedit_atooutstyle(argv[1], &state.outstyle) == 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_msg(ELFEDIT_MSG_ERR,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_ERR_BADOSTYLE), argv[1]);
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab default:
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:set
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_set(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab int num_opt)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *s;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * This command doesn't accept options, so num_opt should be
d29b2c4438482eb00488be49a1f5d6835f455546ab * 0. This is a defensive measure, in case that should change.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab argc -= num_opt;
d29b2c4438482eb00488be49a1f5d6835f455546ab argv += num_opt;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if ((argc < 1) || (argc > 2))
d29b2c4438482eb00488be49a1f5d6835f455546ab return;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc == 1) { /* The first argument is a variable letter */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_A), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_D), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_O), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_W), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab return;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* We're dealing with the second argument, the value */
d29b2c4438482eb00488be49a1f5d6835f455546ab s = argv[0];
d29b2c4438482eb00488be49a1f5d6835f455546ab if (strlen(s) > 1) /* One letter variables */
d29b2c4438482eb00488be49a1f5d6835f455546ab return;
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (*s) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'a': /* Booleans */
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'A':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'd':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'D':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'w':
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'W':
d29b2c4438482eb00488be49a1f5d6835f455546ab /* The second argument is a boolean */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_BOOL);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* The numbers are not symbolic, but we want them in the list */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_0), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_match(cpldata, MSG_ORIG(MSG_STR_1), 1);
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'o': /* Output style */
d29b2c4438482eb00488be49a1f5d6835f455546ab case 'O':
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_OUTSTYLE);
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:unload
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_unload(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_state_t getopt_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_ret_t *getopt_ret;
d29b2c4438482eb00488be49a1f5d6835f455546ab MODLIST_T *moddef;
d29b2c4438482eb00488be49a1f5d6835f455546ab int do_all = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_getopt_init(&getopt_state, &argc, &argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (getopt_ret->gor_idmask) {
d29b2c4438482eb00488be49a1f5d6835f455546ab case SYS_OPT_F_ALL:
d29b2c4438482eb00488be49a1f5d6835f455546ab do_all = 1;
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * If -a is specified, unload everything except builtins. Don't
d29b2c4438482eb00488be49a1f5d6835f455546ab * allow plain arguments in this case because there is nothing
d29b2c4438482eb00488be49a1f5d6835f455546ab * left to unload after -a.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (do_all) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc > 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Until we run out of non-builtin modules, take the first
d29b2c4438482eb00488be49a1f5d6835f455546ab * one from the list and unload it. Each removal alters
d29b2c4438482eb00488be49a1f5d6835f455546ab * the list, so we always start at the beginning, but this
d29b2c4438482eb00488be49a1f5d6835f455546ab * is efficient since we always remove the first available item
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab while (state.modlist != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab for (moddef = state.modlist; moddef != NULL;
d29b2c4438482eb00488be49a1f5d6835f455546ab moddef = moddef->ml_next)
d29b2c4438482eb00488be49a1f5d6835f455546ab if (moddef->ml_dl_hdl != NULL) break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* If we made it to the end, then the list is empty */
d29b2c4438482eb00488be49a1f5d6835f455546ab if (moddef == NULL)
d29b2c4438482eb00488be49a1f5d6835f455546ab break;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_unload_module(moddef->ml_mod->mod_name);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Unload each module individually */
d29b2c4438482eb00488be49a1f5d6835f455546ab for (; argc-- > 0; argv++)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_unload_module(*argv);
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:unload
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_unload(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab int num_opt)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Module names. Don't allow elfedit to load all the modules,
d29b2c4438482eb00488be49a1f5d6835f455546ab * as the only modules we want to unload are those already
d29b2c4438482eb00488be49a1f5d6835f455546ab * in memory.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_cpl_module(cpldata, 0);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:write
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED2*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic elfedit_cmdret_t
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_write(void *obj_state, int argc, const char *argv[])
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *file;
d29b2c4438482eb00488be49a1f5d6835f455546ab int fd;
d29b2c4438482eb00488be49a1f5d6835f455546ab Elf *elf;
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc != 0)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_command_usage();
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.file.present != 0) {
d29b2c4438482eb00488be49a1f5d6835f455546ab if (state.flags & ELFEDIT_F_READONLY)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_msg(ELFEDIT_MSG_ERR,
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_INTL(MSG_ERR_READONLY));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab get_obj_state_info(obj_state, &file, &fd, &elf);
d29b2c4438482eb00488be49a1f5d6835f455546ab if (elf_update(elf, ELF_C_WRITE) == -1)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_msg(ELFEDIT_MSG_ERR, MSG_INTL(MSG_ERR_LIBELF),
d29b2c4438482eb00488be49a1f5d6835f455546ab file, MSG_ORIG(MSG_ELF_UPDATE),
d29b2c4438482eb00488be49a1f5d6835f455546ab elf_errmsg(elf_errno()));
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /*
d29b2c4438482eb00488be49a1f5d6835f455546ab * An update has succeeded for this file, so revoke the need
d29b2c4438482eb00488be49a1f5d6835f455546ab * to unlink it on exit.
d29b2c4438482eb00488be49a1f5d6835f455546ab */
d29b2c4438482eb00488be49a1f5d6835f455546ab state.file.unlink_on_exit = 0;
d29b2c4438482eb00488be49a1f5d6835f455546ab }
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (ELFEDIT_CMDRET_FLUSH);
d29b2c4438482eb00488be49a1f5d6835f455546ab}
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abMODLIST_T *
d29b2c4438482eb00488be49a1f5d6835f455546abelfedit_sys_init(elfedit_module_version_t version)
d29b2c4438482eb00488be49a1f5d6835f455546ab{
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:help */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_help[] = { MSG_ORIG(MSG_SYS_CMD_HELP),
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_HELP_A1), MSG_ORIG(MSG_SYS_CMD_HELP_A2),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t opt_help[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MINUS_S),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_HELP_S) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_HELP_S), 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_SYNOPSIS, 0 },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t arg_help[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_ARG),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_HELP_ARG) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_ARGDESC_HELP_ARG),
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:load */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_load[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_LOAD), NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t opt_load[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MINUS_A),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_LOAD_A) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_LOAD_A), 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_ALL, 0 },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t arg_load[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MODNAME),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_LOAD_MODNAME) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_ARGDESC_LOAD_MODNAME),
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:quit */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_quit[] = { MSG_ORIG(MSG_SYS_CMD_QUIT),
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_QUIT_A1), MSG_ORIG(MSG_SYS_CMD_QUIT_A2),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t opt_quit[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MINUS_F),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_QUIT_F) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_QUIT_F), 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_FORCE, 0 },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:status */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_status[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_STATUS), NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:set */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_set[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_SET), NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t arg_set[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_OPTION),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_SET_OPTION) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_ARGDESC_SET_OPTION), 0 },
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_VALUE),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_SET_VALUE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_ARGDESC_SET_VALUE), 0 },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:unload */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_unload[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_UNLOAD), NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t opt_unload[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MINUS_A),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_UNLOAD_A) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_OPTDESC_UNLOAD_A), 0,
d29b2c4438482eb00488be49a1f5d6835f455546ab SYS_OPT_F_ALL, 0},
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_optarg_t arg_unload[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab { MSG_ORIG(MSG_STR_MODNAME),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_UNLOAD_MODNAME) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_ARGDESC_UNLOAD_MODNAME),
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT },
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:write */
d29b2c4438482eb00488be49a1f5d6835f455546ab static const char *name_write[] = { MSG_ORIG(MSG_SYS_CMD_WRITE),
d29b2c4438482eb00488be49a1f5d6835f455546ab MSG_ORIG(MSG_SYS_CMD_WRITE_A1), MSG_ORIG(MSG_SYS_CMD_WRITE_A2),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_cmd_t cmds[] = {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:help */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_help,
d29b2c4438482eb00488be49a1f5d6835f455546ab (elfedit_cmdcpl_func_t *)cpl_help, name_help,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_HELP) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_HELP),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_HELP) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_HELP),
d29b2c4438482eb00488be49a1f5d6835f455546ab opt_help, arg_help },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:load */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_load,
d29b2c4438482eb00488be49a1f5d6835f455546ab (elfedit_cmdcpl_func_t *)cpl_load, name_load,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_LOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_LOAD),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_LOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_LOAD),
d29b2c4438482eb00488be49a1f5d6835f455546ab opt_load, arg_load },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:quit */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_quit, NULL, name_quit,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_QUIT) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_QUIT),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_QUIT) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_QUIT),
d29b2c4438482eb00488be49a1f5d6835f455546ab opt_quit, NULL },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:status */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_status, NULL, name_status,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_STATUS) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_STATUS),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_STATUS) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_STATUS),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL, NULL },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:set */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_set,
d29b2c4438482eb00488be49a1f5d6835f455546ab (elfedit_cmdcpl_func_t *)cpl_set, name_set,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_SET) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_SET),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_SET) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_SET),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL, arg_set },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:unload */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_unload,
d29b2c4438482eb00488be49a1f5d6835f455546ab (elfedit_cmdcpl_func_t *)cpl_unload, name_unload,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_UNLOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_UNLOAD),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_UNLOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_UNLOAD),
d29b2c4438482eb00488be49a1f5d6835f455546ab opt_unload, arg_unload },
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:write */
d29b2c4438482eb00488be49a1f5d6835f455546ab { (elfedit_cmd_func_t *)cmd_write, NULL, name_write,
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_WRITE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_DESC_WRITE),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_WRITE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_SYS_HELP_WRITE),
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL, NULL},
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab { NULL }
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab static elfedit_module_t module = {
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_VER_CURRENT, MSG_ORIG(MSG_MOD_SYS),
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_MOD_SYS_DESC) */
d29b2c4438482eb00488be49a1f5d6835f455546ab ELFEDIT_I18NHDL(MSG_MOD_SYS_DESC),
d29b2c4438482eb00488be49a1f5d6835f455546ab cmds, mod_i18nhdl_to_str };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab static MODLIST_T moddef = {
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL, /* next */
d29b2c4438482eb00488be49a1f5d6835f455546ab (elfeditGC_module_t *)&module, /* Module definition */
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL, /* Didn't dlopen() it, so NULL handle */
d29b2c4438482eb00488be49a1f5d6835f455546ab NULL /* Didn't dlopen() it, so no file path */
d29b2c4438482eb00488be49a1f5d6835f455546ab };
d29b2c4438482eb00488be49a1f5d6835f455546ab
d29b2c4438482eb00488be49a1f5d6835f455546ab return (&moddef);
d29b2c4438482eb00488be49a1f5d6835f455546ab}