Mercurial > hg > toybox
changeset 1098:46d83f3c7546 draft
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).
author | Isaac Dunham <ibid.ag@gmail.com> |
---|---|
date | Sun, 27 Oct 2013 19:11:07 -0500 |
parents | 54b2776de2f4 |
children | 71326585c02d |
files | toys/pending/cpio.c |
diffstat | 1 files changed, 6 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/toys/pending/cpio.c Sun Oct 27 00:02:56 2013 -0500 +++ b/toys/pending/cpio.c Sun Oct 27 19:11:07 2013 -0500 @@ -27,9 +27,10 @@ /* 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 @@ 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 @@ 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 @@ { 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;