/* See LICENSE file for copyright and license details. */
#include <sys/resource.h>

#include <errno.h>
#include <pwd.h>
#include <stdlib.h>

#include "util.h"

static int
renice(int which, int who, long adj)
{
	errno = 0;
	adj += getpriority(which, who);
	if (errno) {
		weprintf("getpriority %d:", who);
		return 0;
	}

	adj = MAX(PRIO_MIN, MIN(adj, PRIO_MAX));
	if (setpriority(which, who, (int)adj) < 0) {
		weprintf("setpriority %d:", who);
		return 0;
	}

	return 1;
}

static void
usage(void)
{
	eprintf("renice -n num [-g | -p | -u] id ...\n");
}

int
main(int argc, char *argv[])
{
	const char *adj = NULL;
	long val;
	int which = PRIO_PROCESS, ret = 0;
	struct passwd *pw;
	int who;

	ARGBEGIN {
	case 'n':
		adj = EARGF(usage());
		break;
	case 'g':
		which = PRIO_PGRP;
		break;
	case 'p':
		which = PRIO_PROCESS;
		break;
	case 'u':
		which = PRIO_USER;
		break;
	default:
		usage();
	} ARGEND

	if (!argc || !adj)
		usage();

	val = estrtonum(adj, PRIO_MIN, PRIO_MAX);
	for (; *argv; argc--, argv++) {
		if (which == PRIO_USER) {
			errno = 0;
			if (!(pw = getpwnam(*argv))) {
				if (errno)
					weprintf("getpwnam %s:", *argv);
				else
					weprintf("getpwnam %s: no user found\n", *argv);
				ret = 1;
				continue;
			}
			who = pw->pw_uid;
		} else {
			who = estrtonum(*argv, 1, INT_MAX);
		}
		if (!renice(which, who, val))
			ret = 1;
	}

	return ret;
}
