----- Original Message -----
> From: "jchaloup" <jchal...@redhat.com>
> To: libcg-devel@lists.sourceforge.net
> Cc: varek...@redhat.com
> Sent: Tuesday, May 20, 2014 10:11:18 AM
> Subject: [PATCH 1/4] config.c: loading templates from multiple files into one 
> template table
> 
> This patch implements loading files from /etc/cgconfig.d/. It uses already
> implemented functions. To hold list of files to be read for template
> reloading, new static variable for this list (list of template files) has
> been added to config.c. It is the same list as file list read with
> cgconfigparser (cgconfig.c file), i.e. the same functions are called.
> Because parser reads only one file, it is called for each file in template
> file list. Thus initialization, resp. template duplication has to be called
> before, resp. after each file parsing. Thus new functions has been
> presented, thus modifying config.[h|c] api and libcgroup.map. Again parsing
> more files for templates is analogy to parsing files for groups in
> cgconfig.c.
> 
> cgroup_reload_cached_templates_from_file and
> cgroup_init_templates_cache_from_files are modification of
> cgroup_reload_cached_templates and cgroup_init_templates_cache. Only for
> loop and auxiliary variables added.
> 
> Signed-off-by: jchaloup <jchal...@redhat.com>
> ---
>  include/libcgroup/config.h |   30 +++++++
>  src/config.c               |  185
>  +++++++++++++++++++++++++++++++++++++++++++-
>  src/libcgroup.map          |    6 +
>  3 files changed, 218 insertions(+), 3 deletions(-)
> 
> diff --git a/include/libcgroup/config.h b/include/libcgroup/config.h
> index 43568e1..5e47637 100644
> --- a/include/libcgroup/config.h
> +++ b/include/libcgroup/config.h
> @@ -84,11 +84,41 @@ int cgroup_init_templates_cache(char *pathname);
>  int cgroup_reload_cached_templates(char *pathname);
>  
>  /**
> + * Initializes the templates cache from files. Before calling this function,
> + * cgroup_templates_cache_set_source_files has to be called first.
> + * @param file_index index of file which was unable to be parsed
> + * @return 0 on success, > 0 on error
> + */
> +struct cgroup_string_list;
> +int cgroup_init_templates_cache_from_files(int *file_index);
> +
> +/**
> + * Reloads the templates list from files. Before calling this function,
> + * cgroup_templates_cache_set_source_files has to be called first.
> + * @param file_index index of file which was unable to be parsed
> + * @return 0 on success, > 0 on failure
> + */
> +int cgroup_reload_cached_templates_from_file(int *file_index);
> +

What about to read only CGCONFIG_CONF_FILE if 
cgroup_templates_cache_set_source_files
is not used (to be compatible with the old api


> +/**
> + * Load the templates cache from files. Used as a common function for
> + * cgroup_[load|init]_templates_cache_from_files.
> + * @param file_index index of file which was unable to be parsed

there is no parameter file_index

> + * @return 0 on success, > 0 on error
> + */
> +void cgroup_templates_cache_set_source_files(
> +        struct cgroup_string_list *tmpl_files);
> +
> +/**
>   * Physically create a new control group in kernel, based on given control
>   * group template and configuration file. If given template is not set in
>   * configuration file, then the procedure works create the control group
>   * using  cgroup_create_cgroup() function
>   *
> + * Templates are loaded using
> cgroup_[init|reload]_templates_cache_from_files
> + * function, which must be preceeded by

preceeded -> preceded

> cgroup_templates_cache_set_source_files
> + * call.
> + *
>   * The flags can alter the behavior of this function:
>   * CGFLAG_USE_TEMPLATE_CACHE: Use cached templates instead of
>   * parsing the config file
> diff --git a/src/config.c b/src/config.c
> index da2c0dd..16c28ec 100644
> --- a/src/config.c
> +++ b/src/config.c
> @@ -41,6 +41,8 @@
>  #include <sys/stat.h>
>  #include <sys/types.h>
>  
> +#include "tools/tools-common.h"
> +
>  unsigned int MAX_CGROUPS = 64;        /* NOTE: This value changes 
> dynamically */
>  unsigned int MAX_TEMPLATES = 64;
>                                  /* NOTE: This value changes dynamically */
> @@ -89,6 +91,7 @@ static int config_template_table_index;
>   */
>  static struct cgroup *template_table;
>  static int template_table_index;
> +static struct cgroup_string_list *template_files;
>  
>  
>  /*
> @@ -96,6 +99,9 @@ static int template_table_index;
>   */
>  #define CGROUP_FILESYSTEM "cgroup"
>  
> +#define TEMPLATE_ACTION_INIT 0
> +#define TEMPLATE_ACTION_RELOAD 1
> +
>  /*
>   * NOTE: All these functions return 1 on success
>   * and not 0 as is the library convention
> @@ -1572,6 +1578,176 @@ int cgroup_init_templates_cache(char *pathname)
>  
>  }
>  
> +/**
> + * Setting source files of templates. This function has to be called before
> + * any call of cgroup_[init|reload]_templates_cache_from_files.
> + * @param tmpl_files
> + */
> +void cgroup_templates_cache_set_source_files(
> +        struct cgroup_string_list *tmpl_files)
> +{
> +        template_files = tmpl_files;
> +}
> +
> +/**
> + * Appending cgroup templates parsed by parser to template_table
> + * @param offset number of templates already in the table
> + */
> +int cgroup_add_cgroup_templates(int offset)
> +{
> +        int i, ti, ret;
> +
> +        for (i = 0; i < config_template_table_index; i++) {
> +                ti = i + offset;
> +                ret = cgroup_copy_cgroup(&template_table[ti],
> +                        &config_template_table[i]);
> +                if (ret)
> +                        return ret;
> +
> +                strcpy((template_table[ti]).name,
> +                        (config_template_table[i]).name);
> +                template_table[ti].tasks_uid =
> +                        config_template_table[i].tasks_uid;
> +                template_table[ti].tasks_gid =
> +                        config_template_table[i].tasks_gid;
> +                template_table[ti].task_fperm =
> +                        config_template_table[i].task_fperm;
> +                template_table[ti].control_uid =
> +                        config_template_table[i].control_uid;
> +                template_table[ti].control_gid =
> +                        config_template_table[i].control_gid;
> +                template_table[ti].control_fperm =
> +                        config_template_table[i].control_fperm;
> +                template_table[ti].control_dperm =
> +                        config_template_table[i].control_dperm;
> +        }
> +
> +        return 0;
> +}
> +
> +/**
> + * Expand template table based on new number of parsed templates, i.e.
> + * on value of config_template_table_index.
> + * Change value of template_table_index.
> + * @return 0 on success, > 0 on error
> + */
> +int cgroup_expand_template_table(void)
> +{
> +        int i, template_table_last_index;
> +
> +        template_table_last_index = template_table_index;
> +        template_table_index += config_template_table_index;

beware if there is a problem in realloc function here then free function can't 
use index as a
index of all allocated spaces in template_table list (now cleanup is done this 
way). What about to set this value after
realloc

> +        template_table = realloc(template_table,
> +                template_table_index*sizeof(struct cgroup));
> +
> +        if (template_table == NULL)
> +                return -ECGOTHER;

-ECGOTHER is a negative number (see function description, the return value 
should be positive one


> +
> +        for (i = 0; i < config_template_table_index; i++)
> +                template_table[i + template_table_last_index].index = 0;
> +
> +        return 0;
> +}
> +
> +/**
> + * Load the templates cache from files. Used as a common function for
> + * cgroup_[load|init]_templates_cache_from_files.
> + * @param file_index index of file which was unable to be parsed
> + * @return 0 on success, > 0 on error
> + */
> +int cgroup_load_templates_cache_from_files(int *file_index)
> +{
> +        int ret;
> +        int i, j;
> +        int template_table_last_index;
> +        char *pathname;
> +
> +        if (!template_files) {
> +                /* source files has not been set */
> +                cgroup_dbg("Template source files have not been set\n");
> +                ret = ECGOTHER;
> +                *file_index = -1;
> +                return ret;
> +        }
> +

-------------------
> +        if (template_table) {
> +                /* template structures have to be free */
> +                for (i = 0; i < template_table_index; i++)
> +                        cgroup_free_controllers(&template_table[i]);
> +                free(template_table);
> +                template_table = NULL;
> +        }
> +        template_table_index = 0;
> +
> +        if ((config_template_table_index != 0) || (config_table_index != 0)) 
> {
> +                /* config structures have to be clean before parsing */
> +                cgroup_free_config();
> +        }
-----------------------
should this part be in both cgroup_reload_cached_templates_from_file and  
cgroup_init_templates_cache_from_files functions?
if yes why there are both of them - there is no need to have the same functions 
which difference is a debug message at the beginning


> +
> +        for (j = 0; j < template_files->count; j++) {


> +                pathname = template_files->items[j];
> +
> +                cgroup_dbg("Parsing templates from %s.\n", pathname);
> +                /* Attempt to read the configuration file
> +                 * and cache the rules. */
> +                ret = cgroup_parse_config(pathname);
> +                if (ret) {
> +#define LTE1 "Could not initialize rule cache, error was: %d\n"
please don't use definition for this purposes
> +                        cgroup_dbg(LTE1, ret);
> +                        *file_index = j;
> +                        return ret;
> +                }
> +
> +                if (config_template_table_index > 0) {
> +                        template_table_last_index = template_table_index;
> +                        ret = cgroup_expand_template_table();
> +#define LTE2 "Could not expand template table, error was: %d\n"
> +                        if (ret) {
> +                                cgroup_dbg(LTE2, -ret);

set *file_index

> +                                return -ret;
> +                        }
> +
> +                        /* copy template data to templates cache structures 
> */
> +#define LTE3 "Copying templates to template table from %s.\n"
> +                        cgroup_dbg(LTE3, pathname);
> +                        ret = cgroup_add_cgroup_templates(
> +                                template_table_last_index);
> +                        if (ret) {
> +                                cgroup_dbg("Unable to copy cgroup\n");

set *file_index

> +                                return ret;
> +                        }
> +#define LTE4 "Templates to template table copied\n"
> +                        cgroup_dbg(LTE4);
> +                }
> +        }
> +
> +        return 0;
> +}
> +
> +/**
> + * Initializes the templates cache from files. Before calling this function,
> + * cgroup_templates_cache_set_source_files has to be called first.
> + * @param file_index index of file which was unable to be parsed
> + * @return 0 on success, > 0 on error
> + */
> +int cgroup_init_templates_cache_from_files(int *file_index)
> +{
> +        cgroup_dbg("Init templates cache from files\n");
> +        return cgroup_load_templates_cache_from_files(file_index);
> +}
> +
> +/**
> + * Reloads the templates list from files. Before calling this function,
> + * cgroup_templates_cache_set_source_files has to be called first.
> + * @param file_index index of file which was unable to be parsed
> + * @return 0 on success, > 0 on failure
> + */
> +int cgroup_reload_cached_templates_from_file(int *file_index)
> +{
> +        cgroup_dbg("Reload templates cache from files\n");
> +        return cgroup_load_templates_cache_from_files(file_index);
> +}
> +
>  /*
>   * Create a given cgroup, based on template configuration if it is present
>   * if the template is not present cgroup is creted using
>   cgroup_create_cgroup
> @@ -1593,13 +1769,16 @@ int cgroup_config_create_template_group(struct cgroup
> *cgroup,
>           * use CGCONFIG_CONF_FILE by default
>           */
>          if (!(flags & CGFLAG_USE_TEMPLATE_CACHE)) {
> +                int fileindex;
>                  if (template_table_index == 0)
>                          /* the rules cache is empty */
> -                        ret = 
> cgroup_init_templates_cache(CGCONFIG_CONF_FILE);
> +                        ret = cgroup_init_templates_cache_from_files(
> +                                &fileindex);
> +
>                  else
>                          /* cache is not empty */
> -                        ret = cgroup_reload_cached_templates(
> -                                CGCONFIG_CONF_FILE);
> +                        ret = cgroup_reload_cached_templates_from_file(
> +                                &fileindex);
>                  if (ret != 0) {
>                          cgroup_dbg("Failed initialize templates cache.\n");
>                          return ret;
> diff --git a/src/libcgroup.map b/src/libcgroup.map
> index b0c162c..f853af0 100644
> --- a/src/libcgroup.map
> +++ b/src/libcgroup.map
> @@ -117,3 +117,9 @@ CGROUP_0.39 {
>          cgroup_log;
>          cgroup_parse_log_level_str;
>  } CGROUP_0.38;
> +
> +CGROUP_0.40 {
> +        cgroup_init_templates_cache_from_files;
> +        cgroup_reload_cached_templates_from_file;
> +        cgroup_templates_cache_set_source_files;
> +} CGROUP_0.39;
> 
> 

------------------------------------------------------------------------------
The best possible search technologies are now affordable for all companies.
Download your FREE open source Enterprise Search Engine today!
Our experts will assist you in its installation for $59/mo, no commitment.
Test it for FREE on our Cloud platform anytime!
http://pubads.g.doubleclick.net/gampad/clk?id=145328191&iu=/4140/ostg.clktrk
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to