commit c01641c89772a214c8b052a9e4b0f3a16b2f1e54
parent 46f743705beb04d9ea4f4160ae1ff7d142ea8753
Author: FRIGN <dev@frign.de>
Date: Mon, 2 Mar 2015 16:53:13 +0100
Audit nice(1)
1) val is sufficient as "int" (read the standard)
2) BUGFIX: If getpriority fails, it returns -1 and sets errno.
Previously, it would correctly catch the errno but not take
care of the fact that by then val has been decremented by 1.
Only change val if the getpriority-call has been successful.
3) Add LIMIT()-macro from st to increase readability.
4) setpriority returns < 0 on failure
5) Remove bikeshedding-comment. Read the standard if you wonder.
6) return-value trick from env(1)
Diffstat:
4 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/README b/README
@@ -47,7 +47,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=* mkfifo yes none
=* mktemp non-posix none
=* mv yes none (-i)
-=* nice yes none
+=*| nice yes none
= nl no -d, -f, -h, -l, -p
=* nohup yes none
#* paste yes none
diff --git a/nice.1 b/nice.1
@@ -1,4 +1,4 @@
-.Dd January 28, 2015
+.Dd March 1, 2015
.Dt NICE 1
.Os sbase
.Sh NAME
@@ -25,7 +25,7 @@ ranging from
.Sy -20
(highest priority)
to
-.Sy +19
+.Sy +20
(lowest priority).
Default is 10.
.El
diff --git a/nice.c b/nice.c
@@ -16,8 +16,7 @@ usage(void)
int
main(int argc, char *argv[])
{
- long val = 10;
- int savederrno;
+ int val = 10, r, savederrno;
ARGBEGIN {
case 'n':
@@ -28,20 +27,22 @@ main(int argc, char *argv[])
break;
} ARGEND;
- if (argc == 0)
+ if (!argc)
usage();
errno = 0;
- val += getpriority(PRIO_PROCESS, 0);
- if (errno != 0)
+ r = getpriority(PRIO_PROCESS, 0);
+ if (errno)
weprintf("getpriority:");
- val = MAX(PRIO_MIN, MIN(val, PRIO_MAX));
- if (setpriority(PRIO_PROCESS, 0, val) != 0)
+ else
+ val += r;
+ LIMIT(val, PRIO_MIN, PRIO_MAX);
+ if (setpriority(PRIO_PROCESS, 0, val) < 0)
weprintf("setpriority:");
- /* POSIX specifies the nice failure still invokes the command */
execvp(argv[0], argv);
savederrno = errno;
weprintf("execvp %s:", argv[0]);
- return (savederrno == ENOENT)? 127 : 126;
+
+ return 126 + (savederrno == ENOENT);
}
diff --git a/util.h b/util.h
@@ -13,6 +13,8 @@
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#undef MAX
#define MAX(x,y) ((x) > (y) ? (x) : (y))
+#undef LIMIT
+#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
#define LEN(x) (sizeof (x) / sizeof *(x))