summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvana Varekova <varekova@redhat.com>2009-06-19 17:08:52 +0200
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2009-06-29 16:59:16 +0530
commita6c5b55add45b76a7deb7ce853f28cff90c953b7 (patch)
tree3ef3ad150f072bc4749885098ed816a8c61200bd
parentb70f033df1ef23a1f46c577c195979b6eed57bfc (diff)
downloadlibcg-a6c5b55add45b76a7deb7ce853f28cff90c953b7.tar.gz
libcg-a6c5b55add45b76a7deb7ce853f28cff90c953b7.tar.xz
libcg-a6c5b55add45b76a7deb7ce853f28cff90c953b7.zip
cgset: Add --copy-from option to cgset
Add copy-from option to cgset Signed-off-by: Ivana Varekova <varekova@redhat.com> Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
-rw-r--r--src/tools/cgset.c74
1 files changed, 69 insertions, 5 deletions
diff --git a/src/tools/cgset.c b/src/tools/cgset.c
index 0c153eb..5018d10 100644
--- a/src/tools/cgset.c
+++ b/src/tools/cgset.c
@@ -9,13 +9,51 @@
#include "tools-common.h"
+#define FL_RULES 1
+#define FL_COPY 2
+
+enum {
+ COPY_FROM_OPTION = CHAR_MAX + 1
+};
+
static struct option const long_options[] =
{
{"rule", required_argument, NULL, 'r'},
{"help", no_argument, NULL, 'h'},
+ {"copy-from", required_argument, NULL, COPY_FROM_OPTION},
{NULL, 0, NULL, 0}
};
+int flags; /* used input method */
+
+struct cgroup *copy_name_value_from_cgroup(char src_cg_path[FILENAME_MAX])
+{
+ int ret = 0;
+ struct cgroup *src_cgroup;
+
+ /* create source cgroup */
+ src_cgroup = cgroup_new_cgroup(src_cg_path);
+ if (!src_cgroup) {
+ fprintf(stderr, "can't create cgroup: %s\n",
+ cgroup_strerror(ECGFAIL));
+ goto scgroup_err;
+ }
+
+ /* copy the name-version values to the cgroup structure */
+ ret = cgroup_get_cgroup(src_cgroup);
+ if (ret != 0) {
+ fprintf(stderr, "cgroup %s error: %s \n",
+ src_cg_path, cgroup_strerror(ret));
+ goto scgroup_err;
+ }
+
+ return src_cgroup;
+
+scgroup_err:
+ cgroup_free(&src_cgroup);
+ return NULL;
+}
+
struct cgroup *copy_name_value_from_rules(int nv_number,
struct control_value *name_value)
@@ -118,6 +156,13 @@ int main(int argc, char *argv[])
break;
case 'r':
+ if ((flags & FL_COPY) != 0) {
+ usage(1, argv[0]);
+ ret = -1;
+ goto err;
+ }
+ flags |= FL_RULES;
+
/* add name-value pair to buffer
(= name_value variable) */
if (nv_number >= nv_max) {
@@ -162,6 +207,16 @@ int main(int argc, char *argv[])
nv_number++;
break;
+ case COPY_FROM_OPTION:
+ if (flags != 0) {
+ usage(1, argv[0]);
+ ret = -1;
+ goto err;
+ }
+ flags |= FL_COPY;
+ strncpy(src_cg_path, optarg, FILENAME_MAX);
+ src_cg_path[FILENAME_MAX-1] = '\0';
+ break;
default:
usage(1, argv[0]);
ret = -1;
@@ -177,7 +232,7 @@ int main(int argc, char *argv[])
goto err;
}
- if (nv_number == 0) {
+ if (flags == 0) {
fprintf(stderr, "%s: no name-value pair was set\n", argv[0]);
ret = -1;
goto err;
@@ -191,12 +246,21 @@ int main(int argc, char *argv[])
goto err;
}
- src_cgroup = copy_name_value_from_rules(nv_number, name_value);
- if (src_cgroup == NULL)
- goto err;
+ /* copy the name-value pairs from -r options */
+ if ((flags & FL_RULES) != 0) {
+ src_cgroup = copy_name_value_from_rules(nv_number, name_value);
+ if (src_cgroup == NULL)
+ goto err;
+ }
- while (optind < argc) {
+ /* copy the name-value from the given group */
+ if ((flags & FL_COPY) != 0) {
+ src_cgroup = copy_name_value_from_cgroup(src_cg_path);
+ if (src_cgroup == NULL)
+ goto err;
+ }
+ while (optind < argc) {
/* create new cgroup */
cgroup = cgroup_new_cgroup(argv[optind]);
if (!cgroup) {