source: MondoRescue/branches/3.3/mindi-busybox/procps/renice.c@ 3837

Last change on this file since 3837 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.6 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * renice implementation for busybox
4 *
5 * Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9
10/* Notes:
11 * Setting an absolute priority was obsoleted in SUSv2 and removed
12 * in SUSv3. However, the common linux version of renice does
13 * absolute and not relative. So we'll continue supporting absolute,
14 * although the stdout logging has been removed since both SUSv2 and
15 * SUSv3 specify that stdout isn't used.
16 *
17 * This version is lenient in that it doesn't require any IDs. The
18 * options -p, -g, and -u are treated as mode switches for the
19 * following IDs (if any). Multiple switches are allowed.
20 */
21
22//usage:#define renice_trivial_usage
23//usage: "[-n] PRIORITY [[-p | -g | -u] ID...]..."
24//usage:#define renice_full_usage "\n\n"
25//usage: "Change scheduling priority of a running process\n"
26//usage: "\n -n Add PRIORITY to current nice value"
27//usage: "\n Without -n, nice value is set to PRIORITY"
28//usage: "\n -p Process ids (default)"
29//usage: "\n -g Process group ids"
30//usage: "\n -u Process user names"
31
32#include "libbb.h"
33#include <sys/resource.h>
34
35void BUG_bad_PRIO_PROCESS(void);
36void BUG_bad_PRIO_PGRP(void);
37void BUG_bad_PRIO_USER(void);
38
39int renice_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
40int renice_main(int argc UNUSED_PARAM, char **argv)
41{
42 static const char Xetpriority_msg[] ALIGN1 = "%cetpriority";
43
44 int retval = EXIT_SUCCESS;
45 int which = PRIO_PROCESS; /* Default 'which' value. */
46 int use_relative = 0;
47 int adjustment, new_priority;
48 unsigned who;
49 char *arg;
50
51 /* Yes, they are not #defines in glibc 2.4! #if won't work */
52 if (PRIO_PROCESS < CHAR_MIN || PRIO_PROCESS > CHAR_MAX)
53 BUG_bad_PRIO_PROCESS();
54 if (PRIO_PGRP < CHAR_MIN || PRIO_PGRP > CHAR_MAX)
55 BUG_bad_PRIO_PGRP();
56 if (PRIO_USER < CHAR_MIN || PRIO_USER > CHAR_MAX)
57 BUG_bad_PRIO_USER();
58
59 arg = *++argv;
60
61 /* Check if we are using a relative adjustment. */
62 if (arg && arg[0] == '-' && arg[1] == 'n') {
63 use_relative = 1;
64 if (!arg[2])
65 arg = *++argv;
66 else
67 arg += 2;
68 }
69
70 if (!arg) { /* No args? Then show usage. */
71 bb_show_usage();
72 }
73
74 /* Get the priority adjustment (absolute or relative). */
75 adjustment = xatoi_range(arg, INT_MIN/2, INT_MAX/2);
76
77 while ((arg = *++argv) != NULL) {
78 /* Check for a mode switch. */
79 if (arg[0] == '-' && arg[1]) {
80 static const char opts[] ALIGN1 = {
81 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER
82 };
83 const char *p = strchr(opts, arg[1]);
84 if (p) {
85 which = p[4];
86 if (!arg[2])
87 continue;
88 arg += 2;
89 }
90 }
91
92 /* Process an ID arg. */
93 if (which == PRIO_USER) {
94 struct passwd *p;
95 p = getpwnam(arg);
96 if (!p) {
97 bb_error_msg("unknown user %s", arg);
98 goto HAD_ERROR;
99 }
100 who = p->pw_uid;
101 } else {
102 who = bb_strtou(arg, NULL, 10);
103 if (errno) {
104 bb_error_msg("invalid number '%s'", arg);
105 goto HAD_ERROR;
106 }
107 }
108
109 /* Get priority to use, and set it. */
110 if (use_relative) {
111 int old_priority;
112
113 errno = 0; /* Needed for getpriority error detection. */
114 old_priority = getpriority(which, who);
115 if (errno) {
116 bb_perror_msg(Xetpriority_msg, 'g');
117 goto HAD_ERROR;
118 }
119
120 new_priority = old_priority + adjustment;
121 } else {
122 new_priority = adjustment;
123 }
124
125 if (setpriority(which, who, new_priority) == 0) {
126 continue;
127 }
128
129 bb_perror_msg(Xetpriority_msg, 's');
130 HAD_ERROR:
131 retval = EXIT_FAILURE;
132 }
133
134 /* No need to check for errors outputing to stderr since, if it
135 * was used, the HAD_ERROR label was reached and retval was set. */
136
137 return retval;
138}
Note: See TracBrowser for help on using the repository browser.