xref: /csrg-svn/usr.bin/renice/renice.c (revision 13606)
111614Ssam #ifndef lint
2*13606Ssam static	char *sccsid = "@(#)renice.c	4.3 (Berkeley) 83/07/02";
311614Ssam #endif
411614Ssam 
5*13606Ssam #include <sys/time.h>
6*13606Ssam #include <sys/resource.h>
711614Ssam #include <stdio.h>
811614Ssam #include <pwd.h>
911614Ssam 
1011614Ssam /*
1111614Ssam  * Change the priority (nice) of processes
1211614Ssam  * or groups of processes which are already
1311614Ssam  * running.
1411614Ssam  */
1511614Ssam main(argc, argv)
1611614Ssam 	char **argv;
1711614Ssam {
1811614Ssam 	int which = PRIO_PROCESS;
1911617Ssam 	int who = 0, prio, errs = 0;
2011614Ssam 
2111614Ssam 	argc--, argv++;
2211614Ssam 	if (argc < 2)
2311614Ssam 		usage();
2411614Ssam 	if (strcmp(*argv, "-g") == 0) {
2511614Ssam 		which = PRIO_PGRP;
2611614Ssam 		argv++, argc--;
2711614Ssam 	} else if (strcmp(*argv, "-u") == 0) {
2811614Ssam 		which = PRIO_USER;
2911614Ssam 		argv++, argc--;
3011614Ssam 	}
3111614Ssam 	prio = atoi(*argv);
3211614Ssam 	argc--, argv++;
3311614Ssam 	if (prio > PRIO_MAX)
3411614Ssam 		prio = PRIO_MAX;
3511614Ssam 	if (prio < PRIO_MIN)
3611614Ssam 		prio = PRIO_MIN;
3711614Ssam 	if (argc == 0)
3811617Ssam 		errs += donice(which, 0, prio);
3911614Ssam 	for (; argc > 0; argc--, argv++) {
4011614Ssam 		if (which == PRIO_USER) {
4111614Ssam 			register struct passwd *pwd = getpwnam(*argv);
4211614Ssam 
4311614Ssam 			if (pwd == NULL) {
4411614Ssam 				fprintf(stderr, "renice: %s: unknown user\n",
4511614Ssam 					*argv);
4611614Ssam 				continue;
4711614Ssam 			}
4811617Ssam 			who = pwd->pw_uid;
4911614Ssam 		} else {
5011617Ssam 			who = atoi(*argv);
5111617Ssam 			if (who < 0) {
5211614Ssam 				fprintf(stderr, "renice: %s: bad value\n",
5311614Ssam 					*argv);
5411614Ssam 				continue;
5511614Ssam 			}
5611614Ssam 		}
5711617Ssam 		errs += donice(which, who, prio);
5811614Ssam 	}
5911614Ssam 	exit(errs != 0);
6011614Ssam }
6111614Ssam 
6211617Ssam donice(which, who, prio)
6311617Ssam 	int which, who, prio;
6411617Ssam {
6511617Ssam 	int oldprio = getpriority(which, who);
6611617Ssam 	extern int errno;
6711617Ssam 
6811617Ssam 	if (oldprio == -1 && errno) {
6911617Ssam 		fprintf(stderr, "renice: %d: ", who);
7011617Ssam 		perror("getpriority");
7111617Ssam 		return (1);
7211617Ssam 	}
7311617Ssam 	if (setpriority(which, who, prio) < 0) {
7411617Ssam 		fprintf(stderr, "renice: %d: ", who);
7511617Ssam 		perror("setpriority");
7611617Ssam 		return (1);
7711617Ssam 	}
7811617Ssam 	printf("%d: old priority %d, new priority %d\n", who, oldprio, prio);
7911617Ssam 	return (0);
8011617Ssam }
8111617Ssam 
8211614Ssam usage()
8311614Ssam {
8411617Ssam 	fprintf(stderr, "usage: renice priority [ pid .... ]\n");
8511617Ssam 	fprintf(stderr, "or, renice -g priority [ pgrp .... ]\n");
8611617Ssam 	fprintf(stderr, "or, renice -u priority [ user .... ]\n");
8711614Ssam 	exit(1);
8811614Ssam }
89