From: Jan Safranek Date: Fri, 23 Sep 2011 11:53:33 +0000 (+0200) Subject: cgclear: delete cgroups from config file X-Git-Tag: v0.38~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98a26c8618128f1040088b8a437823dda14d6e1d;p=thirdparty%2Flibcgroup.git cgclear: delete cgroups from config file cgclear should be able to 'uload' cgroups (and mounts) as specified in given config file - as exact opposite of cgconfigparser. This patch adds new options '-c ' and '-C just for this purpose. These options can be specified multiple times. Signed-off-by: Jan Safranek --- diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index 92a00781..b825dffc 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -20,7 +20,7 @@ cgget_SOURCES = cgget.c tools-common.c tools-common.h cgconfigparser_SOURCES = cgconfig.c -cgclear_SOURCES = cgclear.c +cgclear_SOURCES = cgclear.c tools-common.c tools-common.h cgdelete_SOURCES = cgdelete.c tools-common.c tools-common.h diff --git a/src/tools/cgclear.c b/src/tools/cgclear.c index c2862728..1dc3e96f 100644 --- a/src/tools/cgclear.c +++ b/src/tools/cgclear.c @@ -21,20 +21,114 @@ #include #include #include +#include +#include "tools-common.h" -int main(int argc, char *argv[]) +static struct cgroup_string_list cfg_files; + +static void usage(int status, const char *program_name) { - int error; + if (status != 0) { + fprintf(stderr, "Wrong input parameters," + " try %s -h' for more information.\n", + program_name); + } else { + printf("%s [-e] [-l config file] [-L directory] ...", + program_name); + } +} - error = cgroup_unload_cgroups(); +static void report_error(int error, const char *program_name) +{ /* Don't spit an error when there is nothing to clear. */ if (error == ECGROUPNOTMOUNTED) error = 0; - if (error) { - printf("%s failed with %s\n", argv[0], cgroup_strerror(error)); - exit(3); + printf("%s failed with %s\n", program_name, + cgroup_strerror(error)); + } +} + + +int main(int argc, char *argv[]) +{ + int error = 0, ret; + int c; + int unload_all = 1; + int flags = CGFLAG_DELETE_RECURSIVE; + + struct option longopts[] = { + {"load", required_argument, 0, 'l' }, + {"load-directory", required_argument, 0, 'L' }, + {"only-empty", no_argument, 0, 'e' }, + { 0, 0, 0, 0} + }; + + ret = cgroup_string_list_init(&cfg_files, argc/2); + if (ret) { + fprintf(stderr, "%s: cannot initialize list of files," + " out of memory?\n", + argv[0]); + exit(1); + } + + while ((c = getopt_long(argc, argv, "hl:L:e", longopts, NULL)) > 0) { + switch (c) { + case 'e': + flags = CGFLAG_DELETE_EMPTY_ONLY; + break; + + case 'l': + unload_all = 0; + ret = cgroup_string_list_add_item(&cfg_files, optarg); + if (ret) { + fprintf(stderr, "%s: cannot add file to list,"\ + " out of memory?\n", argv[0]); + exit(1); + } + break; + + case 'L': + unload_all = 0; + cgroup_string_list_add_directory(&cfg_files, optarg, + argv[0]); + break; + + case 'h': + usage(0, argv[0]); + exit(0); + default: + usage(1, argv[0]); + exit(1); + } + } + + if (unload_all) { + error = cgroup_unload_cgroups(); + if (error) + report_error(error, argv[0]); + } else { + int i; + + ret = cgroup_init(); + if (ret) { + report_error(ret, argv[0]); + exit(4); + } + /* process the config files in reverse order */ + for (i = cfg_files.count-1; i >= 0 ; i--) { + ret = cgroup_config_unload_config(cfg_files.items[i], + flags); + if (ret) { + report_error(ret, argv[0]); + if (!error) + error = ret; + } + } } + cgroup_string_list_free(&cfg_files); + if (error) + exit(3); return 0; }