]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - sys-utils/renice.c
su: change error message
[thirdparty/util-linux.git] / sys-utils / renice.c
index b4d96e02f9716b9af336a7388f8d2f13eb141239..3ae71f9c1dd7e9c0ef04ad27427adfab1aa62362 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  */
 
- /* 1999-02-22 Arkadiusz Mikiewicz <misiek@pld.ORG.PL>
+ /* 1999-02-22 Arkadiusz Miśkiewicz <misiek@pld.ORG.PL>
   * - added Native Language Support
   */
 
 #include <errno.h>
 #include "nls.h"
 #include "c.h"
+#include "closestream.h"
 
-static int donice(int,int,int);
+static const char *idtype[] = {
+       [PRIO_PROCESS]  = N_("process ID"),
+       [PRIO_PGRP]     = N_("process group ID"),
+       [PRIO_USER]     = N_("user ID"),
+};
 
-static void __attribute__((__noreturn__)) usage(FILE *out)
+static void __attribute__((__noreturn__)) usage(void)
 {
-       fprintf(out, _(
-               "\nUsage:\n"
-               " %1$s [-n] <priority> [-p] <pid> [<pid>  ...]\n"
-               " %1$s [-n] <priority>  -g <pgrp> [<pgrp> ...]\n"
-               " %1$s [-n] <priority>  -u <user> [<user> ...]\n"),
+       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);
 
-       fprintf(out, _(
-               "\nOptions:\n"
-               " -g, --pgrp <id>        interpret as process group ID\n"
-               " -h, --help             print help\n"
-               " -n, --priority <num>   set the nice increment value\n"
-               " -p, --pid <id>         force to be interpreted as process ID\n"
-               " -u, --user <name|id>   interpret as username or user ID\n"
-               " -v, --version          print version\n"));
+       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;
+}
 
-       fprintf(out, _("\nFor more information see renice(1).\n"));
+static int donice(const int which, const int who, const int prio)
+{
+       int oldprio, newprio;
 
-       exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
+       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;
@@ -87,6 +119,7 @@ main(int argc, char **argv)
        setlocale(LC_ALL, "");
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
+       atexit(close_stdout);
 
        argc--;
        argv++;
@@ -94,27 +127,31 @@ main(int argc, char **argv)
        if (argc == 1) {
                if (strcmp(*argv, "-h") == 0 ||
                    strcmp(*argv, "--help") == 0)
-                       usage(stdout);
+                       usage();
 
                if (strcmp(*argv, "-v") == 0 ||
+                   strcmp(*argv, "-V") == 0 ||
                    strcmp(*argv, "--version") == 0) {
-                       printf(_("renice from %s\n"), PACKAGE_STRING);
-                       exit(EXIT_SUCCESS);
+                       printf(UTIL_LINUX_VERSION);
+                       return EXIT_SUCCESS;
                }
        }
 
-       if (argc < 2)
-               usage(stderr);
-
-       if (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--priority") == 0) {
+       if (*argv && (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--priority") == 0)) {
                argc--;
                argv++;
        }
 
-       prio = strtol(*argv, &endptr, 10);
-       if (*endptr)
-               usage(stderr);
+       if (argc < 2) {
+               warnx(_("not enough arguments"));
+               errtryhelp(EXIT_FAILURE);
+       }
 
+       prio = strtol(*argv, &endptr, 10);
+       if (*endptr) {
+               warnx(_("invalid priority '%s'"), *argv);
+               errtryhelp(EXIT_FAILURE);
+       }
        argc--;
        argv++;
 
@@ -132,53 +169,28 @@ main(int argc, char **argv)
                        continue;
                }
                if (which == PRIO_USER) {
-                       register struct passwd *pwd = getpwnam(*argv);
+                       struct passwd *pwd = getpwnam(*argv);
 
-                       if (pwd == NULL) {
+                       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 = strtol(*argv, &endptr, 10);
                        if (who < 0 || *endptr) {
-                               warnx(_("bad value %s"), *argv);
+                               /* 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);
+               errs |= donice(which, who, prio);
        }
        return errs != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
-
-static int
-donice(int which, int who, int prio) {
-       int oldprio, newprio;
-       const char *idtype = _("process ID");
-
-       if (which == PRIO_USER)
-               idtype = _("user ID");
-       else if (which == PRIO_PGRP)
-               idtype = _("process group ID");
-
-       errno = 0;
-       oldprio = getpriority(which, who);
-       if (oldprio == -1 && errno) {
-               warn(_("failed to get priority for %d (%s)"), who, idtype);
-               return 1;
-       }
-       if (setpriority(which, who, prio) < 0) {
-               warn(_("failed to set priority for %d (%s)"), who, idtype);
-               return 1;
-       }
-       errno = 0;
-       newprio = getpriority(which, who);
-       if (newprio == -1 && errno) {
-               warn(_("failed to get priority for %d (%s)"), who, idtype);
-               return 1;
-       }
-
-       printf(_("%d (%s) old priority %d, new priority %d\n"),
-              who, idtype, oldprio, newprio);
-       return 0;
-}