text: /* See LICENSE file for copyright and license details. */
  #include <sys/resource.h>
  
  #include <errno.h>
  #include <pwd.h>
  #include <stdlib.h>
  
  #include "util.h"
  
  #ifndef PRIO_MIN
  #define PRIO_MIN -NZERO
  #endif
  
  #ifndef PRIO_MAX
  #define PRIO_MAX (NZERO-1)
  #endif
  
  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("usage: %s -n num [-g | -p | -u] id ...\n", argv0);
  }
  
  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;
  }
  