/* * simple taskset -> cpuset converter */ #include #include #include #include #include #include #include #include #include #include void usage() { printf("Usage: taskset mask cmd [args...]\n"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int query[2]; int numcpu = 0; size_t length = sizeof(numcpu); int i; long mask; char *endptr; /* fixed buffers -> buffer overflow */ char csarg[255] = "-l"; char buf[10]; if (argc < 3) usage(); query[0] = CTL_HW; query[1] = HW_NCPU; if (sysctl(query, 2, &numcpu, &length, NULL, 0) == -1) { printf("Unable to query cpus: %s\n", strerror(errno)); return EXIT_FAILURE; } mask = strtol(argv[1], &endptr, 16); if ((errno == ERANGE && (mask == LONG_MAX || mask == LONG_MIN)) || (errno != 0 && mask == 0)) { printf("Invalid mask value\n"); exit(EXIT_FAILURE); } if (*endptr != '\0' || mask < 0) { printf("Invalid mask value. Only positive numbers allowed.\n"); exit(EXIT_FAILURE); } if (mask == 0) { printf("Mask value 0 not allowed.\n"); exit(EXIT_FAILURE); } for(i = 0; i < numcpu; ++i) { long cpuval = pow(2, i); if (mask & cpuval) { sprintf(buf, "%d,", i); strcat(csarg, buf); } } argv[0] = "cpuset"; argv[1] = csarg; return execvp(argv[0], argv); }