renice.c (1489B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <sys/resource.h> 3 4 #include <errno.h> 5 #include <pwd.h> 6 #include <stdlib.h> 7 8 #include "util.h" 9 10 #ifndef PRIO_MIN 11 #define PRIO_MIN -NZERO 12 #endif 13 14 #ifndef PRIO_MAX 15 #define PRIO_MAX (NZERO-1) 16 #endif 17 18 static int 19 renice(int which, int who, long adj) 20 { 21 errno = 0; 22 adj += getpriority(which, who); 23 if (errno) { 24 weprintf("getpriority %d:", who); 25 return 0; 26 } 27 28 adj = MAX(PRIO_MIN, MIN(adj, PRIO_MAX)); 29 if (setpriority(which, who, (int)adj) < 0) { 30 weprintf("setpriority %d:", who); 31 return 0; 32 } 33 34 return 1; 35 } 36 37 static void 38 usage(void) 39 { 40 eprintf("usage: %s -n num [-g | -p | -u] id ...\n", argv0); 41 } 42 43 int 44 main(int argc, char *argv[]) 45 { 46 const char *adj = NULL; 47 long val; 48 int which = PRIO_PROCESS, ret = 0; 49 struct passwd *pw; 50 int who; 51 52 ARGBEGIN { 53 case 'n': 54 adj = EARGF(usage()); 55 break; 56 case 'g': 57 which = PRIO_PGRP; 58 break; 59 case 'p': 60 which = PRIO_PROCESS; 61 break; 62 case 'u': 63 which = PRIO_USER; 64 break; 65 default: 66 usage(); 67 } ARGEND 68 69 if (!argc || !adj) 70 usage(); 71 72 val = estrtonum(adj, PRIO_MIN, PRIO_MAX); 73 for (; *argv; argc--, argv++) { 74 if (which == PRIO_USER) { 75 errno = 0; 76 if (!(pw = getpwnam(*argv))) { 77 if (errno) 78 weprintf("getpwnam %s:", *argv); 79 else 80 weprintf("getpwnam %s: no user found\n", *argv); 81 ret = 1; 82 continue; 83 } 84 who = pw->pw_uid; 85 } else { 86 who = estrtonum(*argv, 1, INT_MAX); 87 } 88 if (!renice(which, who, val)) 89 ret = 1; 90 } 91 92 return ret; 93 }