xref: /original-bsd/usr.bin/renice/renice.c (revision c43e4352)
1 #ifndef lint
2 static	char *sccsid = "@(#)renice.c	4.6 (Berkeley) 83/07/24";
3 #endif
4 
5 #include <sys/time.h>
6 #include <sys/resource.h>
7 #include <stdio.h>
8 #include <pwd.h>
9 
10 /*
11  * Change the priority (nice) of processes
12  * or groups of processes which are already
13  * running.
14  */
15 main(argc, argv)
16 	char **argv;
17 {
18 	int which = PRIO_PROCESS;
19 	int who = 0, prio, errs = 0;
20 
21 	argc--, argv++;
22 	if (argc < 2) {
23 		fprintf(stderr, "usage: renice priority [ [ -p ] pids ] ");
24 		fprintf(stderr, "[ [ -g ] pgrps ] [ [ -u ] users ]\n");
25 		exit(1);
26 	}
27 	prio = atoi(*argv);
28 	argc--, argv++;
29 	if (prio > PRIO_MAX)
30 		prio = PRIO_MAX;
31 	if (prio < PRIO_MIN)
32 		prio = PRIO_MIN;
33 	for (; argc > 0; argc--, argv++) {
34 		if (strcmp(*argv, "-g") == 0) {
35 			which = PRIO_PGRP;
36 			continue;
37 		}
38 		if (strcmp(*argv, "-u") == 0) {
39 			which = PRIO_USER;
40 			continue;
41 		}
42 		if (strcmp(*argv, "-p") == 0) {
43 			which = PRIO_PROCESS;
44 			continue;
45 		}
46 		if (which == PRIO_USER) {
47 			register struct passwd *pwd = getpwnam(*argv);
48 
49 			if (pwd == NULL) {
50 				fprintf(stderr, "renice: %s: unknown user\n",
51 					*argv);
52 				continue;
53 			}
54 			who = pwd->pw_uid;
55 		} else {
56 			who = atoi(*argv);
57 			if (who < 0) {
58 				fprintf(stderr, "renice: %s: bad value\n",
59 					*argv);
60 				continue;
61 			}
62 		}
63 		errs += donice(which, who, prio);
64 	}
65 	exit(errs != 0);
66 }
67 
68 donice(which, who, prio)
69 	int which, who, prio;
70 {
71 	int oldprio;
72 	extern int errno;
73 
74 	errno = 0, oldprio = getpriority(which, who);
75 	if (oldprio == -1 && errno) {
76 		fprintf(stderr, "renice: %d: ", who);
77 		perror("getpriority");
78 		return (1);
79 	}
80 	if (setpriority(which, who, prio) < 0) {
81 		fprintf(stderr, "renice: %d: ", who);
82 		perror("setpriority");
83 		return (1);
84 	}
85 	printf("%d: old priority %d, new priority %d\n", who, oldprio, prio);
86 	return (0);
87 }
88