diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 17:37:52 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 17:37:52 +0200 |
commit | 571c5ab768075c98da547e627b457d9188dca350 (patch) | |
tree | 749e1d5df47f77bdd510e6c37ad81c659bcb5f2e /util-linux/blockdev.c | |
parent | a35dfe62004abaa116d01155605e3f3df379688c (diff) | |
download | busybox-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>
Diffstat (limited to 'util-linux/blockdev.c')
-rw-r--r-- | util-linux/blockdev.c | 56 |
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; | |||
125 | int blockdev_main(int argc, char **argv) | 126 | int 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 | ||