From 628cab7cde49bfb0387a51d5390d65921d7c3dc4 Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Sat, 12 Jan 2008 22:35:50 -0700 Subject: [PATCH] renice: detect errors in arguments, add -v, -h and long options * renice was using atoi(), which does no error detection, meaning that: "renice +20 blah" was accepted as valid. * add -h | --help * add -v | --version * add long options for -p, -u and -g * cleanup coding style Addresses-Debian-Bug: #385245 Co-Author: Karel Zak Signed-off-by: LaMont Jones Signed-off-by: Karel Zak --- sys-utils/renice.1 | 12 ++++++-- sys-utils/renice.c | 69 ++++++++++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/sys-utils/renice.1 b/sys-utils/renice.1 index 06462e8e..3c20d6eb 100644 --- a/sys-utils/renice.1 +++ b/sys-utils/renice.1 @@ -52,6 +52,8 @@ .Op Fl u .Ar user ... .Oc +.Nm renice +.Ad Fl h | Fl v .Sh DESCRIPTION .Nm Renice alters the @@ -72,18 +74,22 @@ their process ID's. Options supported by .Nm renice : .Bl -tag -width Ds -.It Fl g +.It Fl g, Fl Fl pgrp Force .Ar who parameters to be interpreted as process group ID's. -.It Fl u +.It Fl u, Fl Fl user Force the .Ar who parameters to be interpreted as user names. -.It Fl p +.It Fl p, Fl Fl pid Resets the .Ar who interpretation to be (the default) process ID's. +.It Fl v, Fl Fl version +Print version. +.It Fl h, Fl Fl help +Print help. .El .Pp For example, diff --git a/sys-utils/renice.c b/sys-utils/renice.c index 2807ae3b..ac05d258 100644 --- a/sys-utils/renice.c +++ b/sys-utils/renice.c @@ -48,6 +48,17 @@ int donice(int,int,int); +void usage(int rc) +{ + printf( _("\nUsage:\n" + " renice priority [-p|--pid] pid [... pid]\n" + " renice priority -g|--pgrp pgrp [... pgrp]\n" + " renice priority -u|--user user [... user]\n" + " renice -h | --help\n" + " renice -v | --version\n\n")); + + exit(rc); +} /* * Change the priority (nice) of processes * or groups of processes which are already @@ -58,41 +69,53 @@ main(int argc, char **argv) { int which = PRIO_PROCESS; int who = 0, prio, errs = 0; + char *endptr = NULL; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - argc--, argv++; - if (argc < 2) { - fprintf(stderr, _("usage: renice priority [ [ -p ] pids ] " - "[ [ -g ] pgrps ] [ [ -u ] users ]\n")); - exit(1); + argc--; + argv++; + + if (argc == 1) { + if (strcmp(*argv, "-h") == 0 || + strcmp(*argv, "--help") == 0) + usage(EXIT_SUCCESS); + + if (strcmp(*argv, "-v") == 0 || + strcmp(*argv, "--version") == 0) { + printf(_("renice from %s\n"), PACKAGE_STRING); + exit(EXIT_SUCCESS); + } } - prio = atoi(*argv); - argc--, argv++; -#if 0 - if (prio > PRIO_MAX) - prio = PRIO_MAX; - if (prio < PRIO_MIN) - prio = PRIO_MIN; -#endif + + if (argc < 2) + usage(EXIT_FAILURE); + + prio = strtol(*argv, &endptr, 10); + if (*endptr) + usage(EXIT_FAILURE); + + argc--; + argv++; + for (; argc > 0; argc--, argv++) { - if (strcmp(*argv, "-g") == 0) { + if (strcmp(*argv, "-g") == 0 || strcmp(*argv, "--pgrp") == 0) { which = PRIO_PGRP; continue; } - if (strcmp(*argv, "-u") == 0) { + if (strcmp(*argv, "-u") == 0 || strcmp(*argv, "--user") == 0) { which = PRIO_USER; continue; } - if (strcmp(*argv, "-p") == 0) { + if (strcmp(*argv, "-p") == 0 || strcmp(*argv, "--pid") == 0) { which = PRIO_PROCESS; continue; } if (which == PRIO_USER) { register struct passwd *pwd = getpwnam(*argv); - + if (pwd == NULL) { fprintf(stderr, _("renice: %s: unknown user\n"), *argv); @@ -100,8 +123,8 @@ main(int argc, char **argv) } who = pwd->pw_uid; } else { - who = atoi(*argv); - if (who < 0) { + who = strtol(*argv, &endptr, 10); + if (who < 0 || *endptr) { fprintf(stderr, _("renice: %s: bad value\n"), *argv); continue; @@ -109,7 +132,7 @@ main(int argc, char **argv) } errs += donice(which, who, prio); } - return (errs != 0); + return errs != 0 ? EXIT_FAILURE : EXIT_SUCCESS; } int @@ -121,19 +144,19 @@ donice(int which, int who, int prio) { if (oldprio == -1 && errno) { fprintf(stderr, "renice: %d: ", who); perror(_("getpriority")); - return (1); + return 1; } if (setpriority(which, who, prio) < 0) { fprintf(stderr, "renice: %d: ", who); perror(_("setpriority")); - return (1); + return 1; } errno = 0; newprio = getpriority(which, who); if (newprio == -1 && errno) { fprintf(stderr, "renice: %d: ", who); perror(_("getpriority")); - return (1); + return 1; } printf(_("%d: old priority %d, new priority %d\n"), -- 2.39.5