Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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 |
Denys Vlasenko | b097a84 | 2018-12-28 03:20:17 +0100 | [diff] [blame] | 10 | //config: bool "ubirename (2.4 kb)" |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 11 | //config: default y |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 12 | //config: help |
Denys Vlasenko | 72089cf | 2017-07-21 09:50:55 +0200 | [diff] [blame] | 13 | //config: Utility to rename UBI volumes |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 14 | |
| 15 | //applet:IF_UBIRENAME(APPLET(ubirename, BB_DIR_USR_SBIN, BB_SUID_DROP)) |
Denys Vlasenko | 798b945 | 2017-08-07 16:00:25 +0200 | [diff] [blame] | 16 | /* not NOEXEC: if flash operation stalls, use less memory in "hung" process */ |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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 |
Sven Eisenberg | b068cf2 | 2016-04-03 21:53:12 +0200 | [diff] [blame] | 33 | #define UBI_MAX_VOLUME_NAME 127 |
Denys Vlasenko | 6aab992 | 2016-04-03 22:24:51 +0200 | [diff] [blame] | 34 | #define UBI_MAX_VOLUMES 128 |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 35 | // end ubi-media.h |
| 36 | |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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 | |
| 47 | struct 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 | |
| 59 | int ubirename_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 60 | int ubirename_main(int argc, char **argv) |
| 61 | { |
| 62 | struct ubi_rnvol_req *rnvol; |
| 63 | const char *ubi_devname; |
| 64 | unsigned ubi_devnum; |
Sven Eisenberg | b068cf2 | 2016-04-03 21:53:12 +0200 | [diff] [blame] | 65 | unsigned n; |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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)) |
James Byrne | 6937487 | 2019-07-02 11:35:03 +0200 | [diff] [blame] | 74 | bb_simple_error_msg_and_die("too many renames requested"); |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 75 | |
| 76 | ubi_devname = argv[1]; |
Sven Eisenberg | b068cf2 | 2016-04-03 21:53:12 +0200 | [diff] [blame] | 77 | ubi_devnum = ubi_devnum_from_devname(ubi_devname); |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 78 | |
| 79 | n = 0; |
| 80 | argv += 2; |
| 81 | while (argv[0]) { |
Denys Vlasenko | 6aab992 | 2016-04-03 22:24:51 +0200 | [diff] [blame] | 82 | rnvol->ents[n].vol_id = ubi_get_volid_by_name(ubi_devnum, argv[0]); |
Denys Vlasenko | 798b945 | 2017-08-07 16:00:25 +0200 | [diff] [blame] | 83 | |
| 84 | /* strnlen avoids overflow of 16-bit field (paranoia) */ |
| 85 | rnvol->ents[n].name_len = strnlen(argv[1], sizeof(rnvol->ents[n].name)); |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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]); |
Denys Vlasenko | 798b945 | 2017-08-07 16:00:25 +0200 | [diff] [blame] | 88 | |
Sven Eisenberg | cb92640 | 2016-04-03 20:12:03 +0200 | [diff] [blame] | 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 | } |