aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toys/pending/blockdev.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/toys/pending/blockdev.c b/toys/pending/blockdev.c
new file mode 100644
index 00000000..9f0176f3
--- /dev/null
+++ b/toys/pending/blockdev.c
@@ -0,0 +1,92 @@
+/* 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)(flushbufs)(rereadpt)",TOYFLAG_USR|TOYFLAG_BIN))
+
+config BLOCKDEV
+ bool "blockdev"
+ default n
+ help
+ usage:blockdev OPTION BLOCKDEV
+
+
+ setro Set ro
+ setrw Set rw
+ getro Get ro
+ 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
+ flushbufs Flush buffers
+ rereadpt Reread partition table
+*/
+
+#define FOR_blockdev
+#include "toys.h"
+#include <linux/fs.h>
+
+GLOBALS(
+ long bsz;
+)
+
+void blockdev_main(void)
+{
+ long long val = 0;
+ int cmd, fd, set = 0;
+
+ switch (toys.optflags) {
+ case FLAG_setro:
+ cmd = BLKROSET;
+ val = set = 1;
+ break;
+ case FLAG_setrw:
+ cmd = BLKROSET;
+ set = 1;
+ break;
+ case FLAG_getro:
+ cmd = BLKROGET;
+ break;
+ case FLAG_getss:
+ cmd = BLKSSZGET;
+ break;
+ case FLAG_getbsz:
+ cmd = BLKBSZGET;
+ break;
+ case FLAG_setbsz:
+ cmd = BLKBSZSET;
+ set = 1;
+ val = TT.bsz;
+ break;
+ case FLAG_getsz:
+ cmd = BLKGETSIZE64;
+ break;
+ case FLAG_getsize:
+ cmd = BLKGETSIZE;
+ break;
+ case FLAG_getsize64:
+ cmd = BLKGETSIZE64;
+ break;
+ case FLAG_flushbufs:
+ cmd = BLKFLSBUF;
+ set = 1;
+ break;
+ case FLAG_rereadpt:
+ cmd = BLKRRPART;
+ set = 1;
+ break;
+ default:
+ toys.exithelp = 1;
+ error_exit(NULL);
+ }
+ fd = xopen(*toys.optargs, O_RDONLY);
+ xioctl(fd, cmd, &val);
+ if (!set)
+ printf("%lld\n", ((toys.optflags & FLAG_getsz)?val >> 9: val));
+ if (CFG_TOYBOX_FREE) xclose(fd);
+}