File: usernice.c

package info (click to toggle)
chiark-utils 8.0.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,084 kB
  • sloc: ansic: 4,640; perl: 4,281; sh: 671; python: 465; makefile: 286; tcl: 228
file content (67 lines) | stat: -rw-r--r-- 1,879 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <pwd.h>
#include <sys/resource.h>

int main(int argc,char **argv) {
  long l;
  int mrenice,wrenice,newprio,eflag;
  uid_t ruid;
  char *ep;
  struct passwd *pw;

  mrenice=0;
  if (argc < 3) {
    fputs("usernice: too few args\n"
          " usage: usernice <nicelevel> <command> <arguments>\n"
          "        usernice <nicelevel>p <pid> <pid> ...\n"
          "        usernice <nicelevel>u <username|uid> ...\n",
          stderr);
    exit(-1);
  }
  l= strtol(*++argv,&ep,10);
  if (*ep == 'p' || *ep == 'u') { mrenice= *ep++; }
  if (*ep) { fputs("usernice: priority not numeric or bad flags\n",stderr); exit(-1); }
  if (l<-20 || l>20)
    { fputs("usernice: priority must be -20 .. 20\n",stderr); exit(-1); }
  newprio= l;
  if (mrenice) {
    eflag=0;
    while (*++argv) {
      if (mrenice == 'p') {
        wrenice= PRIO_PROCESS;
        l= strtoul(*argv,&ep,10);
        if (*ep) {
          fprintf(stderr,"usernice: pid `%s' not numeric\n",*argv); eflag=2;
          continue;
        }
      } else {
        wrenice= PRIO_USER;
        l= strtoul(*argv,&ep,10);
        if (*ep) {
          pw= getpwnam(*argv);
          if (!pw) {
            fprintf(stderr,"usernice: unknown user `%s'\n",*argv); eflag=2;
            continue;
          }
          l= pw->pw_uid;
        }
      }
      if (setpriority(wrenice,l,newprio)) {
        perror(*argv); if (!eflag) eflag=1;
      }
    }
    exit(eflag);
  } else {
    if (setpriority(PRIO_PROCESS,0,newprio))
      { perror("usernice: setpriority"); exit(-1); }
    ruid= getuid(); if (ruid == (uid_t)-1) { perror("usernice: getuid"); exit(-1); }
    if (setreuid(ruid,ruid)) { perror("usernice: setreuid"); exit(-1); }
    execvp(argv[1],argv+1); perror("usernice: exec"); exit(-1);
  }
}