X-Git-Url: https://git.saurik.com/apple/shell_cmds.git/blobdiff_plain/c0fcf4e10b938344ef61467570bddfdc19cc8b7b..254f12f71a85dc64a2552ac4af43a6bdb4a80b05:/renice/renice.c diff --git a/renice/renice.c b/renice/renice.c index 3fd63ce..d7253e0 100644 --- a/renice/renice.c +++ b/renice/renice.c @@ -1,5 +1,3 @@ -/* $NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $ */ - /* * Copyright (c) 1983, 1989, 1993 * The Regents of the University of California. All rights reserved. @@ -33,29 +31,33 @@ * SUCH DAMAGE. */ -#include #ifndef lint -__COPYRIGHT("@(#) Copyright (c) 1983, 1989, 1993\n\ - The Regents of the University of California. All rights reserved.\n"); +static const char copyright[] = +"@(#) Copyright (c) 1983, 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ +#if 0 #ifndef lint -/*static char sccsid[] = "from: @(#)renice.c 8.1 (Berkeley) 6/9/93";*/ -__RCSID("$NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $"); +static char sccsid[] = "@(#)renice.c 8.1 (Berkeley) 6/9/93"; #endif /* not lint */ +#endif #include #include #include #include +#include +#include #include #include #include #include -int donice __P((int, int, int)); -int main __P((int, char **)); +static int donice(int, int, int, int); +static int getnum(const char *, const char *, int *); +static void usage(void); /* * Change the priority (nice) of processes @@ -63,26 +65,37 @@ int main __P((int, char **)); * running. */ int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { - int which = PRIO_PROCESS; - int who = 0, prio, errs = 0; + struct passwd *pwd; + int errs, incr, prio, which, who; + int delim; + int priflag; + errs = 0; + incr = 0; + which = PRIO_PROCESS; + who = 0; argc--, argv++; - if (argc < 2) { - fprintf(stderr, "usage: renice priority [ [ -p ] pids ] "); - fprintf(stderr, "[ [ -g ] pgrps ] [ [ -u ] users ]\n"); - exit(1); - } - prio = atoi(*argv); - argc--, argv++; - if (prio > PRIO_MAX) - prio = PRIO_MAX; - if (prio < PRIO_MIN) - prio = PRIO_MIN; - for (; argc > 0; argc--, argv++) { + if (argc < 2) + usage(); + delim = 0; + priflag = 0; + + /* incrementing priflag here ensures we only process + the single priority arg if it is the very first arg */ + for (; argc > 0; argc--, argv++, priflag++) { + /* once we've seen -- , don't process anymore switches */ + if (0 == delim) { + /* -n must immediately be followed by the incremental + priority */ + if (strcmp(*argv, "-n") == 0) { + incr = 1; + argc--, argv++; + if (getnum("priority", *argv, &prio)) + return (1); + continue; + } if (strcmp(*argv, "-g") == 0) { which = PRIO_PGRP; continue; @@ -95,42 +108,96 @@ main(argc, argv) which = PRIO_PROCESS; continue; } + if (strcmp(*argv, "--") == 0) { + delim = 1; + continue; + } + if (0 == priflag) { + /* if very first switch/arg and we've made it to + here, this must be the priority */ + if (getnum("priority", *argv, &prio)) { + return(1); + } + continue; + } + } if (which == PRIO_USER) { - register struct passwd *pwd = getpwnam(*argv); - - if (pwd == NULL) { - warnx("%s: unknown user", *argv); + if ((pwd = getpwnam(*argv)) != NULL) + who = pwd->pw_uid; + else if (getnum("uid", *argv, &who)) { + errs++; + continue; + } else if (who < 0) { + warnx("%s: bad value", *argv); + errs++; continue; } - who = pwd->pw_uid; } else { - who = atoi(*argv); + if (getnum("pid", *argv, &who)) { + errs++; + continue; + } if (who < 0) { warnx("%s: bad value", *argv); + errs++; continue; } } - errs += donice(which, who, prio); + errs += donice(which, who, prio, incr); } exit(errs != 0); } -int -donice(which, who, prio) - int which, who, prio; +static int +donice(int which, int who, int prio, int incr) { int oldprio; - extern int errno; - errno = 0, oldprio = getpriority(which, who); + errno = 0; + oldprio = getpriority(which, who); if (oldprio == -1 && errno) { 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 (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); } + +static int +getnum(const char *com, const char *str, int *val) +{ + long v; + char *ep; + + errno = 0; + 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); + } + if (ep == str || *ep != '\0' || errno != 0) { + warnx("Bad %s argument: %s.", com, str); + return (1); + } + + *val = (int)v; + return (0); +} + +static void +usage() +{ + fprintf(stderr, "%s\n%s\n", +"usage: renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]", +" renice -n increment [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]"); + exit(1); +}