[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



2012/11/19 Ian Campbell <Ian.Campbell@xxxxxxxxxx>:
> 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.
Will update.

>> +            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
>
>
>
> _______________________________________________>
>> +            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
>


> 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®.