summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-09-06 17:37:52 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-09-06 17:37:52 +0200
commit571c5ab768075c98da547e627b457d9188dca350 (patch)
tree749e1d5df47f77bdd510e6c37ad81c659bcb5f2e
parenta35dfe62004abaa116d01155605e3f3df379688c (diff)
downloadbusybox-w32-571c5ab768075c98da547e627b457d9188dca350.tar.gz
busybox-w32-571c5ab768075c98da547e627b457d9188dca350.tar.bz2
busybox-w32-571c5ab768075c98da547e627b457d9188dca350.zip
blockdev: code shrink
function old new delta blockdev_main 292 255 -37 Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--util-linux/blockdev.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/util-linux/blockdev.c b/util-linux/blockdev.c
index a780d2238..29c288a15 100644
--- a/util-linux/blockdev.c
+++ b/util-linux/blockdev.c
@@ -3,7 +3,7 @@
3 * 3 *
4 * Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com> 4 * Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com>
5 * 5 *
6 * Licensed under GPLv2, see file LICENSE in this source tree. 6 * Licensed under GPLv2, see file License in this tarball for details.
7 */ 7 */
8 8
9//applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP)) 9//applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
@@ -39,7 +39,8 @@ enum {
39 ARG_NONE = 0, 39 ARG_NONE = 0,
40 ARG_INT = 1, 40 ARG_INT = 1,
41 ARG_ULONG = 2, 41 ARG_ULONG = 2,
42 ARG_ULLONG = 3, 42 /* Yes, BLKGETSIZE64 takes pointer to uint64_t, not ullong! */
43 ARG_U64 = 3,
43 ARG_MASK = 3, 44 ARG_MASK = 3,
44 45
45 FL_USRARG = 4, /* argument is provided by user */ 46 FL_USRARG = 4, /* argument is provided by user */
@@ -92,7 +93,7 @@ static const struct bdc bdcommands[] = {
92 },{ 93 },{
93 .ioc = BLKGETSIZE64, 94 .ioc = BLKGETSIZE64,
94 .name = "getsize64", 95 .name = "getsize64",
95 .flags = ARG_ULLONG, 96 .flags = ARG_U64,
96 .argval = -1, 97 .argval = -1,
97 },{ 98 },{
98 .ioc = BLKFLSBUF, 99 .ioc = BLKFLSBUF,
@@ -125,55 +126,66 @@ int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
125int blockdev_main(int argc, char **argv) 126int blockdev_main(int argc, char **argv)
126{ 127{
127 const struct bdc *bdcmd; 128 const struct bdc *bdcmd;
128 void *ioctl_ptr;
129 int fd; 129 int fd;
130 int iarg; 130 uint64_t u64;
131 unsigned long lu; 131 union {
132 unsigned long long llu; 132 int i;
133 unsigned long lu;
134 uint64_t u64;
135 } ioctl_val_on_stack;
133 136
134 if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */ 137 if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */
135 bb_show_usage(); 138 bb_show_usage();
136 139
137 bdcmd = find_cmd(*++argv); 140 bdcmd = find_cmd(*++argv);
138 141
139 llu = (int)bdcmd->argval; 142 u64 = (int)bdcmd->argval;
140 if (bdcmd->flags & FL_USRARG) 143 if (bdcmd->flags & FL_USRARG)
141 llu = xatoi_positive(*++argv); 144 u64 = xatoi_positive(*++argv);
142 lu = llu;
143 iarg = llu;
144 145
145 if (!*++argv || argv[1]) 146 if (!*++argv || argv[1])
146 bb_show_usage(); 147 bb_show_usage();
147 fd = xopen(*argv, O_RDONLY); 148 fd = xopen(*argv, O_RDONLY);
148 149
149 ioctl_ptr = NULL; 150 ioctl_val_on_stack.u64 = u64;
151#if BB_BIG_ENDIAN
152 /* Store data properly wrt data size.
153 * (1) It's no-op for little-endian.
154 * (2) it's no-op for 0 and -1. Only --setro uses arg != 0 and != -1,
155 * and it is ARG_INT. --setbsz USER_VAL is also ARG_INT.
156 * Thus, we don't need to handle ARG_ULONG.
157 */
150 switch (bdcmd->flags & ARG_MASK) { 158 switch (bdcmd->flags & ARG_MASK) {
151 case ARG_INT: 159 case ARG_INT:
152 ioctl_ptr = &iarg; 160 ioctl_val_on_stack.i = (int)u64;
153 break; 161 break;
162# if 0 /* unused */
154 case ARG_ULONG: 163 case ARG_ULONG:
155 ioctl_ptr = &lu; 164 ioctl_val_on_stack.lu = (unsigned long)u64;
156 break;
157 case ARG_ULLONG:
158 ioctl_ptr = &llu;
159 break; 165 break;
166# endif
160 } 167 }
168#endif
161 169
162 if (ioctl(fd, bdcmd->ioc, ioctl_ptr) == -1) 170 if (ioctl(fd, bdcmd->ioc, &ioctl_val_on_stack.u64) == -1)
163 bb_simple_perror_msg_and_die(*argv); 171 bb_simple_perror_msg_and_die(*argv);
164 172
173 /* Fetch it into register(s) */
174 u64 = ioctl_val_on_stack.u64;
175
176 /* Zero- or one-extend the value if needed, then print */
165 switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) { 177 switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) {
166 case ARG_INT: 178 case ARG_INT:
167 /* Smaller code when we use long long 179 /* Smaller code when we use long long
168 * (gcc tail-merges printf call) 180 * (gcc tail-merges printf call)
169 */ 181 */
170 printf("%lld\n", (long long)iarg); 182 printf("%lld\n", (long long)(int)u64);
171 break; 183 break;
172 case ARG_ULONG: 184 case ARG_ULONG:
173 llu = lu; 185 u64 = (unsigned long)u64;
174 /* FALLTHROUGH */ 186 /* FALLTHROUGH */
175 case ARG_ULLONG: 187 case ARG_U64:
176 printf("%llu\n", llu); 188 printf("%llu\n", (unsigned long long)u64);
177 break; 189 break;
178 } 190 }
179 191