master xplshn/aruu / cmd / posix / nice.c
 1/* See LICENSE file for copyright and license details. */
 2
 3#include <sys/resource.h>
 4
 5#include <errno.h>
 6#include <stdlib.h>
 7#include <unistd.h>
 8
 9#include "util.h"
10#include "wexec.h"
11
12#ifndef PRIO_MIN
13#define PRIO_MIN -NZERO
14#endif
15
16#ifndef PRIO_MAX
17#define PRIO_MAX (NZERO - 1)
18#endif
19
20static void
21usage(void)
22{
23  eprintf("usage: %s [-n inc] cmd [arg ...]\n", argv0);
24}
25
26// ?man nice: run command with modified priority
27// ?man arguments: cmd [arg ...]
28// ?man run a command with modified scheduling priority
29int
30main(int argc, char *argv[])
31{
32  int val = 10, r, savederrno;
33
34  ARGBEGIN
35  {
36    // ?man -n:num: print line numbers or counts
37    case 'n':
38      val = estrtonum(EARGF(usage()), PRIO_MIN, PRIO_MAX);
39      break;
40    default:
41      usage();
42      break;
43  }
44  ARGEND
45
46  if (!argc)
47    usage();
48
49  errno = 0;
50  r     = getpriority(PRIO_PROCESS, 0);
51  if (errno)
52    weprintf("getpriority:");
53  else
54    val += r;
55  LIMIT(val, PRIO_MIN, PRIO_MAX);
56  if (setpriority(PRIO_PROCESS, 0, val) < 0)
57    weprintf("setpriority:");
58
59  wexecvp_self(argv[0], argv);
60  savederrno = errno;
61  weprintf("wexecvp %s:", argv[0]);
62
63  _exit(126 + (savederrno == ENOENT));
64}