diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-03-30 20:07:21 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-03-30 20:07:21 +0100 |
commit | 35082fc2c17369223669e099f422acc0982ee4ff (patch) | |
tree | 15c5cfc8fbce1cc2ffc34fdbf1a6d7d1f2a72eac /util-linux/blockdev.c | |
parent | bb3a9531b28f5c946452b92c8ac5a0951c5eab03 (diff) | |
download | busybox-w32-35082fc2c17369223669e099f422acc0982ee4ff.tar.gz busybox-w32-35082fc2c17369223669e099f422acc0982ee4ff.tar.bz2 busybox-w32-35082fc2c17369223669e099f422acc0982ee4ff.zip |
blockdev: code shrink
function old new delta
bdcmd_names - 82 +82
bdcmd_ioctl - 44 +44
bdcmd_flags - 11 +11
blockdev_main 273 258 -15
bdcommands 176 - -176
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 0/1 up/down: 137/-191) Total: -54 bytes
text data bss dec hex filename
982326 485 7296 990107 f1b9b busybox_old
982272 485 7296 990053 f1b65 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux/blockdev.c')
-rw-r--r-- | util-linux/blockdev.c | 139 |
1 files changed, 58 insertions, 81 deletions
diff --git a/util-linux/blockdev.c b/util-linux/blockdev.c index 5d8e465b4..e9b5b8bf9 100644 --- a/util-linux/blockdev.c +++ b/util-linux/blockdev.c | |||
@@ -34,6 +34,35 @@ | |||
34 | #include "libbb.h" | 34 | #include "libbb.h" |
35 | #include <linux/fs.h> | 35 | #include <linux/fs.h> |
36 | 36 | ||
37 | /* Takes less space is separate arrays than one array of struct */ | ||
38 | static const char bdcmd_names[] ALIGN1 = | ||
39 | "setro" "\0" | ||
40 | #define CMD_SETRO 0 | ||
41 | "setrw" "\0" | ||
42 | "getro" "\0" | ||
43 | "getss" "\0" | ||
44 | "getbsz" "\0" | ||
45 | "setbsz" "\0" | ||
46 | #define CMD_SETBSZ 5 | ||
47 | "getsz" "\0" | ||
48 | "getsize" "\0" | ||
49 | "getsize64" "\0" | ||
50 | "flushbufs" "\0" | ||
51 | "rereadpt" "\0" | ||
52 | ; | ||
53 | static const uint32_t bdcmd_ioctl[] = { | ||
54 | BLKROSET, //setro | ||
55 | BLKROSET, //setrw | ||
56 | BLKROGET, //getro | ||
57 | BLKSSZGET, //getss | ||
58 | BLKBSZGET, //getbsz | ||
59 | BLKBSZSET, //setbsz | ||
60 | BLKGETSIZE64, //getsz | ||
61 | BLKGETSIZE, //getsize | ||
62 | BLKGETSIZE64, //getsize64 | ||
63 | BLKFLSBUF, //flushbufs | ||
64 | BLKRRPART, //rereadpt | ||
65 | }; | ||
37 | enum { | 66 | enum { |
38 | ARG_NONE = 0, | 67 | ARG_NONE = 0, |
39 | ARG_INT = 1, | 68 | ARG_INT = 1, |
@@ -46,83 +75,26 @@ enum { | |||
46 | FL_NORESULT = 8, | 75 | FL_NORESULT = 8, |
47 | FL_SCALE512 = 16, | 76 | FL_SCALE512 = 16, |
48 | }; | 77 | }; |
49 | 78 | static const uint8_t bdcmd_flags[] ALIGN1 = { | |
50 | struct bdc { | 79 | ARG_INT + FL_NORESULT, //setro |
51 | uint32_t ioc; /* ioctl code */ | 80 | ARG_INT + FL_NORESULT, //setrw |
52 | const char name[sizeof("flushbufs")]; /* "--setfoo" wothout "--" */ | 81 | ARG_INT, //getro |
53 | uint8_t flags; | 82 | ARG_INT, //getss |
54 | int8_t argval; /* default argument value */ | 83 | ARG_INT, //getbsz |
84 | ARG_INT + FL_NORESULT + FL_USRARG, //setbsz | ||
85 | ARG_U64 + FL_SCALE512, //getsz | ||
86 | ARG_ULONG, //getsize | ||
87 | ARG_U64, //getsize64 | ||
88 | ARG_NONE + FL_NORESULT, //flushbufs | ||
89 | ARG_NONE + FL_NORESULT, //rereadpt | ||
55 | }; | 90 | }; |
56 | 91 | ||
57 | static const struct bdc bdcommands[] = { | 92 | static unsigned find_cmd(const char *s) |
58 | { | ||
59 | .ioc = BLKROSET, | ||
60 | .name = "setro", | ||
61 | .flags = ARG_INT + FL_NORESULT, | ||
62 | .argval = 1, | ||
63 | },{ | ||
64 | .ioc = BLKROSET, | ||
65 | .name = "setrw", | ||
66 | .flags = ARG_INT + FL_NORESULT, | ||
67 | .argval = 0, | ||
68 | },{ | ||
69 | .ioc = BLKROGET, | ||
70 | .name = "getro", | ||
71 | .flags = ARG_INT, | ||
72 | .argval = -1, | ||
73 | },{ | ||
74 | .ioc = BLKSSZGET, | ||
75 | .name = "getss", | ||
76 | .flags = ARG_INT, | ||
77 | .argval = -1, | ||
78 | },{ | ||
79 | .ioc = BLKBSZGET, | ||
80 | .name = "getbsz", | ||
81 | .flags = ARG_INT, | ||
82 | .argval = -1, | ||
83 | },{ | ||
84 | .ioc = BLKBSZSET, | ||
85 | .name = "setbsz", | ||
86 | .flags = ARG_INT + FL_NORESULT + FL_USRARG, | ||
87 | .argval = 0, | ||
88 | },{ | ||
89 | .ioc = BLKGETSIZE64, | ||
90 | .name = "getsz", | ||
91 | .flags = ARG_U64 + FL_SCALE512, | ||
92 | .argval = -1, | ||
93 | },{ | ||
94 | .ioc = BLKGETSIZE, | ||
95 | .name = "getsize", | ||
96 | .flags = ARG_ULONG, | ||
97 | .argval = -1, | ||
98 | },{ | ||
99 | .ioc = BLKGETSIZE64, | ||
100 | .name = "getsize64", | ||
101 | .flags = ARG_U64, | ||
102 | .argval = -1, | ||
103 | },{ | ||
104 | .ioc = BLKFLSBUF, | ||
105 | .name = "flushbufs", | ||
106 | .flags = ARG_NONE + FL_NORESULT, | ||
107 | .argval = 0, | ||
108 | },{ | ||
109 | .ioc = BLKRRPART, | ||
110 | .name = "rereadpt", | ||
111 | .flags = ARG_NONE + FL_NORESULT, | ||
112 | .argval = 0, | ||
113 | } | ||
114 | }; | ||
115 | |||
116 | static const struct bdc *find_cmd(const char *s) | ||
117 | { | 93 | { |
118 | const struct bdc *bdcmd = bdcommands; | ||
119 | if (s[0] == '-' && s[1] == '-') { | 94 | if (s[0] == '-' && s[1] == '-') { |
120 | s += 2; | 95 | int n = index_in_strings(bdcmd_names, s + 2); |
121 | do { | 96 | if (n >= 0) |
122 | if (strcmp(s, bdcmd->name) == 0) | 97 | return n; |
123 | return bdcmd; | ||
124 | bdcmd++; | ||
125 | } while (bdcmd != bdcommands + ARRAY_SIZE(bdcommands)); | ||
126 | } | 98 | } |
127 | bb_show_usage(); | 99 | bb_show_usage(); |
128 | } | 100 | } |
@@ -130,7 +102,8 @@ static const struct bdc *find_cmd(const char *s) | |||
130 | int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 102 | int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
131 | int blockdev_main(int argc UNUSED_PARAM, char **argv) | 103 | int blockdev_main(int argc UNUSED_PARAM, char **argv) |
132 | { | 104 | { |
133 | const struct bdc *bdcmd; | 105 | unsigned bdcmd; |
106 | unsigned flags; | ||
134 | int fd; | 107 | int fd; |
135 | uint64_t u64; | 108 | uint64_t u64; |
136 | union { | 109 | union { |
@@ -144,10 +117,13 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
144 | bb_show_usage(); | 117 | bb_show_usage(); |
145 | 118 | ||
146 | bdcmd = find_cmd(*argv); | 119 | bdcmd = find_cmd(*argv); |
147 | 120 | /* setrw translates to BLKROSET(0), most other ioctls don't care... */ | |
148 | u64 = (int)bdcmd->argval; | 121 | /* ...setro will do BLKROSET(1) */ |
149 | if (bdcmd->flags & FL_USRARG) | 122 | u64 = (bdcmd == CMD_SETRO); |
123 | if (bdcmd == CMD_SETBSZ) { | ||
124 | /* ...setbsz is BLKBSZSET(bytes) */ | ||
150 | u64 = xatoi_positive(*++argv); | 125 | u64 = xatoi_positive(*++argv); |
126 | } | ||
151 | 127 | ||
152 | argv++; | 128 | argv++; |
153 | if (!argv[0] || argv[1]) | 129 | if (!argv[0] || argv[1]) |
@@ -155,6 +131,7 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
155 | fd = xopen(argv[0], O_RDONLY); | 131 | fd = xopen(argv[0], O_RDONLY); |
156 | 132 | ||
157 | ioctl_val_on_stack.u64 = u64; | 133 | ioctl_val_on_stack.u64 = u64; |
134 | flags = bdcmd_flags[bdcmd]; | ||
158 | #if BB_BIG_ENDIAN | 135 | #if BB_BIG_ENDIAN |
159 | /* Store data properly wrt data size. | 136 | /* Store data properly wrt data size. |
160 | * (1) It's no-op for little-endian. | 137 | * (1) It's no-op for little-endian. |
@@ -162,7 +139,7 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
162 | * and it is ARG_INT. --setbsz USER_VAL is also ARG_INT. | 139 | * and it is ARG_INT. --setbsz USER_VAL is also ARG_INT. |
163 | * Thus, we don't need to handle ARG_ULONG. | 140 | * Thus, we don't need to handle ARG_ULONG. |
164 | */ | 141 | */ |
165 | switch (bdcmd->flags & ARG_MASK) { | 142 | switch (flags & ARG_MASK) { |
166 | case ARG_INT: | 143 | case ARG_INT: |
167 | ioctl_val_on_stack.i = (int)u64; | 144 | ioctl_val_on_stack.i = (int)u64; |
168 | break; | 145 | break; |
@@ -174,17 +151,17 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
174 | } | 151 | } |
175 | #endif | 152 | #endif |
176 | 153 | ||
177 | if (ioctl(fd, bdcmd->ioc, &ioctl_val_on_stack.u64) == -1) | 154 | if (ioctl(fd, bdcmd_ioctl[bdcmd], &ioctl_val_on_stack.u64) == -1) |
178 | bb_simple_perror_msg_and_die(*argv); | 155 | bb_simple_perror_msg_and_die(*argv); |
179 | 156 | ||
180 | /* Fetch it into register(s) */ | 157 | /* Fetch it into register(s) */ |
181 | u64 = ioctl_val_on_stack.u64; | 158 | u64 = ioctl_val_on_stack.u64; |
182 | 159 | ||
183 | if (bdcmd->flags & FL_SCALE512) | 160 | if (flags & FL_SCALE512) |
184 | u64 >>= 9; | 161 | u64 >>= 9; |
185 | 162 | ||
186 | /* Zero- or one-extend the value if needed, then print */ | 163 | /* Zero- or one-extend the value if needed, then print */ |
187 | switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) { | 164 | switch (flags & (ARG_MASK+FL_NORESULT)) { |
188 | case ARG_INT: | 165 | case ARG_INT: |
189 | /* Smaller code when we use long long | 166 | /* Smaller code when we use long long |
190 | * (gcc tail-merges printf call) | 167 | * (gcc tail-merges printf call) |