diff options
Diffstat (limited to 'schedutils/ionice.c')
-rw-r--r-- | schedutils/ionice.c | 70 |
1 files changed, 48 insertions, 22 deletions
diff --git a/schedutils/ionice.c b/schedutils/ionice.c index 50616dfc6..a3edf5512 100644 --- a/schedutils/ionice.c +++ b/schedutils/ionice.c @@ -68,9 +68,9 @@ static int parse_ioclass(const char *str) return -1; } -static void ioprio_print(int pid) +static void ioprio_print(int pid, int who) { - int ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid); + int ioprio = ioprio_get(who, pid); if (ioprio == -1) err(EXIT_FAILURE, _("ioprio_get failed")); @@ -89,9 +89,9 @@ static void ioprio_print(int pid) } } -static void ioprio_setpid(pid_t pid, int ioclass, int data) +static void ioprio_setid(int which, int ioclass, int data, int who) { - int rc = ioprio_set(IOPRIO_WHO_PROCESS, pid, + int rc = ioprio_set(who, which, IOPRIO_PRIO_VALUE(ioclass, data)); if (rc == -1 && !tolerant) @@ -106,6 +106,8 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) "\n" "Usage:\n" " %1$s [OPTION] -p PID [PID...]\n" + " %1$s [OPTION] -P PGID [PGID...]\n" + " %1$s [OPTION] -u UID [UID...]\n" " %1$s [OPTION] COMMAND\n" "\n" "Options:\n" @@ -113,8 +115,10 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) " 0: none, 1: realtime, 2: best-effort, 3: idle\n" " -n, --classdata <num> scheduling class data\n" " 0-7 for realtime and best-effort classes\n" - " -p, --pid=PID view or modify already running process\n" + " -p, --pid <pid> view or modify already running process\n" + " -P, --pgid <pgrp> view or modify already running process group\n" " -t, --ignore ignore failures\n" + " -u, --uid <uid> view or modify already running processes owned by a user\n" " -V, --version output version information and exit\n" " -h, --help display this help and exit\n\n"), program_invocation_short_name); @@ -125,7 +129,8 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) int main(int argc, char **argv) { int data = 4, set = 0, ioclass = IOPRIO_CLASS_BE, c; - pid_t pid = 0; + int which = 0, who = 0; + const char *invalid_msg = NULL; static const struct option longopts[] = { { "classdata", required_argument, NULL, 'n' }, @@ -133,6 +138,8 @@ int main(int argc, char **argv) { "help", no_argument, NULL, 'h' }, { "ignore", no_argument, NULL, 't' }, { "pid", required_argument, NULL, 'p' }, + { "pgid", required_argument, NULL, 'P' }, + { "uid", required_argument, NULL, 'u' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } }; @@ -142,7 +149,7 @@ int main(int argc, char **argv) textdomain(PACKAGE); atexit(close_stdout); - while ((c = getopt_long(argc, argv, "+n:c:p:tVh", longopts, NULL)) != EOF) + while ((c = getopt_long(argc, argv, "+n:c:p:P:u:tVh", longopts, NULL)) != EOF) switch (c) { case 'n': data = strtos32_or_err(optarg, _("invalid class data argument")); @@ -162,7 +169,27 @@ int main(int argc, char **argv) set |= 2; break; case 'p': - pid = strtos32_or_err(optarg, _("invalid PID argument")); + if (who) + errx(EXIT_FAILURE, + _("can handle one of pid, pgid or uid at once")); + invalid_msg = _("invalid PID argument"); + which = strtos32_or_err(optarg, invalid_msg); + who = IOPRIO_WHO_PROCESS; + break; + case 'P': + if (who) + errx(EXIT_FAILURE, + _("can handle one of pid, pgid or uid at once")); + invalid_msg = _("invalid PGID argument"); + which = strtos32_or_err(optarg, invalid_msg); + who = IOPRIO_WHO_PGRP; + break; + case 'u': + if (who) + errx(EXIT_FAILURE, + _("can handle one of pid, pgid or uid at once")); + which = strtos32_or_err(optarg, invalid_msg); + who = IOPRIO_WHO_USER; break; case 't': tolerant = 1; @@ -197,37 +224,36 @@ int main(int argc, char **argv) break; } - if (!set && !pid && optind == argc) + if (!set && !which && optind == argc) /* * ionice without options, print the current ioprio */ - ioprio_print(0); - - else if (!set && pid) { + ioprio_print(0, IOPRIO_WHO_PROCESS); + else if (!set && who) { /* - * ionice -p PID [PID ...] + * ionice -p|-P|-u ID [ID ...] */ - ioprio_print(pid); + ioprio_print(which, who); for(; argv[optind]; ++optind) { - pid = strtos32_or_err(argv[optind], _("invalid PID argument")); - ioprio_print(pid); + which = strtos32_or_err(argv[optind], invalid_msg); + ioprio_print(which, who); } - } else if (set && pid) { + } else if (set && who) { /* - * ionice -c CLASS -p PID [PID ...] + * ionice -c CLASS -p|-P|-u ID [ID ...] */ - ioprio_setpid(pid, ioclass, data); + ioprio_setid(which, ioclass, data, who); for(; argv[optind]; ++optind) { - pid = strtos32_or_err(argv[optind], _("invalid PID argument")); - ioprio_setpid(pid, ioclass, data); + which = strtos32_or_err(argv[optind], invalid_msg); + ioprio_setid(which, ioclass, data, who); } } else if (argv[optind]) { /* * ionice [-c CLASS] COMMAND */ - ioprio_setpid(0, ioclass, data); + ioprio_setid(0, ioclass, data, IOPRIO_WHO_PROCESS); execvp(argv[optind], &argv[optind]); err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]); } else |