#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define _GNU_SOURCE
#include <sched.h>

main(int argc, char **argv) {
	unsigned long mask;
	int cpu, pid;
	cpu_set_t cpu_set;

	--argc; ++argv;

	mask = 0; pid = 0;
	while (argc && **argv == '-') {
		if (!strcmp(*argv, "-m")) {
			mask = atol(*++argv);
			argc--;
		}
		if (!strcmp(*argv, "-p")) {
			pid = atol(*++argv);
			argc--;
		}
		argc--;
		argv++;
	}
	
	if (argc < 1 && !pid) {
		printf("usage: cpuexec [ -m cpumask ] cmd <args> ...}\n"
		       "       cpuexec [ -m cpumask ] -p pid\n"
		       "  cpumask is a bitfield of CPUs the task will be runnable on.\n");
		exit(1);
	}

#if 0
	cpu = 0;
	CPU_ZERO(&cpu_set);
	while (mask) {
		if (mask & 1)
			CPU_SET(cpu, &cpu_set);
		mask >>= 1;
		cpu++;
	}
	//sched_setaffinity(0, sizeof(cpu_set), &cpu_set) == -1);
#else
	memcpy(&cpu_set, &mask, sizeof(mask));
#endif

	if (mask &&
	    sched_setaffinity(pid, sizeof(unsigned long), (void*)&mask) == -1) {
		perror("Warning: cannot set affinity");
	}

	if (!pid) {
		execvp(*argv, argv);
		perror("execve");
		exit(1);
	}
	return 0;
}

