diff options
author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2002-11-03 14:05:15 +0000 |
---|---|---|
committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2002-11-03 14:05:15 +0000 |
commit | 2967488be46c8e0454faf05f966826f9cfb9b746 (patch) | |
tree | 3fb6a9c10150303aca3c218b47aaf327a186382a /archival/cpio.c | |
parent | 76351c0a9c44f998dd9be624435bf96392c4e088 (diff) | |
download | busybox-w32-2967488be46c8e0454faf05f966826f9cfb9b746.tar.gz busybox-w32-2967488be46c8e0454faf05f966826f9cfb9b746.tar.bz2 busybox-w32-2967488be46c8e0454faf05f966826f9cfb9b746.zip |
Abstract read and seek in unarchiving code, convert bunzip to file descriptors, support tar -j
git-svn-id: svn://busybox.net/trunk/busybox@5787 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'archival/cpio.c')
-rw-r--r-- | archival/cpio.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/archival/cpio.c b/archival/cpio.c index 761517516..0d0614932 100644 --- a/archival/cpio.c +++ b/archival/cpio.c | |||
@@ -45,6 +45,7 @@ extern int cpio_main(int argc, char **argv) | |||
45 | /* Initialise */ | 45 | /* Initialise */ |
46 | archive_handle = init_handle(); | 46 | archive_handle = init_handle(); |
47 | archive_handle->src_fd = fileno(stdin); | 47 | archive_handle->src_fd = fileno(stdin); |
48 | archive_handle->seek = seek_by_char; | ||
48 | archive_handle->action_header = header_list; | 49 | archive_handle->action_header = header_list; |
49 | 50 | ||
50 | while ((opt = getopt(argc, argv, "idmuvtF:")) != -1) { | 51 | while ((opt = getopt(argc, argv, "idmuvtF:")) != -1) { |
@@ -69,6 +70,7 @@ extern int cpio_main(int argc, char **argv) | |||
69 | break; | 70 | break; |
70 | case 'F': | 71 | case 'F': |
71 | archive_handle->src_fd = xopen(optarg, O_RDONLY); | 72 | archive_handle->src_fd = xopen(optarg, O_RDONLY); |
73 | archive_handle->seek = seek_by_jump; | ||
72 | break; | 74 | break; |
73 | default: | 75 | default: |
74 | show_usage(); | 76 | show_usage(); |
@@ -117,9 +119,9 @@ extern int cpio_main(int argc, char **argv) | |||
117 | } | 119 | } |
118 | 120 | ||
119 | /* There can be padding before archive header */ | 121 | /* There can be padding before archive header */ |
120 | archive_handle->offset += data_align(archive_handle->src_fd, archive_handle->offset, 4); | 122 | data_align(archive_handle, 4); |
121 | 123 | ||
122 | if (xread_all_eof(archive_handle->src_fd, cpio_header, 110) == 0) { | 124 | if (archive_xread_all_eof(archive_handle, cpio_header, 110) == 0) { |
123 | return(EXIT_FAILURE); | 125 | return(EXIT_FAILURE); |
124 | } | 126 | } |
125 | archive_handle->offset += 110; | 127 | archive_handle->offset += 110; |
@@ -145,12 +147,12 @@ extern int cpio_main(int argc, char **argv) | |||
145 | dummy, &major, &minor, &namesize, dummy); | 147 | dummy, &major, &minor, &namesize, dummy); |
146 | 148 | ||
147 | file_header->name = (char *) xmalloc(namesize + 1); | 149 | file_header->name = (char *) xmalloc(namesize + 1); |
148 | xread(archive_handle->src_fd, file_header->name, namesize); /* Read in filename */ | 150 | archive_xread_all(archive_handle, file_header->name, namesize); /* Read in filename */ |
149 | file_header->name[namesize] = '\0'; | 151 | file_header->name[namesize] = '\0'; |
150 | archive_handle->offset += namesize; | 152 | archive_handle->offset += namesize; |
151 | 153 | ||
152 | /* Update offset amount and skip padding before file contents */ | 154 | /* Update offset amount and skip padding before file contents */ |
153 | archive_handle->offset += data_align(archive_handle->src_fd, archive_handle->offset, 4); | 155 | data_align(archive_handle, 4); |
154 | 156 | ||
155 | if (strcmp(file_header->name, "TRAILER!!!") == 0) { | 157 | if (strcmp(file_header->name, "TRAILER!!!") == 0) { |
156 | printf("%d blocks\n", (int) (archive_handle->offset % 512 ? (archive_handle->offset / 512) + 1 : archive_handle->offset / 512)); /* Always round up */ | 158 | printf("%d blocks\n", (int) (archive_handle->offset % 512 ? (archive_handle->offset / 512) + 1 : archive_handle->offset / 512)); /* Always round up */ |
@@ -173,7 +175,7 @@ extern int cpio_main(int argc, char **argv) | |||
173 | 175 | ||
174 | if (S_ISLNK(file_header->mode)) { | 176 | if (S_ISLNK(file_header->mode)) { |
175 | file_header->link_name = (char *) xmalloc(file_header->size + 1); | 177 | file_header->link_name = (char *) xmalloc(file_header->size + 1); |
176 | xread(archive_handle->src_fd, file_header->link_name, file_header->size); | 178 | archive_xread_all(archive_handle, file_header->link_name, file_header->size); |
177 | file_header->link_name[file_header->size] = '\0'; | 179 | file_header->link_name[file_header->size] = '\0'; |
178 | archive_handle->offset += file_header->size; | 180 | archive_handle->offset += file_header->size; |
179 | file_header->size = 0; /* Stop possible seeks in future */ | 181 | file_header->size = 0; /* Stop possible seeks in future */ |