Module Name: src Committed By: pooka Date: Thu Jan 16 01:54:47 UTC 2014
Modified Files: src/distrib/sets/lists/base: mi src/distrib/sets/lists/man: mi src/usr.bin: Makefile Added Files: src/usr.bin/rump_wmd: Makefile rump_wmd.1 rump_wmd.sh Log Message: Add rump_wmd, a utility to resolve rump kernel component dependencies. To generate a diff of this commit: cvs rdiff -u -r1.1058 -r1.1059 src/distrib/sets/lists/base/mi cvs rdiff -u -r1.1456 -r1.1457 src/distrib/sets/lists/man/mi cvs rdiff -u -r1.215 -r1.216 src/usr.bin/Makefile cvs rdiff -u -r0 -r1.1 src/usr.bin/rump_wmd/Makefile \ src/usr.bin/rump_wmd/rump_wmd.1 src/usr.bin/rump_wmd/rump_wmd.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/base/mi diff -u src/distrib/sets/lists/base/mi:1.1058 src/distrib/sets/lists/base/mi:1.1059 --- src/distrib/sets/lists/base/mi:1.1058 Tue Jan 14 18:52:19 2014 +++ src/distrib/sets/lists/base/mi Thu Jan 16 01:54:47 2014 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1058 2014/01/14 18:52:19 christos Exp $ +# $NetBSD: mi,v 1.1059 2014/01/16 01:54:47 pooka Exp $ # # Note: Don't delete entries from here - mark them as "obsolete" instead, # unless otherwise stated below. @@ -672,6 +672,7 @@ ./usr/bin/rump.sockstat base-util-bin rump ./usr/bin/rump_allserver base-util-bin rump ./usr/bin/rump_server base-util-bin rump +./usr/bin/rump_wmd base-util-bin rump ./usr/bin/rup base-netutil-bin ./usr/bin/ruptime base-netutil-bin ./usr/bin/rusers base-netutil-bin Index: src/distrib/sets/lists/man/mi diff -u src/distrib/sets/lists/man/mi:1.1456 src/distrib/sets/lists/man/mi:1.1457 --- src/distrib/sets/lists/man/mi:1.1456 Sat Dec 28 03:27:01 2013 +++ src/distrib/sets/lists/man/mi Thu Jan 16 01:54:47 2014 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1456 2013/12/28 03:27:01 christos Exp $ +# $NetBSD: mi,v 1.1457 2014/01/16 01:54:47 pooka Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -484,6 +484,7 @@ ./usr/share/man/cat1/rump.halt.0 man-netutil-catman .cat,rump ./usr/share/man/cat1/rump_allserver.0 man-netutil-catman .cat,rump ./usr/share/man/cat1/rump_server.0 man-netutil-catman .cat,rump +./usr/share/man/cat1/rump_wmd.0 man-netutil-catman .cat,rump ./usr/share/man/cat1/rup.0 man-netutil-catman .cat ./usr/share/man/cat1/ruptime.0 man-netutil-catman .cat ./usr/share/man/cat1/rusers.0 man-netutil-catman .cat @@ -3550,6 +3551,7 @@ ./usr/share/man/html1/rump.halt.html man-netutil-htmlman html,rump ./usr/share/man/html1/rump_allserver.html man-netutil-htmlman html,rump ./usr/share/man/html1/rump_server.html man-netutil-htmlman html,rump +./usr/share/man/html1/rump_wmd.html man-netutil-htmlman html,rump ./usr/share/man/html1/rup.html man-netutil-htmlman html ./usr/share/man/html1/ruptime.html man-netutil-htmlman html ./usr/share/man/html1/rusers.html man-netutil-htmlman html @@ -6266,6 +6268,7 @@ ./usr/share/man/man1/rump.halt.1 man-netutil-man .man,rump ./usr/share/man/man1/rump_allserver.1 man-netutil-man .man,rump ./usr/share/man/man1/rump_server.1 man-netutil-man .man,rump +./usr/share/man/man1/rump_wmd.1 man-netutil-man .man,rump ./usr/share/man/man1/rup.1 man-netutil-man .man ./usr/share/man/man1/ruptime.1 man-netutil-man .man ./usr/share/man/man1/rusers.1 man-netutil-man .man Index: src/usr.bin/Makefile diff -u src/usr.bin/Makefile:1.215 src/usr.bin/Makefile:1.216 --- src/usr.bin/Makefile:1.215 Sat Dec 28 02:32:01 2013 +++ src/usr.bin/Makefile Thu Jan 16 01:54:47 2014 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.215 2013/12/28 02:32:01 rjs Exp $ +# $NetBSD: Makefile,v 1.216 2014/01/16 01:54:47 pooka Exp $ # from: @(#)Makefile 8.3 (Berkeley) 1/7/94 .include <bsd.own.mk> @@ -44,7 +44,8 @@ SUBDIR+= apropos whatis .endif .if (${MKRUMP} != "no") -SUBDIR+= rump_allserver rump_dhcpclient rump_halt rump_server shmif_dumpbus +SUBDIR+= rump_allserver rump_dhcpclient rump_halt rump_server shmif_dumpbus \ + rump_wmd .endif .if (${MKBSDGREP} != "no") Added files: Index: src/usr.bin/rump_wmd/Makefile diff -u /dev/null src/usr.bin/rump_wmd/Makefile:1.1 --- /dev/null Thu Jan 16 01:54:47 2014 +++ src/usr.bin/rump_wmd/Makefile Thu Jan 16 01:54:47 2014 @@ -0,0 +1,7 @@ +# $NetBSD: Makefile,v 1.1 2014/01/16 01:54:47 pooka Exp $ +# + +MAN= rump_wmd.1 +SCRIPTS=rump_wmd.sh + +.include <bsd.prog.mk> Index: src/usr.bin/rump_wmd/rump_wmd.1 diff -u /dev/null src/usr.bin/rump_wmd/rump_wmd.1:1.1 --- /dev/null Thu Jan 16 01:54:47 2014 +++ src/usr.bin/rump_wmd/rump_wmd.1 Thu Jan 16 01:54:47 2014 @@ -0,0 +1,94 @@ +.\" $NetBSD: rump_wmd.1,v 1.1 2014/01/16 01:54:47 pooka Exp $ +.\" +.\" Copyright (c) 2014 Antti Kantee. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd January 16, 2014 +.Dt RUMP_WMD 1 +.Os +.Sh NAME +.Nm rump_wmd +.Nd Resolve rump kernel component dependencies +.Sh SYNOPSIS +.Nm +.Op Fl L Ar libdir +.Op Fl v +.Fl l Ar component +.Sh DESCRIPTION +The +.Nm +utility can be used to resolve the link dependencies of rump kernel +components. +This functionality is useful when desiring to run a rump kernel with +a given set of drivers, but not being sure what the dependencies of +those drivers are. +The output of +.Nm +is accepted as command line input by +.Xr rump_server 1 . +.Pp +The command line options are: +.Bl -tag -width indent +.It Fl L Ar libdir +By default, rump kernel components in +.Pa /usr/lib +are examined. +If this option is supplied, components in +.Ar libdir +are examined instead. +.It Fl v +Increase debug output from the utility. +This option may be given multiple times. +.It Fl l Ar component +Resolve dependencies for the given component. +This option may be given multiple time. +.El +.Sh EXAMPLES +Resolve dependencies for FFS: +.Bd -literal -offset indent +$ rump_wmd -lrumpfs_ffs +DEBUG0: Searching component combinations. This may take a while ... +DEBUG0: Found a set +-lrumpdev -lrumpdev_disk -lrumpvfs -lrumpfs_ffs +.Ed +.Pp +Resolve dependencies for NFS, use IPv6 networking and the virtif +network interface: +.Bd -literal -offset indent +$ rump_wmd -lrumpfs_nfs -lrumpnet_netinet6 -lrumpnet_virtif +DEBUG0: Searching component combinations. This may take a while ... +DEBUG0: Found a set +-lrumpnet -lrumpnet_net -lrumpvfs -lrumpfs_nfs -lrumpnet_netinet6 -lrumpnet_virtif +.Ed +.Sh CAVEATS +Since +.Nm +uses trial-and-error brute force resolution, it runs somewhat slow. +If several seconds are spent for dependency resolution, the benefit of +a rump kernel booting in 10ms is somewhat lost. +Caching the output is highly recommended. +.Sh FUNFACTS +.Nm +is short for "rump, where's my dependency". +.Sh SEE ALSO +.Xr rump_server 1 Index: src/usr.bin/rump_wmd/rump_wmd.sh diff -u /dev/null src/usr.bin/rump_wmd/rump_wmd.sh:1.1 --- /dev/null Thu Jan 16 01:54:47 2014 +++ src/usr.bin/rump_wmd/rump_wmd.sh Thu Jan 16 01:54:47 2014 @@ -0,0 +1,158 @@ +#!/bin/sh +# +# Copyright (c) 2014 Antti Kantee <po...@iki.fi> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +: ${CC:=cc} +DEBUGLEVEL=0 +LIBDIR=/usr/lib + +die () +{ + + echo $* >&2 + exit 1 +} + +usage () +{ + + die "Usage: $0 [-v] [-L libdir] -lrump_component [...]" +} + +unset FIRSTLIB +while getopts 'l:L:v' opt; do + case "${opt}" in + l) + : ${FIRSTLIB:=${OPTIND}} + ;; + L) + [ -z "${FIRSTLIB}" ] || usage + LIBDIR=${OPTARG} + ;; + v) + [ -z "${FIRSTLIB}" ] || usage + DEBUGLEVEL=$((DEBUGLEVEL + 1)) + ;; + -h|*) + usage + ;; + esac +done +shift $((${FIRSTLIB} - 2)) +[ $# -eq 0 ] && usage + +debug () +{ + + [ ${DEBUGLEVEL} -ge ${1} ] && \ + { lvl=$1; shift; echo DEBUG${lvl}: $* >&2; } +} + +# filters from list +filter () +{ + + filtee=$1 + vname=$2 + tmplist='' + found=false + for x in $(eval echo \${${vname}}); do + if [ "${filtee}" = "${x}" ]; then + found=true + else + tmplist="${tmplist} ${x}" + fi + done + ${found} || die \"${1}\" not found in \$${2} + + eval ${vname}="\${tmplist}" +} + +SEEDPROG='int rump_init(void); int main() { rump_init(); }' +CCPARAMS='-Wl,--no-as-needed -o /dev/null -x c -' + +# sanity-check +for lib in $* ; do + [ "${lib#-l}" = "${lib}" -o -z "${lib#-l}" ] \ + && die Param \"${lib}\" is not of format -llib +done + +# starting set and available components +WANTEDCOMP="$*" +RUMPBASE='-lrump -lrumpuser' +CURCOMP="${WANTEDCOMP}" +NEEDEDCOMP='' +ALLCOMP=$(ls ${LIBDIR} 2>/dev/null \ + | sed -n '/^librump.*.so$/{s/lib/-l/;s/\.so//p;}') +[ -z "${ALLCOMP}" ] && die No rump kernel components in \"${LIBDIR}\" + +# filter out ones we'll definitely not use +for f in ${CURCOMP} -lrumphijack -lrumpclient; do + filter ${f} ALLCOMP +done + +# put the factions first so that they'll be tried first. +# this is an optimization to minimize link attempts. +FACTIONS='-lrumpvfs -lrumpnet -lrumpdev' +for f in ${FACTIONS}; do + filter ${f} ALLCOMP +done +ALLCOMP="${FACTIONS} ${ALLCOMP}" + +debug 0 Searching component combinations. This may take a while ... +while :; do + debug 1 Current components: ${CURCOMP} + + IFS=' ' + out=$(echo ${SEEDPROG} \ + | ${CC} -L${LIBDIR} ${CCPARAMS} ${CURCOMP} ${RUMPBASE} 2>&1) + [ -z "${out}" ] && break + undef=$(echo ${out} \ + | sed -n '/undefined reference to/{s/.*`//;s/.$//p;q;}') + [ -z "${undef}" ] && break + + debug 1 Trying to find ${undef} + for attempt in ${ALLCOMP}; do + debug 2 Component attempt: ${attempt} + unset IFS + nowundef=$(echo ${SEEDPROG} \ + | ${CC} -L${LIBDIR} ${CCPARAMS} \ + ${attempt} ${CURCOMP} ${RUMPBASE} 2>&1 \ + | sed -n '/undefined reference to/{s/.*`//;s/.$//p;}') + for one in ${nowundef}; do + [ "${one}" = "${undef}" ] && continue 2 + done + CURCOMP="${attempt} ${CURCOMP}" + filter ${attempt} ALLCOMP + debug 1 Found ${undef} from ${attempt} + continue 2 + done + die Internal error: unreachable statement +done + +[ ! -z "${out}" ] && { echo 'ERROR:' >&2 ; echo ${out} >&2 ; exit 1 ; } +debug 0 Found a set +echo ${CURCOMP} +exit 0