aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/cpio.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/archival/cpio.c b/archival/cpio.c
index daf6cffc9..7149782d7 100644
--- a/archival/cpio.c
+++ b/archival/cpio.c
@@ -45,6 +45,13 @@
45//config: depends on FEATURE_CPIO_O && LONG_OPTS 45//config: depends on FEATURE_CPIO_O && LONG_OPTS
46//config: help 46//config: help
47//config: Optionally ignore device numbers when creating archives. 47//config: Optionally ignore device numbers when creating archives.
48//config:
49//config:config FEATURE_CPIO_RENUMBER_INODES
50//config: bool "Support --renumber-inodes like GNU cpio"
51//config: default y
52//config: depends on FEATURE_CPIO_O && LONG_OPTS
53//config: help
54//config: Optionally renumber inodes when creating archives.
48 55
49//applet:IF_CPIO(APPLET(cpio, BB_DIR_BIN, BB_SUID_DROP)) 56//applet:IF_CPIO(APPLET(cpio, BB_DIR_BIN, BB_SUID_DROP))
50 57
@@ -85,6 +92,9 @@
85//usage: IF_FEATURE_CPIO_IGNORE_DEVNO( 92//usage: IF_FEATURE_CPIO_IGNORE_DEVNO(
86//usage: "\n --ignore-devno" 93//usage: "\n --ignore-devno"
87//usage: ) 94//usage: )
95//usage: IF_FEATURE_CPIO_RENUMBER_INODES(
96//usage: "\n --renumber-inodes"
97//usage: )
88 98
89/* GNU cpio 2.9 --help (abridged): 99/* GNU cpio 2.9 --help (abridged):
90 100
@@ -173,18 +183,21 @@ enum {
173 IF_LONG_OPTS( OPTBIT_QUIET ,) 183 IF_LONG_OPTS( OPTBIT_QUIET ,)
174 IF_LONG_OPTS( OPTBIT_2STDOUT ,) 184 IF_LONG_OPTS( OPTBIT_2STDOUT ,)
175 IF_FEATURE_CPIO_IGNORE_DEVNO(OPTBIT_IGNORE_DEVNO,) 185 IF_FEATURE_CPIO_IGNORE_DEVNO(OPTBIT_IGNORE_DEVNO,)
186 IF_FEATURE_CPIO_RENUMBER_INODES(OPTBIT_RENUMBER_INODES,)
176 OPT_CREATE = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE )) + 0, 187 OPT_CREATE = IF_FEATURE_CPIO_O((1 << OPTBIT_CREATE )) + 0,
177 OPT_FORMAT = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT )) + 0, 188 OPT_FORMAT = IF_FEATURE_CPIO_O((1 << OPTBIT_FORMAT )) + 0,
178 OPT_PASSTHROUGH = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0, 189 OPT_PASSTHROUGH = IF_FEATURE_CPIO_P((1 << OPTBIT_PASSTHROUGH)) + 0,
179 OPT_QUIET = IF_LONG_OPTS( (1 << OPTBIT_QUIET )) + 0, 190 OPT_QUIET = IF_LONG_OPTS( (1 << OPTBIT_QUIET )) + 0,
180 OPT_2STDOUT = IF_LONG_OPTS( (1 << OPTBIT_2STDOUT )) + 0, 191 OPT_2STDOUT = IF_LONG_OPTS( (1 << OPTBIT_2STDOUT )) + 0,
181 OPT_IGNORE_DEVNO = IF_FEATURE_CPIO_IGNORE_DEVNO((1 << OPTBIT_IGNORE_DEVNO)) + 0, 192 OPT_IGNORE_DEVNO = IF_FEATURE_CPIO_IGNORE_DEVNO((1 << OPTBIT_IGNORE_DEVNO)) + 0,
193 OPT_RENUMBER_INODES = IF_FEATURE_CPIO_RENUMBER_INODES((1 << OPTBIT_RENUMBER_INODES)) + 0,
182}; 194};
183 195
184#define OPTION_STR "it0uvdmLF:R:" 196#define OPTION_STR "it0uvdmLF:R:"
185 197
186struct globals { 198struct globals {
187 struct bb_uidgid_t owner_ugid; 199 struct bb_uidgid_t owner_ugid;
200 ino_t next_inode;
188} FIX_ALIASING; 201} FIX_ALIASING;
189#define G (*(struct globals*)bb_common_bufsiz1) 202#define G (*(struct globals*)bb_common_bufsiz1)
190void BUG_cpio_globals_too_big(void); 203void BUG_cpio_globals_too_big(void);
@@ -218,6 +231,9 @@ static NOINLINE int cpio_o(void)
218 struct inodes_s *next; 231 struct inodes_s *next;
219 struct name_s *names; 232 struct name_s *names;
220 struct stat st; 233 struct stat st;
234#if ENABLE_FEATURE_CPIO_RENUMBER_INODES
235 ino_t mapped_inode;
236#endif
221 }; 237 };
222 238
223 struct inodes_s *links = NULL; 239 struct inodes_s *links = NULL;
@@ -272,6 +288,10 @@ static NOINLINE int cpio_o(void)
272 l = xzalloc(sizeof(*l)); 288 l = xzalloc(sizeof(*l));
273 l->st = st; 289 l->st = st;
274 l->next = links; 290 l->next = links;
291#if ENABLE_FEATURE_CPIO_RENUMBER_INODES
292 if (option_mask32 & OPT_RENUMBER_INODES)
293 l->mapped_inode = ++G.next_inode;
294#endif
275 links = l; 295 links = l;
276 break; 296 break;
277 } 297 }
@@ -290,6 +310,11 @@ static NOINLINE int cpio_o(void)
290 free(line); 310 free(line);
291 continue; 311 continue;
292 } 312 }
313#if ENABLE_FEATURE_CPIO_RENUMBER_INODES
314 else if (option_mask32 & OPT_RENUMBER_INODES) {
315 st.st_ino = ++G.next_inode;
316 }
317#endif
293 } else { /* line == NULL: EOF */ 318 } else { /* line == NULL: EOF */
294 next_link: 319 next_link:
295 if (links) { 320 if (links) {
@@ -297,6 +322,10 @@ static NOINLINE int cpio_o(void)
297 st = links->st; 322 st = links->st;
298 name = links->names->name; 323 name = links->names->name;
299 links->names = links->names->next; 324 links->names = links->names->next;
325#if ENABLE_FEATURE_CPIO_RENUMBER_INODES
326 if (links->mapped_inode)
327 st.st_ino = links->mapped_inode;
328#endif
300 /* GNU cpio is reported to emit file data 329 /* GNU cpio is reported to emit file data
301 * only for the last instance. Mimic that. */ 330 * only for the last instance. Mimic that. */
302 if (links->names == NULL) 331 if (links->names == NULL)
@@ -399,6 +428,9 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
399#if ENABLE_FEATURE_CPIO_IGNORE_DEVNO 428#if ENABLE_FEATURE_CPIO_IGNORE_DEVNO
400 "ignore-devno\0" No_argument "\xfd" 429 "ignore-devno\0" No_argument "\xfd"
401#endif 430#endif
431#if ENABLE_FEATURE_CPIO_RENUMBER_INODES
432 "renumber-inodes\0" No_argument "\xfc"
433#endif
402 ; 434 ;
403#endif 435#endif
404 436