int main(int argc, char *argv[]) { cpu_set_t *cpu_set; size_t setsize; int cmd = -1; int c; enum { EXCL_NONE, EXCL_CONFIGURE, EXCL_DECONFIGURE, EXCL_DISABLE, EXCL_DISPATCH, EXCL_ENABLE }; int excl_any = EXCL_NONE; static const struct option longopts[] = { { "configure", required_argument, 0, 'c' }, { "deconfigure",required_argument, 0, 'g' }, { "disable", required_argument, 0, 'd' }, { "dispatch", required_argument, 0, 'p' }, { "enable", required_argument, 0, 'e' }, { "help", no_argument, 0, 'h' }, { "rescan", no_argument, 0, 'r' }, { "version", no_argument, 0, 'V' }, { NULL, 0, 0, 0 } }; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); maxcpus = get_max_number_of_cpus(); if (maxcpus < 1) errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting")); if (path_exist(_PATH_SYS_CPU_ONLINE)) onlinecpus = path_cpulist(maxcpus, _PATH_SYS_CPU_ONLINE); setsize = CPU_ALLOC_SIZE(maxcpus); cpu_set = CPU_ALLOC(maxcpus); if (!cpu_set) err(EXIT_FAILURE, _("cpuset_alloc failed")); while ((c = getopt_long(argc, argv, "c:d:e:g:hp:rV", longopts, NULL)) != -1) { switch (c) { case 'c': exclusive_option(&excl_any, EXCL_CONFIGURE, EXCL_ERROR); cmd = CMD_CPU_CONFIGURE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'd': exclusive_option(&excl_any, EXCL_DISABLE, EXCL_ERROR); cmd = CMD_CPU_DISABLE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'e': exclusive_option(&excl_any, EXCL_ENABLE, EXCL_ERROR); cmd = CMD_CPU_ENABLE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'g': exclusive_option(&excl_any, EXCL_DECONFIGURE, EXCL_ERROR); cmd = CMD_CPU_DECONFIGURE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'h': usage(stdout); case 'p': exclusive_option(&excl_any, EXCL_DISPATCH, EXCL_ERROR); if (strcmp("horizontal", argv[optind - 1]) == 0) cmd = CMD_CPU_DISPATCH_HORIZONTAL; else if (strcmp("vertical", argv[optind - 1]) == 0) cmd = CMD_CPU_DISPATCH_VERTICAL; else errx(EXIT_FAILURE, _("unsupported argument: %s"), argv[optind -1 ]); break; case 'r': cmd = CMD_CPU_RESCAN; break; case 'V': printf(_("%s from %s\n"), program_invocation_short_name, PACKAGE_STRING); return EXIT_SUCCESS; default: usage(stderr); } } if ((argc == 1) || (argc != optind)) usage(stderr); switch (cmd) { case CMD_CPU_ENABLE: return cpu_enable(cpu_set, maxcpus, 1); case CMD_CPU_DISABLE: return cpu_enable(cpu_set, maxcpus, 0); case CMD_CPU_CONFIGURE: return cpu_configure(cpu_set, maxcpus, 1); case CMD_CPU_DECONFIGURE: return cpu_configure(cpu_set, maxcpus, 0); case CMD_CPU_RESCAN: return cpu_rescan(); case CMD_CPU_DISPATCH_HORIZONTAL: return cpu_set_dispatch(0); case CMD_CPU_DISPATCH_VERTICAL: return cpu_set_dispatch(1); } return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { cpu_set_t *cpu_set; size_t setsize; int cmd = -1; int c, rc; static const struct option longopts[] = { { "configure", required_argument, NULL, 'c' }, { "deconfigure",required_argument, NULL, 'g' }, { "disable", required_argument, NULL, 'd' }, { "dispatch", required_argument, NULL, 'p' }, { "enable", required_argument, NULL, 'e' }, { "help", no_argument, NULL, 'h' }, { "rescan", no_argument, NULL, 'r' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } }; static const ul_excl_t excl[] = { /* rows and cols in ASCII order */ { 'c','d','e','g','p' }, { 0 } }; int excl_st[ARRAY_SIZE(excl)] = UL_EXCL_STATUS_INIT; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); maxcpus = get_max_number_of_cpus(); if (maxcpus < 1) errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting")); if (path_exist(_PATH_SYS_CPU_ONLINE)) onlinecpus = path_read_cpulist(maxcpus, _PATH_SYS_CPU_ONLINE); setsize = CPU_ALLOC_SIZE(maxcpus); cpu_set = CPU_ALLOC(maxcpus); if (!cpu_set) err(EXIT_FAILURE, _("cpuset_alloc failed")); while ((c = getopt_long(argc, argv, "c:d:e:g:hp:rV", longopts, NULL)) != -1) { err_exclusive_options(c, longopts, excl, excl_st); switch (c) { case 'c': cmd = CMD_CPU_CONFIGURE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'd': cmd = CMD_CPU_DISABLE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'e': cmd = CMD_CPU_ENABLE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'g': cmd = CMD_CPU_DECONFIGURE; cpu_parse(argv[optind - 1], cpu_set, setsize); break; case 'h': usage(stdout); case 'p': if (strcmp("horizontal", argv[optind - 1]) == 0) cmd = CMD_CPU_DISPATCH_HORIZONTAL; else if (strcmp("vertical", argv[optind - 1]) == 0) cmd = CMD_CPU_DISPATCH_VERTICAL; else errx(EXIT_FAILURE, _("unsupported argument: %s"), argv[optind -1 ]); break; case 'r': cmd = CMD_CPU_RESCAN; break; case 'V': printf(UTIL_LINUX_VERSION); return EXIT_SUCCESS; default: errtryhelp(EXIT_FAILURE); } } if ((argc == 1) || (argc != optind)) usage(stderr); switch (cmd) { case CMD_CPU_ENABLE: rc = cpu_enable(cpu_set, maxcpus, 1); break; case CMD_CPU_DISABLE: rc = cpu_enable(cpu_set, maxcpus, 0); break; case CMD_CPU_CONFIGURE: rc = cpu_configure(cpu_set, maxcpus, 1); break; case CMD_CPU_DECONFIGURE: rc = cpu_configure(cpu_set, maxcpus, 0); break; case CMD_CPU_RESCAN: rc = cpu_rescan(); break; case CMD_CPU_DISPATCH_HORIZONTAL: rc = cpu_set_dispatch(0); break; case CMD_CPU_DISPATCH_VERTICAL: rc = cpu_set_dispatch(1); break; default: rc = -EINVAL; break; } return rc == 0 ? EXIT_SUCCESS : rc < 0 ? EXIT_FAILURE : CHCPU_EXIT_SOMEOK; }