2 * blockdev implementation for busybox
4 * Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com>
6 * Licensed under GPLv2, see file License in this tarball for details.
9 //applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
11 //kbuild:lib-$(CONFIG_BLOCKDEV) += blockdev.o
13 //config:config BLOCKDEV
14 //config: bool "blockdev"
17 //config: Performs some ioctls with block devices.
19 //usage:#define blockdev_trivial_usage
20 //usage: "OPTION [OPTARG] DEVICE"
21 //usage:#define blockdev_full_usage "\n\n"
23 //usage: "\n --setro Set ro"
24 //usage: "\n --setrw Set rw"
25 //usage: "\n --getro Get ro"
26 //usage: "\n --getss Get sector size"
27 //usage: "\n --getbsz Get block size"
28 //usage: "\n --setbsz BYTES Set block size"
29 //usage: "\n --getsize Get device size in 512-byte sectors"
30 //usage: "\n --getsize64 Get device size in bytes"
31 //usage: "\n --flushbufs Flush buffers"
32 //usage: "\n --rereadpt Reread partition table"
45 FL_USRARG = 4, /* argument is provided by user */
50 uint32_t ioc; /* ioctl code */
51 const char name[sizeof("flushbufs")]; /* "--setfoo" wothout "--" */
53 int8_t argval; /* default argument value */
56 static const struct bdc bdcommands[] = {
60 .flags = ARG_INT + FL_NORESULT,
65 .flags = ARG_INT + FL_NORESULT,
85 .flags = ARG_INT + FL_NORESULT + FL_USRARG,
100 .flags = ARG_NONE + FL_NORESULT,
105 .flags = ARG_NONE + FL_NORESULT,
110 static const struct bdc *find_cmd(const char *s)
115 for (j = 0; j < ARRAY_SIZE(bdcommands); j++)
116 if (strcmp(s, bdcommands[j].name) == 0)
117 return &bdcommands[j];
121 int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
122 int blockdev_main(int argc, char **argv)
124 const struct bdc *bdcmd;
129 unsigned long long llu;
131 if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */
134 bdcmd = find_cmd(*++argv);
136 llu = (int)bdcmd->argval;
137 if (bdcmd->flags & FL_USRARG)
138 llu = xatoi_positive(*++argv);
144 fd = xopen(*argv, O_RDONLY);
147 switch (bdcmd->flags & ARG_MASK) {
159 if (ioctl(fd, bdcmd->ioc, ioctl_ptr) == -1)
160 bb_simple_perror_msg_and_die(*argv);
162 switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) {
164 /* Smaller code when we use long long
165 * (gcc tail-merges printf call)
167 printf("%lld\n", (long long)iarg);
173 printf("%llu\n", llu);
177 if (ENABLE_FEATURE_CLEAN_UP)