X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fsyscall_ctxcreate-v21.hc;fp=lib%2Fsyscall_ctxcreate-v21.hc;h=20e74623be7fe6068a61cc88e5528cbec06b121e;hb=a741f6faf2baae1e823d334012f6a09e6a1bda51;hp=0000000000000000000000000000000000000000;hpb=426a0d3a38995dc25a839aaa56d8642e6bdcbba5;p=util-vserver.git diff --git a/lib/syscall_ctxcreate-v21.hc b/lib/syscall_ctxcreate-v21.hc new file mode 100644 index 0000000..20e7462 --- /dev/null +++ b/lib/syscall_ctxcreate-v21.hc @@ -0,0 +1,48 @@ +// $Id$ --*- c -*-- + +// Copyright (C) 2007 Daniel Hokka Zakrisson +// +// 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 +#endif +#include + +static inline ALWAYSINLINE xid_t +vc_ctx_create_v21(xid_t xid, struct vc_ctx_flags *flags) +{ + struct vcmd_ctx_create data = { + .flagword = (VC_VXF_STATE_SETUP | VC_VXF_STATE_ADMIN | + VC_VXF_STATE_INIT) + }; + xid_t res; + + if (flags) + data.flagword = flags->flagword & flags->mask; + + res = vserver(VCMD_ctx_create, CTX_USER2KERNEL(xid), &data); + res = CTX_KERNEL2USER(res); + + if (res != VC_NOCTX) { + if (utilvserver_checkCompatConfig() & VC_VCI_SPACES) { + uint32_t spaces = vc_get_space_mask() & ~(CLONE_NEWNS|CLONE_FS); + sys_unshare(spaces); + vc_set_namespace(VC_SAMECTX, spaces); + } + } + + return res; +}