Re: [PATCH] renice: correctly detect errors in arguments

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <lamont@xxxxxxxxxx>
> ---
>  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 <lamont@xxxxxxxxxx>
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 <kzak@xxxxxxxxxx>
Signed-off-by: LaMont Jones <lamont@xxxxxxxxxx>
Signed-off-by: Karel Zak <kzak@xxxxxxxxxx>
---
 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux