diff options
author | Isaac Dunham <ibid.ag@gmail.com> | 2013-10-27 19:11:07 -0500 |
---|---|---|
committer | Isaac Dunham <ibid.ag@gmail.com> | 2013-10-27 19:11:07 -0500 |
commit | 159e529c19382e7528a75633de240e3bf5cf68f5 (patch) | |
tree | 0fc1ab534b38a4d1c29b0797e32169e6c79b56a7 /toys | |
parent | c9cc530371a981eef37fab4be6d6669e27b7fa0d (diff) | |
download | toybox-159e529c19382e7528a75633de240e3bf5cf68f5.tar.gz |
Here's a revised cpio.
I've reduced the use of malloc(), dropped an extra function call, and
-at least in theory- allowed proper handling of non-regular files.
(If we have a file we can't read, we still should record it when it's
of a type where file content is ignored).
Diffstat (limited to 'toys')
-rw-r--r-- | toys/pending/cpio.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/toys/pending/cpio.c b/toys/pending/cpio.c index 6830bc72..5608e97c 100644 --- a/toys/pending/cpio.c +++ b/toys/pending/cpio.c @@ -27,9 +27,10 @@ char * fmt; /* Iterate through a list of files, read from stdin. * No users need rw. */ -void loopfiles_stdin(void (*function)(int fd, char *name)) +void loopfiles_stdin(void (*function)(int fd, char *name, struct stat st)) { int fd; + struct stat st; char *name = toybuf; while (name != NULL){ @@ -39,9 +40,10 @@ void loopfiles_stdin(void (*function)(int fd, char *name)) if (name != NULL) { if (toybuf[strlen(name) - 1] == '\n' ) { toybuf[strlen(name) - 1 ] = '\0'; + if (lstat(name, &st) == -1) continue; fd = open(name, O_RDONLY); - if (fd > 0) { - function(fd, name); + if (fd > 0 || !S_ISREG(st.st_mode)) { + function(fd, name, st); close(fd); } errno = 0; @@ -105,13 +107,6 @@ void write_cpio_member(int fd, char *name, struct stat buf) if (buf.st_size % 4) write(1, &n, 4 - (buf.st_size % 4)); } -void write_cpio_call(int fd, char *name) -{ - struct stat buf; - if (lstat(name, &buf) == -1) return; - write_cpio_member(fd, name, buf); -} - //convert hex to uint; mostly to allow using bits of non-terminated strings unsigned int htou(char * hex) { @@ -224,7 +219,7 @@ void cpio_main(void) { switch (toys.optflags & (FLAG_i | FLAG_o | FLAG_t)) { case FLAG_o: - loopfiles_stdin(write_cpio_call); + loopfiles_stdin(write_cpio_member); write(1, "07070100000000000000000000000000000000000000010000000000000000" "000000000000000000000000000000000000000B00000000TRAILER!!!\0\0\0", 124); break; |