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
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox