diff options
Diffstat (limited to 'procps')
-rw-r--r-- | procps/kill.c | 10 | ||||
-rw-r--r-- | procps/renice.c | 148 |
2 files changed, 5 insertions, 153 deletions
diff --git a/procps/kill.c b/procps/kill.c index 7ae5beead..975a3e8c5 100644 --- a/procps/kill.c +++ b/procps/kill.c | |||
@@ -201,7 +201,7 @@ int kill_main(int argc UNUSED_PARAM, char **argv) | |||
201 | pid_t sid; | 201 | pid_t sid; |
202 | procps_status_t* p = NULL; | 202 | procps_status_t* p = NULL; |
203 | /* compat: exitcode 2 is "no one was signaled" */ | 203 | /* compat: exitcode 2 is "no one was signaled" */ |
204 | int ret = 2; | 204 | errors = 2; |
205 | 205 | ||
206 | /* Find out our session id */ | 206 | /* Find out our session id */ |
207 | sid = getsid(pid); | 207 | sid = getsid(pid); |
@@ -229,7 +229,7 @@ int kill_main(int argc UNUSED_PARAM, char **argv) | |||
229 | arg = *args++; | 229 | arg = *args++; |
230 | if (arg[0] != '-' || arg[1] != 'o') { | 230 | if (arg[0] != '-' || arg[1] != 'o') { |
231 | bb_error_msg("bad option '%s'", arg); | 231 | bb_error_msg("bad option '%s'", arg); |
232 | ret = 1; | 232 | errors = 1; |
233 | goto resume; | 233 | goto resume; |
234 | } | 234 | } |
235 | arg += 2; | 235 | arg += 2; |
@@ -238,21 +238,21 @@ int kill_main(int argc UNUSED_PARAM, char **argv) | |||
238 | omit = bb_strtoi(arg, NULL, 10); | 238 | omit = bb_strtoi(arg, NULL, 10); |
239 | if (errno) { | 239 | if (errno) { |
240 | bb_error_msg("invalid number '%s'", arg); | 240 | bb_error_msg("invalid number '%s'", arg); |
241 | ret = 1; | 241 | errors = 1; |
242 | goto resume; | 242 | goto resume; |
243 | } | 243 | } |
244 | if (p->pid == omit) | 244 | if (p->pid == omit) |
245 | goto dont_kill; | 245 | goto dont_kill; |
246 | } | 246 | } |
247 | kill(p->pid, signo); | 247 | kill(p->pid, signo); |
248 | ret = 0; | 248 | errors = 0; |
249 | dont_kill: ; | 249 | dont_kill: ; |
250 | } | 250 | } |
251 | resume: | 251 | resume: |
252 | /* And let them continue */ | 252 | /* And let them continue */ |
253 | if (signo != SIGSTOP && signo != SIGCONT) | 253 | if (signo != SIGSTOP && signo != SIGCONT) |
254 | kill(-1, SIGCONT); | 254 | kill(-1, SIGCONT); |
255 | return ret; | 255 | return errors; |
256 | } | 256 | } |
257 | 257 | ||
258 | #if ENABLE_KILL || ENABLE_KILLALL | 258 | #if ENABLE_KILL || ENABLE_KILLALL |
diff --git a/procps/renice.c b/procps/renice.c deleted file mode 100644 index 64213c680..000000000 --- a/procps/renice.c +++ /dev/null | |||
@@ -1,148 +0,0 @@ | |||
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 | //config:config RENICE | ||
22 | //config: bool "renice" | ||
23 | //config: default y | ||
24 | //config: help | ||
25 | //config: Renice alters the scheduling priority of one or more running | ||
26 | //config: processes. | ||
27 | |||
28 | //applet:IF_RENICE(APPLET(renice, BB_DIR_USR_BIN, BB_SUID_DROP)) | ||
29 | |||
30 | //kbuild:lib-$(CONFIG_RENICE) += renice.o | ||
31 | |||
32 | //usage:#define renice_trivial_usage | ||
33 | //usage: "[-n] PRIORITY [[-p | -g | -u] ID...]..." | ||
34 | //usage:#define renice_full_usage "\n\n" | ||
35 | //usage: "Change scheduling priority of a running process\n" | ||
36 | //usage: "\n -n Add PRIORITY to current nice value" | ||
37 | //usage: "\n Without -n, nice value is set to PRIORITY" | ||
38 | //usage: "\n -p Process ids (default)" | ||
39 | //usage: "\n -g Process group ids" | ||
40 | //usage: "\n -u Process user names" | ||
41 | |||
42 | #include "libbb.h" | ||
43 | #include <sys/resource.h> | ||
44 | |||
45 | void BUG_bad_PRIO_PROCESS(void); | ||
46 | void BUG_bad_PRIO_PGRP(void); | ||
47 | void BUG_bad_PRIO_USER(void); | ||
48 | |||
49 | int renice_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
50 | int renice_main(int argc UNUSED_PARAM, char **argv) | ||
51 | { | ||
52 | static const char Xetpriority_msg[] ALIGN1 = "%cetpriority"; | ||
53 | |||
54 | int retval = EXIT_SUCCESS; | ||
55 | int which = PRIO_PROCESS; /* Default 'which' value. */ | ||
56 | int use_relative = 0; | ||
57 | int adjustment, new_priority; | ||
58 | unsigned who; | ||
59 | char *arg; | ||
60 | |||
61 | /* Yes, they are not #defines in glibc 2.4! #if won't work */ | ||
62 | if (PRIO_PROCESS < CHAR_MIN || PRIO_PROCESS > CHAR_MAX) | ||
63 | BUG_bad_PRIO_PROCESS(); | ||
64 | if (PRIO_PGRP < CHAR_MIN || PRIO_PGRP > CHAR_MAX) | ||
65 | BUG_bad_PRIO_PGRP(); | ||
66 | if (PRIO_USER < CHAR_MIN || PRIO_USER > CHAR_MAX) | ||
67 | BUG_bad_PRIO_USER(); | ||
68 | |||
69 | arg = *++argv; | ||
70 | |||
71 | /* Check if we are using a relative adjustment. */ | ||
72 | if (arg && arg[0] == '-' && arg[1] == 'n') { | ||
73 | use_relative = 1; | ||
74 | if (!arg[2]) | ||
75 | arg = *++argv; | ||
76 | else | ||
77 | arg += 2; | ||
78 | } | ||
79 | |||
80 | if (!arg) { /* No args? Then show usage. */ | ||
81 | bb_show_usage(); | ||
82 | } | ||
83 | |||
84 | /* Get the priority adjustment (absolute or relative). */ | ||
85 | adjustment = xatoi_range(arg, INT_MIN/2, INT_MAX/2); | ||
86 | |||
87 | while ((arg = *++argv) != NULL) { | ||
88 | /* Check for a mode switch. */ | ||
89 | if (arg[0] == '-' && arg[1]) { | ||
90 | static const char opts[] ALIGN1 = { | ||
91 | 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER | ||
92 | }; | ||
93 | const char *p = strchr(opts, arg[1]); | ||
94 | if (p) { | ||
95 | which = p[4]; | ||
96 | if (!arg[2]) | ||
97 | continue; | ||
98 | arg += 2; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | /* Process an ID arg. */ | ||
103 | if (which == PRIO_USER) { | ||
104 | struct passwd *p; | ||
105 | p = getpwnam(arg); | ||
106 | if (!p) { | ||
107 | bb_error_msg("unknown user %s", arg); | ||
108 | goto HAD_ERROR; | ||
109 | } | ||
110 | who = p->pw_uid; | ||
111 | } else { | ||
112 | who = bb_strtou(arg, NULL, 10); | ||
113 | if (errno) { | ||
114 | bb_error_msg("invalid number '%s'", arg); | ||
115 | goto HAD_ERROR; | ||
116 | } | ||
117 | } | ||
118 | |||
119 | /* Get priority to use, and set it. */ | ||
120 | if (use_relative) { | ||
121 | int old_priority; | ||
122 | |||
123 | errno = 0; /* Needed for getpriority error detection. */ | ||
124 | old_priority = getpriority(which, who); | ||
125 | if (errno) { | ||
126 | bb_perror_msg(Xetpriority_msg, 'g'); | ||
127 | goto HAD_ERROR; | ||
128 | } | ||
129 | |||
130 | new_priority = old_priority + adjustment; | ||
131 | } else { | ||
132 | new_priority = adjustment; | ||
133 | } | ||
134 | |||
135 | if (setpriority(which, who, new_priority) == 0) { | ||
136 | continue; | ||
137 | } | ||
138 | |||
139 | bb_perror_msg(Xetpriority_msg, 's'); | ||
140 | HAD_ERROR: | ||
141 | retval = EXIT_FAILURE; | ||
142 | } | ||
143 | |||
144 | /* No need to check for errors outputing to stderr since, if it | ||
145 | * was used, the HAD_ERROR label was reached and retval was set. */ | ||
146 | |||
147 | return retval; | ||
148 | } | ||