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