]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
Split header file III
authorJan Safranek <jsafrane@redhat.com>
Fri, 12 Mar 2010 15:50:20 +0000 (16:50 +0100)
committerDhaval Giani <dhaval.giani@gmail.com>
Sun, 21 Mar 2010 21:02:01 +0000 (22:02 +0100)
Changelog:
 - since there are no global macros, base.h is gone
 - since there is no base.h, all headers need to include <features.h> to get
   __BEGIN_DECLS
 - new init.h with cgroup_init() and cgroup_get_subsys_mount_point()
 - new error.h with error handling enum and related stuff
 - use #ifndef _LIBCGROUP_*_H instead _LIBCG_*_H in header guards
 - fix few checkpatch complaints (long lines, whitespaces, ...)

The patch includes Makefile and .spec changes. I tested it compiles,
make dist produces tarball with all headers, so does also the rpm.
'make' should automatically catch all changes in new headers and
recompile dependent (=all) sources when any header changes.

libcgroup.h
  - does not declare anything, it just includes all the other files. In
    future, it might contain base of doxygen documentation (some
    introduction etc.)

libcgroup/error.h
  - the big enum with errors + error related functions

libcgroup/init.h
  - libcgroup_init() and cgroup_get_subsys_mount_point()

libcgroup/config.h
  - configuration reading/unloading

libcgroup/groups.h
  - group manipulation stuff (create/modify/delete/free, incl. controllers and
    get/set values) + definition of struct cgroup (=must be included by
    libcgroup/tasks.h, which needs it)

libcgroup/iterators.h
  - various walks, *_begin/next/end

libcgroup/tasks.h
  - task classification, incl. rules cache manipulation

In addition, I probably removed some #includes, which are not needed now when
looking for the minimal #include set to build the project. I also hope I did not
miss any function declaration or macro...

Signed-off-by: Jan Safranek <jsafrane@redhat.com>
Signed-off-by: Dhaval Giani <dhaval.giani@gmail.com>
12 files changed:
dist/libcgroup.spec.in
include/Makefile.am
include/libcgroup.h
include/libcgroup/config.h [new file with mode: 0644]
include/libcgroup/error.h [new file with mode: 0644]
include/libcgroup/groups.h [new file with mode: 0644]
include/libcgroup/init.h [new file with mode: 0644]
include/libcgroup/iterators.h [new file with mode: 0644]
include/libcgroup/tasks.h [new file with mode: 0644]
src/api.c
src/tools/cgcreate.c
tests/libcg_ba.cpp

index 7cab82f81e7b2461817445b109c60f7baa91c24e..fcbbadda47c887c07c5c0a50fe3737ac6fc032bd 100644 (file)
@@ -122,6 +122,7 @@ fi
 %files devel
 %defattr(-,root,root,-)
 %{_includedir}/libcgroup.h
+%{_includedir}/libcgroup/*.h
 %{_libdir}/libcgroup.*
 %doc COPYING INSTALL 
 
index 2733f09e84d099ab8e9f5dd59941ea50eff2cd44..a7602a9fbb1793a7a69a9cfa96db1ca2af219212 100644 (file)
@@ -1,2 +1,2 @@
-include_HEADERS = libcgroup.h
-
+# Using 'nobase_', we what groups.h in /usr/include/libcgroup/ directory
+nobase_include_HEADERS = libcgroup.h libcgroup/error.h libcgroup/init.h libcgroup/groups.h libcgroup/tasks.h libcgroup/iterators.h libcgroup/config.h
index b7d997b53decc0011d0b97342f0a6f46e3adb737..27812c558f4624c721109df9fcc59de95581067c 100644 (file)
  *
  */
 
-#ifndef _LIBCG_H
-#define _LIBCG_H
+#ifndef _LIBCGROUP_H
+#define _LIBCGROUP_H
 
-#include <features.h>
+#include <libcgroup/error.h>
+#include <libcgroup/init.h>
+#include <libcgroup/iterators.h>
+#include <libcgroup/groups.h>
+#include <libcgroup/tasks.h>
+#include <libcgroup/config.h>
 
-__BEGIN_DECLS
-
-#include <grp.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <linux/cn_proc.h>
-
-/*
- * NOTE: Wide characters are not supported at the moment. Wide character support
- * would require us to use a scanner/parser that can parse beyond ASCII
- */
-
-/* Flags for cgroup_change_cgroup_uid_gid() */
-enum cgflags {
-       CGFLAG_USECACHE = 0x01,
-};
-
-enum {
-       ECGROUPNOTCOMPILED=50000,
-       ECGROUPNOTMOUNTED,
-       ECGROUPNOTEXIST,
-       ECGROUPNOTCREATED,
-       ECGROUPSUBSYSNOTMOUNTED,
-       ECGROUPNOTOWNER,
-       ECGROUPMULTIMOUNTED,/* Controllers bound to different mount points */
-       ECGROUPNOTALLOWED,  /* This is the stock error. Default error. */
-       ECGMAXVALUESEXCEEDED,
-       ECGCONTROLLEREXISTS,
-       ECGVALUEEXISTS,
-       ECGINVAL,
-       ECGCONTROLLERCREATEFAILED,
-       ECGFAIL,
-       ECGROUPNOTINITIALIZED,
-       ECGROUPVALUENOTEXIST,
-       /* Represents error coming from other libraries like glibc. libcgroup
-        * users need to check errno upon encoutering ECGOTHER.
-        */
-       ECGOTHER,       /* OS error, see errno */
-       ECGROUPNOTEQUAL,
-       ECGCONTROLLERNOTEQUAL,
-       ECGROUPPARSEFAIL, /* Failed to parse rules configuration file. */
-       ECGROUPNORULES, /* Rules list does not exist. */
-       ECGMOUNTFAIL,
-       ECGSENTINEL,    /* Please insert further error codes above this */
-       ECGEOF,         /* End of file, iterator */
-       ECGCONFIGPARSEFAIL,/* Failed to parse config file (cgconfig.conf). */
-       ECGNAMESPACEPATHS,
-       ECGNAMESPACECONTROLLER,
-       ECGMOUNTNAMESPACE,
-};
-
-#define ECGRULESPARSEFAIL      ECGROUPPARSEFAIL
-
-/*
- * Don't use CGROUP_WALK_TYPE_FILE right now. It is added here for
- * later refactoring and better implementation. Most users *should*
- * use CGROUP_WALK_TYPE_PRE_DIR.
- */
-enum cgroup_walk_type {
-       CGROUP_WALK_TYPE_PRE_DIR = 0x1, /* Pre Order Directory */
-       CGROUP_WALK_TYPE_POST_DIR = 0x2,        /* Post Order Directory */
-};
-
-enum cgroup_file_type {
-       CGROUP_FILE_TYPE_FILE,          /* File */
-       CGROUP_FILE_TYPE_DIR,           /* Directory */
-       CGROUP_FILE_TYPE_OTHER,         /* Directory */
-};
-
-enum cgroup_daemon_type {
-       CGROUP_DAEMON_UNCHANGE_CHILDREN = 0x1,
-};
-
-/**
- * Flags for cgroup_delete_cgroup_ext
- */
-enum cgroup_delete_flag {
-       /**
-        * Ignore errors caused by migration of tasks to parent group.
-        */
-       CGFLAG_DELETE_IGNORE_MIGRATION = 1,
-
-       /**
-        * Recursively delete all child groups.
-        */
-       CGFLAG_DELETE_RECURSIVE = 2,
-};
-
-struct cgroup_file_info {
-       enum cgroup_file_type type;
-       const char *path;
-       const char *parent;
-       const char *full_path;
-       short depth;
-};
-
-#define CG_VALUE_MAX 100
-struct cgroup_stat {
-       char name[FILENAME_MAX];
-       char value[CG_VALUE_MAX];
-};
-
-struct cgroup_mount_point {
-       char name[FILENAME_MAX];
-       char path[FILENAME_MAX];
-};
-
-/*
- * Detailed information about available controller.
- */
-
-struct controller_data {
-/** Controller name. */
-       char name[FILENAME_MAX];
-/**
- * Hierarchy ID. Controllers with the same hierarchy ID
- * are mounted together as one hierarchy. Controllers with
- * ID 0 are not currently used.
- */
-       int hierarchy;
-/** Number of groups. */
-       int num_cgroups;
-/** Enabled flag */
-       int enabled;
-};
-
-/* Functions and structures that can be used by the application*/
-struct cgroup;
-struct cgroup_controller;
-
-int cgroup_init(void);
-int cgroup_attach_task(struct cgroup *cgroup);
-int cgroup_modify_cgroup(struct cgroup *cgroup);
-int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership);
-int cgroup_delete_cgroup(struct cgroup *cgroup, int ignore_migration);
-int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid);
-int cgroup_get_cgroup(struct cgroup *cgroup);
-int cgroup_create_cgroup_from_parent(struct cgroup *cgroup, int ignore_ownership);
-int cgroup_copy_cgroup(struct cgroup *dst, struct cgroup *src);
-
-/**
- * Delete control group.
- * All tasks are automatically moved to parent group.
- * If CGFLAG_DELETE_IGNORE_MIGRATION flag is used, the errors that occurred
- * during the task movement are ignored.
- * CGFLAG_DELETE_RECURSIVE flag specifies that all subgroups should be removed
- * too. If root group is being removed with this flag specified, all subgroups
- * are removed but the root group itself is left undeleted.
- *
- * @param cgroup Group to delete.
- * @param flags  Combination of CGFLAG_DELETE_* flags, which indicate what and
- *     how to delete.
- */
-int cgroup_delete_cgroup_ext(struct cgroup *cgroup, int flags);
-
-/**
- * Changes the cgroup of a program based on the rules in the config file.
- * If a rule exists for the given UID, GID or PROCESS NAME, then the given
- * PID is placed into the correct group.  By default, this function parses
- * the configuration file each time it is called.
- *
- * The flags can alter the behavior of this function:
- *     CGFLAG_USECACHE: Use cached rules instead of parsing the config file
- *
- * This function may NOT be thread safe.
- *     @param uid The UID to match
- *     @param gid The GID to match
- *     @param procname The PROCESS NAME to match
- *     @param pid The PID of the process to move
- *     @param flags Bit flags to change the behavior, as defined above
- *     @return 0 on success, > 0 on error
- * TODO: Determine thread-safeness and fix of not safe.
- */
-int cgroup_change_cgroup_flags(const uid_t uid, const gid_t gid,
-               char *procname, const pid_t pid, const int flags);
-
-/**
- * Changes the cgroup of a program based on the rules in the config file.  If a
- * rule exists for the given UID or GID, then the given PID is placed into the
- * correct group.  By default, this function parses the configuration file each
- * time it is called.
- * 
- * The flags can alter the behavior of this function:
- *      CGFLAG_USECACHE: Use cached rules instead of parsing the config file
- * 
- * This function may NOT be thread safe.
- *     @param uid The UID to match
- *     @param gid The GID to match
- *     @param pid The PID of the process to move
- *     @param flags Bit flags to change the behavior, as defined above
- *     @return 0 on success, > 0 on error
- * TODO: Determine thread-safeness and fix if not safe.
- */
-int cgroup_change_cgroup_uid_gid_flags(const uid_t uid, const gid_t gid,
-                               const pid_t pid, const int flags);
-
-/**
- * Provides backwards-compatibility with older versions of the API.  This
- * function is deprecated, and cgroup_change_cgroup_uid_gid_flags() should be
- * used instead.  In fact, this function simply calls the newer one with flags
- * set to 0 (none).
- *     @param uid The UID to match
- *     @param gid The GID to match
- *     @param pid The PID of the process to move
- *     @return 0 on success, > 0 on error
- * 
- */
-int cgroup_change_cgroup_uid_gid(uid_t uid, gid_t gid, pid_t pid);
-
-/**
- * Changes the cgroup of a program based on the path provided.  In this case,
- * the user must already know into which cgroup the task should be placed and
- * no rules will be parsed.
- *
- *  returns 0 on success.
- */
-int cgroup_change_cgroup_path(char *path, pid_t pid, char *controllers[]);
-
-/**
- * Print the cached rules table.  This function should be called only after
- * first calling cgroup_parse_config(), but it will work with an empty rule
- * list.
- *     @param fp The file stream to print to
- */
-void cgroup_print_rules_config(FILE *fp);
-
-/**
- * Reloads the rules list, using the given configuration file.  This function
- * is probably NOT thread safe (calls cgroup_parse_rules_config()).
- *     @return 0 on success, > 0 on failure
- */
-int cgroup_reload_cached_rules(void);
-
-/**
- * Initializes the rules cache.
- *     @return 0 on success, > 0 on failure
- */
-int cgroup_init_rules_cache(void);
-
-/**
- * Get the current cgroup path where the task specified by pid_t pid
- * has been classified
- */
-int cgroup_get_current_controller_path(pid_t pid, const char *controller,
-                                       char **current_path);
-/**
- * Return error corresponding to @code in human readable format.
- * @code: error code for which the corresponding error string is to be
- * returned
- */
-const char *cgroup_strerror(int code);
-
-/**
- * Return last errno, which caused ECGOTHER error.
- */
-int cgroup_get_last_errno();
-
-/**
- * Walk through the directory tree for the specified controller.
- * @controller: Name of the controller, for which we want to walk
- * the directory tree
- * @base_path: Begin walking from this path
- * @depth: The maximum depth to which the function should walk, 0
- * implies all the way down
- * @handle: Handle to be used during iteration
- * @info: info filled and returned about directory information
- */
-int cgroup_walk_tree_begin(char *controller, char *base_path, const int depth,
-                               void **handle, struct cgroup_file_info *info,
-                               int *base_level);
-/**
- * Get the next element during the walk
- * @depth: The maximum depth to which the function should walk, 0
- * implies all the way down
- * @handle: Handle to be used during iteration
- * @info: info filled and returned about directory information
- *
- * Returns ECGEOF when we are done walking through the nodes.
- */
-int cgroup_walk_tree_next(const int depth, void **handle,
-                               struct cgroup_file_info *info, int base_level);
-int cgroup_walk_tree_end(void **handle);
-
-/**
- * This API is used to set the flags for walk_tree API. Currently availble
- *  flags are
- *
- *  CGROUP_WALK_TYPE_PRE_DIR
- *  CGROUP_WALK_TYPE_POST_DIR
- *
- */
-int cgroup_walk_tree_set_flags(void **handle, int flags);
-
-/**
- * Read the statistics values for the specified controller
- * @controller: Name of the controller for which stats are requested.
- * @path: cgroup path.
- * @handle: Handle to be used during iteration.
- * @stat: Stats values will be filled and returned here.
- */
-int cgroup_read_stats_begin(char *controller, char *path, void **handle,
-                               struct cgroup_stat *stat);
-
-/**
- * Read the next stat value.
- * @handle: Handle to be used during iteration.
- * @stat: Stats values will be filled and returned here.
- */
-int cgroup_read_stats_next(void **handle, struct cgroup_stat *stat);
-
-int cgroup_read_stats_end(void **handle);
-
-/**
- * Read the tasks file to get the list of tasks in a cgroup
- * @cgroup: Name of the cgroup
- * @controller: Name of the cgroup subsystem
- * @handle: Handle to be used in the iteration
- * @pid: The pid read from the tasks file. Will be filled in by the API
- */
-int cgroup_get_task_begin(char *cgroup, char *controller, void **handle,
-                                                               pid_t *pid);
-
-/**
- * Register the unchanged process to a cgrulesengd daemon.
- * If the daemon does not work, this function returns 0 as success.
- * @param pid: The process id
- * @param flags Bit flags to change the behavior, as defined above
- * @return 0 on success, > 0 on error.
- */
-int cgroup_register_unchanged_process(pid_t pid, int flags);
-
-/**
- * Read the next task value
- * @handle: The handle used for iterating
- * @pid: The variable where the value will be stored
- *
- * return ECGEOF when the iterator finishes getting the list of tasks.
- */
-int cgroup_get_task_next(void **handle, pid_t *pid);
-int cgroup_get_task_end(void **handle);
-
-/**
- * Read the mount table to give a list where each controller is
- * mounted
- * @handle: Handle to be used for iteration.
- * @name: The variable where the name is stored. Should be freed by caller.
- * @path: Te variable where the path to the controller is stored. Should be
- * freed by the caller.
- */
-int cgroup_get_controller_begin(void **handle, struct cgroup_mount_point *info);
-/*
- * While walking through the mount table, the controllers will be
- * returned in order of their mount points.
- */
-int cgroup_get_controller_next(void **handle, struct cgroup_mount_point *info);
-int cgroup_get_controller_end(void **handle);
-
-/**
- * Read the list of controllers from /proc/cgroups (not mounted included)
- * @param handle: Handle to be used for iteration.
- * @param info: The structure which contains all controller data
- */
-int cgroup_get_all_controller_begin(void **handle,
-       struct controller_data *info);
-/*
- * While walking through the mount table, the controllers will be
- * returned in the same order as is in /proc/cgroups file
- */
-int cgroup_get_all_controller_next(void **handle, struct controller_data *info);
-int cgroup_get_all_controller_end(void **handle);
-
-/*
- * Reads the mount to table to give the mount point of a controller
- * @controller: Name of the controller
- * @mount_point: The string where the mount point is stored. Please note,
- * the caller must free mount_point.
- */
-int cgroup_get_subsys_mount_point(char *controller, char **mount_point);
-
-/* The wrappers for filling libcg structures */
-
-struct cgroup *cgroup_new_cgroup(const char *name);
-struct cgroup_controller *cgroup_add_controller(struct cgroup *cgroup,
-                                               const char *name);
-void cgroup_free(struct cgroup **cgroup);
-void cgroup_free_controllers(struct cgroup *cgroup);
-int cgroup_add_value_string(struct cgroup_controller *controller,
-                               const char *name, const char *value);
-int cgroup_add_value_int64(struct cgroup_controller *controller,
-                               const char *name, int64_t value);
-int cgroup_add_value_uint64(struct cgroup_controller *controller,
-                               const char *name, u_int64_t value);
-int cgroup_add_value_bool(struct cgroup_controller *controller,
-                               const char *name, bool value);
-int cgroup_compare_cgroup(struct cgroup *cgroup_a, struct cgroup *cgroup_b);
-int cgroup_compare_controllers(struct cgroup_controller *cgca,
-                                       struct cgroup_controller *cgcb);
-int cgroup_set_uid_gid(struct cgroup *cgroup, uid_t tasks_uid, gid_t tasks_gid,
-                                       uid_t control_uid, gid_t control_gid);
-int cgroup_get_uid_gid(struct cgroup *cgroup, uid_t *tasks_uid,
-               gid_t *tasks_gid, uid_t *control_uid, gid_t *control_gid);
-int cgroup_get_value_string(struct cgroup_controller *controller,
-                                       const char *name, char **value);
-int cgroup_set_value_string(struct cgroup_controller *controller,
-                                       const char *name, const char *value);
-int cgroup_get_value_int64(struct cgroup_controller *controller,
-                                       const char *name, int64_t *value);
-int cgroup_set_value_int64(struct cgroup_controller *controller,
-                                       const char *name, int64_t value);
-int cgroup_get_value_uint64(struct cgroup_controller *controller,
-                                       const char *name, u_int64_t *value);
-int cgroup_set_value_uint64(struct cgroup_controller *controller,
-                                       const char *name, u_int64_t value);
-int cgroup_get_value_bool(struct cgroup_controller *controller,
-                                               const char *name, bool *value);
-int cgroup_set_value_bool(struct cgroup_controller *controller,
-                                               const char *name, bool value);
-struct cgroup_controller *cgroup_get_controller(struct cgroup *cgroup,
-                                                       const char *name);
-
-/**
- * Return the number of variables for the specified controller, if the
- * structure does not exist -1 is returned
- * @param controller Name of the controller for which stats are requested.
- */
-int cgroup_get_value_name_count(struct cgroup_controller *controller);
-
-/**
- * Return the "index" variable for the specified controller,
- * the return value is the pointer to the internal structure so
- * don't dealocate it, or change the content of the memory space.
- * @param controller Name of the controller for which stats are requested.
- * @param index number of the variable.
- */
-char *cgroup_get_value_name(struct cgroup_controller *controller, int index);
-/*
- * Config related stuff
- */
-int cgroup_config_load_config(const char *pathname);
-int cgroup_unload_cgroups(void);
-
-__END_DECLS
-
-#endif /* _LIBCG_H  */
+#endif /* _LIBCGROUP_H  */
diff --git a/include/libcgroup/config.h b/include/libcgroup/config.h
new file mode 100644 (file)
index 0000000..68029b8
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _LIBCGROUP_CONFIG_H
+#define _LIBCGROUP_CONFIG_H
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+/*
+ * Config related stuff
+ */
+int cgroup_config_load_config(const char *pathname);
+int cgroup_unload_cgroups(void);
+
+__END_DECLS
+
+#endif /*_LIBCGROUP_CONFIG_H*/
diff --git a/include/libcgroup/error.h b/include/libcgroup/error.h
new file mode 100644 (file)
index 0000000..4d756ff
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef _LIBCGROUP_ERROR_H
+#define _LIBCGROUP_ERROR_H
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+enum {
+       ECGROUPNOTCOMPILED = 50000,
+       ECGROUPNOTMOUNTED,
+       ECGROUPNOTEXIST,
+       ECGROUPNOTCREATED,
+       ECGROUPSUBSYSNOTMOUNTED,
+       ECGROUPNOTOWNER,
+       ECGROUPMULTIMOUNTED,/* Controllers bound to different mount points */
+       ECGROUPNOTALLOWED,  /* This is the stock error. Default error. */
+       ECGMAXVALUESEXCEEDED,
+       ECGCONTROLLEREXISTS,
+       ECGVALUEEXISTS,
+       ECGINVAL,
+       ECGCONTROLLERCREATEFAILED,
+       ECGFAIL,
+       ECGROUPNOTINITIALIZED,
+       ECGROUPVALUENOTEXIST,
+       /* Represents error coming from other libraries like glibc. libcgroup
+        * users need to check errno upon encoutering ECGOTHER.
+        */
+       ECGOTHER,       /* OS error, see errno */
+       ECGROUPNOTEQUAL,
+       ECGCONTROLLERNOTEQUAL,
+       ECGROUPPARSEFAIL, /* Failed to parse rules configuration file. */
+       ECGROUPNORULES, /* Rules list does not exist. */
+       ECGMOUNTFAIL,
+       ECGSENTINEL,    /* Please insert further error codes above this */
+       ECGEOF,         /* End of file, iterator */
+       ECGCONFIGPARSEFAIL,/* Failed to parse config file (cgconfig.conf). */
+       ECGNAMESPACEPATHS,
+       ECGNAMESPACECONTROLLER,
+       ECGMOUNTNAMESPACE,
+};
+
+#define ECGRULESPARSEFAIL      ECGROUPPARSEFAIL
+
+/**
+ * Return error corresponding to @code in human readable format.
+ * @code: error code for which the corresponding error string is to be
+ * returned
+ */
+const char *cgroup_strerror(int code);
+
+/**
+ * Return last errno, which caused ECGOTHER error.
+ */
+int cgroup_get_last_errno();
+
+__END_DECLS
+
+#endif /* _LIBCGROUP_INIT_H */
diff --git a/include/libcgroup/groups.h b/include/libcgroup/groups.h
new file mode 100644 (file)
index 0000000..ba01011
--- /dev/null
@@ -0,0 +1,109 @@
+#ifndef _LIBCGROUP_GROUPS_H
+#define _LIBCGROUP_GROUPS_H
+
+#include <features.h>
+#include <sys/types.h>
+#include <stdbool.h>
+
+__BEGIN_DECLS
+
+/**
+ * Flags for cgroup_delete_cgroup_ext
+ */
+enum cgroup_delete_flag {
+       /**
+        * Ignore errors caused by migration of tasks to parent group.
+        */
+       CGFLAG_DELETE_IGNORE_MIGRATION = 1,
+
+       /**
+        * Recursively delete all child groups.
+        */
+       CGFLAG_DELETE_RECURSIVE = 2,
+};
+
+struct cgroup;
+struct cgroup_controller;
+
+int cgroup_modify_cgroup(struct cgroup *cgroup);
+int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership);
+int cgroup_delete_cgroup(struct cgroup *cgroup, int ignore_migration);
+int cgroup_get_cgroup(struct cgroup *cgroup);
+int cgroup_create_cgroup_from_parent(struct cgroup *cgroup,
+               int ignore_ownership);
+int cgroup_copy_cgroup(struct cgroup *dst, struct cgroup *src);
+
+/**
+ * Delete control group.
+ * All tasks are automatically moved to parent group.
+ * If CGFLAG_DELETE_IGNORE_MIGRATION flag is used, the errors that occurred
+ * during the task movement are ignored.
+ * CGFLAG_DELETE_RECURSIVE flag specifies that all subgroups should be removed
+ * too. If root group is being removed with this flag specified, all subgroups
+ * are removed but the root group itself is left undeleted.
+ *
+ * @param cgroup Group to delete.
+ * @param flags  Combination of CGFLAG_DELETE_* flags, which indicate what and
+ *     how to delete.
+ */
+int cgroup_delete_cgroup_ext(struct cgroup *cgroup, int flags);
+
+struct cgroup *cgroup_new_cgroup(const char *name);
+struct cgroup_controller *cgroup_add_controller(struct cgroup *cgroup,
+                                               const char *name);
+void cgroup_free(struct cgroup **cgroup);
+void cgroup_free_controllers(struct cgroup *cgroup);
+int cgroup_compare_cgroup(struct cgroup *cgroup_a, struct cgroup *cgroup_b);
+int cgroup_compare_controllers(struct cgroup_controller *cgca,
+                                       struct cgroup_controller *cgcb);
+struct cgroup_controller *cgroup_get_controller(struct cgroup *cgroup,
+                                                       const char *name);
+
+int cgroup_add_value_string(struct cgroup_controller *controller,
+                               const char *name, const char *value);
+int cgroup_add_value_int64(struct cgroup_controller *controller,
+                               const char *name, int64_t value);
+int cgroup_add_value_uint64(struct cgroup_controller *controller,
+                               const char *name, u_int64_t value);
+int cgroup_add_value_bool(struct cgroup_controller *controller,
+                               const char *name, bool value);
+int cgroup_set_uid_gid(struct cgroup *cgroup, uid_t tasks_uid, gid_t tasks_gid,
+                                       uid_t control_uid, gid_t control_gid);
+int cgroup_get_uid_gid(struct cgroup *cgroup, uid_t *tasks_uid,
+               gid_t *tasks_gid, uid_t *control_uid, gid_t *control_gid);
+int cgroup_get_value_string(struct cgroup_controller *controller,
+                                       const char *name, char **value);
+int cgroup_set_value_string(struct cgroup_controller *controller,
+                                       const char *name, const char *value);
+int cgroup_get_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t *value);
+int cgroup_set_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t value);
+int cgroup_get_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t *value);
+int cgroup_set_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t value);
+int cgroup_get_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool *value);
+int cgroup_set_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool value);
+/**
+ * Return the number of variables for the specified controller, if the
+ * structure does not exist -1 is returned
+ * @param controller Name of the controller for which stats are requested.
+ */
+int cgroup_get_value_name_count(struct cgroup_controller *controller);
+
+/**
+ * Return the "index" variable for the specified controller,
+ * the return value is the pointer to the internal structure so
+ * don't dealocate it, or change the content of the memory space.
+ * @param controller Name of the controller for which stats are requested.
+ * @param index number of the variable.
+ */
+char *cgroup_get_value_name(struct cgroup_controller *controller, int index);
+
+
+__END_DECLS
+
+#endif /* _LIBCGROUP_GROUPS_H */
diff --git a/include/libcgroup/init.h b/include/libcgroup/init.h
new file mode 100644 (file)
index 0000000..0e8f0f6
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _LIBCGROUP_INIT_H
+#define _LIBCGROUP_INIT_H
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Functions and structures that can be used by the application*/
+int cgroup_init(void);
+
+/*
+ * Reads the mount to table to give the mount point of a controller
+ * @controller: Name of the controller
+ * @mount_point: The string where the mount point is stored. Please note,
+ * the caller must free mount_point.
+ */
+int cgroup_get_subsys_mount_point(char *controller, char **mount_point);
+
+__END_DECLS
+
+#endif /* _LIBCGROUP_INIT_H */
diff --git a/include/libcgroup/iterators.h b/include/libcgroup/iterators.h
new file mode 100644 (file)
index 0000000..c724abf
--- /dev/null
@@ -0,0 +1,170 @@
+#ifndef _LIBCGROUP_ITERATORS_H
+#define _LIBCGROUP_ITERATORS_H
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <features.h>
+
+__BEGIN_DECLS
+
+/*
+ * Don't use CGROUP_WALK_TYPE_FILE right now. It is added here for
+ * later refactoring and better implementation. Most users *should*
+ * use CGROUP_WALK_TYPE_PRE_DIR.
+ */
+enum cgroup_walk_type {
+       CGROUP_WALK_TYPE_PRE_DIR = 0x1, /* Pre Order Directory */
+       CGROUP_WALK_TYPE_POST_DIR = 0x2,        /* Post Order Directory */
+};
+
+enum cgroup_file_type {
+       CGROUP_FILE_TYPE_FILE,          /* File */
+       CGROUP_FILE_TYPE_DIR,           /* Directory */
+       CGROUP_FILE_TYPE_OTHER,         /* Directory */
+};
+struct cgroup_file_info {
+       enum cgroup_file_type type;
+       const char *path;
+       const char *parent;
+       const char *full_path;
+       short depth;
+};
+
+#define CG_VALUE_MAX 100
+struct cgroup_stat {
+       char name[FILENAME_MAX];
+       char value[CG_VALUE_MAX];
+};
+
+struct cgroup_mount_point {
+       char name[FILENAME_MAX];
+       char path[FILENAME_MAX];
+};
+
+/*
+ * Detailed information about available controller.
+ */
+
+struct controller_data {
+/** Controller name. */
+       char name[FILENAME_MAX];
+/**
+ * Hierarchy ID. Controllers with the same hierarchy ID
+ * are mounted together as one hierarchy. Controllers with
+ * ID 0 are not currently used.
+ */
+       int hierarchy;
+/** Number of groups. */
+       int num_cgroups;
+/** Enabled flag */
+       int enabled;
+};
+
+/**
+ * Walk through the directory tree for the specified controller.
+ * @controller: Name of the controller, for which we want to walk
+ * the directory tree
+ * @base_path: Begin walking from this path
+ * @depth: The maximum depth to which the function should walk, 0
+ * implies all the way down
+ * @handle: Handle to be used during iteration
+ * @info: info filled and returned about directory information
+ */
+int cgroup_walk_tree_begin(char *controller, char *base_path, const int depth,
+                               void **handle, struct cgroup_file_info *info,
+                               int *base_level);
+/**
+ * Get the next element during the walk
+ * @depth: The maximum depth to which the function should walk, 0
+ * implies all the way down
+ * @handle: Handle to be used during iteration
+ * @info: info filled and returned about directory information
+ *
+ * Returns ECGEOF when we are done walking through the nodes.
+ */
+int cgroup_walk_tree_next(const int depth, void **handle,
+                               struct cgroup_file_info *info, int base_level);
+int cgroup_walk_tree_end(void **handle);
+
+/**
+ * This API is used to set the flags for walk_tree API. Currently availble
+ *  flags are
+ *
+ *  CGROUP_WALK_TYPE_PRE_DIR
+ *  CGROUP_WALK_TYPE_POST_DIR
+ *
+ */
+int cgroup_walk_tree_set_flags(void **handle, int flags);
+
+/**
+ * Read the statistics values for the specified controller
+ * @controller: Name of the controller for which stats are requested.
+ * @path: cgroup path.
+ * @handle: Handle to be used during iteration.
+ * @stat: Stats values will be filled and returned here.
+ */
+int cgroup_read_stats_begin(char *controller, char *path, void **handle,
+                               struct cgroup_stat *stat);
+
+/**
+ * Read the next stat value.
+ * @handle: Handle to be used during iteration.
+ * @stat: Stats values will be filled and returned here.
+ */
+int cgroup_read_stats_next(void **handle, struct cgroup_stat *stat);
+
+int cgroup_read_stats_end(void **handle);
+
+/**
+ * Read the tasks file to get the list of tasks in a cgroup
+ * @cgroup: Name of the cgroup
+ * @controller: Name of the cgroup subsystem
+ * @handle: Handle to be used in the iteration
+ * @pid: The pid read from the tasks file. Will be filled in by the API
+ */
+int cgroup_get_task_begin(char *cgroup, char *controller, void **handle,
+                                                               pid_t *pid);
+
+/**
+ * Read the next task value
+ * @handle: The handle used for iterating
+ * @pid: The variable where the value will be stored
+ *
+ * return ECGEOF when the iterator finishes getting the list of tasks.
+ */
+int cgroup_get_task_next(void **handle, pid_t *pid);
+int cgroup_get_task_end(void **handle);
+
+/**
+ * Read the mount table to give a list where each controller is
+ * mounted
+ * @handle: Handle to be used for iteration.
+ * @name: The variable where the name is stored. Should be freed by caller.
+ * @path: Te variable where the path to the controller is stored. Should be
+ * freed by the caller.
+ */
+int cgroup_get_controller_begin(void **handle, struct cgroup_mount_point *info);
+/*
+ * While walking through the mount table, the controllers will be
+ * returned in order of their mount points.
+ */
+int cgroup_get_controller_next(void **handle, struct cgroup_mount_point *info);
+int cgroup_get_controller_end(void **handle);
+
+/**
+ * Read the list of controllers from /proc/cgroups (not mounted included)
+ * @param handle: Handle to be used for iteration.
+ * @param info: The structure which contains all controller data
+ */
+int cgroup_get_all_controller_begin(void **handle,
+       struct controller_data *info);
+/*
+ * While walking through the mount table, the controllers will be
+ * returned in the same order as is in /proc/cgroups file
+ */
+int cgroup_get_all_controller_next(void **handle, struct controller_data *info);
+int cgroup_get_all_controller_end(void **handle);
+
+__END_DECLS
+
+#endif /* _LIBCGROUP_ITERATORS_H */
diff --git a/include/libcgroup/tasks.h b/include/libcgroup/tasks.h
new file mode 100644 (file)
index 0000000..0bd4fb1
--- /dev/null
@@ -0,0 +1,126 @@
+#ifndef _LIBCGROUP_TASKS_H
+#define _LIBCGROUP_TASKS_H
+
+#include <libcgroup/groups.h>
+
+#include <features.h>
+#include <stdbool.h>
+
+__BEGIN_DECLS
+
+/* Flags for cgroup_change_cgroup_uid_gid() */
+enum cgflags {
+       CGFLAG_USECACHE = 0x01,
+};
+
+enum cgroup_daemon_type {
+       CGROUP_DAEMON_UNCHANGE_CHILDREN = 0x1,
+};
+
+int cgroup_attach_task(struct cgroup *cgroup);
+int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid);
+
+/**
+ * Changes the cgroup of a program based on the rules in the config file.
+ * If a rule exists for the given UID, GID or PROCESS NAME, then the given
+ * PID is placed into the correct group.  By default, this function parses
+ * the configuration file each time it is called.
+ *
+ * The flags can alter the behavior of this function:
+ *     CGFLAG_USECACHE: Use cached rules instead of parsing the config file
+ *
+ * This function may NOT be thread safe.
+ *     @param uid The UID to match
+ *     @param gid The GID to match
+ *     @param procname The PROCESS NAME to match
+ *     @param pid The PID of the process to move
+ *     @param flags Bit flags to change the behavior, as defined above
+ *     @return 0 on success, > 0 on error
+ * TODO: Determine thread-safeness and fix of not safe.
+ */
+int cgroup_change_cgroup_flags(const uid_t uid, const gid_t gid,
+               char *procname, const pid_t pid, const int flags);
+
+/**
+ * Changes the cgroup of a program based on the rules in the config file.  If a
+ * rule exists for the given UID or GID, then the given PID is placed into the
+ * correct group.  By default, this function parses the configuration file each
+ * time it is called.
+ *
+ * The flags can alter the behavior of this function:
+ *      CGFLAG_USECACHE: Use cached rules instead of parsing the config file
+ *
+ * This function may NOT be thread safe.
+ *     @param uid The UID to match
+ *     @param gid The GID to match
+ *     @param pid The PID of the process to move
+ *     @param flags Bit flags to change the behavior, as defined above
+ *     @return 0 on success, > 0 on error
+ * TODO: Determine thread-safeness and fix if not safe.
+ */
+int cgroup_change_cgroup_uid_gid_flags(const uid_t uid, const gid_t gid,
+                               const pid_t pid, const int flags);
+
+/**
+ * Provides backwards-compatibility with older versions of the API.  This
+ * function is deprecated, and cgroup_change_cgroup_uid_gid_flags() should be
+ * used instead.  In fact, this function simply calls the newer one with flags
+ * set to 0 (none).
+ *     @param uid The UID to match
+ *     @param gid The GID to match
+ *     @param pid The PID of the process to move
+ *     @return 0 on success, > 0 on error
+ */
+int cgroup_change_cgroup_uid_gid(uid_t uid, gid_t gid, pid_t pid);
+
+/**
+ * Changes the cgroup of a program based on the path provided.  In this case,
+ * the user must already know into which cgroup the task should be placed and
+ * no rules will be parsed.
+ *
+ *  returns 0 on success.
+ */
+int cgroup_change_cgroup_path(char *path, pid_t pid, char *controllers[]);
+
+/**
+ * Print the cached rules table.  This function should be called only after
+ * first calling cgroup_parse_config(), but it will work with an empty rule
+ * list.
+ *     @param fp The file stream to print to
+ */
+void cgroup_print_rules_config(FILE *fp);
+
+/**
+ * Reloads the rules list, using the given configuration file.  This function
+ * is probably NOT thread safe (calls cgroup_parse_rules_config()).
+ *     @return 0 on success, > 0 on failure
+ */
+int cgroup_reload_cached_rules(void);
+
+/**
+ * Initializes the rules cache.
+ *     @return 0 on success, > 0 on failure
+ */
+int cgroup_init_rules_cache(void);
+
+/**
+ * Get the current cgroup path where the task specified by pid_t pid
+ * has been classified
+ */
+int cgroup_get_current_controller_path(pid_t pid, const char *controller,
+                                       char **current_path);
+
+/**
+ * Register the unchanged process to a cgrulesengd daemon.
+ * If the daemon does not work, this function returns 0 as success.
+ * @param pid: The process id
+ * @param flags Bit flags to change the behavior, as defined above
+ * @return 0 on success, > 0 on error.
+ */
+int cgroup_register_unchanged_process(pid_t pid, int flags);
+
+__END_DECLS
+
+#endif /* _LIBCGROUP_TASKS_H */
+
+
index 169df2e6e4a49b58bf53b265208943ab8d7daf4e..45253112c9f75e89ba3644f802d7d2971a1b028f 100644 (file)
--- a/src/api.c
+++ b/src/api.c
@@ -50,6 +50,7 @@
 #include <libgen.h>
 #include <assert.h>
 #include <linux/un.h>
+#include <grp.h>
 
 /*
  * The errno which happend the last time (have to be thread specific)
index aeb94f4a4d01b33ac7616dab8d378e1a88bc1bb7..616fa163f0970efc9929ca8c7d6e542fc377bd39 100644 (file)
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <errno.h>
 #include <unistd.h>
+#include <grp.h>
 
 #include "tools-common.h"
 
index c9994d67833e1faffa40e7c25375dc06085cc850..322794b24b3a088a13cb3aa8a26dcbb2f1a5dab4 100644 (file)
@@ -24,6 +24,7 @@ using namespace std;
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <grp.h>
 
 #include "../config.h"