}
static void
-seek_sub_file(FILE *src_stream, const int count)
+seek_sub_file(FILE *fd, const int count)
{
- /* Try to fseek as faster */
archive_offset += count;
- seek_by_read(src_stream, count);
+
+ /* Do not use fseek() on a pipe. It may fail with ESPIPE, leaving the
+ * stream at an undefined location.
+ */
+ seek_by_read(fd, count);
+
return;
}
goto cleanup;
}
archive_offset += file_entry->size;
- copy_file_chunk(src_stream, dst_stream, file_entry->size);
+ *err = copy_file_chunk(src_stream, dst_stream, file_entry->size);
fclose(dst_stream);
}
break;
if (mkdir(full_name, file_entry->mode) < 0) {
if ((function & extract_quiet) != extract_quiet) {
*err = -1;
- perror_msg("%s: %s", __FUNCTION__, full_name);
+ perror_msg("Cannot make dir %s", full_name);
}
}
}
buffer = extract_archive(src_stream, out_stream,
file_entry, extract_function,
prefix, err);
+ *err = 0; /* XXX: ignore extraction errors */
if (*err) {
free_headers(file_entry);
break;
else if (extract_function & extract_data_tar_gz) {
ared_file = "data.tar.gz";
} else {
- fprintf(stderr, "no file specified to extract -- extract_function=%x\n", extract_function);
+ opkg_msg(ERROR, "Internal error: extract_function=%x\n",
+ extract_function);
*err = -1;
goto cleanup;
}
/* open a stream of decompressed data */
uncompressed_stream = gz_open(deb_stream, &gunzip_pid);
if (uncompressed_stream == NULL) {
- printf("%s: %d\n", __FUNCTION__, __LINE__);
*err = -1;
goto cleanup;
}
free_header_ar(ar_header);
break;
}
- seek_sub_file(deb_stream, ar_header->size);
+ if (fseek(deb_stream, ar_header->size, SEEK_CUR) == -1) {
+ opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
+ *err = -1;
+ free_header_ar(ar_header);
+ goto cleanup;
+ }
free_header_ar(ar_header);
}
goto cleanup;
FILE *unzipped_opkg_stream;
file_header_t *tar_header;
archive_offset = 0;
- fseek(deb_stream, 0, SEEK_SET);
+ if (fseek(deb_stream, 0, SEEK_SET) == -1) {
+ opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
+ *err = -1;
+ goto cleanup;
+ }
unzipped_opkg_stream = gz_open(deb_stream, &unzipped_opkg_pid);
if (unzipped_opkg_stream == NULL) {
*err = -1;