Cleaup read() and write() variants, plus a couple of new functions like

xlseek and fdlength() for the new mkswap.
This commit is contained in:
Rob Landley 2006-07-16 08:14:35 +00:00
parent afb94ecf2b
commit 534374755d
39 changed files with 208 additions and 228 deletions

View file

@ -88,7 +88,7 @@ int ar_main(int argc, char **argv)
llist_add_to(&(archive_handle->accept), argv[optind++]);
}
archive_xread_all(archive_handle, magic, 7);
xread(archive_handle->src_fd, magic, 7);
if (strncmp(magic, "!<arch>", 7) != 0) {
bb_error_msg_and_die("Invalid ar magic");
}

View file

@ -112,10 +112,10 @@ int gunzip_main(int argc, char **argv)
}
/* do the decompression, and cleanup */
if (bb_xread_char(src_fd) == 0x1f) {
if (xread_char(src_fd) == 0x1f) {
unsigned char magic2;
magic2 = bb_xread_char(src_fd);
magic2 = xread_char(src_fd);
#ifdef CONFIG_FEATURE_GUNZIP_UNCOMPRESS
if (magic2 == 0x9d) {
status = uncompress(src_fd, dst_fd);

View file

@ -29,7 +29,6 @@ LIBUNARCHIVE-y:= \
header_list.o \
header_verbose_list.o \
\
archive_xread_all.o \
archive_xread_all_eof.o \
\
seek_by_char.o \

View file

@ -1,21 +0,0 @@
/* vi: set sw=4 ts=4: */
/*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "unarchive.h"
#include "libbb.h"
void archive_xread_all(const archive_handle_t *archive_handle, void *buf, const size_t count)
{
ssize_t size;
size = bb_full_read(archive_handle->src_fd, buf, count);
if (size != count) {
bb_error_msg_and_die("Short read");
}
return;
}

View file

@ -13,7 +13,7 @@ ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *b
{
ssize_t size;
size = bb_full_read(archive_handle->src_fd, buf, count);
size = full_read(archive_handle->src_fd, buf, count);
if ((size != 0) && (size != count)) {
bb_perror_msg_and_die("Short read, read %ld of %ld", (long)size, (long)count);
}

View file

@ -20,7 +20,7 @@ void check_header_gzip(int src_fd)
} formated;
} header;
bb_xread_all(src_fd, header.raw, 8);
xread(src_fd, header.raw, 8);
/* Check the compression method */
if (header.formated.method != 8) {
@ -32,10 +32,10 @@ void check_header_gzip(int src_fd)
/* bit 2 set: extra field present */
unsigned char extra_short;
extra_short = bb_xread_char(src_fd) + (bb_xread_char(src_fd) << 8);
extra_short = xread_char(src_fd) + (xread_char(src_fd) << 8);
while (extra_short > 0) {
/* Ignore extra field */
bb_xread_char(src_fd);
xread_char(src_fd);
extra_short--;
}
}
@ -43,19 +43,19 @@ void check_header_gzip(int src_fd)
/* Discard original name if any */
if (header.formated.flags & 0x08) {
/* bit 3 set: original file name present */
while(bb_xread_char(src_fd) != 0);
while(xread_char(src_fd) != 0);
}
/* Discard file comment if any */
if (header.formated.flags & 0x10) {
/* bit 4 set: file comment present */
while(bb_xread_char(src_fd) != 0);
while(xread_char(src_fd) != 0);
}
/* Read the header checksum */
if (header.formated.flags & 0x02) {
bb_xread_char(src_fd);
bb_xread_char(src_fd);
xread_char(src_fd);
xread_char(src_fd);
}
return;

View file

@ -14,5 +14,5 @@ void data_extract_to_buffer(archive_handle_t *archive_handle)
archive_handle->buffer = xzalloc(size + 1);
archive_xread_all(archive_handle, archive_handle->buffer, size);
xread(archive_handle->src_fd, archive_handle->buffer, size);
}

View file

@ -116,7 +116,7 @@ int uncompress(int fd_in, int fd_out)
insize = 0;
inbuf[0] = bb_xread_char(fd_in);
inbuf[0] = xread_char(fd_in);
maxbits = inbuf[0] & BIT_MASK;
block_mode = inbuf[0] & BLOCK_MODE;

View file

@ -116,9 +116,8 @@ static unsigned int fill_bitbuffer(unsigned int bitbuffer, unsigned int *current
/* Leave the first 4 bytes empty so we can always unwind the bitbuffer
* to the front of the bytebuffer, leave 4 bytes free at end of tail
* so we can easily top up buffer in check_trailer_gzip() */
if (!(bytebuffer_size = bb_xread(gunzip_src_fd, &bytebuffer[4], bytebuffer_max - 8))) {
if (1 > (bytebuffer_size = safe_read(gunzip_src_fd, &bytebuffer[4], bytebuffer_max - 8)))
bb_error_msg_and_die("unexpected end of file");
}
bytebuffer_size += 4;
bytebuffer_offset = 4;
}
@ -862,7 +861,7 @@ int inflate_unzip(int in, int out)
while(1) {
int ret = inflate_get_next_window();
nwrote = bb_full_write(out, gunzip_window, gunzip_outbuf_count);
nwrote = full_write(out, gunzip_window, gunzip_outbuf_count);
if (nwrote == -1) {
bb_perror_msg("write");
return -1;
@ -896,7 +895,7 @@ int inflate_gunzip(int in, int out)
/* top up the input buffer with the rest of the trailer */
count = bytebuffer_size - bytebuffer_offset;
if (count < 8) {
bb_xread_all(in, &bytebuffer[bytebuffer_size], 8 - count);
xread(in, &bytebuffer[bytebuffer_size], 8 - count);
bytebuffer_size += 8 - count;
}
for (count = 0; count != 4; count++) {

View file

@ -43,7 +43,7 @@ char get_header_ar(archive_handle_t *archive_handle)
if (ar.raw[0] == '\n') {
/* fix up the header, we started reading 1 byte too early */
memmove(ar.raw, &ar.raw[1], 59);
ar.raw[59] = bb_xread_char(archive_handle->src_fd);
ar.raw[59] = xread_char(archive_handle->src_fd);
archive_handle->offset++;
}
archive_handle->offset += 60;
@ -68,7 +68,7 @@ char get_header_ar(archive_handle_t *archive_handle)
* in static variable long_names for use in future entries */
ar_long_name_size = typed->size;
ar_long_names = xmalloc(ar_long_name_size);
bb_xread_all(archive_handle->src_fd, ar_long_names, ar_long_name_size);
xread(archive_handle->src_fd, ar_long_names, ar_long_name_size);
archive_handle->offset += ar_long_name_size;
/* This ar entries data section only contained filenames for other records
* they are stored in the static ar_long_names for future reference */

View file

@ -76,7 +76,8 @@ char get_header_cpio(archive_handle_t *archive_handle)
}
file_header->name = (char *) xzalloc(namesize + 1);
archive_xread_all(archive_handle, file_header->name, namesize); /* Read in filename */
/* Read in filename */
xread(archive_handle->src_fd, file_header->name, namesize);
archive_handle->offset += namesize;
/* Update offset amount and skip padding before file contents */
@ -103,7 +104,7 @@ char get_header_cpio(archive_handle_t *archive_handle)
if (S_ISLNK(file_header->mode)) {
file_header->link_name = (char *) xzalloc(file_header->size + 1);
archive_xread_all(archive_handle, file_header->link_name, file_header->size);
xread(archive_handle->src_fd, file_header->link_name, file_header->size);
archive_handle->offset += file_header->size;
file_header->size = 0; /* Stop possible seeks in future */
} else {

View file

@ -56,11 +56,7 @@ char get_header_tar(archive_handle_t *archive_handle)
/* Align header */
data_align(archive_handle, 512);
if (bb_full_read(archive_handle->src_fd, tar.raw, 512) != 512) {
/* Assume end of file */
bb_error_msg_and_die("Short header");
//return(EXIT_FAILURE);
}
xread(archive_handle->src_fd, tar.raw, 512);
archive_handle->offset += 512;
/* If there is no filename its an empty header */
@ -69,7 +65,7 @@ char get_header_tar(archive_handle_t *archive_handle)
/* This is the second consecutive empty header! End of archive!
* Read until the end to empty the pipe from gz or bz2
*/
while (bb_full_read(archive_handle->src_fd, tar.raw, 512) == 512);
while (full_read(archive_handle->src_fd, tar.raw, 512) == 512);
return(EXIT_FAILURE);
}
end = 1;
@ -166,14 +162,14 @@ char get_header_tar(archive_handle_t *archive_handle)
#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
case 'L': {
longname = xzalloc(file_header->size + 1);
archive_xread_all(archive_handle, longname, file_header->size);
xread(archive_handle->src_fd, longname, file_header->size);
archive_handle->offset += file_header->size;
return(get_header_tar(archive_handle));
}
case 'K': {
linkname = xzalloc(file_header->size + 1);
archive_xread_all(archive_handle, linkname, file_header->size);
xread(archive_handle->src_fd, linkname, file_header->size);
archive_handle->offset += file_header->size;
file_header->name = linkname;

View file

@ -15,7 +15,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
/* Cant lseek over pipe's */
archive_handle->seek = seek_by_char;
archive_xread_all(archive_handle, &magic, 2);
xread(archive_handle->src_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
bb_error_msg_and_die("Invalid gzip magic");
}

View file

@ -12,7 +12,7 @@ void unpack_ar_archive(archive_handle_t *ar_archive)
{
char magic[7];
archive_xread_all(ar_archive, magic, 7);
xread(ar_archive->src_fd, magic, 7);
if (strncmp(magic, "!<arch>", 7) != 0) {
bb_error_msg_and_die("Invalid ar magic");
}

View file

@ -193,7 +193,7 @@ void extract_cpio_gz(int fd) {
archive_handle->src_fd = fd;
archive_handle->offset = 0;
bb_xread_all(archive_handle->src_fd, &magic, 2);
xread(archive_handle->src_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
bb_error_msg_and_die("Invalid gzip magic");
}

View file

@ -40,7 +40,7 @@ static void skip_header(int rpm_fd)
{
struct rpm_header header;
bb_xread_all(rpm_fd, &header, sizeof(struct rpm_header));
xread(rpm_fd, &header, sizeof(struct rpm_header));
if (strncmp((char *) &header.magic, RPM_HEADER_MAGIC, 3) != 0) {
bb_error_msg_and_die("Invalid RPM header magic"); /* Invalid magic */
}
@ -66,7 +66,7 @@ int rpm2cpio_main(int argc, char **argv)
rpm_fd = bb_xopen(argv[1], O_RDONLY);
}
bb_xread_all(rpm_fd, &lead, sizeof(struct rpm_lead));
xread(rpm_fd, &lead, sizeof(struct rpm_lead));
if (strncmp((char *) &lead.magic, RPM_MAGIC, 4) != 0) {
bb_error_msg_and_die("Invalid RPM magic"); /* Just check the magic, the rest is irrelevant */
}
@ -78,7 +78,7 @@ int rpm2cpio_main(int argc, char **argv)
/* Skip the main header */
skip_header(rpm_fd);
bb_xread_all(rpm_fd, &magic, 2);
xread(rpm_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
bb_error_msg_and_die("Invalid gzip magic");
}

View file

@ -269,9 +269,9 @@ static inline int writeTarHeader(struct TarBallInfo *tbInfo,
putOctal(header.chksum, 7, chksum);
/* Now write the header out to disk */
if ((size =
bb_full_write(tbInfo->tarFd, (char *) &header,
sizeof(struct TarHeader))) < 0) {
if ((size = full_write(tbInfo->tarFd, (char *) &header,
sizeof(struct TarHeader))) < 0)
{
bb_error_msg(bb_msg_io_error, real_name);
return (FALSE);
}
@ -475,7 +475,7 @@ static inline int writeTarFile(const int tar_fd, const int verboseFlag,
while (1) {
char buf;
int n = bb_full_read(gzipStatusPipe[0], &buf, 1);
int n = full_read(gzipStatusPipe[0], &buf, 1);
if (n == 0 && vfork_exec_errno != 0) {
errno = vfork_exec_errno;
@ -562,8 +562,8 @@ static char get_header_tar_Z(archive_handle_t *archive_handle)
archive_handle->seek = seek_by_char;
/* do the decompression, and cleanup */
if (bb_xread_char(archive_handle->src_fd) != 0x1f ||
bb_xread_char(archive_handle->src_fd) != 0x9d)
if (xread_char(archive_handle->src_fd) != 0x1f ||
xread_char(archive_handle->src_fd) != 0x9d)
{
bb_error_msg_and_die("Invalid magic");
}

View file

@ -70,7 +70,7 @@ int uncompress_main(int argc, char **argv)
}
/* do the decompression, and cleanup */
if ((bb_xread_char(src_fd) != 0x1f) || (bb_xread_char(src_fd) != 0x9d)) {
if ((xread_char(src_fd) != 0x1f) || (xread_char(src_fd) != 0x9d)) {
bb_error_msg_and_die("Invalid magic");
}

View file

@ -32,28 +32,10 @@
#include "unarchive.h"
#include "busybox.h"
#if BB_BIG_ENDIAN
static inline unsigned short
__swap16(unsigned short x) {
return (((uint16_t)(x) & 0xFF) << 8) | (((uint16_t)(x) & 0xFF00) >> 8);
}
static inline uint32_t
__swap32(uint32_t x) {
return (((x & 0xFF) << 24) |
((x & 0xFF00) << 8) |
((x & 0xFF0000) >> 8) |
((x & 0xFF000000) >> 24));
}
#else /* it's little-endian */
# define __swap16(x) (x)
# define __swap32(x) (x)
#endif /* BB_BIG_ENDIAN */
#define ZIP_FILEHEADER_MAGIC __swap32(0x04034b50)
#define ZIP_CDS_MAGIC __swap32(0x02014b50)
#define ZIP_CDS_END_MAGIC __swap32(0x06054b50)
#define ZIP_DD_MAGIC __swap32(0x08074b50)
#define ZIP_FILEHEADER_MAGIC SWAP_LE32(0x04034b50)
#define ZIP_CDS_MAGIC SWAP_LE32(0x02014b50)
#define ZIP_CDS_END_MAGIC SWAP_LE32(0x06054b50)
#define ZIP_DD_MAGIC SWAP_LE32(0x08074b50)
extern unsigned int gunzip_crc;
extern unsigned int gunzip_bytes_out;
@ -83,13 +65,6 @@ static void unzip_skip(int fd, off_t skip)
}
}
static void unzip_read(int fd, void *buf, size_t count)
{
if (bb_xread(fd, buf, count) != count) {
bb_error_msg_and_die(bb_msg_read_error);
}
}
static void unzip_create_leading_dirs(char *fn)
{
/* Create all leading directories */
@ -248,7 +223,7 @@ int unzip_main(int argc, char **argv)
unsigned int magic;
/* Check magic number */
unzip_read(src_fd, &magic, 4);
xread(src_fd, &magic, 4);
if (magic == ZIP_CDS_MAGIC) {
break;
} else if (magic != ZIP_FILEHEADER_MAGIC) {
@ -256,19 +231,17 @@ int unzip_main(int argc, char **argv)
}
/* Read the file header */
unzip_read(src_fd, zip_header.raw, 26);
#if BB_BIG_ENDIAN
zip_header.formated.version = __swap16(zip_header.formated.version);
zip_header.formated.flags = __swap16(zip_header.formated.flags);
zip_header.formated.method = __swap16(zip_header.formated.method);
zip_header.formated.modtime = __swap16(zip_header.formated.modtime);
zip_header.formated.moddate = __swap16(zip_header.formated.moddate);
zip_header.formated.crc32 = __swap32(zip_header.formated.crc32);
zip_header.formated.cmpsize = __swap32(zip_header.formated.cmpsize);
zip_header.formated.ucmpsize = __swap32(zip_header.formated.ucmpsize);
zip_header.formated.filename_len = __swap16(zip_header.formated.filename_len);
zip_header.formated.extra_len = __swap16(zip_header.formated.extra_len);
#endif /* BB_BIG_ENDIAN */
xread(src_fd, zip_header.raw, 26);
zip_header.formated.version = SWAP_LE32(zip_header.formated.version);
zip_header.formated.flags = SWAP_LE32(zip_header.formated.flags);
zip_header.formated.method = SWAP_LE32(zip_header.formated.method);
zip_header.formated.modtime = SWAP_LE32(zip_header.formated.modtime);
zip_header.formated.moddate = SWAP_LE32(zip_header.formated.moddate);
zip_header.formated.crc32 = SWAP_LE32(zip_header.formated.crc32);
zip_header.formated.cmpsize = SWAP_LE32(zip_header.formated.cmpsize);
zip_header.formated.ucmpsize = SWAP_LE32(zip_header.formated.ucmpsize);
zip_header.formated.filename_len = SWAP_LE32(zip_header.formated.filename_len);
zip_header.formated.extra_len = SWAP_LE32(zip_header.formated.extra_len);
if ((zip_header.formated.method != 0) && (zip_header.formated.method != 8)) {
bb_error_msg_and_die("Unsupported compression method %d", zip_header.formated.method);
}
@ -276,7 +249,7 @@ int unzip_main(int argc, char **argv)
/* Read filename */
free(dst_fn);
dst_fn = xzalloc(zip_header.formated.filename_len + 1);
unzip_read(src_fd, dst_fn, zip_header.formated.filename_len);
xread(src_fd, dst_fn, zip_header.formated.filename_len);
/* Skip extra header bytes */
unzip_skip(src_fd, zip_header.formated.extra_len);