/* renice.c - renice process
 *
 * Copyright 2013 CE Strake <strake888 at gmail.com>
 *
 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/renice.html

USE_RENICE(NEWTOY(renice, "<1gpun#|", TOYFLAG_USR|TOYFLAG_BIN))

config RENICE
  bool "renice"
  default y
  help
    usage: renice [-gpu] -n increment ID ...
*/

#define FOR_renice
#include "toys.h"

GLOBALS(
  long n;
)

void renice_main(void) {
  int which = (toys.optflags & FLAG_g) ? PRIO_PGRP :
              ((toys.optflags & FLAG_u) ? PRIO_USER : PRIO_PROCESS);
  char **arg;

  for (arg = toys.optargs; *arg; arg++) {
    char *s = *arg;
    int id = -1;

    if (toys.optflags & FLAG_u) {
      struct passwd *p = getpwnam(s);
      if (p) id = p->pw_uid;
    } else {
      id = strtol(s, &s, 10);
      if (*s) id = -1;
    }

    if (id < 0) {
      error_msg("bad '%s'", *arg);
      continue;
    }

    if (setpriority(which, id, getpriority(which, id)+TT.n) < 0)
      perror_msg("setpriority %d", id);
  }
}