Add support for requesting a specific library set for preload.  This adds
the --library option which takes an optional argument.  Without an argument
it requests use of the specific libraries installed with the version
of hugectl in use.  An argument is treated as a prefix to the library
directories and the approprate 32/64 bit library directories are added.

Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]>
---
 Makefile  |    9 ++++++-
 hugectl.c |   76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 1 deletions(-)

diff --git a/Makefile b/Makefile
index d69a365..6571672 100644
--- a/Makefile
+++ b/Makefile
@@ -101,6 +101,13 @@ BINDIR = $(PREFIX)/share/libhugetlbfs
 EXEDIR = $(PREFIX)/bin
 DOCDIR = $(PREFIX)/share/doc/libhugetlbfs
 
+ifdef LIB32
+LIBPATHS += -DLIB32='"$(LIB32)"' -DLIBDIR32='"$(LIBDIR32)"'
+endif
+ifdef LIB64
+LIBPATHS += -DLIB64='"$(LIB64)"' -DLIBDIR64='"$(LIBDIR64)"'
+endif
+
 EXTRA_DIST = \
        README \
        HOWTO \
@@ -228,7 +235,7 @@ obj64/%.s:  %.c
 
 $(OBJS):       hugectl.c
        @$(VECHO) CPP $@
-       $(CC) $(CFLAGS) -o $@ -c $<
+       $(CC) $(CFLAGS) $(LIBPATHS) -o $@ -c $<
 
 $(INSTALL_OBJ):        $(OBJS)
        @$(VECHO) CC $@
diff --git a/hugectl.c b/hugectl.c
index 755d3b6..81e76b2 100644
--- a/hugectl.c
+++ b/hugectl.c
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <limits.h>
 
 #define _GNU_SOURCE /* for getopt_long */
 #include <unistd.h>
@@ -66,6 +67,17 @@ void print_usage()
        CONT("(malloc space)");
 
        OPTION("--no-preload", "Disable preloading the libhugetlbfs library");
+
+       OPTION("--library-use-path", "Use the system library path");
+       OPTION("--library <path>", "Select a library prefix");
+       CONT("(Default: "
+#ifdef LIBDIR32
+               LIBDIR32 ":"
+#endif
+#ifdef LIBDIR32
+               LIBDIR32 ":"
+#endif
+               ")");
 }
 
 int verbose_level = VERBOSITY_DEFAULT;
@@ -97,6 +109,9 @@ void setup_environment(char *var, char *val)
 
 #define LONG_NO_PRELOAD        (LONG_BASE | 'p')
 
+#define LONG_NO_LIBRARY        (LONG_BASE | 'L')
+#define LONG_LIBRARY   (LONG_BASE | 'l')
+
 /*
  * Mapping selectors, one bit per remappable/backable area as requested
  * by the user.  These are also used as returns from getopts where they
@@ -140,6 +155,51 @@ void setup_mappings(int which)
                setup_environment("HUGETLB_MORECORE", "yes");
 }
 
+#define LIBRARY_DISABLE ((void *)-1)
+
+void library_path(char *path)
+{
+       char val[NAME_MAX] = "";
+       char *env;
+
+       /*
+        * Select which libraries we wish to use.  No argument implies
+        * use the libraries included with this version of hugectl.
+        * Else it is assumed to be a prefix to the 32/64 bit directories
+        * both of which are added, where available.
+        */
+       env = getenv("LD_LIBRARY_PATH");
+       if (!path) {
+               /* [LIBDIR32:][LIBDIR64:]$LD_LIBRARY_PATH */
+               snprintf(val, sizeof(val), ""
+#ifdef LIBDIR32
+                       LIBDIR32 ":"
+#endif
+#ifdef LIBDIR64
+                       LIBDIR64 ":"
+#endif
+                       "%s", env ? env : "");
+       } else {
+               /* [$PATH/LIB32:][$PATH/LIB64:]$LD_LIBRARY_PATH */
+               snprintf(val, sizeof(val), ""
+#ifdef LIBDIR32
+               "%s/" LIB32 ":"
+#endif
+#ifdef LIBDIR64
+               "%s/" LIB64 ":"
+#endif
+               "%s",
+#ifdef LIBDIR32
+               path,
+#endif
+#ifdef LIBDIR64
+               path,
+#endif
+               env ? env : "");
+       }
+       setup_environment("LD_LIBRARY_PATH", val);
+}
+
 void ldpreload(int which)
 {
        if (which == MAP_HEAP) {
@@ -154,12 +214,16 @@ int main(int argc, char** argv)
 {
        int opt_mappings = 0;
        int opt_preload = 1;
+       char *opt_library = NULL;
 
        char opts[] = "+h";
        int ret = 0, index = 0;
        struct option long_opts[] = {
                {"help",       no_argument, NULL, 'h'},
                {"no-preload", no_argument, NULL, LONG_NO_PRELOAD},
+               {"library-use-path",
+                              no_argument, NULL, LONG_NO_LIBRARY},
+               {"library",    required_argument, NULL, LONG_LIBRARY},
 
                {"disable",    no_argument, NULL, MAP_BASE|MAP_DISABLE},
                {"text",       no_argument, NULL, MAP_BASE|MAP_TEXT},
@@ -192,6 +256,15 @@ int main(int argc, char** argv)
                        DEBUG("LD_PRELOAD disabled\n");
                        break;
 
+               case LONG_NO_LIBRARY:
+                       opt_library = LIBRARY_DISABLE;
+                       DEBUG("using LD_LIBRARY_PATH to find library\n");
+                       break;
+
+               case LONG_LIBRARY:
+                       opt_library = optarg;
+                       break;
+
                default:
                        WARNING("unparsed option %08x\n", ret);
                        ret = -1;
@@ -206,6 +279,9 @@ int main(int argc, char** argv)
                exit(EXIT_FAILURE);
        }
 
+       if (opt_library != LIBRARY_DISABLE)
+               library_path(opt_library);
+
        if (opt_mappings)
                setup_mappings(opt_mappings);
 
-- 
1.5.6.GIT


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Libhugetlbfs-devel mailing list
Libhugetlbfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to