+++ /dev/null
-.\" Copyright IBM Corporation. 2009.
-.\" Written by Dhaval Giani <dhaval@linux.vnet.ibm.com>.
-
-.TH CGCLEAR 1 2009-10-23 "Linux" "libcgroup Manual"
-.SH NAME
-cgclear \- unload the cgroup filesystem
-
-.SH SYNOPSIS
-\fBcgclear\fR [\fB-e\fR] [\fB-l\fR <\fIfilename\fR>] [\fB-L\fR <\fIdirectory\fR>] [...]
-
-.SH DESCRIPTION
-
-Without parameters, this command moves all the tasks inside the various cgroups
-to the root cgroup, deletes all the cgroups and finally
-unmounts the cgroup filesystem from the system.
-
-If one or more config files are specified, only groups defined in the config
-files are removed. The files are processed in reverse order, i.e. the last
-file on command line is processed first, so \fBcgclear\fR can have the same
-command line arguments as appropriate \fBcgconfigparser\fR.
-
-.TP
-.B -l, --load=<filename>
-specifies the config file to read. This option can be used multiple times and
-can be mixed with \fB-L\fR option.
-
-.TP
-.B -L, --load-directory=<directory>
-specifies the directory, which is searched for configuration files. All files
-in this directory will be processed in alphabetical order as they were specified
-by \fB-l\fR option. This option can be used multiple times and
-can be mixed with \fB-l\fR option.
-
-.TP
-.B -e
-specifies that only empty groups should be removed. If a group defined in a
-config file has tasks inside or has a subgroup, it won't be removed. This
-option works only with \fB-l\fR or \fB-L\fR options.
-
-.SH ENVIRONMENT VARIABLES
-.TP
-.B CGROUP_LOGLEVEL
-controls verbosity of the tool. Allowed values are \fBDEBUG\fR,
-\fBINFO\fR, \fBWARNING\fR or \fBERROR\fR.
-
-.SH FILES
-.TP
-.B /etc/cgconfig.conf
-default templates file
-.TP
-.B /etc/cgconfig.d/
-default templates files directory
-.RE
-
-
-.SH EXAMPLES
-.TP
-.B cgclear
-unload the whole cgroup filesystem
-
-.TP
-.B cgclear -l /etc/cgconfig.conf
-unload a subsystem of cgroup filesystem based on \fB/etc/cgconfig.conf\fR definition.
-
-.SH SEE ALSO
-cgconfigparser(1), cgconfig.conf(5)
+++ /dev/null
-/*
- * Copyright IBM Corporation. 2009
- *
- * Authors: Dhaval Giani <dhaval@linux.vnet.ibm.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.
- *
- * Code initiated and designed by Dhaval Giani. All faults are most likely
- * his mistake.
- */
-
-#include <libcgroup.h>
-#include <libcgroup-internal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <getopt.h>
-#include "tools-common.h"
-
-static struct cgroup_string_list cfg_files;
-
-static void usage(int status, const char *program_name)
-{
- if (status != 0) {
- fprintf(stderr, "Wrong input parameters,"
- " try %s -h' for more information.\n",
- program_name);
- return;
- }
- printf("Usage: %s [-h] [-l FILE] [-L DIR] [-e]\n",
- program_name);
- printf("Unload the cgroup filesystem\n");
- printf(" -e, --empty Remove only empty cgroups\n");
- printf(" -h, --help Display this help\n");
- printf(" -l, --load=FILE Parse and load the cgroups "\
- "configuration file\n");
- printf(" -L, --load-directory=DIR Parse and load the cgroups "\
- "configuration files from a directory\n");
-}
-
-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", 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' },
- {"help", no_argument, 0, 'h'},
- { 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 && ret != ECGNONEMPTY) {
- report_error(ret, argv[0]);
- if (!error)
- error = ret;
- }
- }
- }
- cgroup_string_list_free(&cfg_files);
- if (error)
- exit(3);
-
- return 0;
-}