vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

vserver.h (37571B)


      1 /* $Id$
      2 
      3 *  Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      4 *   
      5 *  This program is free software; you can redistribute it and/or modify
      6 *  it under the terms of the GNU General Public License as published by
      7 *  the Free Software Foundation; either version 2, or (at your option)
      8 *  any later version.
      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 
     20 /** \file vserver.h
     21  *  \brief The public interface of the the libvserver library.
     22  */
     23 
     24 #ifndef H_VSERVER_SYSCALL_H
     25 #define H_VSERVER_SYSCALL_H
     26 
     27 #include <stdint.h>
     28 #include <stdlib.h>
     29 #include <stdbool.h>
     30 #include <sys/types.h>
     31 #include <sched.h>
     32 #include <netinet/in.h>
     33 
     34 #ifndef IS_DOXYGEN
     35 #if defined(__GNUC__)
     36 #  define VC_ATTR_UNUSED                __attribute__((__unused__))
     37 #  define VC_ATTR_NORETURN              __attribute__((__noreturn__))
     38 #  define VC_ATTR_CONST			__attribute__((__const__))
     39 #  define VC_ATTR_DEPRECATED		__attribute__((__deprecated__))
     40 #  if __GNUC__*0x10000 + __GNUC_MINOR__*0x100 + __GNUC_PATCHLEVEL__ >= 0x30300
     41 #    define VC_ATTR_NONNULL(ARGS)	__attribute__((__nonnull__ ARGS))
     42 #    define VC_ATTR_ALWAYSINLINE        __attribute__((__always_inline__))
     43 #  else
     44 #    define VC_ATTR_NONNULL(ARGS)
     45 #    define VC_ATTR_ALWAYSINLINE
     46 #  endif
     47 #  if __GNUC__*0x10000 + __GNUC_MINOR__*0x100 + __GNUC_PATCHLEVEL__ >= 0x30303
     48 #    define VC_ATTR_PURE		__attribute__((__pure__))
     49 #  else
     50 #    define VC_ATTR_PURE
     51 #  endif
     52 #else
     53 #  define VC_ATTR_NONNULL(ARGS)
     54 #  define VC_ATTR_UNUSED
     55 #  define VC_ATTR_NORETURN
     56 #  define VC_ATTR_ALWAYSINLINE
     57 #  define VC_ATTR_DEPRECATED
     58 #  define VC_ATTR_PURE
     59 #  define VC_ATTR_CONST
     60 #endif
     61 #endif	// IS_DOXYGEN
     62 
     63 /** the value which is returned in error-case (no ctx found) */
     64 #define VC_NOCTX		((xid_t)(-1))
     65 #define VC_NOXID		((xid_t)(-1))
     66 /** the value which means a random (the next free) ctx */
     67 #define VC_DYNAMIC_XID		((xid_t)(-1))
     68 /** the value which means the current ctx */
     69 #define VC_SAMECTX		((xid_t)(-2))
     70 
     71 #define VC_NONID		((nid_t)(-1))
     72 #define VC_DYNAMIC_NID		((nid_t)(-1))
     73 
     74 #define VC_LIM_INFINITY		(~0ULL)
     75 #define VC_LIM_KEEP		(~1ULL)
     76 
     77 #define VC_CDLIM_UNSET		(0U)
     78 #define VC_CDLIM_INFINITY	(~0U)
     79 #define VC_CDLIM_KEEP		(~1U)
     80   
     81 #ifndef S_CTX_INFO_LOCK
     82 #  define S_CTX_INFO_LOCK	1
     83 #endif
     84 
     85 #ifndef S_CTX_INFO_SCHED
     86 #  define S_CTX_INFO_SCHED	2
     87 #endif
     88 
     89 #ifndef S_CTX_INFO_NPROC
     90 #  define S_CTX_INFO_NPROC	4
     91 #endif
     92 
     93 #ifndef S_CTX_INFO_PRIVATE
     94 #  define S_CTX_INFO_PRIVATE	8
     95 #endif
     96 
     97 #ifndef S_CTX_INFO_INIT
     98 #  define S_CTX_INFO_INIT	16
     99 #endif
    100 
    101 #ifndef S_CTX_INFO_HIDEINFO
    102 #  define S_CTX_INFO_HIDEINFO	32
    103 #endif
    104 
    105 #ifndef S_CTX_INFO_ULIMIT
    106 #  define S_CTX_INFO_ULIMIT	64
    107 #endif
    108 
    109 #ifndef S_CTX_INFO_NAMESPACE
    110 #  define S_CTX_INFO_NAMESPACE	128
    111 #endif
    112 
    113 #define VC_CAP_CHOWN            	 0
    114 #define VC_CAP_DAC_OVERRIDE     	 1
    115 #define VC_CAP_DAC_READ_SEARCH  	 2
    116 #define VC_CAP_FOWNER           	 3
    117 #define VC_CAP_FSETID           	 4
    118 #define VC_CAP_KILL             	 5
    119 #define VC_CAP_SETGID           	 6
    120 #define VC_CAP_SETUID           	 7
    121 #define VC_CAP_SETPCAP          	 8
    122 #define VC_CAP_LINUX_IMMUTABLE  	 9
    123 #define VC_CAP_NET_BIND_SERVICE 	10
    124 #define VC_CAP_NET_BROADCAST    	11
    125 #define VC_CAP_NET_ADMIN        	12
    126 #define VC_CAP_NET_RAW          	13
    127 #define VC_CAP_IPC_LOCK         	14
    128 #define VC_CAP_IPC_OWNER        	15
    129 #define VC_CAP_SYS_MODULE       	16
    130 #define VC_CAP_SYS_RAWIO        	17
    131 #define VC_CAP_SYS_CHROOT       	18
    132 #define VC_CAP_SYS_PTRACE       	19
    133 #define VC_CAP_SYS_PACCT        	20
    134 #define VC_CAP_SYS_ADMIN        	21
    135 #define VC_CAP_SYS_BOOT         	22
    136 #define VC_CAP_SYS_NICE         	23
    137 #define VC_CAP_SYS_RESOURCE     	24
    138 #define VC_CAP_SYS_TIME 		25
    139 #define VC_CAP_SYS_TTY_CONFIG   	26
    140 #define VC_CAP_MKNOD            	27
    141 #define VC_CAP_LEASE            	28
    142 #define VC_CAP_AUDIT_WRITE          	29
    143 #define VC_CAP_AUDIT_CONTROL          	30
    144 #define VC_CAP_SETFCAP			31
    145 #define VC_CAP_MAC_OVERRIDE		32
    146 #define VC_CAP_MAC_ADMIN		33
    147 
    148 #define VC_IMMUTABLE_FILE_FL		0x0000010lu
    149 #define VC_IMMUTABLE_LINK_FL		0x0008000lu
    150 #define VC_IMMUTABLE_ALL		(VC_IMMUTABLE_LINK_FL|VC_IMMUTABLE_FILE_FL)
    151 
    152 #define VC_IATTR_XID			0x01000000u
    153 
    154 #define VC_IATTR_ADMIN			0x00000001u
    155 #define VC_IATTR_WATCH			0x00000002u
    156 #define VC_IATTR_HIDE			0x00000004u
    157 #define VC_IATTR_WRITE			0x00000008u
    158 #define VC_IATTR_FLAGS			0x0000000fu
    159 
    160 #define VC_IATTR_BARRIER		0x00010000u
    161 #define	VC_IATTR_IUNLINK		0x00020000u
    162 #define VC_IATTR_IMMUTABLE		0x00040000u
    163 #define VC_IATTR_COW			0x00080000u
    164 
    165 
    166 // the flags
    167 #define VC_VXF_INFO_LOCK		0x00000001ull
    168 #define VC_VXF_INFO_NPROC		0x00000004ull
    169 #define VC_VXF_INFO_PRIVATE		0x00000008ull
    170 #define VC_VXF_INFO_INIT		0x00000010ull
    171 
    172 #define VC_VXF_INFO_HIDEINFO		0x00000020ull
    173 #define VC_VXF_INFO_ULIMIT		0x00000040ull
    174 #define VC_VXF_INFO_NAMESPACE		0x00000080ull
    175 
    176 #define	VC_VXF_SCHED_HARD		0x00000100ull
    177 #define	VC_VXF_SCHED_PRIO		0x00000200ull
    178 #define	VC_VXF_SCHED_PAUSE		0x00000400ull
    179 
    180 #define VC_VXF_VIRT_MEM			0x00010000ull
    181 #define VC_VXF_VIRT_UPTIME		0x00020000ull
    182 #define VC_VXF_VIRT_CPU			0x00040000ull
    183 #define VC_VXF_VIRT_LOAD		0x00080000ull
    184 #define VC_VXF_VIRT_TIME		0x00100000ull
    185 
    186 #define VC_VXF_HIDE_MOUNT		0x01000000ull
    187 #define VC_VXF_HIDE_NETIF		0x02000000ull
    188 #define VC_VXF_HIDE_VINFO		0x04000000ull
    189 
    190 #define	VC_VXF_STATE_SETUP		(1ULL<<32)
    191 #define	VC_VXF_STATE_INIT		(1ULL<<33)
    192 #define VC_VXF_STATE_ADMIN		(1ULL<<34)
    193 
    194 #define VC_VXF_SC_HELPER		(1ULL<<36)
    195 #define VC_VXF_REBOOT_KILL		(1ULL<<37)
    196 #define VC_VXF_PERSISTENT		(1ULL<<38)
    197 
    198 #define VC_VXF_FORK_RSS			(1ULL<<48)
    199 #define VC_VXF_PROLIFIC			(1ULL<<49)
    200 
    201 #define VC_VXF_IGNEG_NICE		(1ULL<<52)
    202 #define VC_VXF_IGNEG_IONICE		(1ULL<<53)
    203 
    204 
    205 // the ccapabilities
    206 #define VC_VXC_SET_UTSNAME		0x00000001ull
    207 #define VC_VXC_SET_RLIMIT		0x00000002ull
    208 #define VC_VXC_FS_SECURITY		0x00000004ull
    209 #define VC_VXC_FS_TRUSTED		0x00000008ull
    210 #define VC_VXC_TIOCSTI			0x00000010ull
    211 
    212 #define VC_VXC_RAW_ICMP			0x00000100ull
    213 #define VC_VXC_SYSLOG			0x00001000ull
    214 #define VC_VXC_OOM_ADJUST		0x00002000ull
    215 #define VC_VXC_AUDIT_CONTROL		0x00004000ull
    216 
    217 #define VC_VXC_SECURE_MOUNT		0x00010000ull
    218 #define VC_VXC_SECURE_REMOUNT		0x00020000ull
    219 #define VC_VXC_BINARY_MOUNT		0x00040000ull
    220 #define VC_VXC_DEV_MOUNT		0x00080000ull
    221 
    222 #define VC_VXC_QUOTA_CTL		0x00100000ull
    223 #define VC_VXC_ADMIN_MAPPER		0x00200000ull
    224 #define VC_VXC_ADMIN_CLOOP		0x00400000ull
    225 
    226 #define VC_VXC_KTHREAD			0x01000000ull
    227 #define VC_VXC_NAMESPACE		0x02000000ull
    228 
    229 
    230 // the scheduler flags
    231 #define VC_VXSM_FILL_RATE		0x0001
    232 #define VC_VXSM_INTERVAL		0x0002
    233 #define VC_VXSM_FILL_RATE2		0x0004
    234 #define VC_VXSM_INTERVAL2		0x0008
    235 #define VC_VXSM_TOKENS			0x0010
    236 #define VC_VXSM_TOKENS_MIN		0x0020
    237 #define VC_VXSM_TOKENS_MAX		0x0040
    238 #define VC_VXSM_PRIO_BIAS		0x0100
    239 #define VC_VXSM_CPU_ID			0x1000
    240 #define VC_VXSM_BUCKET_ID		0x2000
    241 
    242 #define VC_VXSM_IDLE_TIME		0x0200
    243 #define VC_VXSM_FORCE			0x0400
    244 #define VC_VXSM_MSEC			0x4000
    245 
    246 #define VC_VXSM_V3_MASK			0x0173
    247 
    248 
    249 // the network flags
    250 #define VC_NXF_INFO_LOCK		0x00000001ull
    251 #define VC_NXF_INFO_PRIVATE		0x00000008ull
    252 
    253 #define VC_NXF_SINGLE_IP		0x00000100ull
    254 #define VC_NXF_LBACK_REMAP		0x00000200ull
    255 #define VC_NXF_LBACK_ALLOW		0x00000400ull
    256 
    257 #define VC_NXF_HIDE_NETIF		0x02000000ull
    258 #define VC_NXF_HIDE_LBACK		0x04000000ull
    259 
    260 #define VC_NXF_STATE_SETUP		(1ULL<<32)
    261 #define VC_NXF_STATE_ADMIN		(1ULL<<34)
    262 
    263 #define VC_NXF_SC_HELPER		(1ULL<<36)
    264 #define VC_NXF_PERSISTENT		(1ULL<<38)
    265 
    266 
    267 // the network capabilities
    268 #define VC_NXC_TUN_CREATE		0x00000001ull
    269 
    270 #define VC_NXC_RAW_ICMP			0x00000100ull
    271 
    272 
    273 // the vserver specific limits
    274 #define VC_VLIMIT_NSOCK			16
    275 #define VC_VLIMIT_OPENFD		17
    276 #define VC_VLIMIT_ANON			18
    277 #define VC_VLIMIT_SHMEM			19
    278 #define VC_VLIMIT_SEMARY		20
    279 #define VC_VLIMIT_NSEMS			21
    280 #define VC_VLIMIT_DENTRY		22
    281 #define VC_VLIMIT_MAPPED		23
    282 
    283 
    284 // the VCI bit values
    285 #define VC_VCI_NO_DYNAMIC		(1 << 0)
    286 #define VC_VCI_PROC_SECURE		(1 << 4)
    287 #define VC_VCI_HARDCPU			(1 << 5)
    288 #define VC_VCI_IDLELIMIT		(1 << 6)
    289 #define VC_VCI_IDLETIME			(1 << 7)
    290 #define VC_VCI_COWBL			(1 << 8)
    291 #define VC_VCI_FULLCOWBL		(1 << 9)
    292 #define VC_VCI_SPACES			(1 << 10)
    293 #define VC_VCI_NETV2			(1 << 11)
    294 #define VC_VCI_MEMCG			(1 << 12)
    295 #define VC_VCI_DEBUG			(1 << 16)
    296 #define VC_VCI_HISTORY			(1 << 20)
    297 #define VC_VCI_TAGGED			(1 << 24)
    298 #define VC_VCI_PPTAG			(1 << 28)
    299 
    300 
    301 // the device mapping flags
    302 #define VC_DATTR_CREATE			0x00000001
    303 #define VC_DATTR_OPEN			0x00000002
    304 
    305 #define VC_DATTR_REMAP			0x00000010
    306 
    307 
    308 // the process context migration flags
    309 #define VC_VXM_SET_INIT			0x00000001
    310 #define VC_VXM_SET_REAPER		0x00000002
    311 
    312 
    313 // the network address flags
    314 #define VC_NXA_TYPE_IPV4		0x0001
    315 #define VC_NXA_TYPE_IPV6		0x0002
    316 
    317 #define VC_NXA_TYPE_NONE		0x0000
    318 #define VC_NXA_TYPE_ANY			0x00FF
    319 
    320 #define VC_NXA_TYPE_ADDR		0x0010
    321 #define VC_NXA_TYPE_MASK		0x0020
    322 #define VC_NXA_TYPE_RANGE		0x0040
    323 
    324 #define VC_NXA_MOD_BCAST		0x0100
    325 #define VC_NXA_MOD_LBACK		0x0200
    326 
    327 
    328 #ifndef CLONE_NEWNS
    329 #  define CLONE_NEWNS			0x00020000
    330 #endif
    331 #ifndef CLONE_NEWUTS
    332 #  define CLONE_NEWUTS			0x04000000
    333 #endif
    334 #ifndef CLONE_NEWIPC
    335 #  define CLONE_NEWIPC			0x08000000
    336 #endif
    337 #ifndef CLONE_NEWUSER
    338 #  define CLONE_NEWUSER			0x10000000
    339 #endif
    340 #ifndef CLONE_NEWPID
    341 #  define CLONE_NEWPID			0x20000000
    342 #endif
    343 #ifndef CLONE_NEWNET
    344 #  define CLONE_NEWNET			0x40000000
    345 #endif
    346 
    347 
    348 #define VC_BAD_PERSONALITY		((uint_least32_t)(-1))
    349 
    350 
    351 /** \defgroup  syscalls Syscall wrappers
    352  *  Functions which are calling the vserver syscall directly. */
    353 
    354 /** \defgroup  helper   Helper functions
    355  *  Functions which are doing general helper tasks like parameter parsing. */
    356 
    357 /** \typedef  an_unsigned_integer_type  xid_t
    358  *  The identifier of a context. */
    359 
    360 #ifdef IS_DOXYGEN
    361 typedef an_unsigned_integer_type	xid_t;
    362 typedef an_unsigned_integer_type	nid_t;
    363 typedef an_unsigned_integer_type	tag_t;
    364 #endif
    365 
    366 #ifdef __cplusplus
    367 extern "C" {
    368 #endif
    369 
    370     /** \brief   The generic vserver syscall
    371      *  \ingroup syscalls
    372      *
    373      *  This function executes the generic vserver syscall. It uses the
    374      *  correct syscallnumber (which may differ between the different
    375      *  architectures).
    376      *
    377      *  \param   cmd  the command to be executed
    378      *  \param   xid  the xid on which the cmd shall be applied
    379      *  \param   data additional arguments; depends on \c cmd
    380      *  \returns depends on \c cmd; usually, -1 stands for an error
    381      */
    382   int		vc_syscall(uint32_t cmd, xid_t xid, void *data);
    383 
    384     /** \brief   Returns the version of the current kernel API.
    385      *  \ingroup syscalls
    386      *	\returns The versionnumber of the kernel API
    387      */
    388   int		vc_get_version();
    389 
    390   typedef	uint64_t vc_vci_t;
    391     /** \brief   Returns the kernel configuration bits
    392      *  \ingroup syscalls
    393      *  \returns The kernel configuration bits
    394      */
    395   vc_vci_t	vc_get_vci();
    396 
    397   int		vc_get_kernel();
    398 
    399     /** \brief   Moves current process into a context
    400      *  \ingroup syscalls
    401      *
    402      *  Puts current process into context \a ctx, removes the capabilities
    403      *  given in \a remove_cap and sets \a flags.
    404      *
    405      *  \param ctx         The new context; special values for are
    406      *  - VC_SAMECTX      which means the current context (just for changing caps and flags)
    407      *  - VC_DYNAMIC_XID  which means the next free context; this value can be used by
    408      *                    ordinary users also
    409      *  \param remove_cap  The linux capabilities which will be \b removed.
    410      *  \param flags       Special flags which will be set.
    411      *
    412      *  \returns  The new context-id, or VC_NOCTX on errors; \c errno
    413      *	          will be set appropriately
    414      *
    415      *  See http://vserver.13thfloor.at/Stuff/Logic.txt for details */
    416   xid_t		vc_new_s_context(xid_t ctx, unsigned int remove_cap, unsigned int flags);
    417 
    418   struct vc_ip_mask_pair {
    419       uint32_t	ip;
    420       uint32_t	mask;
    421   };
    422 
    423     /** \brief  Sets the ipv4root information.
    424      *  \ingroup syscalls
    425      *  \pre    \a nb < NB_IPV4ROOT && \a ips != 0 */
    426   int		vc_set_ipv4root(uint32_t  bcast, size_t nb,
    427 			struct vc_ip_mask_pair const *ips) VC_ATTR_NONNULL((3));
    428 
    429     /** \brief  Returns the value of NB_IPV4ROOT.
    430      *  \ingroup helper
    431      *
    432      *  This function returns the value of NB_IPV4ROOT which was used when the
    433      *  library was built, but \b not the value which is used by the currently
    434      *  running kernel. */
    435   size_t	vc_get_nb_ipv4root() VC_ATTR_CONST VC_ATTR_PURE;
    436 
    437     /* process context */
    438   /** \brief    Flags of process-contexts
    439    */
    440   struct  vc_ctx_flags {
    441       /** \brief Mask of set context flags */
    442       uint_least64_t	flagword;
    443       /** \brief Mask of set and unset context flags when used by set
    444        *         operations, or modifiable flags when used by get
    445        *         operations */
    446       uint_least64_t	mask;
    447   };
    448 
    449     /** \brief   Creates a context without starting it.
    450      *  \ingroup syscalls
    451      *
    452      *  This functions initializes a new context. When already in a freshly
    453      *  created context, this old context will be discarded.
    454      *
    455      *  \param xid  The new context; special values are:
    456      *	- VC_DYNAMIC_XID which means to create a dynamic context
    457      *
    458      *	\returns the xid of the created context, or VC_NOCTX on errors. \c errno
    459      *	         will be set appropriately. */
    460   xid_t		vc_ctx_create(xid_t xid, struct vc_ctx_flags *flags);
    461 
    462     /** \brief   Moves the current process into the specified context.
    463      *  \ingroup syscalls
    464      *
    465      *  \param   xid    The new context
    466      *  \param   flags  The flags, see VC_VXM_*
    467      *  \returns 0 on success, -1 on errors */
    468   int		vc_ctx_migrate(xid_t xid, uint_least64_t flags);
    469 
    470     /** \brief   Statistics about a context */
    471   struct vc_ctx_stat {
    472       uint_least32_t	usecnt;	///< number of uses
    473       uint_least32_t	tasks;	///< number of tasks
    474   };
    475 
    476     /** \brief   Get some statistics about a context.
    477      *  \ingroup syscalls
    478      *
    479      *  \param   xid   The context to get stats about
    480      *  \param   stat  Where to store the result
    481      *
    482      *  \returns 0 on success, -1 on errors. */
    483   int		vc_ctx_stat(xid_t xid, struct vc_ctx_stat /*@out@*/ *stat) VC_ATTR_NONNULL((2));
    484 
    485     /** \brief   Contains further statistics about a context. */
    486   struct vc_virt_stat {
    487       uint_least64_t	offset;
    488       uint_least64_t	uptime;
    489       uint_least32_t	nr_threads;
    490       uint_least32_t	nr_running;
    491       uint_least32_t	nr_uninterruptible;
    492       uint_least32_t	nr_onhold;
    493       uint_least32_t	nr_forks;
    494       uint_least32_t	load[3];
    495   };
    496 
    497     /** \brief   Get more statistics about a context.
    498      *  \ingroup syscalls
    499      *
    500      *  \param xid   The context to get stats about
    501      *  \param stat  Where to store the result
    502      *
    503      *  \returns 0 on success, -1 on errors. */
    504   int		vc_virt_stat(xid_t xid, struct vc_virt_stat /*@out@*/ *stat) VC_ATTR_NONNULL((2));
    505 
    506   /** \brief    Sends a signal to a context/pid
    507    *  \ingroup  syscalls
    508    *
    509    *  Special values for \a pid are:
    510    *  - -1   which means every process in ctx except the init-process
    511    *  -  0   which means every process in ctx inclusive the init-process */
    512   int		vc_ctx_kill(xid_t ctx, pid_t pid, int sig);
    513  
    514   int		vc_get_cflags(xid_t xid, struct vc_ctx_flags /*@out@*/ *)	VC_ATTR_NONNULL((2));
    515   int		vc_set_cflags(xid_t xid, struct vc_ctx_flags /*@in@*/ const *)	VC_ATTR_NONNULL((2));
    516 
    517   /** \brief    Capabilities of process-contexts */
    518   struct  vc_ctx_caps {
    519       /** \brief  Mask of set common system capabilities */
    520       uint_least64_t	bcaps;
    521       /** \brief Mask of set and unset common system capabilities when used by
    522        *         set operations, or the modifiable capabilities when used by
    523        *         get operations */
    524       uint_least64_t	bmask;
    525       /** \brief Mask of set process context capabilities */
    526       uint_least64_t	ccaps;
    527       /** \brief Mask of set and unset process context capabilities when used
    528        *         by set operations, or the modifiable capabilities when used
    529        *         by get operations */
    530       uint_least64_t	cmask;
    531   };
    532 
    533   int		vc_get_ccaps(xid_t xid, struct vc_ctx_caps *);
    534   int		vc_set_ccaps(xid_t xid, struct vc_ctx_caps const *);
    535 
    536   struct vc_vx_info {
    537       xid_t	xid;
    538       pid_t	initpid;
    539   };
    540 
    541   int		vc_get_vx_info(xid_t xid, struct vc_vx_info *info) VC_ATTR_NONNULL((2));
    542   
    543     /** \brief   Returns the context of the given process.
    544      *  \ingroup syscalls
    545      *
    546      *  \param  pid  the process-id whose xid shall be determined;
    547      *               pid==0 means the current process.
    548      *  \returns     the xid of process \c pid or -1 on errors
    549      */
    550   xid_t		vc_get_task_xid(pid_t pid);
    551 
    552   /** \brief   Waits for the end of a context
    553    *  \ingroup syscalls
    554    */
    555   int		vc_wait_exit(xid_t xid);
    556   
    557     /* rlimit related functions */
    558   
    559     /** \brief  The type which is used for a single limit value.
    560      *
    561      *  Special values are
    562      *  - VC_LIM_INFINITY ... which is the infinite value
    563      *  - VC_LIM_KEEP     ... which is used to mark values which shall not be
    564      *                        modified by the vc_set_rlimit() operation.
    565      *
    566      *  Else, the interpretation of the value depends on the corresponding
    567      *  resource; it might be bytes, pages, seconds or litres of beer. */
    568   typedef uint_least64_t	vc_limit_t;
    569 
    570     /** \brief  Masks describing the supported limits. */
    571   struct  vc_rlimit_mask {
    572       uint_least32_t	min;	///< masks the resources supporting a minimum limit
    573       uint_least32_t	soft;	///< masks the resources supporting a soft limit
    574       uint_least32_t	hard;	///< masks the resources supporting a hard limit
    575   };
    576 
    577     /** \brief  Returns the limits supported by the kernel */
    578   int		vc_get_rlimit_mask(xid_t xid,
    579 			   struct vc_rlimit_mask /*@out@*/ *lim) VC_ATTR_NONNULL((2));
    580 
    581     /** \brief  The limits of a resources.
    582      *
    583      *  This is a triple consisting of a minimum, soft and hardlimit. */
    584   struct vc_rlimit {
    585       vc_limit_t	min;	///< the guaranted minimum of a resources
    586       vc_limit_t	soft;	///< the softlimit of a resource
    587       vc_limit_t	hard;	///< the absolute hardlimit of a resource
    588   };
    589 
    590     /** \brief   Returns the limits of \a resource.
    591      *  \ingroup syscalls
    592      *
    593      *  \param  xid       The id of the context
    594      *  \param  resource  The resource which will be queried
    595      *  \param  lim       The result which will be filled with the limits
    596      *
    597      *  \returns 0 on success, and -1 on errors. */
    598   int		vc_get_rlimit(xid_t xid, int resource,
    599 		      struct vc_rlimit       /*@out@*/ *lim) VC_ATTR_NONNULL((3));
    600     /** \brief   Sets the limits of \a resource.
    601      *  \ingroup syscalls
    602      *
    603      *  \param  xid       The id of the context
    604      *  \param  resource  The resource which will be queried
    605      *  \param  lim       The new limits
    606      *
    607      *  \returns 0 on success, and -1 on errors. */
    608   int		vc_set_rlimit(xid_t xid, int resource,
    609 		      struct vc_rlimit const /*@in@*/  *lim) VC_ATTR_NONNULL((3));
    610 
    611     /** \brief Statistics for a resource limit. */
    612   struct  vc_rlimit_stat {
    613       uint_least32_t	hits;	 ///< number of hits on the limit
    614       vc_limit_t	value;	 ///< current value
    615       vc_limit_t	minimum; ///< minimum value observed
    616       vc_limit_t	maximum; ///< maximum value observed
    617   };
    618 
    619     /** \brief   Returns the current stats of \a resource.
    620      *  \ingroup syscalls
    621      *
    622      *  \param  xid       The id of the context
    623      *  \param  resource  The resource which will be queried
    624      *  \param  stat      The result which will be filled with the stats
    625      *
    626      *  \returns 0 on success, and -1 on errors. */
    627   int		vc_rlimit_stat(xid_t xid, int resource,
    628 		       struct vc_rlimit_stat /*@out@*/ *stat) VC_ATTR_NONNULL((3));
    629 
    630     /** \brief   Resets the minimum and maximum observed values of all resources.
    631      *  \ingroup syscalls
    632      *
    633      *  \param xid	The id of the context
    634      *
    635      *  \returns 0 on success, and -1 on errors. */
    636   int		vc_reset_minmax(xid_t xid);
    637 
    638     /** \brief   Parses a string describing a limit
    639      *  \ingroup helper
    640      *
    641      *  This function parses \a str and interprets special words like \p "inf"
    642      *  or suffixes. Valid suffixes are
    643      *  - \p k ... 1000
    644      *  - \p m ... 1000000
    645      *  - \p K ... 1024
    646      *  - \p M ... 1048576
    647      *
    648      *  \param str  The string which shall be parsed
    649      *  \param res  Will be filled with the interpreted value; in errorcase,
    650      *              this value is undefined.
    651      *
    652      *  \returns \a true, iff the string \a str could be parsed. \a res will
    653      *  be filled with the interpreted value in this case. 
    654      *
    655      *  \pre \a str!=0 && \a res!=0
    656      */
    657   bool		vc_parseLimit(char const /*@in@*/ *str, vc_limit_t /*@out@*/ *res)	VC_ATTR_NONNULL((1,2));
    658 
    659 
    660     /* network context */
    661   struct vc_nx_info {
    662       nid_t	nid;
    663   };
    664 
    665   nid_t		vc_get_task_nid(pid_t pid);
    666   int		vc_get_nx_info(nid_t nid, struct vc_nx_info *) VC_ATTR_NONNULL((2));
    667 
    668   struct vc_net_addr {
    669       uint16_t			vna_type;
    670       uint16_t			vna_flags;
    671       uint16_t			vna_prefix;
    672       uint16_t			vna_parent;
    673       struct {
    674 	union {
    675 	  struct in_addr	v4;
    676 	  struct in6_addr	v6;
    677 	} ip;
    678 	union {
    679 	  struct in_addr	v4;
    680 	  struct in6_addr	v6;
    681 	} ip2;
    682 	union {
    683 	  struct in_addr	v4;
    684 	  struct in6_addr	v6;
    685 	} mask;
    686       } s;
    687 #define vna_v4_ip	s.ip.v4
    688 #define vna_v4_ip2	s.ip2.v4
    689 #define vna_v4_mask	s.mask.v4
    690 #define vna_v6_ip	s.ip.v6
    691 #define vna_v6_ip2	s.ip2.v6
    692 #define vna_v6_mask	s.mask.v6
    693   };
    694 
    695   struct vc_net_flags {
    696       uint_least64_t	flagword;
    697       uint_least64_t	mask;
    698   };
    699 
    700   nid_t		vc_net_create(nid_t nid);
    701   int		vc_net_migrate(nid_t nid);
    702 
    703   int		vc_net_add(nid_t nid, struct vc_net_addr const *info);
    704   int		vc_net_remove(nid_t nid, struct vc_net_addr const *info);
    705 
    706   int		vc_get_nflags(nid_t, struct vc_net_flags *);
    707   int		vc_set_nflags(nid_t, struct vc_net_flags const *);
    708 
    709   struct vc_net_caps {
    710       uint_least64_t	ncaps;
    711       uint_least64_t	cmask;
    712   };
    713 
    714   int		vc_get_ncaps(nid_t, struct vc_net_caps *);
    715   int		vc_set_ncaps(nid_t, struct vc_net_caps const *);
    716 
    717 
    718     /* iattr related functions */
    719 
    720   int		vc_set_iattr(char const *filename, xid_t xid,
    721 			     uint_least32_t flags, uint_least32_t mask) VC_ATTR_NONNULL((1));
    722 
    723   int		vc_fset_iattr(int fd, xid_t xid,
    724 			      uint_least32_t flags, uint_least32_t mask);
    725 
    726     /** \brief   Returns information about attributes and assigned context of a file.
    727      *  \ingroup syscalls
    728      *
    729      *  This function returns the VC_IATTR_XXX flags and about the assigned
    730      *  context of a file. To request an information, the appropriate bit in
    731      *  \c mask must be set and the corresponding parameter (\a xid or \a
    732      *  flags) must not be NULL.
    733      *
    734      *  E.g. to receive the assigned context, the \c VC_IATTR_XID bit must be
    735      *  set in \a mask, and \a xid must point to valid memory.
    736      *
    737      *  Possible flags are \c VC_IATTR_ADMIN, \c VC_IATTR_WATCH , \c VC_IATTR_HIDE,
    738      *  \c VC_IATTR_BARRIER, \c VC_IATTR_IUNLINK and \c VC_IATTR_IMMUTABLE.
    739      *
    740      *  \param filename  The name of the file whose attributes shall be determined.
    741 
    742      *  \param xid       When non-zero and the VC_IATTR_XID bit is set in \a mask,
    743      *                   the assigned context of \a filename will be stored there.
    744      *  \param flags     When non-zero, a bitmask of current attributes will be
    745      *                   stored there. These attributes must be requested explicitly
    746      *                   by setting the appropriate bit in \a mask
    747      *  \param mask      Points to a bitmask which tells which attributes shall be
    748      *                   determined. On return, it will masquerade the attributes
    749      *                   which were determined.
    750      *
    751      *  \pre  mask!=0 && !((*mask&VC_IATTR_XID) && xid==0) && !((*mask&~VC_IATTR_XID) && flags==0) */
    752   int		vc_get_iattr(char const *filename, xid_t * /*@null@*/ xid,
    753 			     uint_least32_t * /*@null@*/ flags,
    754 			     uint_least32_t * /*@null@*/ mask) VC_ATTR_NONNULL((1));
    755 
    756   int		vc_fget_iattr(int fd, xid_t * /*@null@*/ xid,
    757 			      uint_least32_t * /*@null@*/ flags,
    758 			      uint_least32_t * /*@null@*/ mask) VC_ATTR_NONNULL((4));
    759   
    760   /** \brief   Returns the context of \c filename
    761    *  \ingroup syscalls
    762    *
    763    *  This function calls vc_get_iattr() with appropriate arguments to
    764    *  determine the context of \c filename. In error-case or when no context
    765    *  is assigned, \c VC_NOCTX will be returned. To differ between both cases,
    766    *  \c errno must be examined.
    767    *
    768    *  \b WARNING: this function can modify \c errno although no error happened.
    769    *
    770    *  \param   filename  The file to check
    771    *  \returns The assigned context, or VC_NOCTX when an error occured or no
    772    *           such assignment exists. \c errno will be 0 in the latter case */
    773   xid_t		vc_getfilecontext(char const *filename) VC_ATTR_NONNULL((1));
    774 
    775 
    776     /* vhi related functions */
    777   typedef enum { vcVHI_CONTEXT, vcVHI_SYSNAME, vcVHI_NODENAME,
    778 		 vcVHI_RELEASE, vcVHI_VERSION, vcVHI_MACHINE,
    779 		 vcVHI_DOMAINNAME }		vc_uts_type;
    780   
    781   int		vc_set_vhi_name(xid_t xid, vc_uts_type type,
    782 				char const *val, size_t len) VC_ATTR_NONNULL((3));
    783   int		vc_get_vhi_name(xid_t xid, vc_uts_type type,
    784 				char *val, size_t len)       VC_ATTR_NONNULL((3));
    785 
    786     /* namespace related functions */
    787   int		vc_enter_namespace(xid_t xid, uint_least64_t mask, uint32_t index);
    788   int		vc_set_namespace(xid_t xid, uint_least64_t mask, uint32_t index);
    789   int		vc_cleanup_namespace(void);
    790   uint_least64_t vc_get_space_mask(void);
    791   uint_least64_t vc_get_space_default(void);
    792 
    793 
    794     /* disk limit related things */
    795   struct vc_ctx_dlimit {
    796       uint_least32_t	space_used;
    797       uint_least32_t	space_total;
    798       uint_least32_t	inodes_used;
    799       uint_least32_t	inodes_total;
    800       uint_least32_t	reserved;
    801   };
    802   
    803 
    804   /** Add a disk limit to a file system. */
    805   int		vc_add_dlimit(char const *filename, xid_t xid,
    806 			      uint_least32_t flags) VC_ATTR_NONNULL((1));
    807   /** Remove a disk limit from a file system. */
    808   int		vc_rem_dlimit(char const *filename, xid_t xid,
    809 			      uint_least32_t flags) VC_ATTR_NONNULL((1));
    810 
    811   /** Set a disk limit. */
    812   int		vc_set_dlimit(char const *filename, xid_t xid,
    813 			      uint_least32_t flags,
    814 			      struct vc_ctx_dlimit const *limits) VC_ATTR_NONNULL((1,4));
    815   /** Get a disk limit. */
    816   int		vc_get_dlimit(char const *filename, xid_t xid,
    817 			      uint_least32_t flags,
    818 			      struct vc_ctx_dlimit *limits) VC_ATTR_NONNULL((1));
    819 
    820   /** Get the filesystem tag for a process. */
    821   tag_t		vc_get_task_tag(pid_t pid);
    822 
    823   /** Create a new filesystem tag space. */
    824   int		vc_tag_create(tag_t tag);
    825 
    826   /** Migrate to an existing filesystem tag space. */
    827   int		vc_tag_migrate(tag_t tag);
    828 
    829     /* scheduler related syscalls */
    830   struct vc_set_sched {
    831       uint_least32_t	set_mask;
    832       int_least32_t	fill_rate;
    833       int_least32_t	interval;
    834       int_least32_t	fill_rate2;
    835       int_least32_t	interval2;
    836       int_least32_t	tokens;
    837       int_least32_t	tokens_min;
    838       int_least32_t	tokens_max;
    839       int_least32_t	priority_bias;
    840       int_least32_t	cpu_id;
    841       int_least32_t	bucket_id;
    842   };
    843 
    844   int		vc_set_sched(xid_t xid, struct vc_set_sched const *) VC_ATTR_NONNULL((2));
    845   int		vc_get_sched(xid_t xid, struct vc_set_sched *) VC_ATTR_NONNULL((2));
    846 
    847   struct vc_sched_info {
    848       int_least32_t	cpu_id;
    849       int_least32_t	bucket_id;
    850       uint_least64_t	user_msec;
    851       uint_least64_t	sys_msec;
    852       uint_least64_t	hold_msec;
    853       uint_least32_t	token_usec;
    854       int_least32_t	vavavoom;
    855   };
    856 
    857   int		vc_sched_info(xid_t xid, struct vc_sched_info *info) VC_ATTR_NONNULL((2));
    858 
    859     /* misc. syscalls */
    860   int		vc_set_mapping(xid_t xid, const char *device, const char *target, uint32_t flags);
    861   int		vc_unset_mapping(xid_t xid, const char *device, const char *target, uint32_t flags);
    862 
    863   int		vc_get_badness(xid_t xid, int64_t *badness);
    864   int		vc_set_badness(xid_t xid, int64_t badness);
    865 
    866 
    867   /** \brief	Namespaces allowed to unshare */
    868   struct vc_umask {
    869       uint_least64_t	umask;
    870       uint_least64_t	mask;
    871   };
    872 
    873   int		vc_get_umask(xid_t xid, struct vc_umask *umask);
    874   int		vc_set_umask(xid_t xid, struct vc_umask const *umask);
    875 
    876   /** \brief    Information about parsing errors
    877    *  \ingroup  helper
    878    */
    879   struct vc_err_listparser {
    880       char const	*ptr;		///< Pointer to the first character of an erroneous string
    881       size_t		len;		///< Length of the erroneous string
    882   };
    883 
    884   /** \brief   Converts a single string into bcapability
    885    *  \ingroup helper
    886    *
    887    *  \param   str   The string to be parsed;
    888    *                 both "CAP_xxx" and "xxx" will be accepted
    889    *  \param   len   The length of the string, or \c 0 for automatic detection
    890    *
    891    *  \returns 0 on error; a bitmask on success
    892    *  \pre     \a str != 0
    893    */
    894   uint_least64_t	vc_text2bcap(char const *str, size_t len);
    895 
    896   /** \brief   Converts the lowest bit of a bcapability or the entire value
    897    *           (when possible) to a textual representation
    898    *  \ingroup helper
    899    *
    900    *  \param   val  The string to be converted; on success, the detected bit(s)
    901    *                will be unset, in errorcase only the lowest set bit
    902    *
    903    *  \returns A textual representation of \a val resp. of its lowest set bit;
    904    *           or \c NULL in errorcase.
    905    *  \pre     \a val!=0
    906    *  \post    \a *val<sub>old</sub> \c != 0  \c <-->
    907    *               \a *val<sub>old</sub> > \a *val<sub>new</sub>
    908    *  \post    \a *val<sub>old</sub> \c == 0  \c --->  \a result == 0
    909    */
    910   char const *	vc_lobcap2text(uint_least64_t *val) VC_ATTR_NONNULL((1));
    911 
    912   /** \brief   Converts a string into a bcapability-bitmask
    913    *  \ingroup helper
    914    *
    915    *  Syntax of \a str: \verbinclude list2xxx.syntax
    916    *
    917    *  When the \c `~' prefix is used, the bits will be unset and a `~' after
    918    *  another `~' will cancel both ones. The \c `^' prefix specifies a
    919    *  bitnumber instead of a bitmask.
    920    *
    921    *  "literal name" is everything which will be accepted by the
    922    *  vc_text2bcap() function. The special values for \c NAME will be
    923    *  recognized case insensitively
    924    *
    925    *  \param  str   The string to be parsed
    926    *  \param  len   The length of the string, or \c 0 for automatic detection
    927    *  \param  err   Pointer to a structure for error-information, or \c NULL.
    928    *  \param  cap   Pointer to a vc_ctx_caps structure holding the results;
    929    *                only the \a bcaps and \a bmask fields will be changed and
    930    *                already set values will not be honored. When an error
    931    *                occured, \a cap will have the value of all processed valid
    932    *                \c BCAP parts.
    933    *
    934    *  \returns 0 on success, -1 on error. In error case, \a err will hold
    935    *           position and length of the first not understood BCAP part
    936    *  \pre     \a str != 0 && \a cap != 0;
    937    *           \a cap->bcaps and \a cap->bmask must be initialized
    938    */
    939   int			vc_list2bcap(char const *str, size_t len,
    940 				     struct vc_err_listparser *err,
    941 				     struct vc_ctx_caps *cap) VC_ATTR_NONNULL((1,4));
    942 
    943   uint_least64_t	vc_text2ccap(char const *, size_t len);
    944   char const *		vc_loccap2text(uint_least64_t *);
    945   int			vc_list2ccap(char const *, size_t len,
    946 				     struct vc_err_listparser *err,
    947 				     struct vc_ctx_caps *);
    948   char const *		vc_loumask2text(uint_least64_t *);
    949   int			vc_list2umask(char const *, size_t len,
    950 				     struct vc_err_listparser *err,
    951 				     struct vc_umask *);
    952   int			vc_list2cflag(char const *, size_t len,
    953 				     struct vc_err_listparser *err,
    954 				     struct vc_ctx_flags *flags);
    955   uint_least64_t	vc_text2umask(char const *str, size_t len);
    956   uint_least64_t	vc_text2cflag(char const *, size_t len);
    957   char const *		vc_locflag2text(uint_least64_t *);
    958   
    959   uint_least32_t	vc_list2cflag_compat(char const *, size_t len,
    960 					    struct vc_err_listparser *err);
    961   uint_least32_t	vc_text2cflag_compat(char const *, size_t len);
    962   char const *		vc_hicflag2text_compat(uint_least32_t);
    963 
    964   int			vc_text2cap(char const *);
    965   char const *		vc_cap2text(unsigned int);
    966 
    967   
    968   int			vc_list2nflag(char const *, size_t len,
    969 				     struct vc_err_listparser *err,
    970 				     struct vc_net_flags *flags);
    971   uint_least64_t	vc_text2nflag(char const *, size_t len);
    972   char const *		vc_lonflag2text(uint_least64_t *);
    973 
    974   uint_least64_t	vc_text2ncap(char const *, size_t len);
    975   char const *		vc_loncap2text(uint_least64_t *);
    976   int			vc_list2ncap(char const *, size_t len,
    977 				     struct vc_err_listparser *err,
    978 				     struct vc_net_caps *);
    979 
    980   uint_least64_t		vc_get_insecurebcaps() VC_ATTR_CONST;
    981   inline static uint_least64_t	vc_get_insecureccaps() {
    982     return ~(VC_VXC_SET_UTSNAME|VC_VXC_RAW_ICMP|VC_VXC_AUDIT_CONTROL);
    983   }
    984   
    985   inline static int	vc_setfilecontext(char const *filename, xid_t xid) {
    986     return vc_set_iattr(filename, xid, 0, VC_IATTR_XID);
    987   }
    988 
    989 
    990   uint_least32_t	vc_text2personalityflag(char const *str,
    991 						size_t len) VC_ATTR_NONNULL((1));
    992 
    993   char const *		vc_lopersonality2text(uint_least32_t *) VC_ATTR_NONNULL((1));
    994   
    995   int			vc_list2personalityflag(char const /*@in@*/ *,
    996 						size_t len,
    997 						uint_least32_t /*@out@*/ *personality,
    998 						struct vc_err_listparser /*@out@*/ *err) VC_ATTR_NONNULL((1,3));
    999 
   1000   uint_least32_t	vc_str2personalitytype(char const /*@in@*/*,
   1001 					       size_t len) VC_ATTR_NONNULL((1));
   1002 
   1003     
   1004   typedef enum { vcFEATURE_VKILL,  vcFEATURE_IATTR,   vcFEATURE_RLIMIT,
   1005 		 vcFEATURE_COMPAT, vcFEATURE_MIGRATE, vcFEATURE_NAMESPACE,
   1006 		 vcFEATURE_SCHED,  vcFEATURE_VINFO,   vcFEATURE_VHI,
   1007                  vcFEATURE_VSHELPER0, vcFEATURE_VSHELPER, vcFEATURE_VWAIT,
   1008 		 vcFEATURE_VNET,   vcFEATURE_VSTAT,   vcFEATURE_PPTAG,
   1009 		 vcFEATURE_PIDSPACE, vcFEATURE_SPACES, vcFEATURE_PERSISTENT,
   1010 		 vcFEATURE_PIVOT_ROOT, vcFEATURE_MEMCG, vcFEATURE_DYNAMIC,
   1011 		 vcFEATURE_BME,
   1012 		 }
   1013     vcFeatureSet;
   1014 
   1015   bool		vc_isSupported(vcFeatureSet) VC_ATTR_CONST;
   1016   bool		vc_isSupportedString(char const *);
   1017 
   1018   
   1019   typedef enum { vcTYPE_INVALID, vcTYPE_MAIN, vcTYPE_WATCH,
   1020 		 vcTYPE_STATIC, vcTYPE_DYNAMIC }
   1021     vcXidType;
   1022   
   1023   vcXidType	vc_getXIDType(xid_t xid) VC_ATTR_CONST;
   1024 
   1025     /** Returns true iff \a xid is a dynamic xid */
   1026   bool		vc_is_dynamic_xid(xid_t xid);
   1027 
   1028 
   1029   /* The management part */
   1030 
   1031 #define VC_LIMIT_VSERVER_NAME_LEN	1024
   1032   
   1033   typedef enum { vcCFG_NONE, vcCFG_AUTO,
   1034 		 vcCFG_LEGACY,
   1035 		 vcCFG_RECENT_SHORT,
   1036 		 vcCFG_RECENT_FULL }		vcCfgStyle;
   1037 
   1038 
   1039   /** Maps an xid given at '--xid' options to an xid_t */
   1040   xid_t		vc_xidopt2xid(char const *, bool honor_static, char const **err_info);
   1041   /** Maps a  nid given at '--nid' options to a  nid_t */
   1042   nid_t		vc_nidopt2nid(char const *, bool honor_static, char const **err_info);
   1043   /** Maps a  tag given at '--tag' options to a  tag_t */
   1044   tag_t		vc_tagopt2tag(char const *, bool honor_static, char const **err_info);
   1045 
   1046   vcCfgStyle	vc_getVserverCfgStyle(char const *id);
   1047   
   1048   /** Resolves the name of the vserver. The result will be allocated and must
   1049       be freed by the caller. */
   1050   char *	vc_getVserverName(char const *id, vcCfgStyle style);
   1051 
   1052   /** Returns the path of the vserver configuration directory. When the given
   1053    *  vserver does not exist, or when it does not have such a directory, NULL
   1054    *  will be returned. Else, the result will be allocated and must be freed
   1055    *  by the caller. */
   1056   char *	vc_getVserverCfgDir(char const *id, vcCfgStyle style);
   1057 
   1058   /** Returns the path of the configuration directory for the given
   1059    *  application. The result will be allocated and must be freed by the
   1060    *  caller. */
   1061   char *	vc_getVserverAppDir(char const *id, vcCfgStyle style, char const *app);
   1062 
   1063   /** Returns the path to the vserver root-directory. The result will be
   1064    *  allocated and must be freed by the caller. */
   1065   char *	vc_getVserverVdir(char const *id, vcCfgStyle style, bool physical);
   1066 
   1067   typedef enum { vcCTX_XID = 1,
   1068 		 vcCTX_NID,
   1069 		 vcCTX_TAG,
   1070 	} vcCtxType;
   1071 
   1072   /** Returns the ctx of the given vserver. When vserver is not running and
   1073    *  'honor_static' is false, VC_NOCTX will be returned. Else, when
   1074    *  'honor_static' is true and a static assignment exists, those value will
   1075    *  be returned. Else, the result will be VC_NOCTX.
   1076    *
   1077    *  When 'is_running' is not null, the status of the vserver will be
   1078    *  assigned to this variable. */
   1079   xid_t		vc_getVserverCtx(char const *id, vcCfgStyle style,
   1080 				 bool honor_static, bool /*@null@*/ *is_running,
   1081 				 vcCtxType type);
   1082 
   1083   /** Resolves the cfg-path of the vserver owning the given ctx. 'revdir' will
   1084       be used as the directory holding the mapping-links; when NULL, the
   1085       default value will be assumed.  The result will be allocated and must be
   1086       freed by the caller. */
   1087   char *	vc_getVserverByCtx(xid_t ctx, /*@null@*/vcCfgStyle *style,
   1088 				   /*@null@*/char const *revdir);
   1089 
   1090   int		vc_compareVserverById(char const *lhs, vcCfgStyle lhs_style,
   1091 				      char const *rhs, vcCfgStyle rhs_style);
   1092 
   1093   void		vc_exitLikeProcess(int pid, int ret) VC_ATTR_NORETURN;
   1094  
   1095 #define vcSKEL_INTERFACES	1u
   1096 #define vcSKEL_PKGMGMT		2u
   1097 #define vcSKEL_FILESYSTEM	4u
   1098 
   1099   /** Create a basic configuration skeleton for a vserver plus toplevel
   1100    *  directories for pkgmanagemt and filesystem (when requested). */
   1101   int		vc_createSkeleton(char const *id, vcCfgStyle style, int flags);
   1102 
   1103 
   1104 #ifdef __cplusplus
   1105 }
   1106 #endif
   1107 
   1108 #undef VC_ATTR_PURE
   1109 #undef VC_ATTR_ALWAYSINLINE
   1110 #undef VC_ATTR_NORETURN
   1111 #undef VC_ATTR_UNUSED
   1112 #undef VC_ATTR_NONNULL
   1113 
   1114 #endif