use $(LIBENSCVECTOR) instead of libensc_vector.a
[util-vserver.git] / util-vserver / lib / vserver-internal.h
index e49b063..9a4fb93 100644 (file)
 #  define __NR_vserver ENSC_SYSCALL__NR_vserver
 #endif
 
+inline static ALWAYSINLINE void vc_noop0() {}
+
 #define VC_PREFIX      0)
-#define VC_SUFFIX      else (void)((void)0
-#define CALL_VC_NOOP   (void)0
+#define VC_SUFFIX      else (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_V13(F,...)   CALL_VC_NOOP
 #endif
 
+#ifdef VC_ENABLE_API_V13
+#  define CALL_VC_V13A(F,...)  CALL_VC_GENERAL(0x00010012, v13, F, __VA_ARGS__)
+#else
+#  define CALL_VC_V13A(F,...)  CALL_VC_NOOP
+#endif
+
+#ifdef VC_ENABLE_API_V13
+#  define CALL_VC_V13B(F,...)  CALL_VC_GENERAL(0x00010021, v13b, F, __VA_ARGS__)
+#else
+#  define CALL_VC_V13B(F,...)  CALL_VC_NOOP
+#endif
+
+#ifdef VC_ENABLE_API_V13
+#  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_NET
+#  define CALL_VC_NET(F,...)   CALL_VC_GENERAL(0x00010016, net, F, __VA_ARGS__)
+#else
+#  define CALL_VC_NET(F,...)   CALL_VC_NOOP
+#endif
+
 #ifdef VC_ENABLE_API_FSCOMPAT
 #  define CALL_VC_FSCOMPAT(F,...)      CALL_VC_GENERAL(0x00010000, fscompat, F, __VA_ARGS__)
 #else
                                 ((X)==(uint32_t)(-2)) ? VC_SAMECTX : \
                                 (xid_t)(X))
 
-#  define CTX_USER2KERNEL(X)   (((X)==VC_RANDCTX) ? (uint32_t)(-1) : \
-                                ((X)==VC_SAMECTX) ? (uint32_t)(-2) : \
+#  define CTX_USER2KERNEL(X)   (((X)==VC_DYNAMIC_XID) ? (uint32_t)(-1) : \
+                                ((X)==VC_SAMECTX)     ? (uint32_t)(-2) : \
                                 (uint32_t)(X))
 #else
 #  define CTX_USER2KERNEL(X)   (X)
 #  define VHI_KERNEL2USER(X)           (X)
 #endif
 
+#if 1
+#  define NID_KERNEL2USER(X)   (((X)==(uint32_t)(-1)) ? VC_NONID   : \
+                                (xid_t)(X))
+
+#  define NID_USER2KERNEL(X)   (((X)==VC_DYNAMIC_NID) ? (uint32_t)(-1) : \
+                                (uint32_t)(X))
+#else
+#  define NID_USER2KERNEL(X)   (X)
+#  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     : \
+                                        (X))
+
+  /// the __typeof__ thing is a hack to deal with the kernel interface
+  /// using an unsigned long long value for a uint32_t type
+#define CDLIM_KERNEL2USER(X)           ((X)==(__typeof__(X))CDLIM_UNSET       ? VC_CDLIM_UNSET    : \
+                                        (X)==(__typeof__(X))CDLIM_INFINITY    ? VC_CDLIM_INFINITY : \
+                                        (X)==(__typeof__(X))CDLIM_KEEP        ? VC_CDLIM_KEEP     : \
+                                        (X))
+
+
+#define ENSC_STRUCT_IDX(STRUCT,ATTR)                   \
+  ((char*)(&(STRUCT).ATTR) - (char*)(&(STRUCT)))
+#define ENSC_SAME_STRUCT_IDX(LHS,RHS,ATTR)                     \
+  (ENSC_STRUCT_IDX(LHS,ATTR) == ENSC_STRUCT_IDX(RHS,ATTR))
+#define ENSC_SAME_STRUCT_ITEM(LHS,RHS,ATTR)    \
+  (ENSC_SAME_STRUCT_IDX(LHS,RHS,ATTR) &&       \
+   sizeof((LHS).ATTR)==sizeof((RHS).ATTR) &&   \
+   sizeof(LHS)==sizeof(RHS))
 
 #define EXT2_IOC_GETCONTEXT            _IOR('x', 1, long)
 #define EXT2_IOC_SETCONTEXT            _IOW('x', 2, long)