Index: renice.c =================================================================== RCS file: /cvsroot/fbsd/src/usr.bin/renice/renice.c,v retrieving revision 1.11 diff -u -r1.11 renice.c --- renice.c 10 Apr 2002 13:38:09 -0000 1.11 +++ renice.c 20 Apr 2002 19:23:42 -0000 @@ -35,16 +35,15 @@ static const char copyright[] = "@(#) Copyright (c) 1983, 1989, 1993\n\ The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ -#ifndef lint #if 0 static char sccsid[] = "@(#)renice.c 8.1 (Berkeley) 6/9/93"; #endif -static const char rcsid[] = - "$FreeBSD: src/usr.bin/renice/renice.c,v 1.11 2002/04/10 13:38:09 maxim Exp $"; #endif /* not lint */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -56,6 +55,7 @@ #include #include #include +#include static int donice(int, int, int, int); static int getnum(const char *, const char *, int *); @@ -70,38 +70,48 @@ main(int argc, char *argv[]) { struct passwd *pwd; - int errs, incr, prio, which, who; + char *ep; + int errs, nflag, prio, which, who; errs = 0; - incr = 0; + nflag = 0; which = PRIO_PROCESS; who = 0; argc--, argv++; if (argc < 2) usage(); if (strcmp(*argv, "-n") == 0) { - incr = 1; + nflag = 1; argc--, argv++; if (argc < 2) usage(); } - if (getnum("priority", *argv, &prio)) - return (1); + if (getnum("nice_value", *argv, &prio)) + exit(EX_DATAERR); argc--, argv++; + + /* + * The next argument shall be -g, -p, -u, or an unsigned decimal + * number. If it is a number, default to -p (PRIO_PROCESS). + */ + if (strcmp(*argv, "-g") == 0) { + which = PRIO_PGRP; + argc--, argv++; + } else if (strcmp(*argv, "-u") == 0) { + which = PRIO_USER; + argc--, argv++; + } else if (strcmp(*argv, "-p") == 0) + argc--, argv++; + if (argc < 1) + usage(); + + /* + * From this point on, all non-numeric arguments are invalid unless -u + * (PRIO_USER). Numbers shall be unsigned integers. + */ for (; argc > 0; argc--, argv++) { - if (strcmp(*argv, "-g") == 0) { - which = PRIO_PGRP; - continue; - } - if (strcmp(*argv, "-u") == 0) { - which = PRIO_USER; - continue; - } - if (strcmp(*argv, "-p") == 0) { - which = PRIO_PROCESS; - continue; - } - if (which == PRIO_USER) { + (void)strtol(*argv, &ep, 10); + if (*ep && which == PRIO_USER) { pwd = getpwnam(*argv); if (pwd == NULL) { warnx("%s: unknown user", *argv); @@ -109,20 +119,20 @@ } who = pwd->pw_uid; } else { - if (getnum("pid", *argv, &who)) + if (getnum("ID", *argv, &who)) continue; if (who < 0) { warnx("%s: bad value", *argv); continue; } } - errs += donice(which, who, prio, incr); + errs += donice(which, who, prio, nflag); } exit(errs != 0); } static int -donice(int which, int who, int prio, int incr) +donice(int which, int who, int prio, int nflag) { int oldprio; @@ -132,17 +142,12 @@ warn("%d: getpriority", who); return (1); } - if (incr) - prio = oldprio + prio; - if (prio > PRIO_MAX) - prio = PRIO_MAX; - if (prio < PRIO_MIN) - prio = PRIO_MIN; + if (nflag) + prio = oldprio + prio; /* Possible over/underflow here. */ if (setpriority(which, who, prio) < 0) { warn("%d: setpriority", who); return (1); } - printf("%d: old priority %d, new priority %d\n", who, oldprio, prio); return (0); } @@ -153,7 +158,7 @@ char *ep; errno = 0; - v = strtol(str, &ep, NULL); + v = strtol(str, &ep, 10); if (v < INT_MIN || v > INT_MAX || errno == ERANGE) { warnx("%s argument %s is out of range.", com, str); return (1); @@ -170,8 +175,8 @@ static void usage() { - fprintf(stderr, "%s\n%s\n", -"usage: renice [priority | [-n incr]] [ [ -p ] pids ] [ [ -g ] pgrps ]", -" [ [ -u ] users ]"); - exit(1); + + fprintf(stderr, "usage: renice nice_value [-g | -p | -u] ID ...\n"); + fprintf(stderr, " renice -n increment [-g | -p | -u] ID ...\n"); + exit(EX_USAGE); }