aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
authorIsaac Dunham <ibid.ag@gmail.com>2013-10-27 19:11:07 -0500
committerIsaac Dunham <ibid.ag@gmail.com>2013-10-27 19:11:07 -0500
commit159e529c19382e7528a75633de240e3bf5cf68f5 (patch)
tree0fc1ab534b38a4d1c29b0797e32169e6c79b56a7 /toys
parentc9cc530371a981eef37fab4be6d6669e27b7fa0d (diff)
downloadtoybox-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.c17
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;