Changeset 2694

Show
Ignore:
Timestamp:
03/01/08 02:07:49 (9 months ago)
Author:
dhozac
Message:

Factor out bitfield-to-string code to src/attribute-util.h.
Add --get for nattribute too.

Files:

Legend:

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

    r2585 r2694  
    2323 
    2424#include "util.h" 
     25#include "attribute-util.h" 
    2526#include <lib/vserver.h> 
    2627 
     
    4142#define CMD_FLAG                0x2003 
    4243#define CMD_SECURE              0x2004 
     44#define CMD_GET                 0x2005 
    4345 
    4446int                     wrapper_exit_code = 1; 
     
    5355  { "flag",       required_argument, 0, CMD_FLAG }, 
    5456  { "secure",     no_argument,       0, CMD_SECURE }, 
     57  { "get",        no_argument,       0, CMD_GET }, 
    5558  {0,0,0,0} 
    5659}; 
    5760 
    5861struct Arguments { 
     62    int                 mode; 
    5963    nid_t               nid; 
    60     struct vc_net_flags flags; 
    61     struct vc_net_caps  caps; 
     64    struct vc_net_flags        flags; 
     65    struct vc_net_caps caps; 
    6266}; 
    6367 
     
    6872  WRITE_STR(fd, cmd); 
    6973  WRITE_MSG(fd, 
    70             " --set [--nid <nid>] [--ncap [~!]<ncap>] [--flag [~!]<flag>] [--secure] -- [<program> <args>*]\n" 
     74            " {--set|--get} [--nid <nid>] [--ncap [~!]<ncap>] [--flag [~!]<flag>] [--secure] --\n" 
     75            "    [<program> <args>*]\n" 
    7176            "\n" 
    7277            " --ncap <cap>   ...  network capability to be added\n" 
     
    8287{ 
    8388  WRITE_MSG(1, 
    84             "nattribute " VERSION " -- sets attributes of network contexts\n" 
     89            "nattribute " VERSION " -- sets/gets attributes of network contexts\n" 
    8590            "This program is part of " PACKAGE_STRING "\n\n" 
    8691            "Copyright (C) 2004 Enrico Scholz\n" 
     
    134139} 
    135140 
     141static int 
     142printAttrs(struct Arguments *args) 
     143{ 
     144  struct vc_net_flags flags; 
     145  struct vc_net_caps  caps; 
     146 
     147  Evc_get_nflags(args->nid, &flags); 
     148  Evc_get_ncaps(args->nid, &caps); 
     149 
     150  print_bitfield(1, ncap, "ncapabilities", &caps.ncaps); 
     151  print_bitfield(1, nflag, "nflags", &flags.flagword); 
     152 
     153  return 0; 
     154} 
     155 
    136156int main(int argc, char *argv[]) 
    137157{ 
    138158  struct Arguments              args = { 
     159    .mode  = CMD_SET, 
    139160    .nid   = VC_NOCTX, 
    140161    .flags = { .flagword = 0, .mask = 0 }, 
     
    149170      case CMD_HELP     :  showHelp(1, argv[0], 0); 
    150171      case CMD_VERSION  :  showVersion(); 
    151       case CMD_SET      :  break; // default op currently 
     172      case CMD_SET      :  args.mode = CMD_SET;                    break; 
     173      case CMD_GET      :  args.mode = CMD_GET;                    break; 
    152174      case CMD_NID      :  args.nid = Evc_nidopt2nid(optarg,true); break; 
    153175      case CMD_FLAG     :  parseFlags(optarg, &args.flags);        break; 
     
    165187  if (args.nid==VC_NOCTX) args.nid = Evc_get_task_nid(0); 
    166188 
    167   if (args.caps.cmask && 
    168       vc_set_ncaps(args.nid, &args.caps)==-1) 
    169     perror(ENSC_WRAPPERS_PREFIX "vc_set_ncaps()"); 
    170   else if (args.flags.mask && 
    171            vc_set_nflags(args.nid, &args.flags)==-1) 
    172     perror(ENSC_WRAPPERS_PREFIX "vc_set_nflags()"); 
    173   else if (optind<argc) 
    174     EexecvpD(argv[optind], argv+optind); 
    175   else 
    176     return EXIT_SUCCESS; 
     189  if (args.mode == CMD_SET) { 
     190    if (args.caps.cmask && 
     191        vc_set_ncaps(args.nid, &args.caps)==-1) 
     192      perror(ENSC_WRAPPERS_PREFIX "vc_set_ncaps()"); 
     193    else if (args.flags.mask && 
     194             vc_set_nflags(args.nid, &args.flags)==-1) 
     195      perror(ENSC_WRAPPERS_PREFIX "vc_set_nflags()"); 
     196    else if (optind<argc) 
     197      EexecvpD(argv[optind], argv+optind); 
     198    else 
     199      return EXIT_SUCCESS; 
     200  } 
     201  else if (args.mode == CMD_GET) { 
     202    printAttrs(&args); 
     203    if (optind<argc) 
     204      EexecvpD(argv[optind], argv+optind); 
     205    else 
     206      return EXIT_SUCCESS; 
     207  } 
    177208 
    178209  return EXIT_FAILURE; 
  • trunk/src/vattribute.c

    r2652 r2694  
    2222 
    2323#include "util.h" 
     24#include "attribute-util.h" 
    2425#include <lib/vserver.h> 
    2526 
     
    157158} 
    158159 
    159 static inline int 
    160 ffsull(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  
    172160static int 
    173161printAttrs(struct Arguments *args) 
     
    180168  Evc_get_ccaps(args->xid, &caps); 
    181169 
    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); 
     170  print_bitfield(1, bcap, "bcapabilities", &caps.bcaps); 
     171  print_bitfield(1, ccap, "ccapabilities", &caps.ccaps); 
     172  print_bitfield(1, cflag, "flags", &flags.flagword); 
    213173 
    214174  return 0;