This patch adds the ubiupdatevol applet (from mtd-utils) to busybox.

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 |   87 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/miscutils/ubi_attach_detach.c b/miscutils/ubi_attach_detach.c
index 9007f8c..ed82162 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"
@@ -102,12 +112,20 @@
 //usage:     "\n       -n VOLID        Volume ID"
 //usage:
 //usage:#define ubirsvol_trivial_usage
-//usage:       "UBI_DEVICE -N NAME -s SIZE"
+//usage:       "UBI_DEVICE -n VOLID -s SIZE"
 //usage:#define ubirsvol_full_usage "\n\n"
 //usage:       "Resize UBI Volume\n"
 //usage:     "\nOptions:"
-//usage:     "\n       -N NAME         Volume name"
+//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,67 @@ 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 name 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);
+                       if (!sysfs_fd)
+                               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 sysfs not accessible", 
"UBI");
+                       if (ENABLE_FEATURE_CLEAN_UP)
+                               close(sysfs_fd);
+                       if (sscanf(buf, "%d", &leb_size) != 1)
+                               bb_error_msg_and_die("%s sysfs not accessible", 
"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);
+                               if (!input_fd)
+                                       bb_error_msg_and_die("%s volume input 
file missing", "UBI");
+                       }
+
+                       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 (ENABLE_FEATURE_CLEAN_UP)
+                               close(input_fd);
+                       if (len < 0)
+                               bb_error_msg_and_die("%s volume update failed", 
"UBI");
+               }
        }
 
        if (ENABLE_FEATURE_CLEAN_UP)


_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to