]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - sys-utils/renice.c
libdisk: write sample output to stdout
[thirdparty/util-linux.git] / sys-utils / renice.c
index 8867d002268e1528bae1d4e4a86a8c8a3a4a9c9d..fbce39a1f8f7755853bc4f570aa4575e3a64b942 100644 (file)
  * SUCH DAMAGE.
  */
 
+ /* 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
+  * - added Native Language Support
+  */
+
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <stdio.h>
 #include <pwd.h>
 #include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "nls.h"
+#include "c.h"
+#include "closestream.h"
+
+static const char *idtype[] = {
+       [PRIO_PROCESS]  = N_("process ID"),
+       [PRIO_PGRP]     = N_("process group ID"),
+       [PRIO_USER]     = N_("user ID"),
+};
 
-int donice(int,int,int);
+static void __attribute__((__noreturn__)) usage(void)
+{
+       FILE *out = stdout;
+       fputs(USAGE_HEADER, out);
+       fprintf(out,
+             _(" %1$s [-n] <priority> [-p|--pid] <pid>...\n"
+               " %1$s [-n] <priority>  -g|--pgrp <pgid>...\n"
+               " %1$s [-n] <priority>  -u|--user <user>...\n"),
+               program_invocation_short_name);
+
+       fputs(USAGE_SEPARATOR, out);
+       fputs(_("Alter the priority of running processes.\n"), out);
+
+       fputs(USAGE_OPTIONS, out);
+       fputs(_(" -n, --priority <num>   specify the nice increment value\n"), out);
+       fputs(_(" -p, --pid <id>         interpret argument as process ID (default)\n"), out);
+       fputs(_(" -g, --pgrp <id>        interpret argument as process group ID\n"), out);
+       fputs(_(" -u, --user <name>|<id> interpret argument as username or user ID\n"), out);
+       fputs(USAGE_SEPARATOR, out);
+       printf(USAGE_HELP_OPTIONS(24));
+       printf(USAGE_MAN_TAIL("renice(1)"));
+       exit(EXIT_SUCCESS);
+}
+
+static int getprio(const int which, const int who, int *prio)
+{
+       errno = 0;
+       *prio = getpriority(which, who);
+       if (*prio == -1 && errno) {
+               warn(_("failed to get priority for %d (%s)"), who, idtype[which]);
+               return -errno;
+       }
+       return 0;
+}
+
+static int donice(const int which, const int who, const int prio)
+{
+       int oldprio, newprio;
+
+       if (getprio(which, who, &oldprio) != 0)
+               return 1;
+       if (setpriority(which, who, prio) < 0) {
+               warn(_("failed to set priority for %d (%s)"), who, idtype[which]);
+               return 1;
+       }
+       if (getprio(which, who, &newprio) != 0)
+               return 1;
+       printf(_("%d (%s) old priority %d, new priority %d\n"),
+              who, idtype[which], oldprio, newprio);
+       return 0;
+}
 
 /*
- * Change the priority (nice) of processes
- * or groups of processes which are already
- * running.
+ * Change the priority (the nice value) of processes
+ * or groups of processes which are already running.
  */
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
 {
        int which = PRIO_PROCESS;
        int who = 0, prio, errs = 0;
+       char *endptr = NULL;
+
+       setlocale(LC_ALL, "");
+       bindtextdomain(PACKAGE, LOCALEDIR);
+       textdomain(PACKAGE);
+       close_stdout_atexit();
 
-       argc--, argv++;
-       if (argc < 2) {
-               fprintf(stderr, "usage: renice priority [ [ -p ] pids ] ");
-               fprintf(stderr, "[ [ -g ] pgrps ] [ [ -u ] users ]\n");
-               exit(1);
+       argc--;
+       argv++;
+
+       if (argc == 1) {
+               if (strcmp(*argv, "-h") == 0 ||
+                   strcmp(*argv, "--help") == 0)
+                       usage();
+
+               if (strcmp(*argv, "-v") == 0 ||
+                   strcmp(*argv, "-V") == 0 ||
+                   strcmp(*argv, "--version") == 0)
+                       print_version(EXIT_SUCCESS);
+       }
+
+       if (*argv && (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--priority") == 0)) {
+               argc--;
+               argv++;
+       }
+
+       if (argc < 2 || !*argv) {
+               warnx(_("not enough arguments"));
+               errtryhelp(EXIT_FAILURE);
+       }
+
+       prio = strtol(*argv, &endptr, 10);
+       if (*endptr) {
+               warnx(_("invalid priority '%s'"), *argv);
+               errtryhelp(EXIT_FAILURE);
        }
-       prio = atoi(*argv);
-       argc--, argv++;
-       if (prio > PRIO_MAX)
-               prio = PRIO_MAX;
-       if (prio < PRIO_MIN)
-               prio = PRIO_MIN;
+       argc--;
+       argv++;
+
        for (; argc > 0; argc--, argv++) {
-               if (strcmp(*argv, "-g") == 0) {
+               if (strcmp(*argv, "-g") == 0 || strcmp(*argv, "--pgrp") == 0) {
                        which = PRIO_PGRP;
                        continue;
                }
-               if (strcmp(*argv, "-u") == 0) {
+               if (strcmp(*argv, "-u") == 0 || strcmp(*argv, "--user") == 0) {
                        which = PRIO_USER;
                        continue;
                }
-               if (strcmp(*argv, "-p") == 0) {
+               if (strcmp(*argv, "-p") == 0 || strcmp(*argv, "--pid") == 0) {
                        which = PRIO_PROCESS;
                        continue;
                }
                if (which == PRIO_USER) {
-                       register struct passwd *pwd = getpwnam(*argv);
-                       
-                       if (pwd == NULL) {
-                               fprintf(stderr, "renice: %s: unknown user\n",
-                                       *argv);
+                       struct passwd *pwd = getpwnam(*argv);
+
+                       if (pwd != NULL)
+                               who = pwd->pw_uid;
+                       else
+                               who = strtol(*argv, &endptr, 10);
+                       if (who < 0 || *endptr) {
+                               warnx(_("unknown user %s"), *argv);
+                               errs = 1;
                                continue;
                        }
-                       who = pwd->pw_uid;
                } else {
-                       who = atoi(*argv);
-                       if (who < 0) {
-                               fprintf(stderr, "renice: %s: bad value\n",
-                                       *argv);
+                       who = strtol(*argv, &endptr, 10);
+                       if (who < 0 || *endptr) {
+                               /* TRANSLATORS: The first %s is one of the above
+                                * three ID names. Read: "bad value for %s: %s" */
+                               warnx(_("bad %s value: %s"), idtype[which], *argv);
+                               errs = 1;
                                continue;
                        }
                }
-               errs += donice(which, who, prio);
-       }
-       return (errs != 0);
-}
-
-int
-donice(which, who, prio)
-       int which, who, prio;
-{
-       int oldprio;
-       extern int errno;
-
-       errno = 0, oldprio = getpriority(which, who);
-       if (oldprio == -1 && errno) {
-               fprintf(stderr, "renice: %d: ", who);
-               perror("getpriority");
-               return (1);
-       }
-       if (setpriority(which, who, prio) < 0) {
-               fprintf(stderr, "renice: %d: ", who);
-               perror("setpriority");
-               return (1);
+               errs |= donice(which, who, prio);
        }
-       printf("%d: old priority %d, new priority %d\n", who, oldprio, prio);
-       return (0);
+       return errs != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }