12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /* 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);
- }
- }
|