diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-05 12:03:48 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-05 12:03:48 +0200 |
commit | ae5ca6fc417161eb514103d3c2b38add18012760 (patch) | |
tree | 44f30bb87ef774528e3a00e63afb9da24e554a69 | |
parent | 29c2dcfe1c934f75c87f5a0bc3bf42b2e73f294c (diff) | |
download | busybox-w32-ae5ca6fc417161eb514103d3c2b38add18012760.tar.gz busybox-w32-ae5ca6fc417161eb514103d3c2b38add18012760.tar.bz2 busybox-w32-ae5ca6fc417161eb514103d3c2b38add18012760.zip |
chrt: do not segfault if policy number is unknown
While at it, improve help text
function old new delta
packed_usage 33319 33344 +25
policy_name - 22 +22
show_min_max 59 64 +5
chrt_main 432 429 -3
policies 72 - -72
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 2/1 up/down: 52/-75) Total: -23 bytes
text data bss dec hex filename
982150 485 7296 989931 f1aeb busybox_old
982183 485 7296 989964 f1b0c busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | util-linux/chrt.c | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/util-linux/chrt.c b/util-linux/chrt.c index 28e65457c..ede92310f 100644 --- a/util-linux/chrt.c +++ b/util-linux/chrt.c | |||
@@ -17,16 +17,16 @@ | |||
17 | //kbuild:lib-$(CONFIG_CHRT) += chrt.o | 17 | //kbuild:lib-$(CONFIG_CHRT) += chrt.o |
18 | 18 | ||
19 | //usage:#define chrt_trivial_usage | 19 | //usage:#define chrt_trivial_usage |
20 | //usage: "[-prfombi] [PRIO] [PID | PROG ARGS]" | 20 | //usage: "-m | -p [PRIO] PID | [-rfobi] PRIO PROG [ARGS]" |
21 | //usage:#define chrt_full_usage "\n\n" | 21 | //usage:#define chrt_full_usage "\n\n" |
22 | //usage: "Change scheduling priority and class for a process\n" | 22 | //usage: "Change scheduling priority and class for a process\n" |
23 | //usage: "\n -m Show min/max priorities" | ||
23 | //usage: "\n -p Operate on PID" | 24 | //usage: "\n -p Operate on PID" |
24 | //usage: "\n -r Set SCHED_RR class" | 25 | //usage: "\n -r Set SCHED_RR class" |
25 | //usage: "\n -f Set SCHED_FIFO class" | 26 | //usage: "\n -f Set SCHED_FIFO class" |
26 | //usage: "\n -o Set SCHED_OTHER class" | 27 | //usage: "\n -o Set SCHED_OTHER class" |
27 | //usage: "\n -b Set SCHED_BATCH class" | 28 | //usage: "\n -b Set SCHED_BATCH class" |
28 | //usage: "\n -i Set SCHED_IDLE class" | 29 | //usage: "\n -i Set SCHED_IDLE class" |
29 | //usage: "\n -m Show min/max priorities" | ||
30 | //usage: | 30 | //usage: |
31 | //usage:#define chrt_example_usage | 31 | //usage:#define chrt_example_usage |
32 | //usage: "$ chrt -r 4 sleep 900; x=$!\n" | 32 | //usage: "$ chrt -r 4 sleep 900; x=$!\n" |
@@ -39,28 +39,32 @@ | |||
39 | # define SCHED_IDLE 5 | 39 | # define SCHED_IDLE 5 |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | static const struct { | 42 | static const char *policy_name(int pol) |
43 | char name[sizeof("SCHED_OTHER")]; | 43 | { |
44 | } policies[] = { | 44 | if (pol > 6) |
45 | { "SCHED_OTHER" }, /* 0:SCHED_OTHER */ | 45 | return utoa(pol); |
46 | { "SCHED_FIFO" }, /* 1:SCHED_FIFO */ | 46 | return nth_string( |
47 | { "SCHED_RR" }, /* 2:SCHED_RR */ | 47 | "OTHER" "\0" /* 0:SCHED_OTHER */ |
48 | { "SCHED_BATCH" }, /* 3:SCHED_BATCH */ | 48 | "FIFO" "\0" /* 1:SCHED_FIFO */ |
49 | { "" }, /* 4:SCHED_ISO */ | 49 | "RR" "\0" /* 2:SCHED_RR */ |
50 | { "SCHED_IDLE" }, /* 5:SCHED_IDLE */ | 50 | "BATCH" "\0" /* 3:SCHED_BATCH */ |
51 | /* 6:SCHED_DEADLINE */ | 51 | "ISO" "\0" /* 4:SCHED_ISO */ |
52 | }; | 52 | "IDLE" "\0" /* 5:SCHED_IDLE */ |
53 | "DEADLINE", /* 6:SCHED_DEADLINE */ | ||
54 | pol | ||
55 | ); | ||
56 | } | ||
53 | 57 | ||
54 | static void show_min_max(int pol) | 58 | static void show_min_max(int pol) |
55 | { | 59 | { |
56 | const char *fmt = "%s min/max priority\t: %u/%u\n"; | 60 | const char *fmt = "SCHED_%s min/max priority\t: %u/%u\n"; |
57 | int max, min; | 61 | int max, min; |
58 | 62 | ||
59 | max = sched_get_priority_max(pol); | 63 | max = sched_get_priority_max(pol); |
60 | min = sched_get_priority_min(pol); | 64 | min = sched_get_priority_min(pol); |
61 | if ((max|min) < 0) | 65 | if ((max|min) < 0) |
62 | fmt = "%s not supported\n"; | 66 | fmt = "SCHED_%s not supported\n"; |
63 | printf(fmt, policies[pol].name, min, max); | 67 | printf(fmt, policy_name(pol), min, max); |
64 | } | 68 | } |
65 | 69 | ||
66 | #define OPT_m (1<<0) | 70 | #define OPT_m (1<<0) |
@@ -112,11 +116,11 @@ int chrt_main(int argc UNUSED_PARAM, char **argv) | |||
112 | bb_show_usage(); | 116 | bb_show_usage(); |
113 | if (opt & OPT_p) { | 117 | if (opt & OPT_p) { |
114 | pid_str = *argv++; | 118 | pid_str = *argv++; |
115 | if (*argv) { /* "-p <priority> <pid> [...]" */ | 119 | if (*argv) { /* "-p PRIO PID [...]" */ |
116 | priority = pid_str; | 120 | priority = pid_str; |
117 | pid_str = *argv; | 121 | pid_str = *argv; |
118 | } | 122 | } |
119 | /* else "-p <pid>", and *argv == NULL */ | 123 | /* else "-p PID", and *argv == NULL */ |
120 | pid = xatoul_range(pid_str, 1, ((unsigned)(pid_t)ULONG_MAX) >> 1); | 124 | pid = xatoul_range(pid_str, 1, ((unsigned)(pid_t)ULONG_MAX) >> 1); |
121 | } else { | 125 | } else { |
122 | priority = *argv++; | 126 | priority = *argv++; |
@@ -130,16 +134,18 @@ int chrt_main(int argc UNUSED_PARAM, char **argv) | |||
130 | print_rt_info: | 134 | print_rt_info: |
131 | pol = sched_getscheduler(pid); | 135 | pol = sched_getscheduler(pid); |
132 | if (pol < 0) | 136 | if (pol < 0) |
133 | bb_perror_msg_and_die("can't %cet pid %d's policy", 'g', (int)pid); | 137 | bb_perror_msg_and_die("can't %cet pid %u's policy", 'g', (int)pid); |
134 | printf("pid %d's %s scheduling policy: %s\n", | 138 | printf("pid %u's %s scheduling policy: SCHED_%s\n", |
135 | pid, current_new, policies[pol].name); | 139 | pid, current_new, policy_name(pol) |
140 | ); | ||
136 | if (sched_getparam(pid, &sp)) | 141 | if (sched_getparam(pid, &sp)) |
137 | bb_perror_msg_and_die("can't get pid %d's attributes", (int)pid); | 142 | bb_perror_msg_and_die("can't get pid %u's attributes", (int)pid); |
138 | printf("pid %d's %s scheduling priority: %d\n", | 143 | printf("pid %u's %s scheduling priority: %d\n", |
139 | (int)pid, current_new, sp.sched_priority); | 144 | (int)pid, current_new, sp.sched_priority |
145 | ); | ||
140 | if (!*argv) { | 146 | if (!*argv) { |
141 | /* Either it was just "-p <pid>", | 147 | /* Either it was just "-p PID", |
142 | * or it was "-p <priority> <pid>" and we came here | 148 | * or it was "-p PRIO PID" and we came here |
143 | * for the second time (see goto below) */ | 149 | * for the second time (see goto below) */ |
144 | return EXIT_SUCCESS; | 150 | return EXIT_SUCCESS; |
145 | } | 151 | } |
@@ -152,9 +158,9 @@ int chrt_main(int argc UNUSED_PARAM, char **argv) | |||
152 | ); | 158 | ); |
153 | 159 | ||
154 | if (sched_setscheduler(pid, policy, &sp) < 0) | 160 | if (sched_setscheduler(pid, policy, &sp) < 0) |
155 | bb_perror_msg_and_die("can't %cet pid %d's policy", 's', (int)pid); | 161 | bb_perror_msg_and_die("can't %cet pid %u's policy", 's', (int)pid); |
156 | 162 | ||
157 | if (!argv[0]) /* "-p <priority> <pid> [...]" */ | 163 | if (!argv[0]) /* "-p PRIO PID [...]" */ |
158 | goto print_rt_info; | 164 | goto print_rt_info; |
159 | 165 | ||
160 | BB_EXECVP_or_die(argv); | 166 | BB_EXECVP_or_die(argv); |