summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Safranek <jsafrane@redhat.com>2009-07-29 15:21:39 +0200
committerJan Safranek <jsafrane@redhat.com>2009-07-29 15:21:39 +0200
commit0c93bc814e1ea8c6b962406ad1163c6b44ca2daf (patch)
treee08be38c43f67f80ebbd126ff1dfada54e063b2b
parent67f6b94acfb1fceda2cc77aa37901293c5022df8 (diff)
downloadlibcg-0c93bc814e1ea8c6b962406ad1163c6b44ca2daf.tar.gz
libcg-0c93bc814e1ea8c6b962406ad1163c6b44ca2daf.tar.xz
libcg-0c93bc814e1ea8c6b962406ad1163c6b44ca2daf.zip
Add cgdelete tool
The cgdelete command line tool removes given control groups. Usage: cgdelete [-r] <controllers>:<group> [...] Signed-off-by: Jan Safranek <jsafrane@redhat.com>
-rw-r--r--src/tools/Makefile.am4
-rw-r--r--src/tools/cgdelete.c144
2 files changed, 147 insertions, 1 deletions
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
index 1c2b8e7..138b42b 100644
--- a/src/tools/Makefile.am
+++ b/src/tools/Makefile.am
@@ -3,7 +3,7 @@ LDADD = $(top_srcdir)/src/.libs/libcgroup.la
if WITH_TOOLS
-bin_PROGRAMS = cgexec cgclassify cgcreate cgset
+bin_PROGRAMS = cgexec cgclassify cgcreate cgset cgdelete
sbin_PROGRAMS = cgconfigparser cgclear
@@ -19,6 +19,8 @@ cgconfigparser_SOURCES = cgconfig.c
cgclear_SOURCES = cgclear.c
+cgdelete_SOURCES = cgdelete.c tools-common.c tools-common.h
+
install-exec-hook:
chmod u+s $(DESTDIR)$(bindir)/cgexec
diff --git a/src/tools/cgdelete.c b/src/tools/cgdelete.c
new file mode 100644
index 0000000..3a6a542
--- /dev/null
+++ b/src/tools/cgdelete.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright RedHat Inc. 2009
+ *
+ * Authors: Jan Safranek <jsafrane@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#include <libcgroup.h>
+#include <libcgroup-internal.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "tools-common.h"
+
+int main(int argc, char *argv[])
+{
+ int ret = 0;
+ int i, j;
+ char c;
+ int flags = 0;
+ int final_ret = 0;
+
+ struct cgroup_group_spec *cgroup_list[CG_HIER_MAX];
+ struct cgroup *cgroup;
+ struct cgroup_controller *cgc;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage is %s [-r] "
+ "<list of controllers>:<relative path to cgroup> "
+ "[...]\n",
+ argv[0]);
+ return -1;
+ }
+
+ memset(cgroup_list, 0, sizeof(cgroup_list));
+
+ /*
+ * Parse arguments
+ */
+ while ((c = getopt(argc, argv, "r")) > 0) {
+ switch (c) {
+ case 'r':
+ flags |= CGFLAG_DELETE_RECURSIVE;
+ break;
+ default:
+ fprintf(stderr, "%s: "
+ "invalid command line option\n",
+ argv[0]);
+ return -1;
+ break;
+ }
+ }
+
+ if (optind >= argc) {
+ fprintf(stderr, "%s: "
+ "no groups to delete\n",
+ argv[0]);
+ ret = -1;
+ goto err;
+ }
+
+ /* initialize libcg */
+ ret = cgroup_init();
+ if (ret) {
+ fprintf(stderr, "%s: "
+ "libcgroup initialization failed: %s\n",
+ argv[0], cgroup_strerror(ret));
+ goto err;
+ }
+
+ /* parse groups on command line */
+ for (i = optind; i < argc; i++) {
+ ret = parse_cgroup_spec(cgroup_list, argv[i]);
+ if (ret != 0) {
+ fprintf(stderr, "%s: error parsing cgroup '%s'\n",
+ argv[0], argv[i]);
+ ret = -1;
+ goto err;
+ }
+ }
+
+ /* for each cgroup to delete */
+ for (i = 0; i < CG_HIER_MAX; i++) {
+ if (!cgroup_list[i])
+ break;
+
+ /* create the new cgroup structure */
+ cgroup = cgroup_new_cgroup(cgroup_list[i]->path);
+ if (!cgroup) {
+ ret = ECGFAIL;
+ fprintf(stderr, "%s: can't create new cgroup: %s\n",
+ argv[0], cgroup_strerror(ret));
+ goto err;
+ }
+
+ /* add controllers to the cgroup */
+ j = 0;
+ while (cgroup_list[i]->controllers[j]) {
+ cgc = cgroup_add_controller(cgroup,
+ cgroup_list[i]->controllers[j]);
+ if (!cgc) {
+ ret = ECGFAIL;
+ fprintf(stderr, "%s: "
+ "controller %s can't be added\n",
+ argv[0],
+ cgroup_list[i]->controllers[j]);
+ cgroup_free(&cgroup);
+ goto err;
+ }
+ j++;
+ }
+
+ ret = cgroup_delete_cgroup_ext(cgroup, flags);
+ /*
+ * Remember the errors and continue, try to remove all groups.
+ */
+ if (ret != 0) {
+ fprintf(stderr, "%s: cannot remove group '%s': %s",
+ argv[0], cgroup->name,
+ cgroup_strerror(ret));
+ final_ret = ret;
+ }
+ cgroup_free(&cgroup);
+ }
+
+ ret = final_ret;
+err:
+ for (i = 0; i < CG_HIER_MAX; i++) {
+ if (cgroup_list[i])
+ cgroup_free_group_spec(cgroup_list[i]);
+ }
+ return ret;
+}