blob: 8b1c3785ac6425945771e408f844ca7bf2c5ec80
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" |
11 | //config: default y |
12 | //config: select PLATFORM_LINUX |
13 | //config: help |
14 | //config: Utility to rename UBI volumes |
15 | |
16 | //applet:IF_UBIRENAME(APPLET(ubirename, BB_DIR_USR_SBIN, BB_SUID_DROP)) |
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 | |
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; |
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_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 | rnvol->ents[n].name_len = strlen(argv[1]); |
84 | if (rnvol->ents[n].name_len >= sizeof(rnvol->ents[n].name)) |
85 | bb_error_msg_and_die("new name '%s' is too long", argv[1]); |
86 | strcpy(rnvol->ents[n].name, argv[1]); |
87 | n++; |
88 | argv += 2; |
89 | } |
90 | |
91 | xioctl(xopen(ubi_devname, O_RDONLY), UBI_IOCRNVOL, rnvol); |
92 | |
93 | return 0; |
94 | } |
95 |