blob: 88975dc2277ec4b0a5f4f691325b8f5aa01e4294 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <dirent.h>
#include <sys/types.h>
#include <pwd.h>
#include <err.h>
#include "../cpuset_lib/common.h"
#include "../cpuset_lib/bitmask.h"
#define MAX_STRING_SIZE 400
#define MAX_NBITS 1024
#define USAGE ("Usage : %s [-a|s] list1 [list2]\n" \
"\t-a|s list1 add/subtract list2." \
"[default: -a]\n" \
"\t-h Help.\n")
int add_or_subtract;
int convert;
static void usage(char *prog_name, int status)
{
fprintf(stderr, USAGE, prog_name);
exit(1);
}
static void checkopt(int argc, char **argv)
{
char c = '\0';
int optc = 0;
while ((c = getopt(argc, argv, "ahs")) != -1) {
switch (c) {
case 'a':
add_or_subtract = 0;
optc++;
break;
case 'h': /* help */
usage(argv[0], 0);
break;
case 's':
add_or_subtract = 1;
optc++;
break;
default:
usage(argv[0], 1);
break;
}
}
if (optc == 2)
OPT_COLLIDING(argv[0], 'a', 's');
if (argc == optc + 1) {
fprintf(stderr, "%s: missing the argument list1.\n",
argv[0]);
usage(argv[0], 1);
} else if (argc == optc + 2)
convert = 1;
}
int main(int argc, char **argv)
{
struct bitmask *mask1 = NULL, *mask2 = NULL, *mask3 = NULL;
char buff[MAX_STRING_SIZE];
checkopt(argc, argv);
mask1 = bitmask_alloc(MAX_NBITS);
if (mask1 == NULL)
err(EXIT_FAILURE, "alloc memory space for bitmask1 failed.");
mask2 = bitmask_alloc(MAX_NBITS);
if (mask2 == NULL)
err(EXIT_FAILURE, "alloc memory space for bitmask2 failed.");
mask3 = bitmask_alloc(MAX_NBITS);
if (mask3 == NULL)
err(EXIT_FAILURE, "alloc memory space for bitmask3 failed.");
if (bitmask_parselist(argv[argc - 2 + convert], mask1) != 0)
err(EXIT_FAILURE, "parse list1 string failed.");
if (convert) {
bitmask_displaylist(buff, MAX_STRING_SIZE, mask1);
printf("%s\n", buff);
exit(0);
}
if (bitmask_parselist(argv[argc - 1], mask2) != 0)
err(EXIT_FAILURE, "parse list2 string failed.");
if (add_or_subtract)
bitmask_andnot(mask3, mask1, mask2);
else
bitmask_or(mask3, mask1, mask2);
bitmask_displaylist(buff, MAX_STRING_SIZE, mask3);
printf("%s\n", buff);
return 0;
}