[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH]xenstore-chmod: handle arbitrary number of perms rather than MAX_PERMS constant



On Fri, 2012-11-16 at 06:02 +0000, Chunyan Liu wrote:
> Constant MAX_PERMS 16 is too small to use in some occasions, e.g. if
> there are more than 16 domU(s) on one hypervisor (it's easy to
> achieve) and one wants to do xenstore-chmod PATH to all domU(s). So,
> remove MAX_PERMS limitation and make it as arbitrary number of perms.
> 
> Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx>
> 
> diff -r 8b93ac0c93f3 tools/xenstore/xenstore_client.c
> --- a/tools/xenstore/xenstore_client.c  Tue Nov 13 11:19:17 2012 +0000
> +++ b/tools/xenstore/xenstore_client.c  Thu Nov 15 16:33:32 2012 +0800
> @@ -25,7 +25,6 @@
>  #define PATH_SEP '/'
>  #define MAX_PATH_LEN 256
> 
> -#define MAX_PERMS 16
> 
>  enum mode {
>      MODE_unknown,
> @@ -416,31 +415,31 @@ perform(enum mode mode, int optind, int
>             break;
>          }
>          case MODE_chmod: {
> -            struct xs_permissions perms[MAX_PERMS];
> -            int nperms = 0;
> +            struct xs_permissions *perms;
>              /* save path pointer: */
>              char *path = argv[optind++];
> +            int nperms = argc - optind;
> +            int i;
> +            perms = (struct xs_permissions *)malloc(nperms *
> sizeof(struct xs_permissions));

You could just do:
                struct xs_permissions perms[nperms];
and let the compiler allocate enough space on the stack.

> +            if (!perms)
> +               err(1, NULL);
> -            for (; argv[optind]; optind++, nperms++)
> +            for (i = 0; argv[optind]; optind++, i++)
>              {
> -                if (MAX_PERMS <= nperms)
> -                    errx(1, "Too many permissions specified.  "
> -                        "Maximum per invocation is %d.", MAX_PERMS);
> -
> -                perms[nperms].id = atoi(argv[optind]+1);
> +                perms[i].id = atoi(argv[optind]+1);
> 
>                  switch (argv[optind][0])
>                  {
>                  case 'n':
> -                    perms[nperms].perms = XS_PERM_NONE;
> +                    perms[i].perms = XS_PERM_NONE;
>                      break;
>                  case 'r':
> -                    perms[nperms].perms = XS_PERM_READ;
> +                    perms[i].perms = XS_PERM_READ;
>                      break;
>                  case 'w':
> -                    perms[nperms].perms = XS_PERM_WRITE;
> +                    perms[i].perms = XS_PERM_WRITE;
>                      break;
>                  case 'b':
> -                    perms[nperms].perms = XS_PERM_READ | XS_PERM_WRITE;
> +                    perms[i].perms = XS_PERM_READ | XS_PERM_WRITE;
>                      break;
>                  default:
>                      errx(1, "Invalid permission specification: '%c'",
> @@ -449,6 +448,7 @@ perform(enum mode mode, int optind, int
>              }
> 
>              do_chmod(path, perms, nperms, upto, recurse, xsh, xth);
> +            free(perms);
>              break;
>          }
>          case MODE_watch: {
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.