ready for tagging
[util-vserver.git] / lib / vserver-internal.h
index ceb5d46..eb0504a 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: vserver-internal.h,v 1.25 2005/05/02 21:42:37 ensc Exp $    --*- c++ -*--
+// $Id: vserver-internal.h 2589 2007-08-16 03:06:50Z dhozac $    --*- c++ -*--
 
 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
 //  
@@ -41,12 +41,16 @@ inline static ALWAYSINLINE void vc_noop0() {}
 #define CALL_VC_NOOP   vc_noop0()
 #define CALL_VC_GENERAL(ID, SUFFIX, FUNC, ...)                         \
   VC_PREFIX; VC_SELECT(ID) return FUNC ## _ ## SUFFIX(__VA_ARGS__); VC_SUFFIX
+#define CALL_VC_GENERAL_CONFIG(BIT, SUFFIX, FUNC, ...)                 \
+  VC_PREFIX; VC_CBIT(BIT)  return FUNC ## _ ## SUFFIX(__VA_ARGS__); VC_SUFFIX
 
 #ifdef VC_MULTIVERSION_SYSCALL
 #  define VC_SELECT(ID)        if (ver>=(ID))
+#  define VC_CBIT(BIT)  if ((conf&BIT) == BIT)
 #  define CALL_VC(...)                                 \
   do {                                                 \
     int        ver = utilvserver_checkCompatVersion();         \
+    vc_vci_t UNUSED conf = utilvserver_checkCompatConfig();    \
     if (ver==-1) return -1;                            \
     VC_SUFFIX, __VA_ARGS__, VC_PREFIX;                 \
     errno = ENOSYS;                                    \
@@ -54,6 +58,7 @@ inline static ALWAYSINLINE void vc_noop0() {}
   } while (0)
 #else
 #  define VC_SELECT(ID) if (1)
+#  define VC_CBIT(BIT)  if (1)
 #  define CALL_VC(...)                                 \
   do {                                                 \
     if (1) {} VC_SUFFIX, __VA_ARGS__, VC_PREFIX;       \
@@ -97,12 +102,41 @@ inline static ALWAYSINLINE void vc_noop0() {}
 #  define CALL_VC_V13B(F,...)  CALL_VC_NOOP
 #endif
 
-#ifdef VC_ENABLE_API_V13
+#ifdef VC_ENABLE_API_V13OBS
 #  define CALL_VC_V13OBS(F,...)        CALL_VC_GENERAL(0x00010011, v13obs, F, __VA_ARGS__)
 #else
 #  define CALL_VC_V13OBS(F,...)        CALL_VC_NOOP
 #endif
 
+#ifdef VC_ENABLE_API_V21
+#  define CALL_VC_V21(F,...)   CALL_VC_GENERAL(0x00020100, v21, F, __VA_ARGS__)
+#else
+#  define CALL_VC_V21(F,...)   CALL_VC_NOOP
+#endif
+
+#if defined(VC_ENABLE_API_V21) || defined(VC_ENABLE_API_V22) || defined(VC_ENABLE_API_V23)
+#  define CALL_VC_SPACES(F,...)        CALL_VC_GENERAL_CONFIG(VC_VCI_SPACES, spaces, F, __VA_ARGS__)
+#else
+#  define CALL_VC_SPACES(F,...)        CALL_VC_NOOP
+#endif
+
+#if defined(VC_ENABLE_API_V23)
+#  define CALL_VC_TAG(F,...)   CALL_VC_GENERAL_CONFIG(VC_VCI_PPTAG, tag, F, __VA_ARGS__)
+#else
+#  define CALL_VC_TAG(F,...)   CALL_VC_NOOP
+#endif
+
+#ifdef VC_ENABLE_API_V22
+#  define CALL_VC_V22(F,...)   CALL_VC_GENERAL(0x00020200, v22, F, __VA_ARGS__)
+#else
+#  define CALL_VC_V22(F,...)   CALL_VC_NOOP
+#endif
+
+#ifdef VC_ENABLE_API_V23
+#  define CALL_VC_V23(F,...)   CALL_VC_GENERAL(0x00020300, v23, F, __VA_ARGS__)
+#else
+#  define CALL_VC_V23(F,...)   CALL_VC_NOOP
+#endif
 
 #ifdef VC_ENABLE_API_NET
 #  define CALL_VC_NET(F,...)   CALL_VC_GENERAL(0x00010016, net, F, __VA_ARGS__)
@@ -110,6 +144,12 @@ inline static ALWAYSINLINE void vc_noop0() {}
 #  define CALL_VC_NET(F,...)   CALL_VC_NOOP
 #endif
 
+#if defined(VC_ENABLE_API_NETV2)
+#  define CALL_VC_NETV2(F,...) CALL_VC_GENERAL_CONFIG(VC_VCI_NETV2, netv2, F, __VA_ARGS__)
+#else
+#  define CALL_VC_NETV2(F,...) CALL_VC_NOOP
+#endif
+
 #ifdef VC_ENABLE_API_FSCOMPAT
 #  define CALL_VC_FSCOMPAT(F,...)      CALL_VC_GENERAL(0x00010000, fscompat, F, __VA_ARGS__)
 #else
@@ -144,6 +184,19 @@ inline static ALWAYSINLINE void vc_noop0() {}
 #  define CTX_KERNEL2USER(X)   (X)
 #endif
 
+#if 1
+#  define TAG_KERNEL2USER(X)   (((X)==(uint32_t)(-1)) ? VC_NOCTX   : \
+                                ((X)==(uint32_t)(-2)) ? VC_SAMECTX : \
+                                (tag_t)(X))
+
+#  define TAG_USER2KERNEL(X)   (((X)==VC_DYNAMIC_XID) ? (uint32_t)(-1) : \
+                                ((X)==VC_SAMECTX)     ? (uint32_t)(-2) : \
+                                (uint32_t)(X))
+#else
+#  define TAG_USER2KERNEL(X)   (X)
+#  define TAG_KERNEL2USER(X)   (X)
+#endif
+
 #if 1
 #  define EXT2FLAGS_USER2KERNEL(X)     (((X) & ~(VC_IMMUTABLE_FILE_FL|VC_IMMUTABLE_LINK_FL)) | \
                                         ((X) & VC_IMMUTABLE_FILE_FL ? EXT2_IMMUTABLE_FILE_FL : 0) | \
@@ -189,22 +242,6 @@ inline static ALWAYSINLINE void vc_noop0() {}
 #  define NID_KERNEL2USER(X)   (X)
 #endif
 
-#if 1
-#  define NETTYPE_USER2KERNEL(X)       ((X)==vcNET_IPV4   ? 0 : \
-                                        (X)==vcNET_IPV6   ? 1 : \
-                                        (X)==vcNET_IPV4R  ? 2 : \
-                                        (X)==vcNET_IPV6R  ? 3 : \
-                                        (X))
-#  define NETTYPE_KERNEL2USER(X)       ((X)==0 ? vcNET_IPV4   ? : \
-                                        (X)==1 ? vcNET_IPV6   ? : \
-                                        (X)==2 ? vcNET_IPV4R  ? : \
-                                        (X)==3 ? vcNET_IPV6R  ? : \
-                                        (vc_net_nx_type)(X))
-#else
-#  define NETTYPE_USER2KERNEL(X)       (X)
-#  define NETTYPE_KERNEL2USER(X)       (X)
-#endif
-
 #define CDLIM_USER2KERNEL(X)           ((X)==VC_CDLIM_UNSET    ? CDLIM_UNSET    : \
                                         (X)==VC_CDLIM_INFINITY ? CDLIM_INFINITY : \
                                         (X)==VC_CDLIM_KEEP     ? CDLIM_KEEP     : \
@@ -235,10 +272,6 @@ inline static ALWAYSINLINE void vc_noop0() {}
 inline static UNUSED ALWAYSINLINE
 int vserver(uint32_t cmd, uint32_t id, void *data)
 {
-#if defined __dietlibc__
-  extern long int syscall (long int __sysno, ...);
-#endif
   return syscall(__NR_vserver, cmd, id, data);
 }
 #else