Thanks Wang -- queued for crash-7.2.9:
https://github.com/crash-utility/crash/commit/5dfbc7aa27392a095b207d31654...
Dave
----- Original Message -----
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(a)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