minor optimizations
[util-vserver.git] / util-vserver / scripts / vrpm-preload
1 #! /bin/bash
2 # $Id$
3
4 # Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 #  
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; version 2 of the License.
9 #  
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #  
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 set -e
20
21 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
22 test -e "$UTIL_VSERVER_VARS" || {
23     echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
24     exit 1
25 }
26 . "$UTIL_VSERVER_VARS"
27
28 function getCapFlags
29 {
30     local ctx=$1
31     
32     if test "$ctx" && ! $_VSERVER_INFO - FEATURE migrate; then
33         set -- $($_CHCONTEXT_COMPAT --xid 1 \
34             sh -c "cat /proc/[0-9]*/status | egrep '^(CapBset|s_context|ctxflags)'" | \
35             grep -B 1 -A 1 "^s_context: $ctx " | \
36             sed -e '1,3p;d' | awk '{ print $2 }')
37     else
38         set --
39     fi
40
41     if test "$3"; then
42         RPM_FAKE_CAP=$[ ~0x$1 ]
43         RPM_FAKE_FLAGS=$3
44     else
45         RPM_FAKE_CAP=$[ ~0xd40c04ff ]
46         RPM_FAKE_FLAGS=4
47     fi
48 }
49
50 lib=$_RPM_FAKE_SO
51
52 #scall_nr=$($_VSERVER_INFO  x SYSCALL_NEW_S_CONTEXT_NR  2>/dev/null)
53 #scall_rev=$($_VSERVER_INFO x SYSCALL_NEW_S_CONTEXT_REV 2>/dev/null)
54 vdir=$($_VSERVER_INFO "$CUR_VSERVER" VDIR)    || vdir="$CUR_VSERVER"
55 ctx=$($_VSERVER_INFO  "$CUR_VSERVER" CONTEXT) || ctx=
56
57 test -d "$vdir" || {
58     echo $"Can not find chroot environment at '$vdir' for '$CUR_VSERVER'" >&2
59     exit 1
60 }
61 for bin in `which rpm` /bin/rpm /usr/lib/rpm/rpm${RPM_FLAVOR:-i} ""; do
62     ldd "$bin" &>/dev/null && break
63 done
64
65 test "$bin" || {
66     echo $"No dynamically linked rpm binary found; exiting..."  >&2
67     exit 1
68 }
69
70
71 getCapFlags "$ctx"
72
73 export RPM_FAKE_CAP RPM_FAKE_FLAGS
74
75 #RPM_FAKE_S_CONTEXT_REV=$scall_rev \
76 #RPM_FAKE_S_CONTEXT_NR=$scall_nr \
77 RPM_FAKE_CHROOT=$vdir \
78 RPM_FAKE_CTX=$ctx \
79 LD_PRELOAD=$lib${LD_PRELOAD:+:$LD_PRELOAD} \
80 exec $bin "$@"