aboutsummaryrefslogtreecommitdiff
path: root/archival/cpio.c
diff options
context:
space:
mode:
authorbug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277>2002-11-03 14:05:15 +0000
committerbug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277>2002-11-03 14:05:15 +0000
commit2967488be46c8e0454faf05f966826f9cfb9b746 (patch)
tree3fb6a9c10150303aca3c218b47aaf327a186382a /archival/cpio.c
parent76351c0a9c44f998dd9be624435bf96392c4e088 (diff)
downloadbusybox-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.c12
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 */