/**************************************************************************** * apps/nshlib/nsh_modcmds.c * * Copyright (C) 2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include "nsh.h" #include "nsh_console.h" #if defined(CONFIG_MODULE) && !defined(CONFIG_NSH_DISABLE_MODCMDS) /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: cmd_insmod ****************************************************************************/ int cmd_insmod(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { FAR void *handle; /* Usage: insmod */ /* Install the module */ handle = insmod(argv[1], argv[2]); if (handle == NULL) { nsh_output(vtbl, g_fmtcmdfailed, argv[0], "insmod", NSH_ERRNO); return ERROR; } return OK; } /**************************************************************************** * Name: cmd_rmmod ****************************************************************************/ int cmd_rmmod(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { FAR void *handle; int ret; /* Usage: rmmod */ /* Get the module handle associated with the name */ handle = modhandle(argv[1]); if (handle == NULL) { nsh_output(vtbl, g_fmtcmdfailed, argv[0], "modhandle", NSH_ERRNO); return ERROR; } /* Remove the module */ ret = rmmod(handle); if (ret < 0) { nsh_output(vtbl, g_fmtcmdfailed, argv[0], "rmmod", NSH_ERRNO); return ERROR; } return OK; } /**************************************************************************** * Name: cmd_lsmod ****************************************************************************/ #if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE) int cmd_lsmod(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { FILE *stream; /* Usage: lsmod */ /* Open /proc/modules */ stream = fopen("/proc/modules", "r"); if (stream == NULL) { nsh_output(vtbl, g_fmtcmdfailed, argv[0], "fopen", NSH_ERRNO); return ERROR; } /* Output a Header */ nsh_output(vtbl, "%-16s %8s %8s %8s %8s %8s %8s %8s %8s\n", "NAME", "INIT", "UNINIT", "ARG", "NEXPORTS", "TEXT", "SIZE", "DATA", "SIZE"); /* Read each line from the procfs "file" */ while (fgets(vtbl->iobuffer, IOBUFFERSIZE, stream) != NULL) { FAR char *modulename; FAR char *initializer; FAR char *uninitializer; FAR char *arg; FAR char *nexports; FAR char *text; FAR char *textsize; FAR char *data; FAR char *datasize; FAR char *lasts; /* Form of returned data is: * * "%s,%p,%p,%p,%p,%lu,%p,%lu\n" * * 1) Module name (string) * 2) Initializer address (hex) * 3) Uninitializer address (hex) * 4) Uninitializer argument (hex) * 5) .text address (hex) * 6) Size of .text (decimal) * 7) .bss/.data address (hex) * 8) Size of .bss/.data (decimal) */ modulename = strtok_r(vtbl->iobuffer, ",\n", &lasts); initializer = strtok_r(NULL, ",\n", &lasts); uninitializer = strtok_r(NULL, ",\n", &lasts); arg = strtok_r(NULL, ",\n", &lasts); nexports = strtok_r(NULL, ",\n", &lasts); text = strtok_r(NULL, ",\n", &lasts); textsize = strtok_r(NULL, ",\n", &lasts); data = strtok_r(NULL, ",\n", &lasts); datasize = strtok_r(NULL, ",\n", &lasts); nsh_output(vtbl, "%-16s %8s %8s %8s %8s %8s %8s %8s %8s\n", modulename, initializer ? initializer : "", uninitializer ? uninitializer : "", arg ? arg : "", nexports ? nexports : "", text ? text : "", textsize ? textsize : "", data ? data : "", datasize ? datasize : ""); } (void)fclose(stream); return OK; } #endif /* CONFIG_FS_PROCFS && !CONFIG_FS_PROCFS_EXCLUDE_MODULE */ #endif /* CONFIG_MODULE && !CONFIG_NSH_DISABLE_MODCMDS */