On Sat, Jan 12, 2008 at 10:35:50PM -0700, LaMont Jones wrote:
> renice was using atoi(), which does no error detection, meaning that:
> "renice +20 blah" was accepted as valid.
> 
> Addresses-Debian-Bug: 385245
> Signed-off-by: LaMont Jones <[EMAIL PROTECTED]>
> ---
>  sys-utils/renice.c |   20 ++++++++++++++------
>  1 files changed, 14 insertions(+), 6 deletions(-)

 Applied with few changes, thanks.

    Karel

>From 628cab7cde49bfb0387a51d5390d65921d7c3dc4 Mon Sep 17 00:00:00 2001
From: LaMont Jones <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
Signed-off-by: LaMont Jones <[EMAIL PROTECTED]>
Signed-off-by: Karel Zak <[EMAIL PROTECTED]>
---
 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 06462e8..3c20d6e 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 2807ae3..ac05d25 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"),
-- 
1.5.3.1

-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to