/** * This function creates and returns a cgroup data structure * @param group the name of the group * @param controller_name the name of the controller to be added to the group * @param control_file name of the control file of the controller * @param value_type which value out of four types * @param struct cval the control value structure * @param struct ids the permissions struct * @param the test number */ struct cgroup *new_cgroup(char *group, char *controller_name, char *control_file, int value_type, struct cntl_val_t cval, struct uid_gid_t ids, int i) { int retval; /* Names of wrapper apis */ char wr[SIZE]; struct cgroup *newcgroup; struct cgroup_controller *newcontroller; newcgroup = cgroup_new_cgroup(group); if (newcgroup) { retval = cgroup_set_uid_gid(newcgroup, ids.tasks_uid, ids.tasks_gid, ids.control_uid, ids.control_gid); if (retval) { snprintf(wr, SIZE, "set_uid_gid()"); message(i++, FAIL, wr, retval, info[NOMESSAGE]); } newcontroller = cgroup_add_controller(newcgroup, controller_name); if (newcontroller) { retval = add_control_value(newcontroller, control_file, wr, value_type, cval); if (!retval) { message(i++, PASS, "new_cgroup()", retval, info[NOMESSAGE]); } else { message(i++, FAIL, wr, retval , info[NOMESSAGE]); cgroup_free(&newcgroup); return NULL; } } else { /* Since these wrappers do not return an int so -1 */ message(i++, FAIL, "add_controller", -1, info[NOMESSAGE]); cgroup_free(&newcgroup); return NULL; } } else { message(i++, FAIL, "new_cgroup", -1, info[NOMESSAGE]); return NULL; } return newcgroup; }
static int l_cgroup_set_uid_gid(lua_State *L) { struct u_cgroup *usrc = check_cgroup(L, 1); int tuid = luaL_checkinteger(L, 2); int tgid = luaL_checkinteger(L, 3); int cuid = luaL_checkinteger(L, 4); int cgid = luaL_checkinteger(L, 5); int rv; if(usrc) { rv = cgroup_set_uid_gid(usrc->group, tuid, tgid, cuid, cgid); lua_pushinteger(L, rv); return 1; } lua_pushstring(L, "Not a valid cgroup"); lua_error (L); return 0; }
int main(int argc, char *argv[]) { int ret = 0; int i, j; int c; static struct option long_opts[] = { {"help", no_argument, NULL, 'h'}, {"task", required_argument, NULL, 't'}, {"admin", required_argument, NULL, 'a'}, {"", required_argument, NULL, 'g'}, {"dperm", required_argument, NULL, 'd'}, {"fperm", required_argument, NULL, 'f' }, {"tperm", required_argument, NULL, 's' }, {0, 0, 0, 0}, }; uid_t tuid = CGRULE_INVALID, auid = CGRULE_INVALID; gid_t tgid = CGRULE_INVALID, agid = CGRULE_INVALID; struct cgroup_group_spec **cgroup_list; struct cgroup *cgroup; struct cgroup_controller *cgc; /* approximation of max. numbers of groups that will be created */ int capacity = argc; /* permission variables */ mode_t dir_mode = NO_PERMS; mode_t file_mode = NO_PERMS; mode_t tasks_mode = NO_PERMS; int dirm_change = 0; int filem_change = 0; /* no parametr on input */ if (argc < 2) { usage(1, argv[0]); return -1; } cgroup_list = calloc(capacity, sizeof(struct cgroup_group_spec *)); if (cgroup_list == NULL) { fprintf(stderr, "%s: out of memory\n", argv[0]); ret = -1; goto err; } /* parse arguments */ while ((c = getopt_long(argc, argv, "a:t:g:hd:f:s:", long_opts, NULL)) > 0) { switch (c) { case 'h': usage(0, argv[0]); ret = 0; goto err; case 'a': /* set admin uid/gid */ if (parse_uid_gid(optarg, &auid, &agid, argv[0])) goto err; break; case 't': /* set task uid/gid */ if (parse_uid_gid(optarg, &tuid, &tgid, argv[0])) goto err; break; case 'g': ret = parse_cgroup_spec(cgroup_list, optarg, capacity); if (ret) { fprintf(stderr, "%s: " "cgroup controller and path" "parsing failed (%s)\n", argv[0], argv[optind]); ret = -1; goto err; } break; case 'd': dirm_change = 1; ret = parse_mode(optarg, &dir_mode, argv[0]); break; case 'f': filem_change = 1; ret = parse_mode(optarg, &file_mode, argv[0]); break; case 's': filem_change = 1; ret = parse_mode(optarg, &tasks_mode, argv[0]); break; default: usage(1, argv[0]); ret = -1; goto err; } } /* no cgroup name */ if (argv[optind]) { fprintf(stderr, "%s: " "wrong arguments (%s)\n", argv[0], argv[optind]); 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; } /* for each new cgroup */ for (i = 0; i < capacity; 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 add new cgroup: %s\n", argv[0], cgroup_strerror(ret)); goto err; } /* set uid and gid for the new cgroup based on input options */ ret = cgroup_set_uid_gid(cgroup, tuid, tgid, auid, agid); if (ret) goto err; /* add controllers to the new cgroup */ j = 0; while (cgroup_list[i]->controllers[j]) { cgc = cgroup_add_controller(cgroup, cgroup_list[i]->controllers[j]); if (!cgc) { ret = ECGINVAL; fprintf(stderr, "%s: " "controller %s can't be add\n", argv[0], cgroup_list[i]->controllers[j]); cgroup_free(&cgroup); goto err; } j++; } /* all variables set so create cgroup */ if (dirm_change | filem_change) cgroup_set_permissions(cgroup, dir_mode, file_mode, tasks_mode); ret = cgroup_create_cgroup(cgroup, 0); if (ret) { fprintf(stderr, "%s: " "can't create cgroup %s: %s\n", argv[0], cgroup->name, cgroup_strerror(ret)); cgroup_free(&cgroup); goto err; } cgroup_free(&cgroup); } err: if (cgroup_list) { for (i = 0; i < capacity; i++) { if (cgroup_list[i]) cgroup_free_group_spec(cgroup_list[i]); } free(cgroup_list); } return ret; }
/** * Tests the cgroup_compare_cgroup() api under different scenarios * @param ctl1 controller 1 to be used for testing * @param ctl2 controller 1 to be used for testing * @param the test number */ void test_cgroup_compare_cgroup(int ctl1, int ctl2, int i) { int retval; struct cntl_val_t cval; cval.val_int64 = 0; cval.val_uint64 = 0; cval.val_bool = 0; strcpy(cval.val_string, "5000"); struct cgroup *cgroup1 = NULL, *cgroup2 = NULL; struct cgroup_controller *controller = NULL; char controller_name[FILENAME_MAX], control_file[FILENAME_MAX]; char wr[SIZE], extra[] = "in cgroup_compare_cgroup"; retval = cgroup_compare_cgroup(NULL, NULL); if (retval) message(i++, PASS, "compare_cgroup()", retval, info[NULLGRP]); else message(i++, FAIL, "compare_cgroup()", retval, info[NULLGRP]); cgroup1 = cgroup_new_cgroup("testgroup"); cgroup2 = cgroup_new_cgroup("testgroup"); cgroup_set_uid_gid(cgroup1, 0, 0, 0, 0); cgroup_set_uid_gid(cgroup2, 0, 0, 0, 0); retval = set_controller(ctl1, controller_name, control_file); controller = cgroup_add_controller(cgroup1, controller_name); if (controller) { retval = add_control_value(controller, control_file, wr, STRING, cval); if (retval) message(i++, FAIL, wr, retval, extra); } controller = cgroup_add_controller(cgroup2, controller_name); if (controller) { retval = add_control_value(controller, control_file, wr, STRING, cval); if (retval) message(i++, FAIL, wr, retval, extra); } retval = cgroup_compare_cgroup(cgroup1, cgroup2); if (retval) message(i++, FAIL, "compare_cgroup()", retval, info[NOMESSAGE]); else message(i++, PASS, "compare_cgroup()", retval, info[NOMESSAGE]); /* Test the api by putting diff number of controllers in cgroups */ retval = set_controller(ctl2, controller_name, control_file); controller = cgroup_add_controller(cgroup2, controller_name); if (controller) { retval = add_control_value(controller, control_file, wr, STRING, cval); if (retval) message(i++, FAIL, wr, retval, extra); } retval = cgroup_compare_cgroup(cgroup1, cgroup2); if (retval == ECGROUPNOTEQUAL) message(i++, PASS, "compare_cgroup()", retval, info[NOMESSAGE]); else message(i++, FAIL, "compare_cgroup()", retval, info[NOMESSAGE]); cgroup_free(&cgroup1); cgroup_free(&cgroup2); }