aboutsummaryrefslogtreecommitdiff
path: root/util-linux/blockdev.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2019-03-30 20:07:21 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2019-03-30 20:07:21 +0100
commit35082fc2c17369223669e099f422acc0982ee4ff (patch)
tree15c5cfc8fbce1cc2ffc34fdbf1a6d7d1f2a72eac /util-linux/blockdev.c
parentbb3a9531b28f5c946452b92c8ac5a0951c5eab03 (diff)
downloadbusybox-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.c139
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 */
38static 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;
53static 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};
37enum { 66enum {
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 78static const uint8_t bdcmd_flags[] ALIGN1 = {
50struct 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
57static const struct bdc bdcommands[] = { 92static 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
116static 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)
130int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 102int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
131int blockdev_main(int argc UNUSED_PARAM, char **argv) 103int 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)