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)(getra)(setra)#<0(flushbufs)(rereadpt)",TOYFLAG_SBIN))
   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    --setro             Set read only
  18    --setrw             Set read write
  19    --getro             Get read only
  20    --getss             Get sector size
  21    --getbsz    Get block size
  22    --setbsz BYTES      Set block size
  23    --getsz             Get device size in 512-byte sectors
  24    --getsize   Get device size in sectors (deprecated)
  25    --getsize64 Get device size in bytes
  26    --getra             Get readahead in 512-byte sectors
  27    --setra SECTORS     Set readahead
  28    --flushbufs Flush buffers
  29    --rereadpt  Reread partition table
  30*/
  31
  32#define FOR_blockdev
  33#include "toys.h"
  34#include <linux/fs.h>
  35
  36GLOBALS(
  37  long setbsz, setra;
  38)
  39
  40void blockdev_main(void)
  41{
  42  int cmds[] = {BLKRRPART, BLKFLSBUF, BLKRASET, BLKRAGET, BLKGETSIZE64, BLKGETSIZE, BLKGETSIZE64,
  43                BLKBSZSET, BLKBSZGET, BLKSSZGET, BLKROGET, BLKROSET, BLKROSET};
  44  char **ss;
  45  long long val = 0;
  46
  47  if (!toys.optflags) help_exit("need --option");
  48
  49  for (ss = toys.optargs;  *ss; ss++) {
  50    int fd = xopenro(*ss), i;
  51
  52    // Command line order discarded so perform multiple operations in flag order
  53    for (i = 0; i < 32; i++) {
  54      long flag = toys.optflags & (1<<i);
  55
  56      if (!flag) continue;
  57
  58      if (flag & FLAG_setbsz) val = TT.setbsz;
  59      else val = !!(flag & FLAG_setro);
  60
  61      if (flag & FLAG_setra) val = TT.setra;
  62
  63      xioctl(fd, cmds[i], &val);
  64
  65      flag &= FLAG_setbsz|FLAG_setro|FLAG_flushbufs|FLAG_rereadpt|FLAG_setrw|FLAG_setbsz;
  66      if (!flag) printf("%lld\n", (toys.optflags & FLAG_getsz) ? val >> 9: val);
  67    }
  68    xclose(fd);
  69  }
  70}
  71