2
#include <libcgroup-internal.h>
10
#include "tools-common.h"
16
COPY_FROM_OPTION = CHAR_MAX + 1
19
static struct option const long_options[] =
21
{"rule", required_argument, NULL, 'r'},
22
{"help", no_argument, NULL, 'h'},
23
{"copy-from", required_argument, NULL, COPY_FROM_OPTION},
27
int flags; /* used input method */
29
struct cgroup *copy_name_value_from_cgroup(char src_cg_path[FILENAME_MAX])
32
struct cgroup *src_cgroup;
34
/* create source cgroup */
35
src_cgroup = cgroup_new_cgroup(src_cg_path);
37
fprintf(stderr, "can't create cgroup: %s\n",
38
cgroup_strerror(ECGFAIL));
42
/* copy the name-version values to the cgroup structure */
43
ret = cgroup_get_cgroup(src_cgroup);
45
fprintf(stderr, "cgroup %s error: %s \n",
46
src_cg_path, cgroup_strerror(ret));
53
cgroup_free(&src_cgroup);
58
struct cgroup *copy_name_value_from_rules(int nv_number,
59
struct control_value *name_value)
61
struct cgroup *src_cgroup;
62
struct cgroup_controller *cgc;
63
char con[FILENAME_MAX];
68
/* create source cgroup */
69
src_cgroup = cgroup_new_cgroup("tmp");
71
fprintf(stderr, "can't create cgroup: %s\n",
72
cgroup_strerror(ECGFAIL));
76
/* add pairs name-value to
77
relevant controllers of this cgroup */
78
for (i = 0; i < nv_number; i++) {
80
if ((strchr(name_value[i].name, '.')) == NULL) {
81
fprintf(stderr, "wrong -r parameter (%s=%s)\n",
82
name_value[i].name, name_value[i].value);
86
strncpy(con, name_value[i].name, FILENAME_MAX);
89
/* add relevant controller */
90
cgc = cgroup_add_controller(src_cgroup, con);
92
fprintf(stderr, "controller %s can't be add\n",
97
/* add name-value pair to this controller */
98
ret = cgroup_add_value_string(cgc,
99
name_value[i].name, name_value[i].value);
101
fprintf(stderr, "name-value pair %s=%s can't be set\n",
102
name_value[i].name, name_value[i].value);
109
cgroup_free(&src_cgroup);
113
void usage(int status, char *program_name)
116
fprintf(stderr, "Wrong input parameters,"
117
" try %s --help' for more information.\n",
120
printf("Usage: %s [-r <name=value>] <cgroup_path> ...\n"
121
" or: %s --copy-from <source_cgrup_path> "
122
"<cgroup_path> ...\n",
123
program_name, program_name);
127
int main(int argc, char *argv[])
133
struct control_value *name_value = NULL;
137
char src_cg_path[FILENAME_MAX];
138
struct cgroup *src_cgroup;
139
struct cgroup *cgroup;
141
/* no parametr on input */
143
fprintf(stderr, "Usage is %s -r <name=value> "
144
"<relative path to cgroup>\n", argv[0]);
148
/* parse arguments */
149
while ((c = getopt_long (argc, argv,
150
"r:h", long_options, NULL)) != -1) {
159
if ((flags & FL_COPY) != 0) {
166
/* add name-value pair to buffer
167
(= name_value variable) */
168
if (nv_number >= nv_max) {
170
name_value = (struct control_value *)
172
nv_max * sizeof(struct control_value));
174
fprintf(stderr, "%s: "
175
"not enough memory\n",
182
/* parse optarg value */
183
/* there is necessary to input the tuple n=v */
184
buf = strtok(optarg, "=");
186
fprintf(stderr, "%s: "
187
"wrong parameter of option -r: %s\n",
193
strncpy(name_value[nv_number].name, buf, FILENAME_MAX);
194
name_value[nv_number].name[FILENAME_MAX-1] = '\0';
196
buf = strtok(NULL, "=");
198
fprintf(stderr, "%s: "
199
"wrong parameter of option -r: %s\n",
205
strncpy(name_value[nv_number].value, buf, CG_VALUE_MAX);
206
name_value[nv_number].value[CG_VALUE_MAX-1] = '\0';
210
case COPY_FROM_OPTION:
217
strncpy(src_cg_path, optarg, FILENAME_MAX);
218
src_cg_path[FILENAME_MAX-1] = '\0';
230
fprintf(stderr, "%s: no cgroup specified\n", argv[0]);
236
fprintf(stderr, "%s: no name-value pair was set\n", argv[0]);
241
/* initialize libcgroup */
244
fprintf(stderr, "%s: libcgroup initialization failed: %s\n",
245
argv[0], cgroup_strerror(ret));
249
/* copy the name-value pairs from -r options */
250
if ((flags & FL_RULES) != 0) {
251
src_cgroup = copy_name_value_from_rules(nv_number, name_value);
252
if (src_cgroup == NULL)
256
/* copy the name-value from the given group */
257
if ((flags & FL_COPY) != 0) {
258
src_cgroup = copy_name_value_from_cgroup(src_cg_path);
259
if (src_cgroup == NULL)
263
while (optind < argc) {
264
/* create new cgroup */
265
cgroup = cgroup_new_cgroup(argv[optind]);
268
fprintf(stderr, "%s: can't add new cgroup: %s\n",
269
argv[0], cgroup_strerror(ret));
270
goto cgroup_free_err;
273
/* copy the values from the source cgroup to new one */
274
ret = cgroup_copy_cgroup(cgroup, src_cgroup);
276
fprintf(stderr, "%s: cgroup %s error: %s \n",
277
argv[0], src_cg_path, cgroup_strerror(ret));
278
goto cgroup_free_err;
281
/* modify cgroup based on values of the new one */
282
ret = cgroup_modify_cgroup(cgroup);
284
fprintf(stderr, "%s: "
285
"the group can't be modified\n",
287
goto cgroup_free_err;
291
cgroup_free(&cgroup);
296
cgroup_free(&cgroup);
297
cgroup_free(&src_cgroup);