Changeset 2652
- Timestamp:
- 01/04/08 18:42:00 (1 year ago)
- Files:
-
- trunk/src/vattribute.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/vattribute.c
r2403 r2652 41 41 #define CMD_SECURE 0x2004 42 42 #define CMD_BCAP 0x2005 43 #define CMD_GET 0x2006 43 44 44 45 int wrapper_exit_code = 1; … … 50 51 { "xid", required_argument, 0, CMD_XID }, 51 52 { "set", no_argument, 0, CMD_SET }, 53 { "get", no_argument, 0, CMD_GET }, 52 54 { "ccap", required_argument, 0, CMD_CCAP }, 53 55 { "bcap", required_argument, 0, CMD_BCAP }, … … 61 63 struct vc_ctx_flags flags; 62 64 struct vc_ctx_caps caps; 65 int mode; 63 66 }; 64 67 … … 69 72 WRITE_STR(fd, cmd); 70 73 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" 72 76 "\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" 75 80 "\n" 76 81 "Please report bugs to " PACKAGE_BUGREPORT "\n"); … … 83 88 { 84 89 WRITE_MSG(1, 85 "vattribute " VERSION " -- sets attributes of vservers\n"90 "vattribute " VERSION " -- sets/gets attributes of vservers\n" 86 91 "This program is part of " PACKAGE_STRING "\n\n" 87 92 "Copyright (C) 2004 Enrico Scholz\n" … … 152 157 } 153 158 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 172 static int 173 printAttrs(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 154 217 int main(int argc, char *argv[]) 155 218 { … … 158 221 .flags = { .flagword = 0, .mask = 0 }, 159 222 .caps = { .bcaps = 0, .bmask = 0,.ccaps = 0, .cmask = 0 }, 223 .mode = CMD_SET, 160 224 }; 161 225 162 226 while (1) { 163 227 int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); … … 167 231 case CMD_HELP : showHelp(1, argv[0], 0); 168 232 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; 170 235 case CMD_XID : args.xid = Evc_xidopt2xid(optarg,true); break; 171 236 case CMD_FLAG : parseFlags(optarg, &args.flags); break; … … 184 249 if (args.xid==VC_NOCTX) args.xid = Evc_get_task_xid(0); 185 250 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 } 196 270 197 271 return EXIT_FAILURE;
