1 /* ubirename - port of the ubirename from the mtd-utils package
3 * A utility to rename one UBI volume.
5 * 2016-03-01 Sven Eisenberg <sven.eisenberg@novero.com>
7 * Licensed under GPLv2, see file LICENSE in this source tree.
9 //config:config UBIRENAME
10 //config: bool "ubirename (2.7 kb)"
13 //config: Utility to rename UBI volumes
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 */
18 //kbuild:lib-$(CONFIG_UBIRENAME) += ubirename.o
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"
26 #include <mtd/mtd-user.h>
29 # define __packed __attribute__((packed))
33 #define UBI_MAX_VOLUME_NAME 127
34 #define UBI_MAX_VOLUMES 128
38 /* ioctl commands of UBI character devices */
39 #define UBI_IOC_MAGIC 'o'
42 #define UBI_IOCRNVOL _IOW(UBI_IOC_MAGIC, 3, struct ubi_rnvol_req)
44 /* Maximum amount of UBI volumes that can be re-named at one go */
45 #define UBI_MAX_RNVOL 32
47 struct ubi_rnvol_req
{
54 char name
[UBI_MAX_VOLUME_NAME
+ 1];
55 } ents
[UBI_MAX_RNVOL
];
59 int ubirename_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
60 int ubirename_main(int argc
, char **argv
)
62 struct ubi_rnvol_req
*rnvol
;
63 const char *ubi_devname
;
67 /* argc can be 4, 6, 8, ... */
68 if ((argc
& 1) || (argc
>>= 1) < 2)
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");
76 ubi_devname
= argv
[1];
77 ubi_devnum
= ubi_devnum_from_devname(ubi_devname
);
82 rnvol
->ents
[n
].vol_id
= ubi_get_volid_by_name(ubi_devnum
, argv
[0]);
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]);
89 strcpy(rnvol
->ents
[n
].name
, argv
[1]);
94 xioctl(xopen(ubi_devname
, O_RDONLY
), UBI_IOCRNVOL
, rnvol
);