summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tools/Makefile.am4
-rw-r--r--src/tools/lssubsys.c216
2 files changed, 219 insertions, 1 deletions
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
index 138b42b..e2338bd 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 cgdelete
+bin_PROGRAMS = cgexec cgclassify cgcreate cgset cgdelete lssubsys
sbin_PROGRAMS = cgconfigparser cgclear
@@ -21,6 +21,8 @@ cgclear_SOURCES = cgclear.c
cgdelete_SOURCES = cgdelete.c tools-common.c tools-common.h
+lssubsys_SOURCES = lssubsys.c
+
install-exec-hook:
chmod u+s $(DESTDIR)$(bindir)/cgexec
diff --git a/src/tools/lssubsys.c b/src/tools/lssubsys.c
new file mode 100644
index 0000000..959b9bf
--- /dev/null
+++ b/src/tools/lssubsys.c
@@ -0,0 +1,216 @@
+/* " Copyright (C) 2009 Red Hat, Inc. All Rights Reserved.
+ * " Written by Ivana Hutarova Varekova <varekova@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 <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+
+#include <libcgroup.h>
+
+enum flag{
+ FL_MOUNT = 1,
+ FL_LIST = 2
+};
+
+typedef char cont_name_t[FILENAME_MAX];
+
+void usage(int status, char *program_name)
+{
+ if (status != 0) {
+ fprintf(stderr, "Wrong input parameters,"
+ " try %s -h' for more information.\n",
+ program_name);
+ } else {
+ fprintf(stdout, "Usage: %s [-m] [controller] [...]\n",
+ program_name);
+ fprintf(stdout, "list all sybsystems of given controller\n");
+ fprintf(stdout, " -h, --help Display this help\n");
+ fprintf(stdout, " -m, --mount-points Display mount points\n");
+ }
+}
+
+/* print data about input cont_name controller */
+int print_controller(cont_name_t cont_name, int flags)
+{
+ int ret = 0;
+ char name[FILENAME_MAX];
+ char path[FILENAME_MAX];
+ void *handle;
+ struct cgroup_mount_point controller;
+ int output = 0;
+
+ ret = cgroup_get_controller_begin(&handle, &controller);
+
+ path[0] = '\0';
+ name[0] = '\0';
+
+ /* go through the list of controllers */
+ while (ret == 0) {
+ if (strcmp(path, controller.path) == 0) {
+ /* if it is still the same mount point */
+ strncat(name, "," , FILENAME_MAX-strlen(name)-1);
+ strncat(name, controller.name,
+ FILENAME_MAX-strlen(name)-1);
+ } else {
+ /*
+ * we got new mount point
+ * print the old one if needed
+ */
+ if (output) {
+ if ((flags & FL_MOUNT) != 0)
+ printf("%s %s\n", name, path);
+ else
+ printf("%s \n", name);
+ if ((flags & FL_LIST) != 0) {
+ /* we succesfully finish printing */
+ output = 0;
+ break;
+ }
+ }
+
+ output = 0;
+ strncpy(name, controller.name, FILENAME_MAX);
+ name[FILENAME_MAX-1] = '\0';
+ strncpy(path, controller.path, FILENAME_MAX);
+ path[FILENAME_MAX-1] = '\0';
+ }
+
+ /* set output flag */
+ if ((!output) && (!(flags & FL_LIST) ||
+ (strcmp(controller.name, cont_name) == 0)))
+ output = 1;
+
+ /* the actual controller should not be printed */
+ ret = cgroup_get_controller_next(&handle, &controller);
+ }
+
+ if (output) {
+ if ((flags & FL_MOUNT) != 0)
+ printf("%s %s\n", name, path);
+ else
+ printf("%s \n", name);
+ if ((flags & FL_LIST) != 0)
+ ret = 0;
+ }
+
+ cgroup_get_controller_end(&handle);
+ return ret;
+
+}
+
+/* list the controllers */
+int cgroup_list_controllers(char *tname,
+ cont_name_t cont_name[CG_CONTROLLER_MAX], int flags)
+{
+ int ret = 0;
+ int final_ret = 0;
+ int i = 0;
+
+ /* initialize libcgroup */
+ ret = cgroup_init();
+ if (ret) {
+ fprintf(stderr, "controllers can't be listed: %s\n",
+ cgroup_strerror(ret));
+ return ret;
+ }
+
+ if ((flags & FL_LIST) == 0) {
+ /* we have to print all controllers */
+ ret = print_controller(NULL, flags);
+ if (ret == ECGEOF)
+ final_ret = 0;
+ else
+ fprintf(stderr, "controllers can't be listed: %s\n",
+ cgroup_strerror(ret));
+ } else
+ /* we have he list of controllers which should be print */
+ while ((i < CG_CONTROLLER_MAX) && (cont_name[i][0] != '\0')
+ && ((ret == ECGEOF) || (ret == 0))) {
+ ret = print_controller(cont_name[i], flags);
+ if (ret != 0) {
+ if (ret == ECGEOF)
+ /* controller was not found */
+ final_ret = ECGFAIL;
+ else
+ /* other problem */
+ final_ret = ret;
+ fprintf(stderr,
+ "%s: cannot find group %s: %s\n",
+ tname, cont_name[i],
+ cgroup_strerror(final_ret));
+ }
+ i++;
+ }
+
+ return final_ret;
+}
+
+int main(int argc, char *argv[])
+{
+
+ int ret = 0;
+ int c;
+
+ int flags = 0;
+
+ int i;
+ int c_number = 0;
+ cont_name_t cont_name[CG_CONTROLLER_MAX];
+
+ static struct option options[] = {
+ {"help", 0, 0, 'h'},
+ {"mount-points", 0, 0, 'm'},
+ {0, 0, 0, 0}
+ };
+
+ for (i = 0; i < CG_CONTROLLER_MAX; i++)
+ cont_name[i][0] = '\0';
+
+ /* parse arguments */
+ while ((c = getopt_long(argc, argv, "mh", options, NULL)) > 0) {
+ switch (c) {
+ case 'h':
+ usage(0, argv[0]);
+ return 0;
+ case 'm':
+ flags |= FL_MOUNT;
+ break;
+ default:
+ usage(1, argv[0]);
+ return -1;
+ }
+ }
+
+ /* read the list of controllers */
+ while (optind < argc) {
+
+ flags |= FL_LIST;
+ strncpy(cont_name[c_number], argv[optind], FILENAME_MAX);
+ cont_name[c_number][FILENAME_MAX-1] = '\0';
+ c_number++;
+ optind++;
+ if (optind == CG_CONTROLLER_MAX) {
+ fprintf(stderr, "too much parameters\n");
+ break;
+ }
+ }
+
+ /*
+ * print the information
+ * based on list of input controllers and flags
+ */
+ ret = cgroup_list_controllers(argv[0], cont_name, flags);
+
+ return ret;
+}