d29b2c4438482eb00488be49a1f5d6835f455546ab * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d29b2c4438482eb00488be49a1f5d6835f455546ab * See the License for the specific language governing permissions
d29b2c4438482eb00488be49a1f5d6835f455546ab * and limitations under the License.
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 * CDDL HEADER END
ba2be53024c0b999e74ba9adcd7d80fec5df8c57ab * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Use is subject to license terms.
d29b2c4438482eb00488be49a1f5d6835f455546ab#pragma ident "%Z%%M% %I% %E% SMI"
d29b2c4438482eb00488be49a1f5d6835f455546ab * This file provides the builtin sys module. It is similar to the
d29b2c4438482eb00488be49a1f5d6835f455546ab * other modules, but differs in several important ways:
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 * 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 * 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.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic const char *
d29b2c4438482eb00488be49a1f5d6835f455546ab * The sys_opt_t enum specifies a bit value for every optional argument
d29b2c4438482eb00488be49a1f5d6835f455546ab * allowed by a command in this module.
d29b2c4438482eb00488be49a1f5d6835f455546abtypedef enum {
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.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abget_obj_state_info(void *obj_state, const char **file, int *fd, Elf **elf)
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit32_obj_state_t *s = (elfedit32_obj_state_t *)obj_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit64_obj_state_t *s = (elfedit64_obj_state_t *)obj_state;
d29b2c4438482eb00488be49a1f5d6835f455546ab * Helper for cmd_help(). Displays synopsis information for one command.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcmd_help_synopsis(elfeditGC_module_t *mod, elfeditGC_cmd_t *cmd)
d29b2c4438482eb00488be49a1f5d6835f455546ab * Helper for cmd_help(). Displays synopsis information for one module.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546ab mod->mod_name, (* mod->mod_i18nhdl_to_str)(mod->mod_desc));
d29b2c4438482eb00488be49a1f5d6835f455546ab for (cmd = mod->mod_cmds; cmd->cmd_func != NULL; cmd++) {
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.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546ab while (*str) {
d29b2c4438482eb00488be49a1f5d6835f455546ab * Given a title, and a NULL terminated list of option/argument
d29b2c4438482eb00488be49a1f5d6835f455546ab * descriptors, output the list contents.
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Insert a blank line between items */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Indentation */
d29b2c4438482eb00488be49a1f5d6835f455546ab * If name is too long, inject a newline to avoid
d29b2c4438482eb00488be49a1f5d6835f455546ab * crowding the help text.
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Output the help text with a tab prefix */
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:help
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab * An array of this type is used to collect the data needed to
d29b2c4438482eb00488be49a1f5d6835f455546ab * generate help output.
d29b2c4438482eb00488be49a1f5d6835f455546ab typedef struct {
d29b2c4438482eb00488be49a1f5d6835f455546ab * Process options. The only option accepted is -s, so we
d29b2c4438482eb00488be49a1f5d6835f455546ab * don't even have to check the idmask to know.
d29b2c4438482eb00488be49a1f5d6835f455546ab * This command can produce an arbitrary amount of output, so
d29b2c4438482eb00488be49a1f5d6835f455546ab * run a pager.
d29b2c4438482eb00488be49a1f5d6835f455546ab if (argc == 0) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Force all modules to load so we have data */
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 * 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 * Note that there are cases where one argument can have two
d29b2c4438482eb00488be49a1f5d6835f455546ab * valid interpretations. In this case, we display them both.
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 while (n < argc)
d29b2c4438482eb00488be49a1f5d6835f455546ab item = elfedit_realloc(MSG_INTL(MSG_ALLOC_HELPITEM), item,
d29b2c4438482eb00488be49a1f5d6835f455546ab n * sizeof (*item));
d29b2c4438482eb00488be49a1f5d6835f455546ab for (i = 0; i < argc; i++) {
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 /* Just colon: Module (and maybe default command) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Strip off the colon */
d29b2c4438482eb00488be49a1f5d6835f455546ab } else { /* A command */
d29b2c4438482eb00488be49a1f5d6835f455546ab * Having validated the items, loop over them again and produce
d29b2c4438482eb00488be49a1f5d6835f455546ab * the required help output.
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Help for a module? */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* An empty line after the last line of output */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Help for a command? */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* If -s, display quick synopsis rather than the whole thing */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* If there are alias names, show them */
d29b2c4438482eb00488be49a1f5d6835f455546ab } while (*alias);
d29b2c4438482eb00488be49a1f5d6835f455546ab /* An empty line after the last line of output */
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:help
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_help(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab * The arguments can be any module or command. Supplying the
d29b2c4438482eb00488be49a1f5d6835f455546ab * commands implicitly supplies the modules too.
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:load
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* For each remaining argument, load them individually */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Is it a directory? Load everything in it */
d29b2c4438482eb00488be49a1f5d6835f455546ab } else { /* Not a directory. Normal load */
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:load
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_load(void *obj_state, void *cpldata, int argc, const char *argv[],
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 * Implementation of sys:quit
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
d29b2c4438482eb00488be49a1f5d6835f455546ab * If session is not READONLY, then refuse to quit if file
d29b2c4438482eb00488be49a1f5d6835f455546ab * needs flushing and -f option was not used.
d29b2c4438482eb00488be49a1f5d6835f455546ab if (!(state.flags & ELFEDIT_F_READONLY) && state.file.dirty &&
d29b2c4438482eb00488be49a1f5d6835f455546ab /*NOTREACHED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:status
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *s;
d29b2c4438482eb00488be49a1f5d6835f455546ab * This command can produce an arbitrary amount of output, so
d29b2c4438482eb00488be49a1f5d6835f455546ab * run a pager.
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Files */
d29b2c4438482eb00488be49a1f5d6835f455546ab elfedit_printf(MSG_INTL(MSG_HLPFMT_INFILE), state.file.infile);
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Option Variables */
d29b2c4438482eb00488be49a1f5d6835f455546ab (state.flags & ELFEDIT_F_AUTOPRINT) ? MSG_ORIG(MSG_STR_ON) :
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Module Load Path */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Currently Loaded Modules */
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:set
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (**argv) {
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:set
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_set(void *obj_state, void *cpldata, int argc, const char *argv[],
d29b2c4438482eb00488be49a1f5d6835f455546ab const char *s;
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 if (argc == 1) { /* The first argument is a variable letter */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* We're dealing with the second argument, the value */
d29b2c4438482eb00488be49a1f5d6835f455546ab switch (*s) {
d29b2c4438482eb00488be49a1f5d6835f455546ab /* The second argument is a boolean */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* The numbers are not symbolic, but we want them in the list */
d29b2c4438482eb00488be49a1f5d6835f455546ab * Implementation of sys:unload
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546ab while ((getopt_ret = elfedit_getopt(&getopt_state)) != NULL) {
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 * 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 /* If we made it to the end, then the list is empty */
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab /* Unload each module individually */
d29b2c4438482eb00488be49a1f5d6835f455546ab return (0);
d29b2c4438482eb00488be49a1f5d6835f455546ab * Command completion function for sys:unload
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
d29b2c4438482eb00488be49a1f5d6835f455546abstatic void
d29b2c4438482eb00488be49a1f5d6835f455546abcpl_unload(void *obj_state, void *cpldata, int argc, const char *argv[],
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 * Implementation of sys:write
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED2*/
d29b2c4438482eb00488be49a1f5d6835f455546ab * An update has succeeded for this file, so revoke the need
d29b2c4438482eb00488be49a1f5d6835f455546ab * to unlink it on exit.
d29b2c4438482eb00488be49a1f5d6835f455546ab/*ARGSUSED*/
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 /* MSG_INTL(MSG_SYS_OPTDESC_HELP_S) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_HELP_ARG) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:load */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_LOAD_A) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_LOAD_MODNAME) */
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 /* MSG_INTL(MSG_SYS_OPTDESC_QUIT_F) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:status */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:set */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_SET_OPTION) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_SET_VALUE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sys:unload */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_OPTDESC_UNLOAD_A) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_ARGDESC_UNLOAD_MODNAME) */
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 /* sym:help */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_HELP) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_HELP) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:load */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_LOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_LOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:quit */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_QUIT) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_QUIT) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:status */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_STATUS) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_STATUS) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:set */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_SET) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_SET) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:unload */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_UNLOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_UNLOAD) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* sym:write */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_DESC_WRITE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_SYS_HELP_WRITE) */
d29b2c4438482eb00488be49a1f5d6835f455546ab /* MSG_INTL(MSG_MOD_SYS_DESC) */
d29b2c4438482eb00488be49a1f5d6835f455546ab return (&moddef);