blockdev.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* blockdev.c -show/set blockdev information.
  2. *
  3. * Copyright 2014 Sameer Prakash Pradhan <sameer.p.pradhan@gmail.com>
  4. *
  5. * No Standard.
  6. USE_BLOCKDEV(NEWTOY(blockdev, "<1>1(setro)(setrw)(getro)(getss)(getbsz)(setbsz)#<0(getsz)(getsize)(getsize64)(getra)(setra)#<0(flushbufs)(rereadpt)",TOYFLAG_SBIN))
  7. config BLOCKDEV
  8. bool "blockdev"
  9. default y
  10. help
  11. usage: blockdev --OPTION... BLOCKDEV...
  12. Call ioctl(s) on each listed block device
  13. --setro Set read only
  14. --setrw Set read write
  15. --getro Get read only
  16. --getss Get sector size
  17. --getbsz Get block size
  18. --setbsz BYTES Set block size
  19. --getsz Get device size in 512-byte sectors
  20. --getsize Get device size in sectors (deprecated)
  21. --getsize64 Get device size in bytes
  22. --getra Get readahead in 512-byte sectors
  23. --setra SECTORS Set readahead
  24. --flushbufs Flush buffers
  25. --rereadpt Reread partition table
  26. */
  27. #define FOR_blockdev
  28. #include "toys.h"
  29. #include <linux/fs.h>
  30. GLOBALS(
  31. long setbsz, setra;
  32. )
  33. void blockdev_main(void)
  34. {
  35. int cmds[] = {BLKRRPART, BLKFLSBUF, BLKRASET, BLKRAGET, BLKGETSIZE64, BLKGETSIZE, BLKGETSIZE64,
  36. BLKBSZSET, BLKBSZGET, BLKSSZGET, BLKROGET, BLKROSET, BLKROSET};
  37. char **ss;
  38. long long val = 0;
  39. if (!toys.optflags) help_exit("need --option");
  40. for (ss = toys.optargs; *ss; ss++) {
  41. int fd = xopenro(*ss), i;
  42. // Command line order discarded so perform multiple operations in flag order
  43. for (i = 0; i < 32; i++) {
  44. long flag = toys.optflags & (1<<i);
  45. if (!flag) continue;
  46. if (flag & FLAG_setbsz) val = TT.setbsz;
  47. else val = !!(flag & FLAG_setro);
  48. if (flag & FLAG_setra) val = TT.setra;
  49. xioctl(fd, cmds[i], &val);
  50. flag &= FLAG_setbsz|FLAG_setro|FLAG_flushbufs|FLAG_rereadpt|FLAG_setrw|FLAG_setbsz;
  51. if (!flag) printf("%lld\n", (toys.optflags & FLAG_getsz) ? val >> 9: val);
  52. }
  53. xclose(fd);
  54. }
  55. }