+++ /dev/null
-#define _POSIX_C_SOURCE 200809L
-#define _XOPEN_SOURCE
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <errno.h>
-
-/* Public domain by Nathan Wagner */
-
-/* reads a long from a string. returns -1 if completely
- * read, number of characters read otherwise,
- * or zero if it can't read a string
- * clears errno, which may be reset again by strtol()
- */
-static int readint(char *s, long *i) {
- long val;
- char *end;
- errno = 0;
- val = strtol(s, &end, 10);
-
- /* Check for various possible errors */
-
- if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
- || (errno != 0 && val == 0)) {
- perror("strtol");
- return 0;
- }
-
- if (end == s) {
- fprintf(stderr, "No digits were found\n");
- return 0;
- }
-
- /* If we got here, strtol() successfully parsed a number */
-
- *i = val;
-
- if (*end != '\0') {
- /* Not necessarily an error... */
- /* printf("Further characters after number: %s\n", endptr); */
- return end - s;
- }
-
- return -1;
-}
-
-static void usage(void) {
- fprintf(stderr, "usage: nice [-n increment] utility [argument...]\n");
- exit(1);
-}
-
-int main(int ac, char *av[]) {
- int arg;
- arg = 1;
- long nval;
- if (arg < ac && !strcmp(av[arg], "-n")) {
- char *s = 0;
- if (av[arg][2]) {
- s = av[arg]+2;
- } else if (++arg < ac) {
- s = av[arg];
- }
- if (s && (readint(s, &nval) == -1)) {
- nice((int)nval);
- arg++;
- } else {
- usage();
- }
- }
-
- if (arg < ac) {
- execvp(av[arg], &av[arg]);
- switch (errno) {
- case ENOENT:
- fprintf(stderr, "nice: ");
- perror(av[arg]);
- return 127;
- default:
- fprintf(stderr, "nice: ");
- perror(av[arg]);
- return 126;
- }
- } else {
- usage();
- }
-
- return 1;
-}