1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <signal.h> 6 #include <dirent.h> 7 #include <sys/types.h> 8 #include <pwd.h> 9 #include <err.h> 10 11 #include "../cpuset_lib/common.h" 12 #include "../cpuset_lib/bitmask.h" 13 14 #define MAX_STRING_SIZE 400 15 #define MAX_NBITS 1024 16 17 #define USAGE ("Usage : %s [-a|s] list1 [list2]\n" \ 18 "\t-a|s list1 add/subtract list2." \ 19 "[default: -a]\n" \ 20 "\t-h Help.\n") 21 int add_or_subtract; 22 int convert; 23 24 static void usage(char *prog_name, int status) 25 { 26 fprintf(stderr, USAGE, prog_name); 27 exit(1); 28 } 29 30 static void checkopt(int argc, char **argv) 31 { 32 char c = '\0'; 33 int optc = 0; 34 35 while ((c = getopt(argc, argv, "ahs")) != -1) { 36 switch (c) { 37 case 'a': 38 add_or_subtract = 0; 39 optc++; 40 break; 41 case 'h': /* help */ 42 usage(argv[0], 0); 43 break; 44 case 's': 45 add_or_subtract = 1; 46 optc++; 47 break; 48 default: 49 usage(argv[0], 1); 50 break; 51 } 52 } 53 54 if (optc == 2) 55 OPT_COLLIDING(argv[0], 'a', 's'); 56 57 if (argc == optc + 1) { 58 fprintf(stderr, "%s: missing the argument list1.\n", argv[0]); 59 usage(argv[0], 1); 60 } else if (argc == optc + 2) 61 convert = 1; 62 } 63 64 int main(int argc, char **argv) 65 { 66 struct bitmask *mask1 = NULL, *mask2 = NULL, *mask3 = NULL; 67 char buff[MAX_STRING_SIZE]; 68 69 checkopt(argc, argv); 70 71 mask1 = bitmask_alloc(MAX_NBITS); 72 if (mask1 == NULL) 73 err(EXIT_FAILURE, "alloc memory space for bitmask1 failed."); 74 75 mask2 = bitmask_alloc(MAX_NBITS); 76 if (mask2 == NULL) 77 err(EXIT_FAILURE, "alloc memory space for bitmask2 failed."); 78 79 mask3 = bitmask_alloc(MAX_NBITS); 80 if (mask3 == NULL) 81 err(EXIT_FAILURE, "alloc memory space for bitmask3 failed."); 82 83 if (bitmask_parselist(argv[argc - 2 + convert], mask1) != 0) 84 err(EXIT_FAILURE, "parse list1 string failed."); 85 86 if (convert) { 87 bitmask_displaylist(buff, MAX_STRING_SIZE, mask1); 88 printf("%s\n", buff); 89 exit(0); 90 } 91 92 if (bitmask_parselist(argv[argc - 1], mask2) != 0) 93 err(EXIT_FAILURE, "parse list2 string failed."); 94 95 if (add_or_subtract) 96 bitmask_andnot(mask3, mask1, mask2); 97 else 98 bitmask_or(mask3, mask1, mask2); 99 100 bitmask_displaylist(buff, MAX_STRING_SIZE, mask3); 101 printf("%s\n", buff); 102 103 return 0; 104 } 105