Changeset 2652

Show
Ignore:
Timestamp:
01/04/08 18:42:00 (1 year ago)
Author:
dhozac
Message:

Add --get.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/vattribute.c

    r2403 r2652  
    4141#define CMD_SECURE              0x2004 
    4242#define CMD_BCAP                0x2005 
     43#define CMD_GET                 0x2006 
    4344 
    4445int                     wrapper_exit_code = 1; 
     
    5051  { "xid",        required_argument, 0, CMD_XID }, 
    5152  { "set",        no_argument,       0, CMD_SET }, 
     53  { "get",        no_argument,       0, CMD_GET }, 
    5254  { "ccap",       required_argument, 0, CMD_CCAP }, 
    5355  { "bcap",       required_argument, 0, CMD_BCAP }, 
     
    6163    struct vc_ctx_flags flags; 
    6264    struct vc_ctx_caps  caps; 
     65    int                 mode; 
    6366}; 
    6467 
     
    6972  WRITE_STR(fd, cmd); 
    7073  WRITE_MSG(fd, 
    71             " --set [--xid <xid>] [--bcap [~!]<cap>] [--ccap [~!]<cap>] [--flag [~!]<flag>] [--secure] -- [<program> <args>*]\n" 
     74            " [--xid <xid>] {--get|--set [--bcap [~!]<cap>] [--ccap [~!]<cap>]\n" 
     75            "    [--flag [~!]<flag>] [--secure]} -- [<program> <args>*]\n" 
    7276            "\n" 
    73             " --bcap <cap>   ...  system  capability to be added\n" 
    74             " --cap  <cap>   ...  context capability to be added\n" 
     77            " --bcap <cap>   ...  system  capability to be set\n" 
     78            " --ccap <cap>   ...  context capability to be set\n" 
     79            " --flag <flag>  ...  context flag to be set\n" 
    7580            "\n" 
    7681            "Please report bugs to " PACKAGE_BUGREPORT "\n"); 
     
    8388{ 
    8489  WRITE_MSG(1, 
    85             "vattribute " VERSION " -- sets attributes of vservers\n" 
     90            "vattribute " VERSION " -- sets/gets attributes of vservers\n" 
    8691            "This program is part of " PACKAGE_STRING "\n\n" 
    8792            "Copyright (C) 2004 Enrico Scholz\n" 
     
    152157} 
    153158 
     159static inline int 
     160ffsull(unsigned long long word) 
     161{ 
     162  int bit; 
     163  for (bit = 0; bit < 64; bit++) { 
     164    if (word & (1ULL << bit)) 
     165      break; 
     166  } 
     167  if (bit == 64) 
     168    bit = 0; 
     169  return bit; 
     170} 
     171 
     172static int 
     173printAttrs(struct Arguments *args) 
     174{ 
     175  struct vc_ctx_flags flags; 
     176  struct vc_ctx_caps caps; 
     177  int first; 
     178 
     179  Evc_get_cflags(args->xid, &flags); 
     180  Evc_get_ccaps(args->xid, &caps); 
     181 
     182#define PRINT_VALUES(type, name, var)   \ 
     183  WRITE_MSG(1, name ":\n");             \ 
     184  first = 1;                            \ 
     185  while (1) {                           \ 
     186    char const *i;                      \ 
     187    i = vc_lo ## type ## 2text(var);    \ 
     188    if (!i)                             \ 
     189      break;                            \ 
     190    if (!first)                         \ 
     191      WRITE_MSG(1, ",");                \ 
     192    else                                \ 
     193      first = 0;                        \ 
     194    WRITE_STR(1, i);                    \ 
     195  }                                     \ 
     196  while (*(var)) {                      \ 
     197    int bit = ffsull(*(var));           \ 
     198    if (!bit)                           \ 
     199      break;                            \ 
     200    if (!first)                         \ 
     201      WRITE_MSG(1, ",");                \ 
     202    else                                \ 
     203      first = 0;                        \ 
     204    WRITE_MSG(1, "^");                  \ 
     205    WRITE_INT(1, bit);                  \ 
     206    *(var) &= ~(1ULL << bit);           \ 
     207  }                                     \ 
     208  WRITE_MSG(1, "\n"); 
     209 
     210  PRINT_VALUES(bcap, "bcapabilities", &caps.bcaps); 
     211  PRINT_VALUES(ccap, "ccapabilities", &caps.ccaps); 
     212  PRINT_VALUES(cflag, "flags", &flags.flagword); 
     213 
     214  return 0; 
     215} 
     216 
    154217int main(int argc, char *argv[]) 
    155218{ 
     
    158221    .flags = { .flagword = 0, .mask = 0 }, 
    159222    .caps  = { .bcaps = 0, .bmask = 0,.ccaps = 0, .cmask = 0 }, 
     223    .mode  = CMD_SET, 
    160224  }; 
    161    
     225 
    162226  while (1) { 
    163227    int         c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); 
     
    167231      case CMD_HELP     :  showHelp(1, argv[0], 0); 
    168232      case CMD_VERSION  :  showVersion(); 
    169       case CMD_SET      :  break; // default op currently 
     233      case CMD_SET      :  args.mode = CMD_SET;                    break; 
     234      case CMD_GET      :  args.mode = CMD_GET;                    break; 
    170235      case CMD_XID      :  args.xid = Evc_xidopt2xid(optarg,true); break; 
    171236      case CMD_FLAG     :  parseFlags(optarg, &args.flags);        break; 
     
    184249  if (args.xid==VC_NOCTX) args.xid = Evc_get_task_xid(0); 
    185250 
    186   if ((args.caps.cmask || args.caps.bmask) && 
    187       vc_set_ccaps(args.xid, &args.caps)==-1) 
    188     perror(ENSC_WRAPPERS_PREFIX "vc_set_ccaps()"); 
    189   else if (args.flags.mask && 
    190            vc_set_cflags(args.xid, &args.flags)==-1) 
    191     perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()"); 
    192   else if (optind<argc) 
    193     EexecvpD(argv[optind], argv+optind); 
    194   else 
    195     return EXIT_SUCCESS; 
     251  if (args.mode == CMD_SET) { 
     252    if ((args.caps.cmask || args.caps.bmask) && 
     253        vc_set_ccaps(args.xid, &args.caps)==-1) 
     254      perror(ENSC_WRAPPERS_PREFIX "vc_set_ccaps()"); 
     255    else if (args.flags.mask && 
     256             vc_set_cflags(args.xid, &args.flags)==-1) 
     257      perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()"); 
     258    else if (optind<argc) 
     259      EexecvpD(argv[optind], argv+optind); 
     260    else 
     261      return EXIT_SUCCESS; 
     262  } 
     263  else if (args.mode == CMD_GET) { 
     264    printAttrs(&args); 
     265    if (optind<argc) 
     266      EexecvpD(argv[optind], argv+optind); 
     267    else 
     268      return EXIT_SUCCESS; 
     269  } 
    196270 
    197271  return EXIT_FAILURE;