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

Reply via email to