aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util-linux/blockdev.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/util-linux/blockdev.c b/util-linux/blockdev.c
index c2fcaee88..4aed02982 100644
--- a/util-linux/blockdev.c
+++ b/util-linux/blockdev.c
@@ -26,7 +26,8 @@
26//usage: "\n --getss Get sector size" 26//usage: "\n --getss Get sector size"
27//usage: "\n --getbsz Get block size" 27//usage: "\n --getbsz Get block size"
28//usage: "\n --setbsz BYTES Set block size" 28//usage: "\n --setbsz BYTES Set block size"
29//usage: "\n --getsize Get device size in 512-byte sectors" 29//usage: "\n --getsz Get device size in 512-byte sectors"
30/*//usage: "\n --getsize Get device size in sectors (deprecated)"*/
30//usage: "\n --getsize64 Get device size in bytes" 31//usage: "\n --getsize64 Get device size in bytes"
31//usage: "\n --flushbufs Flush buffers" 32//usage: "\n --flushbufs Flush buffers"
32//usage: "\n --rereadpt Reread partition table" 33//usage: "\n --rereadpt Reread partition table"
@@ -45,6 +46,7 @@ enum {
45 46
46 FL_USRARG = 4, /* argument is provided by user */ 47 FL_USRARG = 4, /* argument is provided by user */
47 FL_NORESULT = 8, 48 FL_NORESULT = 8,
49 FL_SCALE512 = 16,
48}; 50};
49 51
50struct bdc { 52struct bdc {
@@ -86,6 +88,11 @@ static const struct bdc bdcommands[] = {
86 .flags = ARG_INT + FL_NORESULT + FL_USRARG, 88 .flags = ARG_INT + FL_NORESULT + FL_USRARG,
87 .argval = 0, 89 .argval = 0,
88 },{ 90 },{
91 .ioc = BLKGETSIZE64,
92 .name = "getsz",
93 .flags = ARG_U64 + FL_SCALE512,
94 .argval = -1,
95 },{
89 .ioc = BLKGETSIZE, 96 .ioc = BLKGETSIZE,
90 .name = "getsize", 97 .name = "getsize",
91 .flags = ARG_ULONG, 98 .flags = ARG_ULONG,
@@ -123,7 +130,7 @@ static const struct bdc *find_cmd(const char *s)
123} 130}
124 131
125int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 132int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
126int blockdev_main(int argc, char **argv) 133int blockdev_main(int argc UNUSED_PARAM, char **argv)
127{ 134{
128 const struct bdc *bdcmd; 135 const struct bdc *bdcmd;
129 int fd; 136 int fd;
@@ -134,18 +141,20 @@ int blockdev_main(int argc, char **argv)
134 uint64_t u64; 141 uint64_t u64;
135 } ioctl_val_on_stack; 142 } ioctl_val_on_stack;
136 143
137 if ((unsigned)(argc - 3) > 1) /* must have 2 or 3 args */ 144 argv++;
145 if (!argv[0] || !argv[1]) /* must have at least 2 args */
138 bb_show_usage(); 146 bb_show_usage();
139 147
140 bdcmd = find_cmd(*++argv); 148 bdcmd = find_cmd(*argv);
141 149
142 u64 = (int)bdcmd->argval; 150 u64 = (int)bdcmd->argval;
143 if (bdcmd->flags & FL_USRARG) 151 if (bdcmd->flags & FL_USRARG)
144 u64 = xatoi_positive(*++argv); 152 u64 = xatoi_positive(*++argv);
145 153
146 if (!*++argv || argv[1]) 154 argv++;
155 if (!argv[0] || argv[1])
147 bb_show_usage(); 156 bb_show_usage();
148 fd = xopen(*argv, O_RDONLY); 157 fd = xopen(argv[0], O_RDONLY);
149 158
150 ioctl_val_on_stack.u64 = u64; 159 ioctl_val_on_stack.u64 = u64;
151#if BB_BIG_ENDIAN 160#if BB_BIG_ENDIAN
@@ -173,6 +182,9 @@ int blockdev_main(int argc, char **argv)
173 /* Fetch it into register(s) */ 182 /* Fetch it into register(s) */
174 u64 = ioctl_val_on_stack.u64; 183 u64 = ioctl_val_on_stack.u64;
175 184
185 if (bdcmd->flags & FL_SCALE512)
186 u64 >>= 9;
187
176 /* Zero- or one-extend the value if needed, then print */ 188 /* Zero- or one-extend the value if needed, then print */
177 switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) { 189 switch (bdcmd->flags & (ARG_MASK+FL_NORESULT)) {
178 case ARG_INT: 190 case ARG_INT: