When we load extensions, sometime we do not know the exact name of the shared object file.
This patch add -s option for extend cmd to show all available shared object file. for example: crash> extend -s ./trace.so /usr/lib64/crash/extensions/dminfo.so /usr/lib64/crash/extensions/echo.so /usr/lib64/crash/extensions/eppic.so /usr/lib64/crash/extensions/snap.so /usr/lib64/crash/extensions/trace.so ./extensions/dminfo.so ./extensions/eppic.so ./extensions/echo.so ./extensions/snap.so ./extensions/trace.so crash> extend -s -l extend: -l and -s are mutually exclusive Usage: extend [shared-object ...] | [-u [shared-object ...]] | -s Enter "help extend" for details. crash> extend -s -u extend: -u and -s are mutually exclusive Usage: extend [shared-object ...] | [-u [shared-object ...]] | -s Enter "help extend" for details. crash> Also, this patch update the help for extend command: add the search order "5. the ./extensions subdirectory of the current directory" Changes since v1: - -s option also check the current working directory - fix warning Signed-off-by: Wang Long <w...@laoqinren.net> --- extensions.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- help.c | 4 +++- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/extensions.c b/extensions.c index 24b91de..d23b1e3 100644 --- a/extensions.c +++ b/extensions.c @@ -20,10 +20,13 @@ static int in_extensions_library(char *, char *); static char *get_extensions_directory(char *); +static void show_all_extensions(void); +static void show_extensions(char *); -#define DUMP_EXTENSIONS (0) -#define LOAD_EXTENSION (1) -#define UNLOAD_EXTENSION (2) +#define DUMP_EXTENSIONS (0) +#define LOAD_EXTENSION (1) +#define UNLOAD_EXTENSION (2) +#define SHOW_ALL_EXTENSIONS (4) /* * Load, unload, or list the extension libaries. @@ -36,14 +39,30 @@ cmd_extend(void) flag = DUMP_EXTENSIONS; - while ((c = getopt(argcnt, args, "lu")) != EOF) { + while ((c = getopt(argcnt, args, "lus")) != EOF) { switch(c) { + case 's': + if (flag & UNLOAD_EXTENSION) { + error(INFO, + "-s and -u are mutually exclusive\n"); + argerrs++; + }else if (flag & LOAD_EXTENSION) { + error(INFO, + "-s and -l are mutually exclusive\n"); + argerrs++; + } else + flag |= SHOW_ALL_EXTENSIONS; + break; case 'l': if (flag & UNLOAD_EXTENSION) { error(INFO, "-l and -u are mutually exclusive\n"); argerrs++; + } else if (flag & SHOW_ALL_EXTENSIONS) { + error(INFO, + "-l and -s are mutually exclusive\n"); + argerrs++; } else flag |= LOAD_EXTENSION; break; @@ -53,6 +72,10 @@ cmd_extend(void) error(INFO, "-u and -l are mutually exclusive\n"); argerrs++; + } else if (flag & SHOW_ALL_EXTENSIONS) { + error(INFO, + "-u and -s are mutually exclusive\n"); + argerrs++; } else flag |= UNLOAD_EXTENSION; break; @@ -100,6 +123,11 @@ cmd_extend(void) optind++; } break; + + case SHOW_ALL_EXTENSIONS: + show_all_extensions(); + break; + } } @@ -182,6 +210,45 @@ dump_extension_table(int verbose) } while ((ext = ext->prev)); } +static void +show_extensions(char *dir) { + DIR *dirp; + struct dirent *dp; + char filename[BUFSIZE*2]; + + dirp = opendir(dir); + if (!dirp) + return; + + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + sprintf(filename, "%s%s%s", dir, + LASTCHAR(dir) == '/' ? "" : "/", + dp->d_name); + + if (!is_shared_object(filename)) + continue; + fprintf(fp, "%s\n", filename); + } + + closedir(dirp); +} + +static void +show_all_extensions(void) +{ + char *dir; + + show_extensions("./"); + + if ((dir = getenv("CRASH_EXTENSIONS"))) + show_extensions(dir); + + if (BITS64()) + show_extensions("/usr/lib64/crash/extensions/"); + + show_extensions("/usr/lib/crash/extensions/"); + show_extensions("./extensions/"); +} /* * Load an extension library. diff --git a/help.c b/help.c index a481850..a0ebe42 100644 --- a/help.c +++ b/help.c @@ -2164,13 +2164,14 @@ NULL char *help_extend[] = { "extend", "extend the %s command set", -"[shared-object ...] | [-u [shared-object ...]]", +"[shared-object ...] | [-u [shared-object ...]] | -s", " This command dynamically loads or unloads %s extension shared object", " libraries:\n", " shared-object load the specified shared object file; more than one", " one object file may be entered.", " -u shared-object unload the specified shared object file; if no file", " arguments are specified, unload all objects.", +" -s show all available shared object file.", "\n If the shared-object filename is not expressed with a fully-qualified", " pathname, the following directories will be searched in the order shown,", " and the first instance of the file that is found will be selected:\n", @@ -2178,6 +2179,7 @@ char *help_extend[] = { " 2. the directory specified in the CRASH_EXTENSIONS environment variable", " 3. /usr/lib64/crash/extensions (64-bit architectures)", " 4. /usr/lib/crash/extensions", +" 5. the ./extensions subdirectory of the current directory", "\n If no arguments are entered, the current set of shared object files and ", " a list of their commands will be displayed. The registered commands", " contained in each shared object file will appear automatically in the ", -- 1.8.3.1 รน -- Crash-utility mailing list Crash-utility@redhat.com https://www.redhat.com/mailman/listinfo/crash-utility