--- /dev/null
+Index: python/Makefile-files
+===================================================================
+--- python/Makefile-files (revision 2883)
++++ python/Makefile-files (revision 2908)
+@@ -17,6 +17,7 @@
+ ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ##
+
++AM_INSTALLCHECK_STD_OPTIONS_EXEMPT += python/libvserver.py
+ pyexec_LTLIBRARIES += python/_libvserver.la
+ pyexec_SCRIPTS += python/libvserver.py
+ python__libvserver_la_SOURCES = python/_libvserver.c
+Index: debian/control
+===================================================================
+--- debian/control (revision 0)
++++ debian/control (revision 2908)
+@@ -0,0 +1,89 @@
++Source: util-vserver
++Section: net
++Priority: optional
++Maintainer: Daniel Hokka Zakrisson <daniel@hozac.com>
++Build-Depends: debhelper (>= 7), gawk, dietlibc-dev, net-tools, vlan, iptables, wget, procps, module-init-tools, libnss3-dev, po-debconf, e2fslibs-dev, pkg-config, python2.6-dev
++Standards-Version: 3.8.4
++Homepage: http://savannah.nongnu.org/projects/util-vserver/
++
++Package: util-vserver
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, util-vserver-core, libvserver0, util-vserver-sysv, diffutils
++Description: utilities for managing Linux-VServer guests
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: libvserver0
++Section: libs
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}
++Description: dynamic libraries for util-vserver
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: util-vserver-core
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}
++Description: core utilities of util-vserver
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: util-vserver-build
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, util-vserver, wget, binutils
++Description: tools which can be used to build vservers
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: util-vserver-sysv
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, util-vserver, make, diffutils
++Description: initscripts for util-vserver
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: util-vserver-legacy
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, util-vserver
++Description: legacy scripts for util-vserver
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: libvserver0-dev
++Section: libdevel
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, libvserver0, pkg-config
++Description: headers and libraries needed to develop vserver based applications
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
++
++Package: util-vserver-python
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, libvserver0, ${python:Depends}, ${python:Versions}
++Description: python-bindings for util-vserver
++ util-vserver provides the components and a framework to setup virtual
++ servers. A virtual server runs inside a Linux server. It is nevertheless
++ highly independent. As such, you can run various services with normal
++ configuration. The various vservers can't interact with each other and
++ can't interact with services in the main server.
+
+Property changes on: debian/control
+___________________________________________________________________
+Name: svn:keywords
+ + Id
+
+Index: debian/compat
+===================================================================
+--- debian/compat (revision 0)
++++ debian/compat (revision 2908)
+@@ -0,0 +1 @@
++7
+Index: debian/util-vserver-build.postinst
+===================================================================
+--- debian/util-vserver-build.postinst (revision 0)
++++ debian/util-vserver-build.postinst (revision 2908)
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++test -d /vservers/.hash || mkdir -m0700 /vservers/.hash
++
++f="/etc/vservers/.defaults/apps/vunify/hash"; test -e "$f"/method -o -e "$f"/00 || \
++ ln -s /vservers/.hash "$f"/00
++
++/usr/sbin/setattr --barrier /vservers/.hash || :
+
+Property changes on: debian/util-vserver-build.postinst
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/copyright
+===================================================================
+--- debian/copyright (revision 0)
++++ debian/copyright (revision 2908)
+@@ -0,0 +1,41 @@
++This work was packaged for Debian by:
++
++ Daniel Hokka Zakrisson <daniel@hozac.com> on Wed, 14 Jul 2010 22:42:52 +0000
++
++It was downloaded from:
++
++ http://svn.linux-vserver.org/svn/util-vserver
++
++Upstream Author(s):
++
++ Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
++ Daniel Hokka Zakrisson <daniel@hozac.com>
++
++Copyright:
++
++ Copyright (C) 2002-2010 Enrico Scholz
++ Copyright (C) 2006-2010 Daniel Hokka Zakrisson
++
++License:
++
++ 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.
++
++ 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 with
++ your Debian GNU system, in /usr/share/common-licenses/GPL-2, or with the
++ Debian GNU source package as the file GNUGPL.TXT. If not, write to the
++ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ MA 02110-1301, USA.
++
++The Debian packaging is:
++
++ Copyright (C) 2010 Daniel Hokka Zakrisson <daniel@hozac.com>
++
++and is licensed under the GPL version 2,
++see "/usr/share/common-licenses/GPL-2".
+Index: debian/docs
+===================================================================
+--- debian/docs (revision 0)
++++ debian/docs (revision 2908)
+@@ -0,0 +1,2 @@
++NEWS
++README
+Index: debian/util-vserver.postinst
+===================================================================
+--- debian/util-vserver.postinst (revision 0)
++++ debian/util-vserver.postinst (revision 2908)
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++test -d /vservers || mkdir -m0000 /vservers
++test -d /vservers/.pkg || mkdir -m0755 /vservers/.pkg
++
++f="/etc/vservers/.defaults/vdirbase"; test -L "$f" -o -e "$f" || ln -s /vservers "$f"
++f="/etc/vservers/.defaults/run.rev"; test -L "$f" -o -e "$f" || ln -s /var/run/vservers.rev "$f"
++f="/etc/vservers/.defaults/cachebase"; test -L "$f" -o -e "$f" || ln -s /var/cache/vservers "$f"
++
++/usr/sbin/setattr --barrier /vservers /vservers/.pkg || :
+
+Property changes on: debian/util-vserver.postinst
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/rules
+===================================================================
+--- debian/rules (revision 0)
++++ debian/rules (revision 2908)
+@@ -0,0 +1,31 @@
++#!/usr/bin/make -f
++# -*- makefile -*-
++# Sample debian/rules that uses debhelper.
++#
++# This file was originally written by Joey Hess and Craig Small.
++# As a special exception, when this file is copied by dh-make into a
++# dh-make output file, you may use that output file without restriction.
++# This special exception was added by Craig Small in version 0.37 of dh-make.
++#
++# Modified to make a template file for a multi-binary package with separated
++# build-arch and build-indep targets by Bill Allombert 2001
++
++# Uncomment this to turn on verbose mode.
++#export DH_VERBOSE=1
++
++# This has to be exported to make some magic below work.
++export DH_OPTIONS
++
++
++%:
++ dh $@
++
++override_dh_auto_configure:
++ dh_auto_configure -- --with-initrddir=/etc/init.d --enable-release \
++ --enable-apis=NOLEGACY --with-initscripts=sysv
++
++override_dh_auto_test:
++
++override_dh_auto_install:
++ dh_auto_install
++ contrib/make-deb-manifest util-vserver debian contrib/manifest.dat files
+
+Property changes on: debian/rules
+___________________________________________________________________
+Name: svn:keywords
+ + Id
+Name: svn:executable
+ + *
+
+Index: debian/util-vserver.postrm
+===================================================================
+--- debian/util-vserver.postrm (revision 0)
++++ debian/util-vserver.postrm (revision 2908)
+@@ -0,0 +1,5 @@
++#!/bin/sh
++
++if test "$1" = purge; then
++ rm -rf /var/cache/vservers/* 2>/dev/null || :
++fi
+
+Property changes on: debian/util-vserver.postrm
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/util-vserver-legacy.postinst
+===================================================================
+--- debian/util-vserver-legacy.postinst (revision 0)
++++ debian/util-vserver-legacy.postinst (revision 2908)
+@@ -0,0 +1,9 @@
++#!/bin/sh
++
++if test "$1" = configure; then
++ update-rc.d rebootmgr start 98 2 3 4 5 stop 02 0 1 6 .
++ update-rc.d vservers-legacy start 98 2 3 4 5 stop 02 0 1 6 .
++ for i in httpd named portmap sendmail smb sshd xinetd gated; do
++ update-rc.d v_$i start 98 2 3 4 5 stop 02 0 1 6 .
++ done
++fi
+
+Property changes on: debian/util-vserver-legacy.postinst
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/util-vserver-sysv.postinst
+===================================================================
+--- debian/util-vserver-sysv.postinst (revision 0)
++++ debian/util-vserver-sysv.postinst (revision 2908)
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++if test "$1" = configure; then
++ update-rc.d vservers-default start 98 2 3 4 5 stop 02 0 1 6 .
++ update-rc.d vprocunhide start 26 2 3 4 5 stop 74 0 1 6 .
++ update-rc.d util-vserver start 10 2 3 4 5 stop 90 0 1 6 .
++fi
+
+Property changes on: debian/util-vserver-sysv.postinst
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/changelog.in
+===================================================================
+--- debian/changelog.in (revision 0)
++++ debian/changelog.in (revision 2908)
+@@ -0,0 +1,5 @@
++util-vserver (@PACKAGE_VERSION@-1) unstable; urgency=low
++
++ * Initial release
++
++ -- Daniel Hokka Zakrisson <daniel@hozac.com> @DATE@
+Index: debian/util-vserver-sysv.postrm
+===================================================================
+--- debian/util-vserver-sysv.postrm (revision 0)
++++ debian/util-vserver-sysv.postrm (revision 2908)
+@@ -0,0 +1,5 @@
++#!/bin/sh
++
++if test "$1" = upgrade; then
++ /etc/init.d/vprocunhide condrestart > /dev/null 2>&1
++fi
+
+Property changes on: debian/util-vserver-sysv.postrm
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/Makefile-files
+===================================================================
+--- debian/Makefile-files (revision 0)
++++ debian/Makefile-files (revision 2908)
+@@ -0,0 +1,33 @@
++## $Id$ -*- makefile -*-
++
++## Copyright (C) 2010 Daniel Hokka Zakrisson <daniel@hozac.com>
++##
++## 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; either version 2, or (at your option)
++## any later version.
++##
++## 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.
++##
++
++
++EXTRA_DIST += debian/rules \
++ debian/control \
++ debian/compat \
++ debian/copyright \
++ debian/docs \
++ debian/changelog.in \
++ debian/changelog
++
++#CLEANFILES += debian/changelog
++
++DEB_CL_DATE = $(shell date '+%a, %d %b %Y %H:%M:%S %z')
++debian/changelog: debian/changelog.in
++ $(SED) "s/@"PACKAGE_VERSION"@/$(PACKAGE_VERSION)/g;s/@"DATE"@/$(DEB_CL_DATE)/g" $< > $@
+
+Property changes on: debian/Makefile-files
+___________________________________________________________________
+Name: svn:keywords
+ + Id
+
+Index: debian/util-vserver-legacy.prerm
+===================================================================
+--- debian/util-vserver-legacy.prerm (revision 0)
++++ debian/util-vserver-legacy.prerm (revision 2908)
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++if test "$1" = remove; then
++ /etc/init.d/rebootmgr stop > /dev/null 2>&1
++ update-rc.d rebootmgr remove
++ update-rc.d vservers-legacy remove
++ for i in httpd named portmap sendmail smb sshd xinetd gated; do
++ update-rc.d v_$i remove
++ done
++fi
+
+Property changes on: debian/util-vserver-legacy.prerm
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: debian/util-vserver-sysv.prerm
+===================================================================
+--- debian/util-vserver-sysv.prerm (revision 0)
++++ debian/util-vserver-sysv.prerm (revision 2908)
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++if test "$1" = remove; then
++ /etc/init.d/vprocunhide stop > /dev/null 2>&1
++ update-rc.d vprocunhide remove
++ update-rc.d util-vserver remove
++ update-rc.d vservers-default remove
++fi
+
+Property changes on: debian/util-vserver-sysv.prerm
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: src/testsuite/hashcalc-plain.c
+===================================================================
+--- src/testsuite/hashcalc-plain.c (revision 2883)
++++ src/testsuite/hashcalc-plain.c (revision 2908)
+@@ -24,6 +24,7 @@
+ #include <stdbool.h>
+ #include <unistd.h>
+ #include <fcntl.h>
++#include <sys/stat.h>
+ #include <sys/mman.h>
+
+ #define ENSC_TESTSUITE
+Index: src/testsuite/Makefile-files
+===================================================================
+--- src/testsuite/Makefile-files (revision 2883)
++++ src/testsuite/Makefile-files (revision 2908)
+@@ -57,19 +57,22 @@
+ src/testsuite/hashcalc-plain.sh \
+ src/testsuite/vwait-test.sh
+
++DIETPROGS += src/testsuite/vunify-functest \
++ src/testsuite/chcontext-test \
++ src/testsuite/chbind-test \
++ src/testsuite/rpm-fake-test
++
+ src_testsuite_rpm_fake_test_SOURCES = src/testsuite/rpm-fake-test.c
+
+ src_testsuite_vunify_functest_SOURCES = src/testsuite/vunify-functest.c
+ src_testsuite_vunify_functest_LDADD = $(LIBINTERNAL)
+ src_testsuite_vunify_functest_CPPFLAGS= $(AM_CPPFLAGS) $(src_testsuite_CPPFLAGS)
+
+-
+ src_testsuite_chcontext_test_SOURCES = src/testsuite/chcontext-test.c
+-src_testsuite_chcontext_test_LDADD = lib/libvserver.la $(LIBINTERNAL)
++src_testsuite_chcontext_test_LDADD = $(VSERVER_LDADDS) $(LIBINTERNAL)
+
+-
+ src_testsuite_chbind_test_SOURCES = src/testsuite/chbind-test.c
+-src_testsuite_chbind_test_LDADD = lib/libvserver.la
++src_testsuite_chbind_test_LDADD = $(LIBVSERVER)
+
+ src_testsuite_hashcalc_SOURCES = src/testsuite/hashcalc.c
+ src_testsuite_hashcalc_plain_SOURCES = src/testsuite/hashcalc-plain.c
+@@ -77,6 +80,9 @@
+ src_testsuite_hashcalc_plain_CFLAGS = $(AM_CFLAGS) $(ENSC_CRYPTO_CFLAGS)
+
+ if ENSC_CAN_CRYPTO_WITH_DIETLIBC
++DIETPROGS += src/testsuite/hashcalc \
++ src/testsuite/hashcalc-plain
++
+ src_testsuite_hashcalc_LDADD = $(LIBINTERNAL) $(LIBENSCVECTOR) $(ENSC_CRYPTO_LIB) $(VSERVER_LDADDS)
+ src_testsuite_hashcalc_LDFLAGS = $(VSERVER_LDFLGS)
+
+Index: src/vcontext.c
+===================================================================
+--- src/vcontext.c (revision 2883)
++++ src/vcontext.c (revision 2908)
+@@ -21,6 +21,7 @@
+ #endif
+
+ #include "util.h"
++#include "compat-pivot_root.h"
+ #include "lib/internal.h"
+ #include "lib_internal/jail.h"
+ #include "lib_internal/sys_personality.h"
+Index: src/vserver-stat.c
+===================================================================
+--- src/vserver-stat.c (revision 2883)
++++ src/vserver-stat.c (revision 2908)
+@@ -24,6 +24,7 @@
+ #include "vserver.h"
+ #include "util.h"
+ #include "internal.h"
++#include "pathconfig.h"
+
+ #include <ensc_vector/vector.h>
+
+@@ -116,7 +117,7 @@
+ WRITE_STR(1, cmd);
+ WRITE_MSG(1,
+ "\n"
+- "Show informations about all the active context.\n\n"
++ "Show information about all active contexts.\n\n"
+ " CTX# Context number\n"
+ " #0 = root context\n"
+ " #1 = monitoring context\n"
+@@ -279,6 +280,152 @@
+ }
+ }
+
++static void
++registerXidCgroups(struct Vector *vec, struct process_info *process)
++{
++ xid_t xid = (xid_t) process->s_context;
++ struct XidData *res;
++
++ switch (vc_getXIDType(xid)) {
++ case vcTYPE_STATIC:
++ case vcTYPE_DYNAMIC:
++ break;
++ default:
++ return;
++ }
++
++ res = Vector_search(vec, &xid, cmpData);
++ if (res == 0) {
++ struct vc_rlimit_stat limit;
++ struct vc_virt_stat vstat;
++ struct vc_sched_info sched;
++ int cpu;
++ char vhi_name[65],
++ filename[128],
++ cgroup[65],
++ buf[30];
++ int fd;
++ ssize_t cgroup_len;
++ unsigned long long rss;
++ char *endptr;
++ size_t len;
++
++ if (vc_virt_stat(xid, &vstat) == -1) {
++ perror("vc_virt_stat()");
++ return;
++ }
++ if (vc_rlimit_stat(xid, RLIMIT_NPROC, &limit) == -1) {
++ perror("vc_rlimit_stat(RLIMIT_NRPOC)");
++ return;
++ }
++ if (vc_get_vhi_name(xid, vcVHI_CONTEXT, vhi_name, sizeof(vhi_name)) == -1) {
++ perror("vc_get_vhi_name(CONTEXT)");
++ return;
++ }
++
++ if ((fd = open(DEFAULTCONFDIR "/cgroup/mnt", O_RDONLY)) == -1) {
++ strcpy(cgroup, "/dev/cgroup/");
++ cgroup_len = sizeof("/dev/cgroup");
++ }
++ else {
++ cgroup_len = read(fd, cgroup, sizeof(cgroup));
++ if (cgroup_len == -1) {
++ perror("read(cgroup/mnt)");
++ return;
++ }
++ close(fd);
++ cgroup[cgroup_len] = '/';
++ cgroup_len += 1;
++ cgroup[cgroup_len] = 0;
++ }
++
++ len = strlen(vhi_name);
++ if ((len + sizeof("/cgroup/name")) >= sizeof(filename)) {
++ WRITE_MSG(2, "too long context name: ");
++ WRITE_STR(2, vhi_name);
++ WRITE_MSG(2, "\n");
++ return;
++ }
++ strcpy(filename, vhi_name);
++ strcpy(filename + len, "/cgroup/name");
++
++ if ((fd = open(filename, O_RDONLY)) == -1) {
++ char *dir = strrchr(vhi_name, '/');
++ if (dir == NULL) {
++ WRITE_MSG(2, "invalid context name: ");
++ WRITE_STR(2, dir);
++ WRITE_MSG(2, "\n");
++ return;
++ }
++ len = strlen(dir);
++ if ((len + cgroup_len) >= sizeof(cgroup)) {
++ WRITE_MSG(2, "cgroup name too long: ");
++ WRITE_STR(2, dir);
++ WRITE_MSG(2, "\n");
++ return;
++ }
++ strcpy(cgroup + cgroup_len, dir);
++ cgroup_len += len;
++ }
++ else {
++ ssize_t ret;
++ ret = read(fd, cgroup + cgroup_len, sizeof(cgroup) - cgroup_len);
++ if (ret == -1) {
++ perror("read(cgroup/name)");
++ return;
++ }
++ cgroup_len += ret;
++ close(fd);
++ }
++
++ if ((cgroup_len + sizeof("/memory.usage_in_bytes")) > sizeof(filename)) {
++ WRITE_MSG(2, "cgroup name too long: ");
++ WRITE_STR(2, cgroup);
++ WRITE_MSG(2, "\n");
++ return;
++ }
++ strcpy(filename, cgroup);
++ strcpy(filename + cgroup_len, "/memory.usage_in_bytes");
++
++ if ((fd = open(filename, O_RDONLY)) == -1) {
++ perror("open(memory.usage_in_bytes)");
++ return;
++ }
++ if (read(fd, buf, sizeof(buf)) == -1) {
++ perror("read(memory.usage_in_bytes)");
++ return;
++ }
++ close(fd);
++ if ((rss = strtoull(buf, &endptr, 0)) == ULLONG_MAX ||
++ (*endptr != '\n' && *endptr != '\0')) {
++ perror("strtoull(memory.usage_in_bytes)");
++ return;
++ }
++
++ res = Vector_insert(vec, &xid, cmpData);
++ res->xid = xid;
++
++ res->process_count = limit.value;
++ res->VmRSS_total = rss / 4096;
++ res->start_time_oldest= getUptime() - vstat.uptime/1000000;
++
++ res->utime_total = 0;
++ res->stime_total = 0;
++ // XXX: arbitrary CPU limit.
++ for (cpu = 0; cpu < 1024; cpu++) {
++ sched.cpu_id = cpu;
++ sched.bucket_id = 0;
++ if (vc_sched_info(xid, &sched) == -1)
++ break;
++
++ res->utime_total += sched.user_msec;
++ res->stime_total += sched.sys_msec;
++ }
++ }
++
++ res->VmSize_total += process->VmSize;
++}
++
+ static inline uint64_t
+ toMsec(uint64_t v)
+ {
+@@ -615,7 +762,7 @@
+
+ Vector_init(&xid_data, sizeof(struct XidData));
+
+- if (vc_isSupported(vcFEATURE_VSTAT)) {
++ if (vc_isSupported(vcFEATURE_VSTAT) && !vc_isSupported(vcFEATURE_MEMCG)) {
+ unsigned long xid;
+ Echdir(PROC_VIRT_DIR_NAME);
+ proc_dir = Eopendir(".");
+@@ -628,6 +775,8 @@
+ closedir(proc_dir);
+ }
+ else {
++ void (*handler)(struct Vector *vec, struct process_info *process);
++
+ my_pid = getpid();
+
+ if (!switchToWatchXid(&errptr)) {
+@@ -641,6 +790,11 @@
+ " procfs-security. Please read the FAQ for more details\n"
+ " http://linux-vserver.org/Proc-Security\n");
+
++ if (vc_isSupported(vcFEATURE_MEMCG))
++ handler = registerXidCgroups;
++ else
++ handler = registerXid;
++
+ Echdir(PROC_DIR_NAME);
+ proc_dir = Eopendir(".");
+ while ((dir_entry = readdir(proc_dir)) != NULL)
+@@ -652,7 +806,7 @@
+ if (atoi(dir_entry->d_name) != my_pid) {
+ struct process_info * info = get_process_info(dir_entry->d_name);
+ if (info)
+- registerXid(&xid_data, info);
++ handler(&xid_data, info);
+ }
+ }
+ closedir(proc_dir);
+Index: scripts/vserver.suexec
+===================================================================
+--- scripts/vserver.suexec (revision 2883)
++++ scripts/vserver.suexec (revision 2908)
+@@ -40,7 +40,7 @@
+ "${CHBIND_CMD[@]}" \
+ $_EXEC_ULIMIT "$VSERVER_DIR/ulimits" \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT" -- } \
+- $_VSPACE --enter "$S_CONTEXT" "${OPTS_VSPACE[@]}" -- \
++ $_VSPACE --enter "$S_CONTEXT" "${OPTS_VSPACE[@]}" "${OPTS_VSPACE_SHARED[@]}" -- \
+ $_VTAG --migrate "${OPTS_VTAG_ENTER[@]}" --silent -- \
+ $_VCONTEXT $SILENT_OPT --migrate $OPT_VCONTEXT_CHROOT \
+ --xid "$S_CONTEXT" --uid "$user" "${OPTS_VCONTEXT_ENTER[@]}" -- \
+Index: scripts/vserver.stop
+===================================================================
+--- scripts/vserver.stop (revision 2883)
++++ scripts/vserver.stop (revision 2908)
+@@ -83,7 +83,7 @@
+ "${IONICE_CMD[@]}" \
+ "${NICE_CMD[@]}" \
+ "${CHBIND_CMD[@]}" \
+- "$_VSPACE" --enter "$S_CONTEXT" "${OPTS_VSPACE[@]}" -- \
++ "$_VSPACE" --enter "$S_CONTEXT" "${OPTS_VSPACE[@]}" "${OPTS_VSPACE_SHARED[@]}" -- \
+ "$_VTAG" --migrate "${OPTS_VTAG_ENTER[@]}" --silent -- \
+ $_VCONTEXT $SILENT_OPT --migrate $OPT_VCONTEXT_CHROOT --xid "$S_CONTEXT" -- \
+ "${INITCMD_STOP[@]}" || fail=1
+Index: scripts/vserver.start
+===================================================================
+--- scripts/vserver.start (revision 2883)
++++ scripts/vserver.start (revision 2908)
+@@ -136,6 +136,7 @@
+ if $_VSERVER_INFO - FEATURE migrate; then
+ ${IONICE_CMD[@]} \
+ ${NICE_CMD[@]} \
++ "${VSPACE_SHARED_CMD[@]}" \
+ "${CHBIND_CMD[@]}" \
+ $_EXEC_ULIMIT "$VSERVER_DIR"/ulimits \
+ $_VTAG --create "${OPTS_VTAG_CREATE[@]}" --silent -- \
+@@ -143,7 +144,7 @@
+ $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
+ ${OPTION_STRACE:+$_STRACE -fF -o /tmp/vserver-start.$$} \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --set -- } \
+- $_VSPACE --set "${OPTS_VSPACE[@]}" -- \
++ $_VSPACE --set "${OPTS_VSPACE[@]}" "${OPTS_VSPACE_SHARED[@]}" -- \
+ $_EXEC_REMOUNT /proc /sys -- \
+ $_VLIMIT --dir "$VSERVER_DIR"/rlimits --missingok -- \
+ $_VSCHED --xid self --force "${OPTS_VSCHED[@]}" -- \
+Index: scripts/vserver.functions
+===================================================================
+--- scripts/vserver.functions (revision 2883)
++++ scripts/vserver.functions (revision 2908)
+@@ -49,6 +49,8 @@
+ declare -a OPTS_VTAG_ENTER=()
+ declare -a OPTS_VMEMCTRL=()
+ declare -a OPTS_VSPACE=( --default )
++declare -a OPTS_VSPACE_SHARED=()
++declare -a VSPACE_SHARED_CMD=()
+
+ declare -a STOPCMD_PREPARE=()
+
+@@ -110,6 +112,12 @@
+
+ test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
+
++ if test -e "$vdir"/noncontext -o \
++ \( -e "$vdir"/spaces/net -a ! -e "$vdir"/ncontext \); then
++ _HAVE_CHBIND_OPTIONS=1
++ return 0
++ fi
++
+ local f="$vdir"/interfaces/bcast
+ getFileValue bcast "$f"
+ f="$vdir"/interfaces/lback
+@@ -787,17 +795,23 @@
+ {
+ local vdir="$1"
+ local d="$vdir"/spaces
++ local shared
++ local space
+
+- ( test ! -e "$d"/pid ) || \
+- OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --pid )
++ for space in pid net; do
++ if test -e "$d"/$space; then
++ getFileValue shared "$d"/$space || shared=""
++ if test -z "$shared"; then
++ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --$space )
++ elif test "$shared" = "0"; then
++ : # Do nothing
++ else
++ OPTS_VSPACE_SHARED=( "${OPTS_VSPACE_SHARED[@]}" --$space )
++ VSPACE_SHARED_CMD=( "${VSPACE_SHARED_CMD[@]}" $_VSPACE --enter "$shared" --$space -- )
++ fi
++ fi
++ done
+
+- test ! -e "$d"/net || {
+- OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --net )
+- # network context and namespace don't make much sense
+- _HAVE_CHBIND_OPTIONS=1
+- CHBIND_CMD=()
+- }
+-
+ local mask
+ getFileValue mask "$d"/mask || \
+ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --mask "$mask" )
+@@ -1461,8 +1475,12 @@
+ {
+ hasCgroup || return 1
+ test -d "$CGROUP_MNT" || return 1
++ memcg=""
++ if $_VSERVER_INFO - FEATURE memcg; then
++ memcg=1
++ fi
+ test -d "$1/cgroup" -o \
+- \( -d "$__CONFDIR/.defaults/cgroup" -a \
++ \( \( -d "$__CONFDIR/.defaults/cgroup" -o -n "$memcg" \) -a \
+ ! -e "$1/nocgroup" \)
+ }
+
+Index: configure.ac
+===================================================================
+--- configure.ac (revision 2883)
++++ configure.ac (revision 2908)
+@@ -27,6 +27,7 @@
+ AC_INIT(util-vserver, 0.30.215, vserver@list.linux-vserver.org)
+ AC_CONFIG_SRCDIR([src/capchroot.c])
+ AC_CONFIG_HEADER([config.h])
++AC_CONFIG_MACRO_DIR([m4])
+
+ AM_INIT_AUTOMAKE([1.9 gnits dist-bzip2 subdir-objects])
+ AM_MAINTAINER_MODE
+Index: lib/syscall_setiattr-fscompat.hc
+===================================================================
+--- lib/syscall_setiattr-fscompat.hc (revision 2883)
++++ lib/syscall_setiattr-fscompat.hc (revision 2908)
+@@ -26,6 +26,7 @@
+ #include "ioctl-getxflg.hc"
+
+ #include <fcntl.h>
++#include <sys/stat.h>
+
+ static inline ALWAYSINLINE int
+ vc_set_iattr_fscompat(char const *filename,
+Index: lib/vserver.h
+===================================================================
+--- lib/vserver.h (revision 2883)
++++ lib/vserver.h (revision 2908)
+@@ -281,8 +281,18 @@
+
+ // the VCI bit values
+ #define VC_VCI_NO_DYNAMIC (1 << 0)
++#define VC_VCI_PROC_SECURE (1 << 4)
++#define VC_VCI_HARDCPU (1 << 5)
++#define VC_VCI_IDLELIMIT (1 << 6)
++#define VC_VCI_IDLETIME (1 << 7)
++#define VC_VCI_COWBL (1 << 8)
++#define VC_VCI_FULLCOWBL (1 << 9)
+ #define VC_VCI_SPACES (1 << 10)
+ #define VC_VCI_NETV2 (1 << 11)
++#define VC_VCI_MEMCG (1 << 12)
++#define VC_VCI_DEBUG (1 << 16)
++#define VC_VCI_HISTORY (1 << 20)
++#define VC_VCI_TAGGED (1 << 24)
+ #define VC_VCI_PPTAG (1 << 28)
+
+
+@@ -980,7 +990,7 @@
+ vcFEATURE_VSHELPER0, vcFEATURE_VSHELPER, vcFEATURE_VWAIT,
+ vcFEATURE_VNET, vcFEATURE_VSTAT, vcFEATURE_PPTAG,
+ vcFEATURE_PIDSPACE, vcFEATURE_SPACES, vcFEATURE_PERSISTENT,
+- vcFEATURE_PIVOT_ROOT,
++ vcFEATURE_PIVOT_ROOT, vcFEATURE_MEMCG,
+ }
+ vcFeatureSet;
+
+Index: lib/issupported.c
+===================================================================
+--- lib/issupported.c (revision 2883)
++++ lib/issupported.c (revision 2908)
+@@ -50,7 +50,8 @@
+ case vcFEATURE_PPTAG : return conf & VC_VCI_PPTAG;
+ case vcFEATURE_SPACES : return conf & VC_VCI_SPACES;
+ case vcFEATURE_PIVOT_ROOT : return ver >= 0x00020304;
+- case vcFEATURE_PIDSPACE : return ver >= 0x00020305;
++ case vcFEATURE_PIDSPACE : return false;
++ case vcFEATURE_MEMCG : return ver >= 0x00020306 && conf & VC_VCI_MEMCG;
+ default : assert(false);
+ }
+
+Index: lib/syscall_getiattr-fscompat.hc
+===================================================================
+--- lib/syscall_getiattr-fscompat.hc (revision 2883)
++++ lib/syscall_getiattr-fscompat.hc (revision 2908)
+@@ -25,6 +25,9 @@
+ #include "ioctl-getxflg.hc"
+
+ #include <fcntl.h>
++#include <unistd.h>
++#include <sys/stat.h>
++
+ static inline ALWAYSINLINE int
+ vc_get_iattr_fscompat(char const *filename,
+ xid_t * /*@null@*/ xid,
+Index: lib/issupportedstring.c
+===================================================================
+--- lib/issupportedstring.c (revision 2883)
++++ lib/issupportedstring.c (revision 2908)
+@@ -35,7 +35,7 @@
+ DECL(MIGRATE), DECL(NAMESPACE), DECL(SCHED), DECL(VINFO),
+ DECL(VHI), DECL(VSHELPER0), DECL(VSHELPER), DECL(VWAIT),
+ DECL(VNET), DECL(VSTAT), DECL(PPTAG), DECL(PIDSPACE),
+- DECL(SPACES), DECL(PERSISTENT),DECL(PIVOT_ROOT),
++ DECL(SPACES), DECL(PERSISTENT),DECL(PIVOT_ROOT),DECL(MEMCG),
+ };
+
+ bool
+Index: pathconfig.h.pathsubst
+===================================================================
+--- pathconfig.h.pathsubst (revision 2883)
++++ pathconfig.h.pathsubst (revision 2908)
+@@ -25,6 +25,7 @@
+ #define SYSCONFDIR "@SYSCONFDIR@"
+ #define LOCKDIR "/var/lock"
+ #define PKGLIBDEFAULTDIR PKGLIBDIR "/defaults"
++#define DEFAULTCONFDIR "@CONFDIR@/.defaults"
+
+ #define DEFAULT_VSERVERDIR "@VSERVERDIR@"
+ #define DEFAULT_VSERVERPKGDIR "@VSERVERPKGDIR@"
+Index: contrib/make-manifest
+===================================================================
+--- contrib/make-manifest (revision 2883)
++++ contrib/make-manifest (revision 2908)
+@@ -21,7 +21,7 @@
+ dest=$2
+ data=$3
+
+-for i in $name-{core,devel,base,build,legacy,lib,sysv}.list; do
++for i in $name-{core,devel,base,build,legacy,lib,sysv,python}.list; do
+ echo '%defattr(-,root,root,-)' >$i
+ done
+
+Index: contrib/manifest.dat.pathsubst
+===================================================================
+--- contrib/manifest.dat.pathsubst (revision 2883)
++++ contrib/manifest.dat.pathsubst (revision 2908)
+@@ -159,3 +159,4 @@
+ legacy @CONFIG@ @INITRDDIR@/vservers-legacy
+ legacy @CONFIG_NOREPLACE@ @SYSCONFDIR@/vservers.conf
+ build @CONFIG_NOREPLACE@ @CONFDIR@/.distributions/*/apt/sources.list
++@HAVE_PYTHON_TRUE@python @PYEXECDIR@/*
+Index: contrib/make-deb-manifest
+===================================================================
+--- contrib/make-deb-manifest (revision 0)
++++ contrib/make-deb-manifest (revision 2908)
+@@ -0,0 +1,63 @@
++#!/bin/bash
++
++# Copyright (C) 2010 Daniel Hokka Zakrisson <daniel@hozac.com>
++#
++# 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.
++
++## Usage: make-deb-manifest <basename> <destdir> <datfile>
++
++name=$2/$1
++dest=$2
++data=$3
++
++getname() {
++ if test $1 = "lib"; then
++ fullname="$dest/libvserver0"
++ elif test $1 = "devel"; then
++ fullname="$dest/libvserver0-dev"
++ elif test $1 = "base"; then
++ fullname="$name"
++ else
++ fullname="$name-$1"
++ fi
++}
++
++for i in {core,build,legacy,sysv,lib,devel,base,python}; do
++ getname $i
++ echo -n >${fullname}.install
++ rm -f ${fullname}.conffiles
++done
++
++DESTDIR=debian/tmp
++while read style file; do
++ test "$file" || continue
++ case "$style" in
++ (\#*) continue;;
++ esac
++ getname $style
++ set -o noglob
++ set -- $file
++ set +o noglob
++ if test "$2"; then
++ file="$2"
++ for i in ${DESTDIR}$file; do
++ test "${file#/etc/}" != "$file" && continue
++ echo "${i#${DESTDIR}}" >>${fullname}.conffiles
++ done
++ fi
++ for i in ${DESTDIR}$file; do
++ i=${i#${DESTDIR}}
++ echo "$i ${i%/*}" >>${fullname}.install
++ done
++done < $data
+
+Property changes on: contrib/make-deb-manifest
+___________________________________________________________________
+Name: svn:executable
+ + *
+
+Index: contrib/Makefile-files
+===================================================================
+--- contrib/Makefile-files (revision 2883)
++++ contrib/Makefile-files (revision 2908)
+@@ -37,6 +37,7 @@
+ contrib/yum-3.2.0-chroot.patch \
+ contrib/yum-3.2.1-chroot.patch \
+ contrib/yum-3.2.4-chroot.patch \
+- contrib/make-manifest
++ contrib/make-manifest \
++ contrib/make-deb-manifest
+
+ contrib/manifest.dat: contrib/.manifest.dat.pathsubst.stamp
+Index: lib_internal/matchlist-initrefserverlist.c
+===================================================================
+--- lib_internal/matchlist-initrefserverlist.c (revision 2883)
++++ lib_internal/matchlist-initrefserverlist.c (revision 2908)
+@@ -26,6 +26,7 @@
+ #include <dirent.h>
+ #include <string.h>
+ #include <fcntl.h>
++#include <sys/stat.h>
+
+ #define ENSC_WRAPPERS_FCNTL 1
+ #define ENSC_WRAPPERS_UNISTD 1
+Index: util-vserver.spec.in
+===================================================================
+--- util-vserver.spec.in (revision 2883)
++++ util-vserver.spec.in (revision 2908)
+@@ -395,9 +395,10 @@
+ %{!?_without_doc:%doc lib/apidoc/html}
+
+
+-%files python
++%if 0%{!?_without_python:1}
++%files python -f %name-python.list
+ %defattr(-,root,root,-)
+-%{!?_without_python:%{python_sitearch}/*}
++%endif
+
+
+ %changelog
+Index: Makefile.am
+===================================================================
+--- Makefile.am (revision 2883)
++++ Makefile.am (revision 2908)
+@@ -143,6 +143,9 @@
+ s!@'ENSC_HAVE_C99_COMPILER_FALSE'@!\@ENSC_HAVE_C99_COMPILER_FALSE@ !g; \
+ s!@'ENSC_HAVE_CXX_COMPILER_TRUE'@!\@ENSC_HAVE_CXX_COMPILER_TRUE@ !g; \
+ s!@'ENSC_HAVE_CXX_COMPILER_FALSE'@!\@ENSC_HAVE_CXX_COMPILER_FALSE@ !g; \
++ s!@'HAVE_PYTHON_TRUE'@!\@HAVE_PYTHON_TRUE@ !g; \
++ s!@'HAVE_PYTHON_FALSE'@!\@HAVE_PYTHON_FALSE@ !g; \
++ s!@'PYEXECDIR'@!$(pyexecdir)!g; \
+ $(ENSC_PATHPROG_SED)
+
+ pathconfig.h: .pathconfig.h.pathsubst.stamp
+@@ -233,6 +236,7 @@
+ if HAVE_PYTHON
+ include $(top_srcdir)/python/Makefile-files
+ endif
++include $(top_srcdir)/debian/Makefile-files
+
+ include $(top_srcdir)/m4/gpgsig.am
+ include $(top_srcdir)/m4/validate.am
+Index: ensc_vector/testsuite/Makefile-files
+===================================================================
+--- ensc_vector/testsuite/Makefile-files (revision 2883)
++++ ensc_vector/testsuite/Makefile-files (revision 2908)
+@@ -21,6 +21,9 @@
+ TESTS += ensc_vector/testsuite/test1 \
+ ensc_vector/testsuite/test2
+
++DIETPROGS += ensc_vector/testsuite/test1 \
++ ensc_vector/testsuite/test2
++
+ ensc_vector_testsuite_test1_SOURCES = ensc_vector/testsuite/test1.c
+ ensc_vector_testsuite_test1_LDADD = $(LIBENSCVECTOR)
+