You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.9 KiB
71 lines
1.9 KiB
4 months ago
|
/* blockdev.c -show/set blockdev information.
|
||
|
*
|
||
|
* Copyright 2014 Sameer Prakash Pradhan <sameer.p.pradhan@gmail.com>
|
||
|
*
|
||
|
* No Standard.
|
||
|
|
||
|
USE_BLOCKDEV(NEWTOY(blockdev, "<1>1(setro)(setrw)(getro)(getss)(getbsz)(setbsz)#<0(getsz)(getsize)(getsize64)(getra)(setra)#<0(flushbufs)(rereadpt)",TOYFLAG_SBIN))
|
||
|
|
||
|
config BLOCKDEV
|
||
|
bool "blockdev"
|
||
|
default y
|
||
|
help
|
||
|
usage: blockdev --OPTION... BLOCKDEV...
|
||
|
|
||
|
Call ioctl(s) on each listed block device
|
||
|
|
||
|
--setro Set read only
|
||
|
--setrw Set read write
|
||
|
--getro Get read only
|
||
|
--getss Get sector size
|
||
|
--getbsz Get block size
|
||
|
--setbsz BYTES Set block size
|
||
|
--getsz Get device size in 512-byte sectors
|
||
|
--getsize Get device size in sectors (deprecated)
|
||
|
--getsize64 Get device size in bytes
|
||
|
--getra Get readahead in 512-byte sectors
|
||
|
--setra SECTORS Set readahead
|
||
|
--flushbufs Flush buffers
|
||
|
--rereadpt Reread partition table
|
||
|
*/
|
||
|
|
||
|
#define FOR_blockdev
|
||
|
#include "toys.h"
|
||
|
#include <linux/fs.h>
|
||
|
|
||
|
GLOBALS(
|
||
|
long setbsz, setra;
|
||
|
)
|
||
|
|
||
|
void blockdev_main(void)
|
||
|
{
|
||
|
int cmds[] = {BLKRRPART, BLKFLSBUF, BLKRASET, BLKRAGET, BLKGETSIZE64, BLKGETSIZE, BLKGETSIZE64,
|
||
|
BLKBSZSET, BLKBSZGET, BLKSSZGET, BLKROGET, BLKROSET, BLKROSET};
|
||
|
char **ss;
|
||
|
long long val = 0;
|
||
|
|
||
|
if (!toys.optflags) help_exit("need --option");
|
||
|
|
||
|
for (ss = toys.optargs; *ss; ss++) {
|
||
|
int fd = xopenro(*ss), i;
|
||
|
|
||
|
// Command line order discarded so perform multiple operations in flag order
|
||
|
for (i = 0; i < 32; i++) {
|
||
|
long flag = toys.optflags & (1<<i);
|
||
|
|
||
|
if (!flag) continue;
|
||
|
|
||
|
if (flag & FLAG_setbsz) val = TT.setbsz;
|
||
|
else val = !!(flag & FLAG_setro);
|
||
|
|
||
|
if (flag & FLAG_setra) val = TT.setra;
|
||
|
|
||
|
xioctl(fd, cmds[i], &val);
|
||
|
|
||
|
flag &= FLAG_setbsz|FLAG_setro|FLAG_flushbufs|FLAG_rereadpt|FLAG_setrw|FLAG_setbsz;
|
||
|
if (!flag) printf("%lld\n", (toys.optflags & FLAG_getsz) ? val >> 9: val);
|
||
|
}
|
||
|
xclose(fd);
|
||
|
}
|
||
|
}
|