]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
cgclear: delete cgroups from config file
authorJan Safranek <jsafrane@redhat.com>
Fri, 23 Sep 2011 11:53:33 +0000 (13:53 +0200)
committerJan Safranek <jsafrane@redhat.com>
Thu, 3 Nov 2011 09:12:47 +0000 (10:12 +0100)
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 <config_file>' and '-C <directory with config
files> just for this purpose. These options can be specified multiple times.

Signed-off-by: Jan Safranek <jsafrane@redhat.com>
src/tools/Makefile.am
src/tools/cgclear.c

index 92a00781da6ac5447396aa0214701ae064b6294a..b825dffc6f3a250c8148a15cf81349898f2cf511 100644 (file)
@@ -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
 
index c2862728510057ca227f0a95c5ddf8c7f0e2c4cf..1dc3e96fdbe423dd2afebd42621f21a424c4a0b0 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <getopt.h>
+#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;
 }