summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenedikt Boehm <hollow@gentoo.org>2006-03-26 07:19:04 +0000
committerBenedikt Boehm <hollow@gentoo.org>2006-03-26 07:19:04 +0000
commit0139f54f5d5d939223ba39267aef6eeed9c0ebb1 (patch)
tree265c36196b720fdfb322a663c4041d37a2b94f19
parentPreparing -r1 for 2.0.2_rc14 and 2.1.1_rc14, still waiting for more patches (diff)
downloadmisc-0139f54f5d5d939223ba39267aef6eeed9c0ebb1.tar.gz
misc-0139f54f5d5d939223ba39267aef6eeed9c0ebb1.tar.bz2
misc-0139f54f5d5d939223ba39267aef6eeed9c0ebb1.zip
import chcontext fix; syscall update
svn path=/; revision=298
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-fix-fastboot.patch13
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-nicefix.patch24
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-rkill.patch26
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-sharedportage.patch11
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.209-remove-traditional-syscall.patch29
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-bmask.patch14
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-chcontext-secure.patch14
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-delete-cmd.patch38
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-gentoo-tools.patch74
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-remove-init-style-gentoo.patch15
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-syscall-update.patch209
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-testsuite-fix.patch52
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vlogin.patch448
-rw-r--r--util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vprocunhide-fix.patch9
14 files changed, 976 insertions, 0 deletions
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-fix-fastboot.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-fix-fastboot.patch
new file mode 100644
index 0000000..7bf246d
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-fix-fastboot.patch
@@ -0,0 +1,13 @@
+diff -Nrup util-vserver-0.30.208.orig/scripts/vserver.functions util-vserver-0.30.208/scripts/vserver.functions
+--- util-vserver-0.30.208.orig/scripts/vserver.functions 2005-07-03 19:47:06.000000000 +0200
++++ util-vserver-0.30.208/scripts/vserver.functions 2005-08-03 11:59:32.000000000 +0200
+@@ -627,8 +627,7 @@ function prepareInit
+ find var/lock ! -type d -print0; } | xargs -0r $_CHROOT_SH rm
+ ;;
+ plain)
+- $_CHROOT_SH rm .autofsck forcefsck 2>/dev/null || :
+- : | $_CHROOT_SH truncate fastboot 2>/dev/null || :
++ $_CHROOT_SH rm .autofsck forcefsck fastboot 2> /dev/null || :
+ ;;
+ minit)
+ ;;
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-nicefix.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-nicefix.patch
new file mode 100644
index 0000000..8b489f0
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-nicefix.patch
@@ -0,0 +1,24 @@
+diff -NurpP util-vserver-0.30.208/scripts/legacy/vserver util-vserver-0.30.208-nicefix/scripts/legacy/vserver
+--- util-vserver-0.30.208/scripts/legacy/vserver 2005-03-21 21:03:31.000000000 +0100
++++ util-vserver-0.30.208-nicefix/scripts/legacy/vserver 2005-10-27 13:33:37.384017250 +0200
+@@ -514,7 +514,7 @@ elif [ "$2" = "start" ] ; then
+ DOMAINOPT="--domainname $S_DOMAINNAME"
+ fi
+ if [ "$S_NICE" != "" ] ; then
+- NICECMD="nice -$S_NICE"
++ NICECMD="nice -n $S_NICE"
+ fi
+ mkdir -p $__PKGSTATEDIR
+ chmod 700 $__PKGSTATEDIR
+diff -NurpP util-vserver-0.30.208/scripts/vserver.functions util-vserver-0.30.208-nicefix/scripts/vserver.functions
+--- util-vserver-0.30.208/scripts/vserver.functions 2005-07-03 19:47:06.000000000 +0200
++++ util-vserver-0.30.208-nicefix/scripts/vserver.functions 2005-10-27 13:32:33.332014250 +0200
+@@ -100,7 +100,7 @@ function _generateNiceCommand
+ test -r "$vdir/nice" || return 0;
+ read nice <"$vdir"/nice
+
+- NICE_CMD=( $_NICE -$nice )
++ NICE_CMD=( $_NICE -n $nice )
+ }
+
+
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-rkill.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-rkill.patch
new file mode 100644
index 0000000..058e404
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-rkill.patch
@@ -0,0 +1,26 @@
+diff -NurpP util-vserver-0.30.208/lib/cflags-v13.c util-vserver-0.30.208-rkill/lib/cflags-v13.c
+--- util-vserver-0.30.208/lib/cflags-v13.c 2004-10-21 21:00:20.000000000 +0200
++++ util-vserver-0.30.208-rkill/lib/cflags-v13.c 2005-09-30 14:32:27.575320000 +0200
+@@ -54,6 +54,9 @@ static struct Mapping_uint64 const VALUE
+ DECL("state_setup", VC_VXF_STATE_SETUP),
+ DECL("state_init", VC_VXF_STATE_INIT),
+
++ DECL("sc_helper", VC_VXF_SC_HELPER),
++ DECL("reboot_kill", VC_VXF_REBOOT_KILL),
++
+ DECL("fork_rss", VC_VXF_FORK_RSS),
+ DECL("prolific", VC_VXF_PROLIFIC),
+ DECL("igneg_nice", VC_VXF_IGNEG_NICE),
+diff -NurpP util-vserver-0.30.208/lib/vserver.h util-vserver-0.30.208-rkill/lib/vserver.h
+--- util-vserver-0.30.208/lib/vserver.h 2005-07-15 18:27:02.000000000 +0200
++++ util-vserver-0.30.208-rkill/lib/vserver.h 2005-09-30 14:33:08.485876750 +0200
+@@ -181,6 +181,9 @@
+ #define VC_VXF_STATE_SETUP (1ULL<<32)
+ #define VC_VXF_STATE_INIT (1ULL<<33)
+
++#define VC_VXF_SC_HELPER (1ULL<<36)
++#define VC_VXF_REBOOT_KILL (1ULL<<37)
++
+ #define VC_VXF_FORK_RSS (1ULL<<48)
+ #define VC_VXF_PROLIFIC (1ULL<<49)
+
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-sharedportage.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-sharedportage.patch
new file mode 100644
index 0000000..051e7f5
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.208-sharedportage.patch
@@ -0,0 +1,11 @@
+diff -NurpP util-vserver-0.30.208/distrib/misc/fstab util-vserver-0.30.208-sharedportage/distrib/misc/fstab
+--- util-vserver-0.30.208/distrib/misc/fstab 2005-02-19 19:12:34.000000000 +0100
++++ util-vserver-0.30.208-sharedportage/distrib/misc/fstab 2005-09-30 14:39:41.790456750 +0200
+@@ -1,3 +1,7 @@
+ none /proc proc defaults 0 0
+ none /tmp tmpfs size=16m,mode=1777 0 0
+ none /dev/pts devpts gid=5,mode=620 0 0
++
++# shared portage tree
++#/usr/portage /usr/portage none bind,ro 0 0
++#/usr/portage/distfiles /usr/portage/distfiles none bind,rw 0 0
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.209-remove-traditional-syscall.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.209-remove-traditional-syscall.patch
new file mode 100644
index 0000000..fdb676a
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.209-remove-traditional-syscall.patch
@@ -0,0 +1,29 @@
+Index: util-vserver-0.30.209/config.h.in
+===================================================================
+--- util-vserver-0.30.209.orig/config.h.in
++++ util-vserver-0.30.209/config.h.in
+@@ -232,10 +232,4 @@
+ /* Use 64bit interface for filesystem operations */
+ #undef _FILE_OFFSET_BITS
+
+-
+-#if defined(__pic__) && defined(__i386) && !defined(ENSC_SYSCALL_TRADITIONAL) && !defined(ENSC_USE_ALTERNATIVE_SYSCALL_MACROS)
+-# define ENSC_SYSCALL_TRADITIONAL 1
+-#endif
+-
+ #include "compat.h"
+-
+Index: util-vserver-0.30.209/m4/ensc_syscall.m4
+===================================================================
+--- util-vserver-0.30.209.orig/m4/ensc_syscall.m4
++++ util-vserver-0.30.209/m4/ensc_syscall.m4
+@@ -101,9 +101,4 @@ int main() {
+ if test x"$with_syscall" = xtraditional; then
+ AC_DEFINE(ENSC_SYSCALL_TRADITIONAL, 1, [Define to 1 when the fast syscall(2) invocation does not work])
+ fi
+-
+- AH_BOTTOM([
+-#if defined(__pic__) && defined(__i386) && !defined(ENSC_SYSCALL_TRADITIONAL) && !defined(ENSC_USE_ALTERNATIVE_SYSCALL_MACROS)
+-# define ENSC_SYSCALL_TRADITIONAL 1
+-#endif])
+ ])
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-bmask.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-bmask.patch
new file mode 100644
index 0000000..93270c1
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-bmask.patch
@@ -0,0 +1,14 @@
+--- util-vserver-0.30.210.orig/lib/syscall_setccaps-v13.hc 2004-03-24 02:07:11.000000000 +0100
++++ util-vserver-0.30.210/lib/syscall_setccaps-v13.hc 2006-03-03 17:19:15.000000000 +0100
+@@ -25,7 +25,10 @@
+ {
+ struct vcmd_ctx_caps_v0 k_caps;
+
+- k_caps.bcaps = caps->bcaps & caps->bmask;
++ if (caps->bmask)
++ k_caps.bcaps = caps->bcaps & caps->bmask;
++ else
++ k_caps.bcaps = ~0;
+ k_caps.ccaps = caps->ccaps;
+ k_caps.cmask = caps->cmask;
+
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-chcontext-secure.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-chcontext-secure.patch
new file mode 100644
index 0000000..2b91fc2
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-chcontext-secure.patch
@@ -0,0 +1,14 @@
+--- util-vserver-0.30.210.orig/scripts/chcontext 2005-04-08 21:14:47.000000000 +0200
++++ util-vserver-0.30.210/scripts/chcontext 2006-03-25 05:17:00.000000000 +0100
+@@ -153,9 +153,9 @@
+ chain_cmd=( "${chain_cmd[@]}"
+ --
+ $_VATTRIBUTE --set
++ ${OPT_SECURE:+--secure}
+ ${OPT_CAPS:+--bcap "${OPT_CAPS[*]}"}
+- ${OPT_FLAGS:+--flag "${OPT_FLAGS[*]}"}
+- ${OPT_SECURE:+--secure} )
++ ${OPT_FLAGS:+--flag "${OPT_FLAGS[*]}"} )
+
+ migrate_cmd=( $_VCONTEXT
+ ${OPT_SILENT:+--silent}
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-delete-cmd.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-delete-cmd.patch
new file mode 100644
index 0000000..b6f446f
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-delete-cmd.patch
@@ -0,0 +1,38 @@
+diff -NurpP util-vserver-0.30.210/scripts/vserver util-vserver-0.30.210-delete/scripts/vserver
+--- util-vserver-0.30.210/scripts/vserver 2005-10-28 20:29:00.000000000 +0200
++++ util-vserver-0.30.210-delete/scripts/vserver 2006-03-12 08:21:19.293748750 +0100
+@@ -43,6 +43,7 @@ Possible commands are:
+ restart ... restarts the specified vserver; this is the subsequent
+ execution of a synchronized 'stop' and a 'start'
+ condrestart ... restarts the vserver when it is running already
++ delete ... deletes the specified vserver
+ suexec <user> <shell-command> <args*>
+ ... executes a command as the specified user in the vserver
+ exec <shell-command> <args*>
+@@ -96,6 +97,17 @@ the GNU General Public License. This pr
+ exit 0
+ }
+
++function delete()
++{
++ if [[ -z "$OPTION_SILENT" ]]; then
++ read -p "Really remove '$vserver'? [y/N]" deleteok
++ [[ "$deleteok" != [Yy] ]] && exit 2
++ fi
++
++ isVserverRunning "$VSERVER_DIR" && "${SELF[@]}" $OPTION_SILENT --sync "$vserver" stop
++ rm -rf $(readlink -f "$VSERVER_DIR"/vdir) "$VSERVER_DIR"
++}
++
+ function suexec()
+ {
+ . $__PKGLIBDIR/vserver.suexec
+@@ -203,7 +215,7 @@ case "$2" in
+ shift 2
+ . $__PKGLIBDIR/vserver.$cmd
+ ;;
+- (suexec|restart)
++ (suexec|restart|delete)
+ shift 2
+ $cmd "$@"
+ ;;
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-gentoo-tools.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-gentoo-tools.patch
new file mode 100644
index 0000000..a415d0a
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-gentoo-tools.patch
@@ -0,0 +1,74 @@
+Index: util-vserver-0.30.210/scripts/Makefile-files
+===================================================================
+--- util-vserver-0.30.210.orig/scripts/Makefile-files
++++ util-vserver-0.30.210/scripts/Makefile-files
+@@ -38,6 +38,7 @@ AM_INSTALLCHECK_STD_OPTIONS_EXEMPT += \
+
+
+ scripts_pkglib_src_DTA = scripts/functions \
++ scripts/gentoo-functions.sh \
+ scripts/vserver-build.apt-rpm \
+ scripts/vserver-build.skeleton \
+ scripts/vserver-build.debootstrap \
+@@ -68,6 +69,7 @@ scripts_pkglib_src_SCRPTS = scripts/pkgm
+ scripts/vservers.grabinfo.sh \
+ scripts/vshelper \
+ scripts/vsysvwrapper \
++ scripts/vschedcalc \
+ scripts/vyum-worker
+
+ scripts_legacy_src_SCRPTS = scripts/legacy/save_s_context \
+@@ -85,7 +87,12 @@ scripts_sbin_src_PRGS = scripts/chconte
+ scripts/vserver \
+ scripts/vsomething \
+ scripts/vtop \
+- scripts/vyum
++ scripts/vyum \
++ scripts/vdispatch-conf \
++ scripts/vemerge \
++ scripts/vesync \
++ scripts/vserver-new \
++ scripts/vupdateworld
+
+ scripts_sbin_gen_PRGS =
+ scripts_sbincfg_gen_DTA =
+Index: util-vserver-0.30.210/scripts/util-vserver-vars.pathsubst
+===================================================================
+--- util-vserver-0.30.210.orig/scripts/util-vserver-vars.pathsubst
++++ util-vserver-0.30.210/scripts/util-vserver-vars.pathsubst
+@@ -43,6 +43,7 @@ _IFSPEC="$__LEGACYDIR/ifspec"
+ _INITSYNC_MINIT_START=:
+ _KEEP_CTX_ALIVE="$__PKGLIBDIR/keep-ctx-alive"
+ _LIB_FUNCTIONS="$__PKGLIBDIR/functions"
++_LIB_GENTOO_FUNCTIONS="$__PKGLIBDIR/gentoo-functions.sh"
+ _LIB_VSERVER_SETUP_FUNCTIONS="$__PKGLIBDIR/vserver-setup.functions"
+ _LIB_VSERVER_BUILD_FUNCTIONS="$__PKGLIBDIR/vserver-build.functions"
+ _LIB_VSERVER_BUILD_FUNCTIONS_APT="$__PKGLIBDIR/vserver-build.functions.apt"
+@@ -68,6 +69,9 @@ _VAPT_GET_WORKER="$__PKGLIBDIR/vapt-get-
+ _VATTRIBUTE="$__SBINDIR/vattribute"
+ _VCONTEXT="$__SBINDIR/vcontext"
+ _VDLIMIT="$__SBINDIR/vdlimit"
++_VDISPATCH_CONF="$__SBINDIR/vdispatch-conf"
++_VEMERGE="$__SBINDIR/vemerge"
++_VESYNC="$__SBINDIR/vesync"
+ _VDU="$__SBINDIR/vdu"
+ _VHASHIFY="$__PKGLIBDIR/vhashify"
+ _VKILL="$__SBINDIR/vkill"
+@@ -81,7 +85,9 @@ _VRPM="$__SBINDIR/vrpm"
+ _VRPM_PRELOAD="$__PKGLIBDIR/vrpm-preload"
+ _VRPM_WORKER="$__PKGLIBDIR/vrpm-worker"
+ _VSCHED="$__SBINDIR/vsched"
++_VSCHEDCALC="$__PKGLIBDIR/vschedcalc"
+ _VSERVER="$__SBINDIR/vserver"
++_VSERVER_NEW="$__SBINDIR/vserver-new"
+ _VSERVER_LEGACY="$__LEGACYDIR/vserver"
+ _VSERVER_BUILD="$__PKGLIBDIR/vserver-build"
+ _VSERVER_INFO="$__SBINDIR/vserver-info"
+@@ -92,6 +98,7 @@ _VSOMETHING="$__SBINDIR/vsomething"
+ _VWAIT="$__SBINDIR/vwait"
+ _VUNAME="$__SBINDIR/vuname"
+ _VUNIFY="$__PKGLIBDIR/vunify"
++_VUPDATEWORLD="$__SBINDIR/vupdateworld"
+ _VYUM="$__SBINDIR/vyum"
+ _VYUM_WORKER="$__PKGLIBDIR/vyum-worker"
+
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-remove-init-style-gentoo.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-remove-init-style-gentoo.patch
new file mode 100644
index 0000000..7fabe46
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-remove-init-style-gentoo.patch
@@ -0,0 +1,15 @@
+Index: util-vserver-0.30.210/scripts/vserver.functions
+===================================================================
+--- util-vserver-0.30.210.orig/scripts/vserver.functions
++++ util-vserver-0.30.210/scripts/vserver.functions
+@@ -292,9 +292,7 @@ function _generateInitOptions
+ ;;
+
+ (xgentoo)
+- INITCMD_START=( /sbin/rc default )
+- INITCMD_STOP=( /sbin/rc shutdown )
+- ;;
++ panic "init-style '$INITSTYLE' is no longer supported; please use plain instead; aborting";;
+
+ (x) ;;
+ (*) panic "Unknown init-style '$INITSTYLE'; aborting";;
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-syscall-update.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-syscall-update.patch
new file mode 100644
index 0000000..ab75ca7
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-syscall-update.patch
@@ -0,0 +1,209 @@
+diff -NurpP util-vserver-0.30.210/lib/syscall-alternative.h util-vserver-0.30.210-shiny9/lib/syscall-alternative.h
+--- util-vserver-0.30.210/lib/syscall-alternative.h 2005-10-28 18:33:50.000000000 +0200
++++ util-vserver-0.30.210-shiny9/lib/syscall-alternative.h 2006-03-26 04:33:07.000000000 +0200
+@@ -1,9 +1,7 @@
+- // from http://vserver.13thfloor.at/Experimental/SYSCALL/syscall_shiny7.h
+-
+ #ifndef __SYSCALL_NEW_H
+ #define __SYSCALL_NEW_H
+
+-/* Copyright (C) 2005 Herbert Pötzl
++/* Copyright (C) 2005-2006 Herbert Pötzl
+
+ global config options
+
+@@ -39,12 +37,13 @@
+ __sysc_rcon(n) ... syscall register constraint
+ __sysc_regs ... list of input regs for clobber
+ __sysc_type ... register type
++ __sysc_aout ... asm code output constraint
+
+ if all else fails
+
+ __sc_asmload(n,N,...) ... asm code to prepare arguments
+ __sc_asmsysc(n,N) ... asm code to execute syscall
+- __sc_asmsave(n,r,e) ... asm code to store results
++ __sc_asmsave(n) ... asm code to store results
+
+ */
+
+@@ -243,7 +242,8 @@
+ sret: r0(r28)
+ serr: (sret >= (unsigned)-EMAXERRNO)
+ call: ble 0x100(%%sr2, %%r0)
+- clob: r1, r2, r4, r20, r29, r31, memory
++ clob: r1, r2, (r4), r20, r29, r31, memory
++ picr: pr(r19)
+ */
+
+ #define __sysc_max_err 4095
+@@ -253,13 +253,21 @@
+ ("r26", "r25", "r24", "r23", "r22", "r21")
+
+ #define __sysc_cmd_sys "ble 0x100(%%sr2,%%r0)"
+-#define __sysc_cmd_fin "ldi %0,%%r20"
+
+-#define __sysc_clobber __sysc_regs, \
+- "r1", "r2", "r4", "r20", "r29", "r31", "memory"
++#define __sysc_pre(n) \
++ __pasm(n,1,1, "copy %%r19, %%r4" , )
+
+-#warning syscall arch hppa not tested yet
++#define __sysc_fin(n) \
++ __casm(n,1,1, "ldi %0,%%r20" , )\
++ __pasm(n,1,1, "copy %%r4, %%r19" , )
+
++#ifndef __PIC__
++#define __sysc_clobber __sysc_regs, \
++ "r1", "r2", "r20", "r29", "r31", "memory"
++#else
++#define __sysc_clobber __sysc_regs, \
++ "r1", "r2", "r4", "r20", "r29", "r31", "memory"
++#endif
+
+
+ /* *****************************************
+@@ -277,6 +285,7 @@
+ sret: r0(eax)
+ serr: (sret >= (unsigned)-EMAXERRNO)
+ call: int 0x80
++ picr: pr(ebx)
+ clob: memory
+ */
+
+@@ -301,15 +310,19 @@
+ __casm(n,6,1, "pushl %%ebp" , )\
+ ""::__sc_iregs(n,__VA_ARGS__):__sysc_clobber)
+
++#define __sc_asmsave(n)
++
+ #define __sysc_pre(n) \
+ __casm(n,6,1, "movl %%eax,%%ebp" , )\
+- __casm(n,0,1, "movl %0,%%eax" , )\
++ __casm(n,0,1, "movl %1,%%eax" , )\
+
+ #define __sysc_fin(n) \
+ __casm(n,6,1, "popl %%ebp" , )\
+ __pasm(n,1,1, "popl %%ebx" , )\
+
+-#define __sysc_clobber __sysc_regs, "eax", "memory"
++#define __sysc_save
++#define __sysc_aout "=a"(__res)
++#define __sysc_clobber __sysc_regs, "memory"
+
+
+ /* *****************************************
+@@ -399,8 +412,43 @@
+
+ #elif defined(__mips__)
+
+-#error syscall arch mips not implemented yet
++/* The ABIO32 calling convention uses a0-a3 to pass the first
++ four arguments, the rest is passed on the userspace stack. The 5th arg
++ starts at 16($sp).
++
++ ABIN32 and ABI64 pass 6 args in a0-a3, t0-t1.
++
++ scnr: id(v0)
++ args: a1(a0), a2(a1), a3(a2), a4(a3), a5(16($sp)), a6(20($sp))
++ sret: r0(v0)
++ serr: e0(a3)
++ call: syscall
++ clob: at, v0, t0-t7, t8-t9
++*/
++
++#define __sysc_reg_cid "v0"
++#define __sysc_reg_ret "v0"
++#define __sysc_reg_err "a3"
++#define __sysc_cmd_sys "syscall"
+
++#define __sysc_reg(n) __arg_##n\
++ ("a0","a1","a2","a3", "t0", "t1")
++
++#define __sysc_clobber "$1", "$3", "$8", "$9", "$10", "$11", "$12", \
++ "$13", "$14", "$15", "$24", "$25", "memory"
++
++#if _MIPS_SIM == _ABIO32
++#define __sysc_pre(n) \
++ __casm(n,5,1,"addiu $sp,$sp,-32",) \
++ __casm(n,6,1,"sw $9,20($sp)",) \
++ __casm(n,5,1,"sw $8, 16($sp)",)
++#define __sysc_fin(n) \
++ __casm(n,5,1,"addiu $sp,$sp,32",)
++#elif (_MIPS_SIM == _ABIN32) || (_MIPS_SIM == _ABI64)
++#warning syscall arch mips with ABI N32 and 64 not tested yet
++#else
++#error unknown mips ABI version
++#endif
+
+
+ /* *****************************************
+@@ -864,6 +912,9 @@
+ #define __sysc_rcon(n) "g"
+ #endif
+
++#ifndef __sysc_aout
++#define __sysc_aout
++#endif
+
+
+ #ifdef __sc_complex /* complex result */
+@@ -918,6 +969,7 @@
+ return (type)(res)
+ #endif
+
++
+ #define __sc_results \
+ __sc_res_def(__res, __sysc_reg_res)
+
+@@ -1009,7 +1061,7 @@
+ #ifndef __sc_asmsysc
+ #define __sc_asmsysc(n,N) __sc_asm_vol( \
+ __casm(n,0,0, __sc_cmds(n,N) , )\
+- ::"i"(__sc_id(N)) : __sysc_clobber)
++ :__sysc_aout:"i"(__sc_id(N)) : __sysc_clobber)
+ #endif
+
+ #ifndef __sc_asmsave
+@@ -1031,33 +1083,33 @@
+
+
+
+-#define _syscall0(type, name) \
++#define _syscall0(type, name) \
+ type name(void) \
+ __sc_body(0, type, name, *)
+
+-#define _syscall1(type, name, type1, arg1) \
++#define _syscall1(type, name, type1, arg1) \
+ type name(type1 arg1) \
+ __sc_body(1, type, name, arg1)
+
+-#define _syscall2(type, name, type1, arg1, type2, arg2) \
++#define _syscall2(type, name, type1, arg1, type2, arg2) \
+ type name(type1 arg1, type2 arg2) \
+ __sc_body(2, type, name, arg1, arg2)
+
+-#define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
++#define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
+ type name(type1 arg1, type2 arg2, type3 arg3) \
+ __sc_body(3, type, name, arg1, arg2, arg3)
+
+-#define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
++#define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
+ type4, arg4) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+ __sc_body(4, type, name, arg1, arg2, arg3, arg4)
+
+-#define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
+- type4, arg4, type5, arg5) \
++#define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
++ type4, arg4, type5, arg5) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+ __sc_body(5, type, name, arg1, arg2, arg3, arg4, arg5)
+
+-#define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
++#define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
+ type4, arg4, type5, arg5, type6, arg6) \
+ type name(type1 arg1, type2 arg2, type3 arg3, \
+ type4 arg4, type5 arg5, type6 arg6) \
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-testsuite-fix.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-testsuite-fix.patch
new file mode 100644
index 0000000..b9cfd46
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-testsuite-fix.patch
@@ -0,0 +1,52 @@
+diff -NurpP util-vserver-0.30.210/lib/testsuite/personality.c util-vserver-0.30.210-testfix/lib/testsuite/personality.c
+--- util-vserver-0.30.210/lib/testsuite/personality.c 2005-12-31 11:31:55.000000000 +0100
++++ util-vserver-0.30.210-testfix/lib/testsuite/personality.c 2006-03-16 17:41:30.239559250 +0100
+@@ -73,7 +73,6 @@ int main()
+ TEST_T2PF("SHORT_INODE", 0, SHORT_INODE);
+ TEST_T2PF("WHOLE_SECONDS", 0, WHOLE_SECONDS);
+ TEST_T2PF("STICKY_TIMEOUTS", 0, STICKY_TIMEOUTS);
+- TEST_T2PF("ADDR_LIMIT_3GB", 0, ADDR_LIMIT_3GB);
+
+
+ // the _loc* tests
+@@ -82,7 +81,6 @@ int main()
+ TEST_PF2T("SHORT_INODE", SHORT_INODE);
+ TEST_PF2T("WHOLE_SECONDS", WHOLE_SECONDS);
+ TEST_PF2T("STICKY_TIMEOUTS", STICKY_TIMEOUTS);
+- TEST_PF2T("ADDR_LIMIT_3GB", ADDR_LIMIT_3GB);
+
+
+
+@@ -123,10 +121,10 @@ int main()
+ TEST_LIST("mmap_page_zero,any", 0, -1, MMAP_PAGE_ZERO, 15, 3);
+
+ TEST_LIST("mmap_page_zero,addr_limit_32bit,short_inode,whole_seconds,"
+- "sticky_timeouts,addr_limit_3gb",
++ "sticky_timeouts",
+ 0, 0,
+ MMAP_PAGE_ZERO|ADDR_LIMIT_32BIT|SHORT_INODE|WHOLE_SECONDS|
+- STICKY_TIMEOUTS|ADDR_LIMIT_3GB,
++ STICKY_TIMEOUTS,
+ -1, 0);
+
+ TEST_T2PT("linux", 0, PER_LINUX);
+diff -NurpP util-vserver-0.30.210/src/testsuite/vunify-test.sh util-vserver-0.30.210-testfix/src/testsuite/vunify-test.sh
+--- util-vserver-0.30.210/src/testsuite/vunify-test.sh 2005-03-21 21:03:33.000000000 +0100
++++ util-vserver-0.30.210-testfix/src/testsuite/vunify-test.sh 2006-03-16 17:37:04.014921250 +0100
+@@ -1,6 +1,7 @@
+ #! /bin/bash
+
+-: ${srcdir=.}
++: ${srcdir:=.}
++: ${builddir:=.}
+ : ${tmptopdir=/var/tmp}
+
+ set -e
+@@ -49,5 +50,5 @@ pushd $tmpdir &>/dev/null
+ popd &>/dev/null
+
+
+-$D ./src/vunify -n --manually $tmpdir/a '' $tmpdir/b '' >/dev/null
+-$D ./src/vunify -n --manually $tmpdir/a '' $tmpdir/c '' >/dev/null
++$builddir/src/vunify -n --manually $tmpdir/a '' $tmpdir/b '' >/dev/null
++$builddir/src/vunify -n --manually $tmpdir/a '' $tmpdir/c '' >/dev/null
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vlogin.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vlogin.patch
new file mode 100644
index 0000000..b3b5acf
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vlogin.patch
@@ -0,0 +1,448 @@
+diff -Nurp util-vserver-0.30.210.orig/ensc_wrappers/wrappers.h util-vserver-0.30.210/ensc_wrappers/wrappers.h
+--- util-vserver-0.30.210.orig/ensc_wrappers/wrappers.h 2006-03-15 12:39:49.000000000 +0100
++++ util-vserver-0.30.210/ensc_wrappers/wrappers.h 2006-03-13 22:32:33.000000000 +0100
+@@ -111,6 +111,10 @@
+ # include "wrappers-stat.hc"
+ #endif
+
++#ifdef ENSC_WRAPPERS_TERMIOS
++# include "wrappers-termios.hc"
++#endif
++
+ #undef ENSC_DETAIL2
+ #undef ENSC_DETAIL1
+ #undef ENSC_DOQUOTE_COND
+diff -Nurp util-vserver-0.30.210.orig/ensc_wrappers/wrappers-termios.hc util-vserver-0.30.210/ensc_wrappers/wrappers-termios.hc
+--- util-vserver-0.30.210.orig/ensc_wrappers/wrappers-termios.hc 1970-01-01 01:00:00.000000000 +0100
++++ util-vserver-0.30.210/ensc_wrappers/wrappers-termios.hc 2006-03-13 22:32:33.000000000 +0100
+@@ -0,0 +1,32 @@
++// $Id: util-vserver-0.30.210-vlogin.patch,v 1.1 2006/03/12 00:01:57 dhozac Exp $ --*- c -*--
++
++// Copyright (C) 2006 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
++//
++// This program is free software; you can redistribute it and/or modify
++// it under the terms of the GNU General Public License as published by
++// the Free Software Foundation; version 2 of the License.
++//
++// This program is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++//
++// You should have received a copy of the GNU General Public License
++// along with this program; if not, write to the Free Software
++// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++
++#ifndef H_ENSC_IN_WRAPPERS_H
++# error wrappers-termios.hc can not be used in this way
++#endif
++
++inline static WRAPPER_DECL void
++Etcgetattr(int fd, struct termios *termios_p)
++{
++ FatalErrnoError(tcgetattr(fd, termios_p)==-1, "tcgetattr()");
++}
++
++inline static WRAPPER_DECL void
++Etcsetattr(int fd, int optional_actions, struct termios *termios_p)
++{
++ FatalErrnoError(tcsetattr(fd, optional_actions, termios_p)==-1, "tcsetattr()");
++}
+diff -Nurp util-vserver-0.30.210.orig/scripts/vserver.functions util-vserver-0.30.210/scripts/vserver.functions
+--- util-vserver-0.30.210.orig/scripts/vserver.functions 2006-03-15 12:39:49.000000000 +0100
++++ util-vserver-0.30.210/scripts/vserver.functions 2006-03-13 22:32:33.000000000 +0100
+@@ -39,7 +39,7 @@ declare -a ENTER_SHELL=()
+
+ declare -a OPTS_VCONTEXT_CREATE=()
+ declare -a OPTS_VCONTEXT_MIGRATE=()
+-declare -a OPTS_VCONTEXT_ENTER=()
++declare -a OPTS_VCONTEXT_ENTER=( --vlogin )
+ declare -a OPTS_VATTRIBUTE=( --flag fakeinit )
+ declare -a OPTS_VSCHED=()
+
+diff -Nurp util-vserver-0.30.210.orig/src/Makefile-files util-vserver-0.30.210/src/Makefile-files
+--- util-vserver-0.30.210.orig/src/Makefile-files 2006-03-15 12:39:49.000000000 +0100
++++ util-vserver-0.30.210/src/Makefile-files 2006-03-13 22:32:33.000000000 +0100
+@@ -167,7 +167,7 @@ src_chcontext_compat_SOURCES = src/chcon
+ src_chcontext_compat_LDADD = $(VSERVER_LDADDS) $(LIBINTERNAL)
+ src_chcontext_compat_LDFLAGS = $(VSERVER_LDFLGS)
+
+-src_vcontext_SOURCES = src/vcontext.c
++src_vcontext_SOURCES = src/vcontext.c src/vlogin.c
+ src_vcontext_LDADD = $(VSERVER_LDADDS) $(LIBINTERNAL)
+ src_vcontext_LDFLAGS = $(VSERVER_LDFLGS)
+
+diff -Nurp util-vserver-0.30.210.orig/src/vcontext.c util-vserver-0.30.210/src/vcontext.c
+--- util-vserver-0.30.210.orig/src/vcontext.c 2006-03-15 12:39:49.000000000 +0100
++++ util-vserver-0.30.210/src/vcontext.c 2006-03-13 22:32:33.000000000 +0100
+@@ -65,6 +65,7 @@
+ #define CMD_NAMESPACE 0x400d
+ #define CMD_PERSTYPE 0x400e
+ #define CMD_PERSFLAG 0x400f
++#define CMD_VLOGIN 0x4010
+
+
+ struct option const
+@@ -88,6 +89,7 @@ CMDLINE_OPTIONS[] = {
+ { "syncmsg", required_argument, 0, CMD_SYNCMSG },
+ { "personality-type", required_argument, 0, CMD_PERSTYPE },
+ { "personality-flags", required_argument, 0, CMD_PERSFLAG },
++ { "vlogin", no_argument, 0, CMD_VLOGIN },
+ #if 1
+ { "fakeinit", no_argument, 0, CMD_INITPID }, // compatibility
+ #endif
+@@ -103,6 +105,7 @@ struct Arguments {
+ bool is_initpid;
+ bool is_silentexist;
+ bool set_namespace;
++ bool do_vlogin;
+ uint_least32_t personality_flags;
+ uint_least32_t personality_type;
+ int verbosity;
+@@ -115,6 +118,8 @@ struct Arguments {
+
+ int wrapper_exit_code = 255;
+
++void do_vlogin(char *argv[]);
++
+ static void
+ showHelp(int fd, char const *cmd, int res)
+ {
+@@ -148,6 +153,7 @@ showHelp(int fd, char const *cmd, int re
+ " --syncmsg <message>\n"
+ " ... use <message> as synchronization message; by\n"
+ " default, 'ok' will be used\n"
++ " --vlogin ... enable terminal proxy\n"
+ "\n"
+ "'vcontext --create' exits with code 254 iff the context exists already.\n"
+ "\n"
+@@ -314,12 +320,15 @@ doit(struct Arguments const *args, char
+ sys_personality(args->personality_type | args->personality_flags)==-1) {
+ perror(ENSC_WRAPPERS_PREFIX "personality()");
+ exit(wrapper_exit_code);
+- }
++ }
+
+ doExternalSync(ext_sync_fd, args->sync_msg);
+ doSyncStage1(p, args->do_disconnect);
+ DPRINTF("doit: pid=%u, ppid=%u\n", getpid(), getppid());
+- execvp (argv[optind],argv+optind);
++ if (!args->do_vlogin)
++ execvp (argv[optind],argv+optind);
++ else
++ do_vlogin(argv+optind);
+ doSyncStage2(p, args->do_disconnect);
+
+ PERROR_Q(ENSC_WRAPPERS_PREFIX "execvp", argv[optind]);
+@@ -368,6 +377,7 @@ int main (int argc, char *argv[])
+ .do_migrateself = false,
+ .do_disconnect = false,
+ .do_endsetup = false,
++ .do_vlogin = false,
+ .is_initpid = false,
+ .is_silentexist = false,
+ .set_namespace = false,
+@@ -390,6 +400,7 @@ int main (int argc, char *argv[])
+ case CMD_MIGRATE : args.do_migrate = true; break;
+ case CMD_DISCONNECT : args.do_disconnect = true; break;
+ case CMD_ENDSETUP : args.do_endsetup = true; break;
++ case CMD_VLOGIN : args.do_vlogin = true; break;
+ case CMD_INITPID : args.is_initpid = true; break;
+ case CMD_CHROOT : args.do_chroot = true; break;
+ case CMD_NAMESPACE : args.set_namespace = true; break;
+diff -Nurp util-vserver-0.30.210.orig/src/vlogin.c util-vserver-0.30.210/src/vlogin.c
+--- util-vserver-0.30.210.orig/src/vlogin.c 1970-01-01 01:00:00.000000000 +0100
++++ util-vserver-0.30.210/src/vlogin.c 2006-03-15 13:04:34.000000000 +0100
+@@ -0,0 +1,292 @@
++// $Id: util-vserver-0.30.210-vlogin.patch,v 1.1 2006/03/12 00:01:57 dhozac Exp $
++
++// Copyright (C) 2006 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
++//
++// This program is free software; you can redistribute it and/or modify
++// it under the terms of the GNU General Public License as published by
++// the Free Software Foundation; version 2 of the License.
++//
++// This program is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++//
++// You should have received a copy of the GNU General Public License
++// along with this program; if not, write to the Free Software
++// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++
++
++#ifdef HAVE_CONFIG_H
++# include <config.h>
++#endif
++
++#include "util.h"
++#include <lib/vserver.h>
++#include <lib/fmt.h>
++
++#include <stdlib.h>
++#include <getopt.h>
++#include <stdint.h>
++#include <errno.h>
++#include <sys/stat.h>
++#include <sys/ioctl.h>
++#include <sys/wait.h>
++#include <sys/socket.h>
++#include <termios.h>
++#include <signal.h>
++#include <pty.h>
++
++#define ENSC_WRAPPERS_PREFIX "vlogin: "
++#define ENSC_WRAPPERS_IOCTL 1
++#define ENSC_WRAPPERS_UNISTD 1
++#define ENSC_WRAPPERS_SOCKET 1
++#define ENSC_WRAPPERS_IO 1
++#define ENSC_WRAPPERS_TERMIOS 1
++#include <wrappers.h>
++
++struct terminal {
++ int fd; /* terminal file descriptor */
++ struct termios term; /* terminal settings */
++ struct winsize ws; /* terminal size */
++ pid_t pid; /* terminal process id */
++ struct termios termo; /* original terminal settings */
++ enum { TS_RESET, TS_RAW } state; /* terminal state */
++};
++
++static struct terminal t;
++extern int wrapper_exit_code;
++
++/* set terminal to raw mode */
++static void
++terminal_raw(void)
++{
++ struct termios buf;
++
++ /* save original terminal settings */
++ Etcgetattr(STDIN_FILENO, &t.termo);
++
++ buf = t.termo;
++
++ /* echo off
++ ** canonical mode off
++ ** extended input processing off
++ ** signal chars off */
++ buf.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
++
++ /* no SIGINT on BREAK
++ ** CR-to-NL off
++ ** input parity check off
++ ** don't strip 8th bit on input
++ ** output flow control off */
++ buf.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
++
++ /* clear size bits
++ ** parity checking off */
++ buf.c_cflag &= ~(CSIZE | PARENB);
++
++ /* set 8 bits/char */
++ buf.c_cflag |= CS8;
++
++ /* output processing off */
++ buf.c_oflag &= ~(OPOST);
++
++ /* 1 byte at a time
++ ** no timer */
++ buf.c_cc[VMIN] = 1;
++ buf.c_cc[VTIME] = 0;
++
++ Etcsetattr(STDIN_FILENO, TCSAFLUSH, &buf);
++
++ t.state = TS_RAW;
++}
++
++/* reset terminal to original state */
++static void
++terminal_reset(void)
++{
++ if (t.state != TS_RAW)
++ return;
++
++ Etcsetattr(STDIN_FILENO, TCSAFLUSH, &t.termo);
++
++ t.state = TS_RESET;
++}
++
++/* exit handler */
++static void
++terminal_atexit(void)
++{
++ terminal_reset();
++ WRITE_MSG(1, "\n"); /* for cosmetic reasons */
++}
++
++/* send signal to terminal */
++static void
++terminal_kill(int sig)
++{
++ pid_t pgrp = -1;
++
++ /* try to get process group leader */
++ if (ioctl(t.fd, TIOCGPGRP, &pgrp) >= 0 &&
++ pgrp != -1 &&
++ kill(-pgrp, sig) != -1)
++ return;
++
++ /* fallback using terminal pid */
++ kill(-t.pid, sig);
++}
++
++/* redraw the terminal screen */
++static void
++terminal_redraw(void)
++{
++ /* get winsize from stdin */
++ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &t.ws) == -1)
++ return;
++
++ /* set winsize in terminal */
++ ioctl(t.fd, TIOCSWINSZ, &t.ws);
++
++ /* set winsize change signal to terminal */
++ terminal_kill(SIGWINCH);
++}
++
++/* copy terminal activity to user */
++static void
++terminal_activity(void)
++{
++ char buf[64];
++ size_t len;
++
++ /* read terminal activity */
++ len = Eread(t.fd, buf, sizeof(buf));
++
++ /* get the current terminal settings */
++ Etcgetattr(t.fd, &t.term);
++
++ /* set the current terminal settings */
++ Etcsetattr(STDIN_FILENO, TCSANOW, &t.term);
++
++ /* write activity to user */
++ EwriteAll(STDOUT_FILENO, buf, len);
++}
++
++/* copy user activity to terminal */
++static void
++user_activity(void)
++{
++ char buf[64];
++ size_t len;
++
++ len = Eread(STDIN_FILENO, buf, sizeof(buf));
++ EwriteAll(t.fd, buf, len);
++}
++
++/* catch signals */
++static void
++signal_handler(int sig)
++{
++ int status;
++
++ switch(sig) {
++ /* catch interrupt */
++ case SIGINT:
++ terminal_kill(sig);
++ break;
++
++ /* terminal died */
++ case SIGCHLD:
++ wait(&status);
++ exit(status);
++ break;
++
++ /* window size has changed */
++ case SIGWINCH:
++ terminal_redraw();
++ break;
++
++ default:
++ exit(0);
++ }
++
++}
++
++void do_vlogin(char *argv[])
++{
++ int slave;
++ pid_t pid;
++ int n;
++ fd_set rfds;
++
++ if (!isatty(0) || !isatty(1)) {
++ execvp(argv[0], argv);
++ return;
++ }
++
++ /* set terminal to raw mode */
++ terminal_raw();
++
++ /* fork new pseudo terminal */
++ if (openpty(&t.fd, &slave, NULL, NULL, NULL) == -1) {
++ perror(ENSC_WRAPPERS_PREFIX "openpty()");
++ exit(EXIT_FAILURE);
++ }
++
++ pid = Efork();
++
++ /* setup some signal handlers */
++ signal(SIGINT, signal_handler);
++ signal(SIGCHLD, signal_handler);
++ signal(SIGWINCH, signal_handler);
++
++ if (pid == 0) {
++ /* we don't need the master side of the terminal */
++ close(t.fd);
++
++ /* login_tty() stupid dietlibc doesn't have it */
++ Esetsid();
++
++ Eioctl(slave, TIOCSCTTY, NULL);
++
++ Edup2(slave, 0);
++ Edup2(slave, 1);
++ Edup2(slave, 2);
++
++ if (slave > 2)
++ close(slave);
++
++ Eexecvp(argv[0], argv);
++ }
++
++ /* save terminals pid */
++ t.pid = pid;
++
++ /* we want a redraw */
++ atexit(terminal_atexit);
++ terminal_redraw();
++
++ /* main loop */
++ for (;;) {
++ /* init file descriptors for select */
++ FD_ZERO(&rfds);
++ FD_SET(STDIN_FILENO, &rfds);
++ FD_SET(t.fd, &rfds);
++ n = t.fd;
++
++ /* wait for something to happen */
++ while (select(n + 1, &rfds, NULL, NULL, NULL) == -1) {
++ if (errno == EINTR || errno == EAGAIN)
++ continue;
++ perror(ENSC_WRAPPERS_PREFIX "select()");
++ exit(wrapper_exit_code);
++ }
++
++ if (FD_ISSET(STDIN_FILENO, &rfds))
++ user_activity();
++
++ if (FD_ISSET(t.fd, &rfds))
++ terminal_activity();
++ }
++
++ /* never get here, signal handler exits */
++}
diff --git a/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vprocunhide-fix.patch b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vprocunhide-fix.patch
new file mode 100644
index 0000000..5e0bf95
--- /dev/null
+++ b/util-vserver/patches/0.30.210-r7/util-vserver-0.30.210-vprocunhide-fix.patch
@@ -0,0 +1,9 @@
+Index: util-vserver-0.30.210/distrib/misc/vprocunhide-files
+===================================================================
+--- util-vserver-0.30.210.orig/distrib/misc/vprocunhide-files
++++ util-vserver-0.30.210/distrib/misc/vprocunhide-files
+@@ -28,3 +28,4 @@
+ /proc/uptime
+ -/proc/cmdline
+ /proc/version
++/proc/mounts