[PATCH]: add ubiupdatevol applet (version 2)

Reuben Dowle Reuben.Dowle at navico.com
Sun Apr 3 22:58:40 UTC 2011


This patch adds the ubiupdatevol applet (from mtd-utils) to busybox. Incorporates changes as suggested by Baruch Siach.

This version of ubiupdatevol makes some assumptions about the naming of ubi device nodes, to avoid the complexity of scanning and probing devices nodes as libubi does in the full version of ubiupdatevol.

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

diff --git a/miscutils/ubi_attach_detach.c b/miscutils/ubi_attach_detach.c
index e82dc38..e265ad7 100644
--- a/miscutils/ubi_attach_detach.c
+++ b/miscutils/ubi_attach_detach.c
@@ -37,18 +37,27 @@
 //config:	select PLATFORM_LINUX
 //config:	help
 //config:	  Resize a UBI volume.
+//config:
+//config:config UBIUPDATEVOL
+//config:	bool "ubiupdatevol"
+//config:	default y
+//config:	select PLATFORM_LINUX
+//config:	help
+//config:	  Update a UBI volume.
 
 //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))
+//applet:IF_UBIUPDATEVOL(APPLET_ODDNAME(ubiupdatevol, ubi_tools, BB_DIR_USR_SBIN, BB_SUID_DROP, ubiupdatevol))
 
 //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
+//kbuild:lib-$(CONFIG_UBIUPDATEVOL) += ubi_attach_detach.o
 
 #include "libbb.h"
 #include <mtd/ubi-user.h>
@@ -66,6 +75,7 @@
 #define do_mkvol  (ENABLE_UBIMKVOL  && applet_name[3] == 'm')
 #define do_rmvol  (ENABLE_UBIRMVOL  && applet_name[4] == 'm')
 #define do_rsvol  (ENABLE_UBIRSVOL  && applet_name[4] == 's')
+#define do_update (ENABLE_UBIUPDATEVOL && applet_name[3] == 'u')
 
 //usage:#define ubiattach_trivial_usage
 //usage:       "-m MTD_NUM [-d UBI_NUM] UBI_CTRL_DEV"
@@ -108,6 +118,14 @@
 //usage:     "\nOptions:"
 //usage:     "\n	-n VOLID	Volume ID to resize"
 //usage:     "\n	-s SIZE		Size in bytes"
+//usage:
+//usage:#define ubiupdatevol_trivial_usage
+//usage:       "<UBI device node> UBI_VOL_DEV IMG_FILE"
+//usage:#define ubiupdatevol_full_usage "\n\n"
+//usage:       "Update UBI Volume\n"
+//usage:     "\nOptions:"
+//usage:     "\n	-t		truncate UBI volume"
+//usage:     "\n	-s SIZE		bytes in input (if not reading from file)"
 
 int ubi_tools_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
@@ -124,7 +142,7 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
 	int alignment = 1;
 	char *type = NULL;
 
-	opt_complementary = "=1:m+:d+:n+:s+:a+";
+	opt_complementary = "-1:m+:d+:n+:s+:a+";
 	opts = getopt32(argv, "m:d:n:N:s:a:t:",
 			&mtd_num, &dev_num, &vol_id,
 			&vol_name, &size_bytes, &alignment, &type
@@ -166,7 +184,7 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
 
 		memset(&req, 0, sizeof(req));
 		req.vol_id = vol_id;
-		if (opts & OPTION_t) {
+		if ((opts & OPTION_t) && type) {
 			if (type[0] == 's')
 				req.vol_type = UBI_STATIC_VOLUME;
 			else
@@ -199,6 +217,64 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
 		req.vol_id = vol_id;
 
 		xioctl(fd, UBI_IOCRSVOL, &req);
+	} else
+	if (do_update) {
+		struct stat st;
+		int ubinum, volnum;
+		char buf[40];
+		int sysfs_fd;
+		int input_fd;
+		int leb_size;
+		ssize_t len;
+		long long bytes;
+		char *input_data;
+
+		if (opts & OPTION_t)
+		{
+			// truncate the volume by starting an update for size 0
+			bytes = 0;
+			xioctl(fd, UBI_IOCVOLUP, &bytes);
+		}
+		else
+		{
+			// Make assumption that device not is in normal format. Removes need for scanning sysfs tree as full libubi does
+			if (sscanf(ubi_ctrl, "/dev/ubi%d_%d", &ubinum, &volnum) != 2)
+				bb_error_msg_and_die("%s volume node not in correct format", "UBI");
+
+			snprintf(buf, sizeof(buf), "/sys/class/ubi/ubi%d_%d/usable_eb_size", ubinum, volnum);
+			sysfs_fd = xopen(buf, O_RDONLY);
+			bb_error_msg_and_die("%s sysfs not accessible", "UBI");
+			if (full_read(sysfs_fd, buf, sizeof(buf)) <= 0)
+				bb_error_msg_and_die("%s could not get LEB size", "UBI");
+			if (ENABLE_FEATURE_CLEAN_UP)
+				close(sysfs_fd);
+			if (sscanf(buf, "%d", &leb_size) != 1)
+				bb_error_msg_and_die("%s could not get LEB size", "UBI");
+
+			input_data = (char *)xmalloc(leb_size);
+			if (opts & OPTION_s)
+				input_fd = 0;
+			else
+			{
+				if (stat(argv[optind+1], &st))
+					bb_error_msg_and_die("%s volume input file missing", "UBI");
+				size_bytes = st.st_size;
+				input_fd = xopen(argv[optind+1], O_RDONLY);
+			}
+
+			bytes = size_bytes;
+			xioctl(fd, UBI_IOCVOLUP, &bytes);
+
+			while ((len = full_read(input_fd, input_data, leb_size)) > 0)
+			{
+				if (full_write(fd, input_data, leb_size) != leb_size)
+					bb_error_msg_and_die("%s volume update failed", "UBI");
+			}
+			if (len < 0)
+				bb_error_msg_and_die("%s volume update failed", "UBI");
+			if (ENABLE_FEATURE_CLEAN_UP)
+				close(input_fd);
+		}
 	}
 
 	if (ENABLE_FEATURE_CLEAN_UP)
-- 
1.7.1




More information about the busybox mailing list