Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/rump_allserver Attempt to load all components even i...



details:   https://anonhg.NetBSD.org/src/rev/0fd48b6ba387
branches:  trunk
changeset: 792758:0fd48b6ba387
user:      pooka <pooka%NetBSD.org@localhost>
date:      Thu Jan 16 00:31:39 2014 +0000

description:
Attempt to load all components even if they are not given in
dependency order.

diffstat:

 usr.bin/rump_allserver/rump_allserver.1 |  21 ++++++--
 usr.bin/rump_allserver/rump_allserver.c |  82 ++++++++++++++++++++++++--------
 2 files changed, 76 insertions(+), 27 deletions(-)

diffs (200 lines):

diff -r cdf4936846d4 -r 0fd48b6ba387 usr.bin/rump_allserver/rump_allserver.1
--- a/usr.bin/rump_allserver/rump_allserver.1   Wed Jan 15 22:25:22 2014 +0000
+++ b/usr.bin/rump_allserver/rump_allserver.1   Thu Jan 16 00:31:39 2014 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: rump_allserver.1,v 1.19 2011/03/04 09:13:23 pooka Exp $
+.\"    $NetBSD: rump_allserver.1,v 1.20 2014/01/16 00:31:39 pooka Exp $
 .\"
 .\" Copyright (c) 2010 Antti Kantee.  All rights reserved.
 .\"
@@ -23,7 +23,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd February 21, 2011
+.Dd January 15, 2014
 .Dt RUMP_SERVER 1
 .Os
 .Sh NAME
@@ -157,9 +157,13 @@
 .Ar library
 can contain a full path or a filename, in which case the standard
 dynamic library search path will be used.
-Libraries are loaded in the order they are given.
-Dependencies are not autoloaded, and the order must be specified
-correctly.
+By default, lazy resolution is used, and may result in a runtime
+error due to missing components.
+To test a configuration, run
+.Nm
+with
+.Ev LD_BIND_NOW=1
+(see examples).
 .It Fl m Ar module
 Load and link a kernel module after the rump kernel is initialized.
 For this to work, the rump kernel must include the vfs faction,
@@ -210,9 +214,14 @@
 $ rump_server tcp://0:3755/
 .Ed
 .Pp
+Test that a configuration contains all of the necessary components:
+.Bd -literal -offset indent
+$ env LD_BIND_NOW=1 rump_server -lrumpvfs -lrumpfs_ffs unix://tsock
+.Ed
+.Pp
 Start a FFS server with a 16MB kernel memory limit.
 .Bd -literal -offset indent
-$ rump_server -lrumpvfs -lrumpfs_ffs -r 16m unix:///tmp/ffs_server
+$ rump_server -lrumpfs_ffs [...] -r 16m unix://ffs
 .Ed
 .Sh SEE ALSO
 .Xr rump.halt 1 ,
diff -r cdf4936846d4 -r 0fd48b6ba387 usr.bin/rump_allserver/rump_allserver.c
--- a/usr.bin/rump_allserver/rump_allserver.c   Wed Jan 15 22:25:22 2014 +0000
+++ b/usr.bin/rump_allserver/rump_allserver.c   Thu Jan 16 00:31:39 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rump_allserver.c,v 1.33 2013/12/31 00:23:56 pooka Exp $        */
+/*     $NetBSD: rump_allserver.c,v 1.34 2014/01/16 00:31:39 pooka Exp $        */
 
 /*-
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include <rump/rumpuser_port.h>
 
 #ifndef lint
-__RCSID("$NetBSD: rump_allserver.c,v 1.33 2013/12/31 00:23:56 pooka Exp $");
+__RCSID("$NetBSD: rump_allserver.c,v 1.34 2014/01/16 00:31:39 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -136,6 +136,8 @@
 
 static void processlabel(int, int, int, off_t *, off_t *);
 
+#define ALLOCCHUNK 32
+
 int
 main(int argc, char *argv[])
 {
@@ -143,10 +145,10 @@
        struct etfsreg *etfs = NULL;
        unsigned netfs = 0, curetfs = 0;
        int error;
-       int ch, sflag;
+       int ch, sflag, onthepath;
        unsigned i;
-       char **modarray = NULL;
-       unsigned nmods = 0, curmod = 0;
+       char **modarray = NULL, **libarray = NULL;
+       unsigned nmods = 0, curmod = 0, nlibs = 0, curlib = 0, libidx, liblast;
 
 #ifdef PLATFORM_HAS_SETGETPROGNAME
        setprogname(argv[0]);
@@ -292,10 +294,11 @@
                                ftype = RUMP_ETFS_BLK;
 
                        if (netfs - curetfs == 0) {
-                               etfs = realloc(etfs, (netfs+16)*sizeof(*etfs));
+                               etfs = realloc(etfs,
+                                   (netfs+ALLOCCHUNK)*sizeof(*etfs));
                                if (etfs == NULL)
                                        die(1, errno, "realloc etfs");
-                               netfs += 16;
+                               netfs += ALLOCCHUNK;
                        }
 
                        etfs[curetfs].key = key;
@@ -309,28 +312,25 @@
                        break;
                }
                case 'l':
-                       if (dlopen(optarg, RTLD_LAZY|RTLD_GLOBAL) == NULL) {
-                               char pb[MAXPATHLEN];
-                               /* try to mimic linker -l syntax */
-
-                               snprintf(pb, sizeof(pb), "lib%s.so", optarg);
-                               if (dlopen(pb, RTLD_LAZY|RTLD_GLOBAL) == NULL) {
-                                       fprintf(stderr, "dlopen: %s", dlerror());
-                                       die(1, 0, NULL);
-                               }
+                       if (nlibs - curlib == 0) {
+                               libarray = realloc(libarray,
+                                   (nlibs+ALLOCCHUNK) * sizeof(char *));
+                               if (libarray == NULL)
+                                       die(1, errno, "realloc");
+                               nlibs += ALLOCCHUNK;
                        }
+                       libarray[curlib++] = optarg;
                        break;
-               case 'm': {
-
+               case 'm':
                        if (nmods - curmod == 0) {
                                modarray = realloc(modarray,
-                                   (nmods+16) * sizeof(char *));
+                                   (nmods+ALLOCCHUNK) * sizeof(char *));
                                if (modarray == NULL)
                                        die(1, errno, "realloc");
-                               nmods += 16;
+                               nmods += ALLOCCHUNK;
                        }
                        modarray[curmod++] = optarg;
-                       break; }
+                       break;
                case 'r':
                        setenv("RUMP_MEMLIMIT", optarg, 1);
                        break;
@@ -352,6 +352,45 @@
        if (argc != 1)
                usage();
 
+       /*
+        * Automatically "resolve" component dependencies, i.e.
+        * try to load libs in a loop until all are loaded or a
+        * full loop completes with no loads (latter case is an error).
+        */
+       for (onthepath = 1, nlibs = curlib; onthepath && nlibs > 0;) {
+               onthepath = 0;
+               for (libidx = 0; libidx < curlib; libidx++) {
+                       /* loaded already? */
+                       if (libarray[libidx] == NULL)
+                               continue;
+
+                       /* try to load */
+                       liblast = libidx;
+                       if (dlopen(libarray[libidx],
+                           RTLD_LAZY|RTLD_GLOBAL) == NULL) {
+                               char pb[MAXPATHLEN];
+                               /* try to mimic linker -l syntax */
+                               snprintf(pb, sizeof(pb),
+                                   "lib%s.so", libarray[libidx]);
+                               if (dlopen(pb, RTLD_LAZY|RTLD_GLOBAL) == NULL)
+                                       continue;
+                       }
+
+                       /* managed to load that one */
+                       libarray[libidx] = NULL;
+                       nlibs--;
+                       onthepath = 1;
+               }
+       }
+       if (nlibs > 0) {
+               fprintf(stderr,
+                   "failed to load -libraries, last error from \"%s\":\n",
+                   libarray[liblast]);
+               fprintf(stderr, "  %s", dlerror());
+               die(1, 0, NULL);
+       }
+       free(libarray);
+
        serverurl = argv[0];
 
        if (!sflag) {
@@ -384,6 +423,7 @@
                rump_pub_etfs_remove(ETFSKEY);
 #undef ETFSKEY
        }
+       free(modarray);
 
        /* register host drives */
        for (i = 0; i < curetfs; i++) {



Home | Main Index | Thread Index | Old Index