* cgroup_table_index -> Where in the cgroup_table we are.
*/
static struct cg_mount_table_s config_mount_table[CG_CONTROLLER_MAX];
+static struct cg_mount_table_s config_namespace_table[CG_CONTROLLER_MAX];
static int config_table_index;
+static int namespace_table_index;
static pthread_rwlock_t config_table_lock = PTHREAD_RWLOCK_INITIALIZER;
+static pthread_rwlock_t namespace_table_lock = PTHREAD_RWLOCK_INITIALIZER;
static struct cgroup config_cgroup_table[MAX_CGROUPS];
int cgroup_table_index;
sizeof(struct cg_mount_table_s) * CG_CONTROLLER_MAX);
}
+/*
+ * The moment we have found the controller's information
+ * insert it into the config_mount_table.
+ */
+int cgroup_config_insert_into_namespace_table(char *name, char *nspath)
+{
+ if (namespace_table_index >= CG_CONTROLLER_MAX)
+ return 0;
+
+ pthread_rwlock_wrlock(&namespace_table_lock);
+
+ strcpy(config_namespace_table[namespace_table_index].name, name);
+ strcpy(config_namespace_table[namespace_table_index].path, nspath);
+ namespace_table_index++;
+
+ pthread_rwlock_unlock(&namespace_table_lock);
+ free(name);
+ free(nspath);
+ return 1;
+}
+
+/*
+ * Cleanup all the data from the config_mount_table
+ */
+void cgroup_config_cleanup_namespace_table(void)
+{
+ memset(&config_namespace_table, 0,
+ sizeof(struct cg_mount_table_s) * CG_CONTROLLER_MAX);
+}
+
/*
* Start mounting the mount table.
*/
[ \t] {/* DO NOTHING */}
^#.*[ \t]* {/* Comments */}
^\*.*[ \t]* {/* Comments */}
-"mount" {return MOUNT;}
-"task" {return TASK;}
-"admin" {return ADMIN;}
-"perm" {return PERM;}
-"group" {return GROUP;}
+"mount" {return MOUNT;}
+"task" {return TASK;}
+"admin" {return ADMIN;}
+"perm" {return PERM;}
+"group" {return GROUP;}
+"namespace" {return NAMESPACE;}
[a-zA-Z0-9_\-\/\.]+ {yylval.name = strdup(yytext); return ID;}
. {return yytext[0];}
%%
int cgroup_config_group_task_perm(char *perm_type, char *value);
int cgroup_config_group_admin_perm(char *perm_type, char *value);
int cgroup_config_insert_into_mount_table(char *name, char *mount_point);
+int cgroup_config_insert_into_namespace_table(char *name, char *mount_point);
void cgroup_config_cleanup_mount_table(void);
__END_DECLS
%}
-%token ID MOUNT GROUP PERM TASK ADMIN
+%token ID MOUNT GROUP PERM TASK ADMIN NAMESPACE
%union {
char *name;
%type <name> ID namevalue_conf
%type <val> mountvalue_conf mount task_namevalue_conf admin_namevalue_conf
%type <val> admin_conf task_conf task_or_admin group_conf group start
+%type <val> namespace namespace_conf
%start start
%%
{
$$ = $1;
}
- |
+ | start namespace
+ {
+ $$ = $1;
+ }
+ |
{
$$ = 1;
}
}
;
+namespace_conf
+ : ID '=' ID ';'
+ {
+ if (!cgroup_config_insert_into_namespace_table($1, $3)) {
+ cgroup_config_cleanup_namespace_table();
+ $$ = 0;
+ return $$;
+ }
+ $$ = 1;
+ }
+ | namespace_conf ID '=' ID ';'
+ {
+ if (!cgroup_config_insert_into_namespace_table($2, $4)) {
+ cgroup_config_cleanup_namespace_table();
+ $$ = 0;
+ return $$;
+ }
+ $$ = 1;
+ }
+ ;
+
+namespace : NAMESPACE '{' namespace_conf '}'
+ {
+ $$ = $3;
+ if (!$$) {
+ fprintf(stderr, "parsing failed at line number %d\n",
+ line_no);
+ $$ = 0;
+ return $$;
+ }
+ }
+ ;
%%