busybox/miscutils/ubirename.c
<<
>>
Prefs
   1/* ubirename - port of the ubirename from the mtd-utils package
   2 *
   3 * A utility to rename one UBI volume.
   4 *
   5 * 2016-03-01 Sven Eisenberg <sven.eisenberg@novero.com>
   6 *
   7 * Licensed under GPLv2, see file LICENSE in this source tree.
   8 */
   9//config:config UBIRENAME
  10//config:       bool "ubirename (2.4 kb)"
  11//config:       default y
  12//config:       help
  13//config:       Utility to rename UBI volumes
  14
  15//applet:IF_UBIRENAME(APPLET(ubirename, BB_DIR_USR_SBIN, BB_SUID_DROP))
  16/* not NOEXEC: if flash operation stalls, use less memory in "hung" process */
  17
  18//kbuild:lib-$(CONFIG_UBIRENAME) += ubirename.o
  19
  20//usage:#define ubirename_trivial_usage
  21//usage:        "UBI_DEVICE OLD_VOLNAME NEW_VOLNAME [OLD2 NEW2]..."
  22//usage:#define ubirename_full_usage "\n\n"
  23//usage:        "Rename UBI volumes on UBI_DEVICE"
  24
  25#include "libbb.h"
  26#include <mtd/mtd-user.h>
  27
  28#ifndef __packed
  29# define __packed __attribute__((packed))
  30#endif
  31
  32// from ubi-media.h
  33#define UBI_MAX_VOLUME_NAME 127
  34#define UBI_MAX_VOLUMES     128
  35// end ubi-media.h
  36
  37// from ubi-user.h
  38/* ioctl commands of UBI character devices */
  39#define UBI_IOC_MAGIC 'o'
  40
  41/* Re-name volumes */
  42#define UBI_IOCRNVOL _IOW(UBI_IOC_MAGIC, 3, struct ubi_rnvol_req)
  43
  44/* Maximum amount of UBI volumes that can be re-named at one go */
  45#define UBI_MAX_RNVOL 32
  46
  47struct ubi_rnvol_req {
  48        int32_t count;
  49        int8_t  padding1[12];
  50        struct {
  51                int32_t vol_id;
  52                int16_t name_len;
  53                int8_t  padding2[2];
  54                char    name[UBI_MAX_VOLUME_NAME + 1];
  55        } ents[UBI_MAX_RNVOL];
  56} __packed;
  57// end ubi-user.h
  58
  59int ubirename_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  60int ubirename_main(int argc, char **argv)
  61{
  62        struct ubi_rnvol_req *rnvol;
  63        const char *ubi_devname;
  64        unsigned ubi_devnum;
  65        unsigned n;
  66
  67        /* argc can be 4, 6, 8, ... */
  68        if ((argc & 1) || (argc >>= 1) < 2)
  69                bb_show_usage();
  70
  71        rnvol = xzalloc(sizeof(*rnvol));
  72        rnvol->count = --argc;
  73        if (argc > ARRAY_SIZE(rnvol->ents))
  74                bb_simple_error_msg_and_die("too many renames requested");
  75
  76        ubi_devname = argv[1];
  77        ubi_devnum = ubi_devnum_from_devname(ubi_devname);
  78
  79        n = 0;
  80        argv += 2;
  81        while (argv[0]) {
  82                rnvol->ents[n].vol_id = ubi_get_volid_by_name(ubi_devnum, argv[0]);
  83
  84                /* strnlen avoids overflow of 16-bit field (paranoia) */
  85                rnvol->ents[n].name_len = strnlen(argv[1], sizeof(rnvol->ents[n].name));
  86                if (rnvol->ents[n].name_len >= sizeof(rnvol->ents[n].name))
  87                        bb_error_msg_and_die("new name '%s' is too long", argv[1]);
  88
  89                strcpy(rnvol->ents[n].name, argv[1]);
  90                n++;
  91                argv += 2;
  92        }
  93
  94        xioctl(xopen(ubi_devname, O_RDONLY), UBI_IOCRNVOL, rnvol);
  95
  96        return 0;
  97}
  98