use $(LIBENSCVECTOR) instead of libensc_vector.a
[util-vserver.git] / util-vserver / lib / vserver.h
index 88423fb..b997d29 100644 (file)
@@ -60,6 +60,7 @@
 
 /** the value which is returned in error-case (no ctx found) */
 #define VC_NOCTX               ((xid_t)(-1))
+#define VC_NOXID               ((xid_t)(-1))
 /** the value which means a random (the next free) ctx */
 #define VC_DYNAMIC_XID         ((xid_t)(-1))
 /** the value which means the current ctx */
@@ -71,6 +72,9 @@
 #define VC_LIM_INFINITY                (~0ULL)
 #define VC_LIM_KEEP            (~1ULL)
 
+#define VC_CDLIM_UNSET         (0U)
+#define VC_CDLIM_INFINITY      (~0U)
+#define VC_CDLIM_KEEP          (~1U)
   
 #ifndef S_CTX_INFO_LOCK
 #  define S_CTX_INFO_LOCK      1
 #define VC_VXF_VIRT_MEM                        0x00010000ull
 #define VC_VXF_VIRT_UPTIME             0x00020000ull
 #define VC_VXF_VIRT_CPU                        0x00040000ull
+#define VC_VXF_VIRT_LOAD               0x00080000ull
 
 #define VC_VXF_HIDE_MOUNT              0x01000000ull
 #define VC_VXF_HIDE_NETIF              0x02000000ull
 #define        VC_VXF_STATE_SETUP              (1ULL<<32)
 #define        VC_VXF_STATE_INIT               (1ULL<<33)
 
+#define VC_VXF_FORK_RSS                        (1ULL<<48)
+#define VC_VXF_PROLIFIC                        (1ULL<<49)
+
+#define VC_VXF_IGNEG_NICE              (1ULL<<52)
+
+
 // the ccapabilities
 #define VC_VXC_SET_UTSNAME             0x00000001ull
 #define VC_VXC_SET_RLIMIT              0x00000002ull
 
-#define VC_VXC_ICMP_PING               0x00000100ull
+#define VC_VXC_RAW_ICMP                        0x00000100ull
 
 #define VC_VXC_SECURE_MOUNT            0x00010000ull
+#define VC_VXC_SECURE_REMOUNT          0x00020000ull
+
+
+#define VC_VXSM_FILL_RATE              0x0001
+#define VC_VXSM_INTERVAL               0x0002
+#define VC_VXSM_TOKENS                 0x0010
+#define VC_VXSM_TOKENS_MIN             0x0020
+#define VC_VXSM_TOKENS_MAX             0x0040
+#define VC_VXSM_PRIO_BIAS              0x0100
+
 
 
 /** \defgroup  syscalls Syscall wrappers
@@ -203,10 +224,24 @@ extern "C" {
 #endif
 
   struct vc_ip_mask_pair {
-    uint32_t   ip;
+      uint32_t ip;
       uint32_t mask;
   };
 
+    /** \brief   The generic vserver syscall
+     *  \ingroup syscalls
+     *
+     *  This function executes the generic vserver syscall. It uses the
+     *  correct syscallnumber (which may differ between the different
+     *  architectures).
+     *
+     *  \param   cmd  the command to be executed
+     *  \param   xid  the xid on which the cmd shall be applied
+     *  \param   data additional arguments; depends on \c cmd
+     *  \returns depends on \c cmd; usually, -1 stands for an error
+     */
+  int  vc_syscall(uint32_t cmd, xid_t xid, void *data);
+
     /** \brief   Returns the version of the current kernel API.
      *  \ingroup syscalls
      * \returns The versionnumber of the kernel API
@@ -226,7 +261,7 @@ extern "C" {
      *  \param remove_cap  The linux capabilities which will be \b removed.
      *  \param flags       Special flags which will be set.
      *
-     *  \returns  The new context-id, or VC_NOCTX on errors; errno
+     *  \returns  The new context-id, or VC_NOCTX on errors; \c errno
      *           will be set appropriately
      *
      *  See http://vserver.13thfloor.at/Stuff/Logic.txt for details */
@@ -255,7 +290,7 @@ extern "C" {
      *  \param xid  The new context; special values are:
      * - VC_DYNAMIC_XID which means to create a dynamic context
      *
-     * \returns the xid of the created context, or VC_NOCTX on errors. errno
+     * \returns the xid of the created context, or VC_NOCTX on errors. \c errno
      *          will be set appropriately. */
   xid_t        vc_ctx_create(xid_t xid);
 
@@ -351,7 +386,7 @@ extern "C" {
   struct vc_nx_info {
       nid_t    nid;
   };
-  
+
   nid_t                vc_get_task_nid(pid_t pid);
   int          vc_get_nx_info(nid_t nid, struct vc_nx_info *) VC_ATTR_NONNULL((2));
 
@@ -392,6 +427,33 @@ extern "C" {
 
   int          vc_set_iattr(char const *filename, xid_t xid,
                             uint_least32_t flags, uint_least32_t mask) VC_ATTR_NONNULL((1));
+
+    /** \brief   Returns information about attributes and assigned context of a file.
+     *  \ingroup syscalls
+     *
+     *  This function returns the VC_IATTR_XXX flags and about the assigned
+     *  context of a file. To request an information, the appropriate bit in
+     *  \c mask must be set and the corresponding parameter (\a xid or \a
+     *  flags) must not be NULL.
+     *
+     *  E.g. to receive the assigned context, the \c VC_IATTR_XID bit must be
+     *  set in \a mask, and \a xid must point to valid memory.
+     *
+     *  Possible flags are \c VC_IATTR_ADMIN, \c VC_IATTR_WATCH , \c VC_IATTR_HIDE,
+     *  \c VC_IATTR_BARRIER, \c VC_IATTR_IUNLINK and \c VC_IATTR_IMMUTABLE.
+     *
+     *  \param filename  The name of the file whose attributes shall be determined.
+
+     *  \param xid       When non-zero and the VC_IATTR_XID bit is set in \a mask,
+     *                   the assigned context of \a filename will be stored there.
+     *  \param flags     When non-zero, a bitmask of current attributes will be
+     *                   stored there. These attributes must be requested explicitly
+     *                   by setting the appropriate bit in \a mask
+     *  \param mask      Points to a bitmask which tells which attributes shall be
+     *                   determined. On return, it will masquerade the attributes
+     *                   which were determined.
+     *
+     *  \pre  mask!=0 && !((*mask&VC_IATTR_XID) && xid==0) && !((*mask&~VC_IATTR_XID) && flags==0) */
   int          vc_get_iattr(char const *filename, xid_t * /*@null@*/ xid,
                             uint_least32_t * /*@null@*/ flags,
                             uint_least32_t * /*@null@*/ mask) VC_ATTR_NONNULL((1));
@@ -401,7 +463,13 @@ extern "C" {
       pid_t    initpid;
   };
   
-    /** Returns the context of the given process. pid==0 means the current process. */
+    /** \brief   Returns the context of the given process.
+     *  \ingroup syscalls
+     *
+     *  \param  pid  the process-id whose xid shall be determined;
+     *               pid==0 means the current process.
+     *  \returns     the xid of process \c pid or -1 on errors
+     */
   xid_t                vc_get_task_xid(pid_t pid);
   int          vc_get_vx_info(xid_t xid, struct vc_vx_info *info) VC_ATTR_NONNULL((2));
 
@@ -451,6 +519,7 @@ extern "C" {
   };
 
   /** \brief    Information about parsing errors
+   *  \ingroup  helper
    */
   struct vc_err_listparser {
       char const       *ptr;           ///< Pointer to the first character of an erroneous string
@@ -557,32 +626,68 @@ extern "C" {
 
   uint_least64_t               vc_get_insecurebcaps() VC_ATTR_CONST;
   inline static uint_least64_t vc_get_insecureccaps() {
-    return ~(VC_VXC_SET_UTSNAME|VC_VXC_ICMP_PING);
+    return ~(VC_VXC_SET_UTSNAME|VC_VXC_RAW_ICMP);
   }
   
   inline static int    vc_setfilecontext(char const *filename, xid_t xid) {
     return vc_set_iattr(filename, xid, 0, VC_IATTR_XID);
   }
   
-  inline static xid_t  vc_getfilecontext(char const *filename) {
-    xid_t      res;
-    if (vc_get_iattr(filename, &res, 0,0)==-1) return VC_NOCTX;
-    return res;
-  }
+  /** \brief   Returns the context of \c filename
+   *  \ingroup syscalls
+   *
+   *  This function calls vc_get_iattr() with appropriate arguments to
+   *  determine the context of \c filename. In error-case or when no context
+   *  is assigned, \c VC_NOCTX will be returned. To differ between both cases,
+   *  \c errno must be examined.
+   *
+   *  \b WARNING: this function can modify \c errno although no error happened.
+   *
+   *  \param   filename  The file to check
+   *  \returns The assigned context, or VC_NOCTX when an error occured or no
+   *           such assignment exists. \c errno will be 0 in the latter case */
+  xid_t                vc_getfilecontext(char const *filename) VC_ATTR_NONNULL((1));
 
 
   struct vc_set_sched {
-      int32_t  fill_rate;
-      int32_t  interval;
-      int32_t  tokens;
-      int32_t  tokens_min;
-      int32_t  tokens_max;
-      uint64_t cpu_mask;
+      uint_least32_t   set_mask;
+      int_least32_t    fill_rate;
+      int_least32_t    interval;
+      int_least32_t    tokens;
+      int_least32_t    tokens_min;
+      int_least32_t    tokens_max;
+      int_least32_t    priority_bias;
   };
 
   int          vc_set_sched(xid_t xid, struct vc_set_sched const *);
+
+
+  struct vc_ctx_dlimit {
+      uint_least32_t   space_used;
+      uint_least32_t   space_total;
+      uint_least32_t   inodes_used;
+      uint_least32_t   inodes_total;
+      uint_least32_t   reserved;
+  };
   
+
+  /** Add a disk limit to a file system. */
+  int          vc_add_dlimit(char const *filename, xid_t xid,
+                             uint_least32_t flags) VC_ATTR_NONNULL((1));
+  /** Remove a disk limit from a file system. */
+  int          vc_rem_dlimit(char const *filename, xid_t xid,
+                             uint_least32_t flags) VC_ATTR_NONNULL((1));
+
+  /** Set a disk limit. */
+  int          vc_set_dlimit(char const *filename, xid_t xid,
+                             uint_least32_t flags,
+                             struct vc_ctx_dlimit const *limits) VC_ATTR_NONNULL((1,4));
+  /** Get a disk limit. */
+  int          vc_get_dlimit(char const *filename, xid_t xid,
+                             uint_least32_t flags,
+                             struct vc_ctx_dlimit *limits) VC_ATTR_NONNULL((1));
   
+    
   typedef enum { vcFEATURE_VKILL,  vcFEATURE_IATTR,   vcFEATURE_RLIMIT,
                 vcFEATURE_COMPAT, vcFEATURE_MIGRATE, vcFEATURE_NAMESPACE,
                 vcFEATURE_SCHED,  vcFEATURE_VINFO,   vcFEATURE_VHI,
@@ -592,6 +697,13 @@ extern "C" {
   bool         vc_isSupported(vcFeatureSet) VC_ATTR_CONST;
   bool         vc_isSupportedString(char const *);
 
+  
+  typedef enum { vcTYPE_INVALID, vcTYPE_MAIN, vcTYPE_WATCH,
+                vcTYPE_STATIC, vcTYPE_DYNAMIC }
+    vcXidType;
+  
+  vcXidType    vc_getXIDType(xid_t xid) VC_ATTR_CONST;
+
   /* The management part */
 
 #define VC_LIMIT_VSERVER_NAME_LEN      1024
@@ -642,15 +754,16 @@ extern "C" {
       freed by the caller. */
   char *       vc_getVserverByCtx(xid_t ctx, /*@null@*/vcCfgStyle *style,
                                   /*@null@*/char const *revdir);
-
 #define vcSKEL_INTERFACES      1u
 #define vcSKEL_PKGMGMT         2u
 #define vcSKEL_FILESYSTEM      4u
-  
+
   /** Create a basic configuration skeleton for a vserver plus toplevel
    *  directories for pkgmanagemt and filesystem (when requested). */
   int          vc_createSkeleton(char const *id, vcCfgStyle style, int flags);
-  
+
+
 #ifdef __cplusplus
 }
 #endif