blockdev: code shrink
function old new delta blockdev_main 292 255 -37 Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
a35dfe6200
commit
571c5ab768
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com>
|
* Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com>
|
||||||
*
|
*
|
||||||
* Licensed under GPLv2, see file LICENSE in this source tree.
|
* Licensed under GPLv2, see file License in this tarball for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
|
//applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
|
||||||
@ -39,7 +39,8 @@ enum {
|
|||||||
ARG_NONE = 0,
|
ARG_NONE = 0,
|
||||||
ARG_INT = 1,
|
ARG_INT = 1,
|
||||||
ARG_ULONG = 2,
|
ARG_ULONG = 2,
|
||||||
ARG_ULLONG = 3,
|
/* Yes, BLKGETSIZE64 takes pointer to uint64_t, not ullong! */
|
||||||
|
ARG_U64 = 3,
|
||||||
ARG_MASK = 3,
|
ARG_MASK = 3,
|
||||||
|
|
||||||
FL_USRARG = 4, /* argument is provided by user */
|
FL_USRARG = 4, /* argument is provided by user */
|
||||||
@ -92,7 +93,7 @@ static const struct bdc bdcommands[] = {
|
|||||||
},{
|
},{
|
||||||
.ioc = BLKGETSIZE64,
|
.ioc = BLKGETSIZE64,
|
||||||
.name = "getsize64",
|
.name = "getsize64",
|
||||||
.flags = ARG_ULLONG,
|
.flags = ARG_U64,
|
||||||
.argval = -1,
|
.argval = -1,
|
||||||
},{
|
},{
|
||||||
.ioc = BLKFLSBUF,
|
.ioc = BLKFLSBUF,
|
||||||
@ -125,55 +126,66 @@ int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
|||||||
int blockdev_main(int argc, char **argv)
|
int blockdev_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const struct bdc *bdcmd;
|
const struct bdc *bdcmd;
|
||||||
void *ioctl_ptr;
|
|
||||||
int fd;
|
int fd;
|
||||||
int iarg;
|
uint64_t u64;
|
||||||
unsigned long lu;
|
union {
|
||||||
unsigned long long llu;
|
int i;
|
||||||
|
unsigned long lu;
|
||||||
|
uint64_t u64;
|
||||||
|
} ioctl_val_on_stack;
|
||||||
|
|
||||||
if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */
|
if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
|
|
||||||
bdcmd = find_cmd(*++argv);
|
bdcmd = find_cmd(*++argv);
|
||||||
|
|
||||||
llu = (int)bdcmd->argval;
|
u64 = (int)bdcmd->argval;
|
||||||
if (bdcmd->flags & FL_USRARG)
|
if (bdcmd->flags & FL_USRARG)
|
||||||
llu = xatoi_positive(*++argv);
|
u64 = xatoi_positive(*++argv);
|
||||||
lu = llu;
|
|
||||||
iarg = llu;
|
|
||||||
|
|
||||||
if (!*++argv || argv[1])
|
if (!*++argv || argv[1])
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
fd = xopen(*argv, O_RDONLY);
|
fd = xopen(*argv, O_RDONLY);
|
||||||
|
|
||||||
ioctl_ptr = NULL;
|
ioctl_val_on_stack.u64 = u64;
|
||||||
|
#if BB_BIG_ENDIAN
|
||||||
|
/* Store data properly wrt data size.
|
||||||
|
* (1) It's no-op for little-endian.
|
||||||
|
* (2) it's no-op for 0 and -1. Only --setro uses arg != 0 and != -1,
|
||||||
|
* and it is ARG_INT. --setbsz USER_VAL is also ARG_INT.
|
||||||
|
* Thus, we don't need to handle ARG_ULONG.
|
||||||
|
*/
|
||||||
switch (bdcmd->flags & ARG_MASK) {
|
switch (bdcmd->flags & ARG_MASK) {
|
||||||
case ARG_INT:
|
case ARG_INT:
|
||||||
ioctl_ptr = &iarg;
|
ioctl_val_on_stack.i = (int)u64;
|
||||||
break;
|
break;
|
||||||
|
# if 0 /* unused */
|
||||||
case ARG_ULONG:
|
case ARG_ULONG:
|
||||||
ioctl_ptr = &lu;
|
ioctl_val_on_stack.lu = (unsigned long)u64;
|
||||||
break;
|
|
||||||
case ARG_ULLONG:
|
|
||||||
ioctl_ptr = &llu;
|
|
||||||
break;
|
break;
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ioctl(fd, bdcmd->ioc, ioctl_ptr) == -1)
|
if (ioctl(fd, bdcmd->ioc, &ioctl_val_on_stack.u64) == -1)
|
||||||
bb_simple_perror_msg_and_die(*argv);
|
bb_simple_perror_msg_and_die(*argv);
|
||||||
|
|
||||||
|
/* Fetch it into register(s) */
|
||||||
|
u64 = ioctl_val_on_stack.u64;
|
||||||
|
|
||||||
|
/* Zero- or one-extend the value if needed, then print */
|
||||||
switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) {
|
switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) {
|
||||||
case ARG_INT:
|
case ARG_INT:
|
||||||
/* Smaller code when we use long long
|
/* Smaller code when we use long long
|
||||||
* (gcc tail-merges printf call)
|
* (gcc tail-merges printf call)
|
||||||
*/
|
*/
|
||||||
printf("%lld\n", (long long)iarg);
|
printf("%lld\n", (long long)(int)u64);
|
||||||
break;
|
break;
|
||||||
case ARG_ULONG:
|
case ARG_ULONG:
|
||||||
llu = lu;
|
u64 = (unsigned long)u64;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case ARG_ULLONG:
|
case ARG_U64:
|
||||||
printf("%llu\n", llu);
|
printf("%llu\n", (unsigned long long)u64);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user