#define _POSIX_C_SOURCE 200809L #define _XOPEN_SOURCE #include #include #include #include #include #include /* 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; }