On Tue, May 19, 2009 at 04:36:10PM +0200, Ivana Varekova wrote:
> This patch adds cgcreate tool, which creates cgroups based on input
> parameters - the syntax is:
>
> cgcreate -t <tuid>:<tgid> -a <agid>:<auid> -g <list of controllers>:<relative
> path to cgroup>
>
> where:
> -a enables user to define admin gid and uid
> -t enables user to define task gid and uid
> -g sets pairs list of controllers-relative path to cgroup
>
>
> Signed-off-by: Ivana Varekova <[email protected]>
Some comments at first glance. Looks sane, will do a more detailed
review in the daytime when I am properly awake.
> ---
>
> src/tools/Makefile.am | 4 +
> src/tools/cgcreate.c | 197
> +++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 200 insertions(+), 1 deletions(-)
> create mode 100644 src/tools/cgcreate.c
>
> diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
> index e1cace3..e3a3add 100644
> --- a/src/tools/Makefile.am
> +++ b/src/tools/Makefile.am
> @@ -1,12 +1,14 @@
> INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/include
> LDADD = $(top_srcdir)/src/.libs/libcgroup.la
>
> -bin_PROGRAMS = cgexec cgclassify
> +bin_PROGRAMS = cgexec cgclassify cgcreate
I wonder. Should this come in sbin if you are going to give absolute
path. Would it be a good idea to look at classifying it wrt the user's
cgroup? (the one where cgclassify/cgrulesengd classifies a task to)
> sbin_PROGRAMS = cgconfigparser
>
> cgexec_SOURCES = cgexec.c tools-common.c tools-common.h
>
> cgclassify_SOURCES = cgclassify.c tools-common.c tools-common.h
>
> +cgcreate_SOURCES = cgcreate.c tools-common.c tools-common.h
> +
> cgconfigparser_SOURCES = cgconfig.c
>
> diff --git a/src/tools/cgcreate.c b/src/tools/cgcreate.c
> new file mode 100644
> index 0000000..fca7cb2
> --- /dev/null
> +++ b/src/tools/cgcreate.c
> @@ -0,0 +1,197 @@
> +#include <libcgroup.h>
> +#include <libcgroup-internal.h>
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <pwd.h>
> +#include <sys/types.h>
> +#include <errno.h>
> +
> +#include "tools-common.h"
> +
> +int main(int argc, char *argv[])
> +{
> + int ret = 0;
> + int i, j;
> + char c;
> +
> + /* Structure to get GID from group name */
> + struct group *grp = NULL;
> + char *grp_string = NULL;
> +
> + /* Structure to get UID from user name */
> + struct passwd *pwd = NULL;
> + char *pwd_string = NULL;
> +
> + uid_t tuid = CGRULE_INVALID, auid = CGRULE_INVALID;
> + gid_t tgid = CGRULE_INVALID, agid = CGRULE_INVALID;
> +
> + struct cgroup_group_spec *cgroup_list[CG_HIER_MAX];
> + struct cgroup *cgroup;
> + struct cgroup_controller *cgc;
> +
> + /* no parametr on input */
> + if (argc < 2) {
> + fprintf(stderr, "Usage is %s "
> + "-t <tuid>:<tgid> -a <agid>:<auid> "
> + "-g <list of controllers>:<relative path to cgroup>\n",
> + argv[0]);
> + return -1;
> + }
> +
> + memset(cgroup_list, 0, sizeof(cgroup_list));
> + /* parse arguments */
> + while ((c = getopt(argc, argv, "a:t:g:")) > 0) {
> + switch (c) {
> + case 'a':
> + /* set admin uid/gid */
> + if (optarg[0] == ':')
> + grp_string = strtok(optarg, ":");
> + else {
> + pwd_string = strtok(optarg, ":");
> + if (pwd_string != NULL)
> + grp_string = strtok(NULL, ":");
> + }
> +
> + if (pwd_string != NULL) {
> + pwd = getpwnam(pwd_string);
> + if (pwd != NULL) {
> + auid = pwd->pw_uid;
> + } else {
> + fprintf(stderr, "cgcreate: "
> + "can't find uid of user %s.\n",
> + pwd_string);
> + return -1;
> + }
> + }
> + if (grp_string != NULL) {
> + grp = getgrnam(grp_string);
> + if (grp != NULL)
> + agid = grp->gr_gid;
> + else {
> + fprintf(stderr, "cgcreate: "
> + "can't find gid of group %s.\n",
> + grp_string);
> + return -1;
> + }
> + }
> +
> + break;
> + case 't':
> + /* set task uid/gid */
> + if (optarg[0] == ':')
> + grp_string = strtok(optarg, ":");
> + else {
> + pwd_string = strtok(optarg, ":");
> + if (pwd_string != NULL)
> + grp_string = strtok(NULL, ":");
> + }
> +
> + if (pwd_string != NULL) {
> + pwd = getpwnam(pwd_string);
> + if (pwd != NULL) {
> + tuid = pwd->pw_uid;
> + } else {
> + fprintf(stderr, "cgcreate: "
> + "can't find uid of user %s.\n",
> + pwd_string);
> + return -1;
> + }
> + }
> + if (grp_string != NULL) {
> + grp = getgrnam(grp_string);
> + if (grp != NULL)
> + tgid = grp->gr_gid;
> + else {
> + fprintf(stderr, "cgcreate: "
> + "can't find gid of group %s.\n",
> + grp_string);
> + return -1;
> + }
> + }
> + break;
> + case 'g':
> + if (parse_cgroup_spec(cgroup_list, optarg)) {
> + fprintf(stderr, "cgcreate: "
> + "cgroup controller and path"
> + "parsing failed (%s)\n", argv[optind]);
> + return -1;
> + }
> + break;
> + default:
> + fprintf(stderr, "cgcreate: "
> + "invalid command line option\n");
> + return -1;
> + break;
> + }
> + }
> +
> + /* no cgroup name */
> + if (argv[optind]) {
> + fprintf(stderr, "cgcreate: "
> + "wrong arguments (%s)\n", argv[optind]);
> + return -1;
> + }
> +
> + /* initialize libcg */
> + ret = cgroup_init();
> + if (ret) {
> + fprintf(stderr, "cgcreate: "
> + "libcgroup initialization failed: %s\n",
> + cgroup_strerror(ret));
> + return ret;
> + }
> +
> + /* for each new cgroup */
> + for (i = 0; i < CG_HIER_MAX; 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, "cgcreate: can't add new cgroup: %s\n",
> + 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, "cgcreate: "
> + "controller %s can't be add\n",
> + cgroup_list[i]->controllers[j]);
> + goto err;
argv[0] instead of cgcreate ? (I'm not sure if that is the correct
programming practice, so please take this with a grain of salt)
> + }
> + j++;
> + }
> +
> + /* no controller in given cgroup */
> + if (!cgroup->index) {
> + ret = ECGROUPNOTEXIST;
> + goto err;
> + }
> +
> + /* all variables set so create cgroup */
> + ret = cgroup_create_cgroup(cgroup, 0);
> + if (ret) {
> + fprintf(stderr, "cgcreate: "
> + "can't create cgroup %s: %s\n",
> + cgroup->name, cgroup_strerror(ret));
> + goto err;
> + }
> + }
cgroup_free() ?
> +err:
> + return ret;
> +}
>
--
regards,
Dhaval
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables
unlimited royalty-free distribution of the report engine
for externally facing server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel