[PATCH] miscutils: add ubimkvol ubirmvol and ubirsvol

Reuben Dowle Reuben.Dowle at navico.com
Wed Feb 2 04:23:57 UTC 2011


Cut down version of ubimkvol, ubirmvol and ubirsvol. Does not support deleting or resizing named volumes (must use volume id), and does not support specifying size as anything other than a byte count.

Signed-off-by: Reuben Dowle <reuben.dowle at navico.com>
---
miscutils/ubi_attach_detach.c |  130 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 119 insertions(+), 11 deletions(-)

diff --git a/miscutils/ubi_attach_detach.c b/miscutils/ubi_attach_detach.c
index aa8a517..881ee69 100644
--- a/miscutils/ubi_attach_detach.c
+++ b/miscutils/ubi_attach_detach.c
@@ -3,11 +3,17 @@
  * Licensed under GPLv2, see file LICENSE in this source tree.
  */
 
-//applet:IF_UBIATTACH(APPLET_ODDNAME(ubiattach, ubi_attach_detach, BB_DIR_USR_SBIN, BB_SUID_DROP, ubiattach))
-//applet:IF_UBIDETACH(APPLET_ODDNAME(ubidetach, ubi_attach_detach, BB_DIR_USR_SBIN, BB_SUID_DROP, ubidetach))
+//applet:IF_UBIATTACH(APPLET_ODDNAME(ubiattach, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubiattach))
+//applet:IF_UBIDETACH(APPLET_ODDNAME(ubidetach, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubidetach))
+//applet:IF_UBIMKVOL(APPLET_ODDNAME(ubimkvol, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubimkvol))
+//applet:IF_UBIRMVOL(APPLET_ODDNAME(ubirmvol, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubirmvol))
+//applet:IF_UBIRSVOL(APPLET_ODDNAME(ubirsvol, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubirsvol))
 
 //kbuild:lib-$(CONFIG_UBIATTACH)   += ubi_attach_detach.o
 //kbuild:lib-$(CONFIG_UBIDETACH)   += ubi_attach_detach.o
+//kbuild:lib-$(CONFIG_UBIMKVOL)   += ubi_attach_detach.o
+//kbuild:lib-$(CONFIG_UBIRMVOL)   += ubi_attach_detach.o
+//kbuild:lib-$(CONFIG_UBIRSVOL)   += ubi_attach_detach.o
 
 //config:config UBIATTACH
 //config:	bool "ubiattach"
@@ -22,6 +28,24 @@
 //config:	depends on PLATFORM_LINUX
 //config:	help
 //config:	  Detach MTD device from an UBI device.
+//config:config UBIMKVOL
+//config:	bool "ubimkvol"
+//config:	default n
+//config:	depends on PLATFORM_LINUX
+//config:	help
+//config:	  Create a UBI volume.
+//config:config UBIRMVOL
+//config:	bool "ubirmvol"
+//config:	default n
+//config:	depends on PLATFORM_LINUX
+//config:	help
+//config:	  Delete a UBI volume.
+//config:config UBIRSVOL
+//config:	bool "ubirsvol"
+//config:	default n
+//config:	depends on PLATFORM_LINUX
+//config:	help
+//config:	  Resize a UBI volume.
 
 #include "libbb.h"
 #include <mtd/ubi-user.h>
@@ -29,8 +53,18 @@
 #define OPTION_M  (1 << 0)
 #define OPTION_D  (1 << 1)
 
-#define do_attach (ENABLE_UBIATTACH && \
-		(!ENABLE_UBIDETACH || (applet_name[3] == 'a')))
+#define OPTION_n  (1 << 0)
+#define OPTION_N  (1 << 1)
+#define OPTION_s  (1 << 2)
+#define OPTION_a  (1 << 3)
+#define OPTION_m  (1 << 4)
+#define OPTION_t  (1 << 5)
+
+#define do_attach (ENABLE_UBIATTACH && applet_name[3] == 'a')
+#define do_detach (ENABLE_UBIDETACH && applet_name[3] == 'd')
+#define do_mkvol (ENABLE_UBIMKVOL && applet_name[3] == 'm')
+#define do_rmvol (ENABLE_UBIATTACH && applet_name[4] == 'm')
+#define do_rsvol (ENABLE_UBIATTACH && applet_name[4] == 's')
 
 //usage:#define ubiattach_trivial_usage
 //usage:       "-m MTD_NUM [-d UBI_NUM] UBI_CTRL_DEV"
@@ -46,20 +80,56 @@
 //usage:       "Detach MTD device from UBI\n"
 //usage:     "\nOptions:"
 //usage:     "\n	-d UBI_NUM	UBI device number"
+//usage:
+//usage:#define ubimkvol_trivial_usage
+//usage:       "<UBI device node> -N NAME -s SIZE"
+//usage:#define ubimkvol_full_usage "\n\n"
+//usage:       "Create UBI Volume\n"
+//usage:     "\nOptions:"
+//usage:     "\n	-a ALIGNMENT	volume alignment (default is 1)"
+//usage:     "\n	-n VOLID		UBI volume ID, if not specified, the volume ID"
+//usage:     "\n					will be assigned automatically"
+//usage:     "\n	-N NAME			volume name"
+//usage:     "\n	-s SIZE			size in bytes"
+//usage:     "\n	-t TYPE			set volume type to static|dynamic"
+//usage:
+//usage:#define ubirmvol_trivial_usage
+//usage:       "<UBI device node> -n VOLID"
+//usage:#define ubirmvol_full_usage "\n\n"
+//usage:       "Remove UBI Volume\n"
+//usage:     "\nOptions:"
+//usage:     "\n	-n VOLID		volume ID to remove"
+//usage:
+//usage:#define ubirsvol_trivial_usage
+//usage:       "<UBI device node> -N NAME -s SIZE"
+//usage:#define ubirsvol_full_usage "\n\n"
+//usage:       "Create UBI Volume\n"
+//usage:     "\nOptions:"
+//usage:     "\n	-n VOLID		volume ID to resize"
+//usage:     "\n	-s SIZE			size in bytes"
 
-int ubi_attach_detach_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ubi_attach_detach_main(int argc UNUSED_PARAM, char **argv)
+int ubi_tools_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
 {
 	unsigned opts;
 	char *ubi_ctrl;
 	//struct stat st;
-	struct ubi_attach_req req;
 	int fd;
 	int mtd_num;
 	int dev_num = UBI_DEV_NUM_AUTO;
-
-	opt_complementary = "=1:m+:d+";
-	opts = getopt32(argv, "m:d:", &mtd_num, &dev_num);
+	int vol_id = UBI_VOL_NUM_AUTO;
+	char *vol_name = NULL;
+	int size_bytes;
+	int alignment = 1;
+	char *type = NULL;
+
+	if (do_attach || do_detach) {
+		opt_complementary = "=1:m+:d+";
+		opts = getopt32(argv, "m:d:n:N:s:a:m:t:", &mtd_num, &dev_num, &vol_id, &vol_name, &size_bytes, &alignment, &type);
+	} else {
+		opt_complementary = "n+:s+:a+:";
+		opts = getopt32(argv, "n:N:s:a:t:", &vol_id, &vol_name, &size_bytes, &alignment, &type);
+	}
 	ubi_ctrl = argv[optind];
 
 	fd = xopen(ubi_ctrl, O_RDWR);
@@ -68,6 +138,7 @@ int ubi_attach_detach_main(int argc UNUSED_PARAM, char **argv)
 	//	bb_error_msg_and_die("%s: not a char device", ubi_ctrl);
 
 	if (do_attach) {
+		struct ubi_attach_req req;
 		if (!(opts & OPTION_M))
 			bb_error_msg_and_die("%s device not specified", "MTD");
 
@@ -76,11 +147,48 @@ int ubi_attach_detach_main(int argc UNUSED_PARAM, char **argv)
 		req.ubi_num = dev_num;
 
 		xioctl(fd, UBI_IOCATT, &req);
-	} else { /* detach */
+	} else if (do_detach) {
 		if (!(opts & OPTION_D))
 			bb_error_msg_and_die("%s device not specified", "UBI");
 
 		xioctl(fd, UBI_IOCDET, &dev_num);
+	} else if (do_mkvol) {
+		struct ubi_mkvol_req req;
+		if (!(opts & OPTION_s))
+			bb_error_msg_and_die("%s size not specified", "UBI");
+		if (!(opts & OPTION_N))
+			bb_error_msg_and_die("%s name not specified", "UBI");
+
+		req.vol_id = vol_id;
+		if (opts & OPTION_t) {
+			if (type[0] == 's')
+				req.vol_type = UBI_STATIC_VOLUME;
+			else
+				req.vol_type = UBI_DYNAMIC_VOLUME;
+		} else
+			req.vol_type = UBI_DYNAMIC_VOLUME;
+		req.alignment = alignment;
+		req.bytes = size_bytes;
+		strcpy(req.name, vol_name);
+
+		printf("%d %d %lld %d %s\n", req.vol_id, req.alignment, req.bytes, req.vol_type, req.name);
+
+		xioctl(fd, UBI_IOCMKVOL, &req);
+	} else if (do_rmvol) {
+		if (!(opts & OPTION_n))
+			bb_error_msg_and_die("%s volume id not specified", "UBI");
+
+		xioctl(fd, UBI_IOCRMVOL, &vol_id);
+	} else if (do_rsvol) {
+		struct ubi_rsvol_req req;
+		if (!(opts & OPTION_s))
+			bb_error_msg_and_die("%s size not specified", "UBI");
+		if (!(opts & OPTION_n))
+			bb_error_msg_and_die("%s volume id not specified", "UBI");
+		req.bytes = size_bytes;
+		req.vol_id = vol_id;
+
+		xioctl(fd, UBI_IOCRMVOL, &req);
 	}
 
 	if (ENABLE_FEATURE_CLEAN_UP)


More information about the busybox mailing list