]> err.no Git - util-linux/commitdiff
renice: detect errors in arguments, add -v, -h and long options
authorLaMont Jones <lamont@debian.org>
Sun, 13 Jan 2008 05:35:50 +0000 (22:35 -0700)
committerKarel Zak <kzak@redhat.com>
Tue, 29 Jan 2008 14:31:47 +0000 (15:31 +0100)
 * 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 <kzak@redhat.com>
Signed-off-by: LaMont Jones <lamont@debian.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/renice.1
sys-utils/renice.c

index 06462e8ee2fd11fe7380071083fd395a8974ca00..3c20d6eb6423d943ef753869cf4397279d185afb 100644 (file)
@@ -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,
index 2807ae3bcb17269348339ea40c665e89856e0f86..ac05d2587bcf1e2124ae21839f0a229097b09de0 100644 (file)
 
 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"),