Cleaup read() and write() variants, plus a couple of new functions like
xlseek and fdlength() for the new mkswap.
This commit is contained in:
parent
afb94ecf2b
commit
534374755d
@ -343,22 +343,15 @@ static void check_suid (struct BB_applet *applet)
|
|||||||
bb_error_msg_and_die ("You have no permission to run this applet!");
|
bb_error_msg_and_die ("You have no permission to run this applet!");
|
||||||
|
|
||||||
if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { /* *both* have to be set for sgid */
|
if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { /* *both* have to be set for sgid */
|
||||||
if (setegid (sct->m_gid))
|
xsetgid(sct->m_gid);
|
||||||
bb_error_msg_and_die
|
} else xsetgid(rgid); /* no sgid -> drop */
|
||||||
("BusyBox binary has insufficient rights to set proper GID for applet!");
|
|
||||||
} else
|
|
||||||
setgid (rgid); /* no sgid -> drop */
|
|
||||||
|
|
||||||
if (sct->m_mode & S_ISUID) {
|
if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
|
||||||
if (seteuid (sct->m_uid))
|
else xsetuid(ruid); /* no suid -> drop */
|
||||||
bb_error_msg_and_die
|
|
||||||
("BusyBox binary has insufficient rights to set proper UID for applet!");
|
|
||||||
} else
|
|
||||||
setuid (ruid); /* no suid -> drop */
|
|
||||||
} else {
|
} else {
|
||||||
/* default: drop all privileges */
|
/* default: drop all privileges */
|
||||||
setgid (rgid);
|
xsetgid(rgid);
|
||||||
setuid (ruid);
|
xsetuid(ruid);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
@ -374,11 +367,10 @@ static void check_suid (struct BB_applet *applet)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (applet->need_suid == _BB_SUID_ALWAYS) {
|
if (applet->need_suid == _BB_SUID_ALWAYS) {
|
||||||
if (geteuid () != 0)
|
if (geteuid()) bb_error_msg_and_die("Applet requires root privileges!");
|
||||||
bb_error_msg_and_die ("This applet requires root privileges!");
|
|
||||||
} else if (applet->need_suid == _BB_SUID_NEVER) {
|
} else if (applet->need_suid == _BB_SUID_NEVER) {
|
||||||
setgid (rgid); /* drop all privileges */
|
xsetgid(rgid); /* drop all privileges */
|
||||||
setuid (ruid);
|
xsetuid(ruid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -419,14 +411,14 @@ static const char *unpack_usage_messages(void)
|
|||||||
case -1: /* error */
|
case -1: /* error */
|
||||||
exit(1);
|
exit(1);
|
||||||
case 0: /* child */
|
case 0: /* child */
|
||||||
bb_full_write(input[1], packed_usage, sizeof(packed_usage));
|
full_write(input[1], packed_usage, sizeof(packed_usage));
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
/* parent */
|
/* parent */
|
||||||
close(input[1]);
|
close(input[1]);
|
||||||
|
|
||||||
buf = xmalloc(SIZEOF_usage_messages);
|
buf = xmalloc(SIZEOF_usage_messages);
|
||||||
bb_full_read(output[0], buf, SIZEOF_usage_messages);
|
full_read(output[0], buf, SIZEOF_usage_messages);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,10 +446,9 @@ void bb_show_usage (void)
|
|||||||
exit (bb_default_error_retval);
|
exit (bb_default_error_retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int applet_name_compare (const void *x, const void *y)
|
static int applet_name_compare(const void *name, const void *vapplet)
|
||||||
{
|
{
|
||||||
const char *name = x;
|
const struct BB_applet *applet = vapplet;
|
||||||
const struct BB_applet *applet = y;
|
|
||||||
|
|
||||||
return strcmp(name, applet->name);
|
return strcmp(name, applet->name);
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ int ar_main(int argc, char **argv)
|
|||||||
llist_add_to(&(archive_handle->accept), argv[optind++]);
|
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) {
|
if (strncmp(magic, "!<arch>", 7) != 0) {
|
||||||
bb_error_msg_and_die("Invalid ar magic");
|
bb_error_msg_and_die("Invalid ar magic");
|
||||||
}
|
}
|
||||||
|
@ -112,10 +112,10 @@ int gunzip_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* do the decompression, and cleanup */
|
/* do the decompression, and cleanup */
|
||||||
if (bb_xread_char(src_fd) == 0x1f) {
|
if (xread_char(src_fd) == 0x1f) {
|
||||||
unsigned char magic2;
|
unsigned char magic2;
|
||||||
|
|
||||||
magic2 = bb_xread_char(src_fd);
|
magic2 = xread_char(src_fd);
|
||||||
#ifdef CONFIG_FEATURE_GUNZIP_UNCOMPRESS
|
#ifdef CONFIG_FEATURE_GUNZIP_UNCOMPRESS
|
||||||
if (magic2 == 0x9d) {
|
if (magic2 == 0x9d) {
|
||||||
status = uncompress(src_fd, dst_fd);
|
status = uncompress(src_fd, dst_fd);
|
||||||
|
@ -29,7 +29,6 @@ LIBUNARCHIVE-y:= \
|
|||||||
header_list.o \
|
header_list.o \
|
||||||
header_verbose_list.o \
|
header_verbose_list.o \
|
||||||
\
|
\
|
||||||
archive_xread_all.o \
|
|
||||||
archive_xread_all_eof.o \
|
archive_xread_all_eof.o \
|
||||||
\
|
\
|
||||||
seek_by_char.o \
|
seek_by_char.o \
|
||||||
|
@ -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;
|
|
||||||
}
|
|
@ -13,7 +13,7 @@ ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *b
|
|||||||
{
|
{
|
||||||
ssize_t size;
|
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)) {
|
if ((size != 0) && (size != count)) {
|
||||||
bb_perror_msg_and_die("Short read, read %ld of %ld", (long)size, (long)count);
|
bb_perror_msg_and_die("Short read, read %ld of %ld", (long)size, (long)count);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ void check_header_gzip(int src_fd)
|
|||||||
} formated;
|
} formated;
|
||||||
} header;
|
} header;
|
||||||
|
|
||||||
bb_xread_all(src_fd, header.raw, 8);
|
xread(src_fd, header.raw, 8);
|
||||||
|
|
||||||
/* Check the compression method */
|
/* Check the compression method */
|
||||||
if (header.formated.method != 8) {
|
if (header.formated.method != 8) {
|
||||||
@ -32,10 +32,10 @@ void check_header_gzip(int src_fd)
|
|||||||
/* bit 2 set: extra field present */
|
/* bit 2 set: extra field present */
|
||||||
unsigned char extra_short;
|
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) {
|
while (extra_short > 0) {
|
||||||
/* Ignore extra field */
|
/* Ignore extra field */
|
||||||
bb_xread_char(src_fd);
|
xread_char(src_fd);
|
||||||
extra_short--;
|
extra_short--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,19 +43,19 @@ void check_header_gzip(int src_fd)
|
|||||||
/* Discard original name if any */
|
/* Discard original name if any */
|
||||||
if (header.formated.flags & 0x08) {
|
if (header.formated.flags & 0x08) {
|
||||||
/* bit 3 set: original file name present */
|
/* 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 */
|
/* Discard file comment if any */
|
||||||
if (header.formated.flags & 0x10) {
|
if (header.formated.flags & 0x10) {
|
||||||
/* bit 4 set: file comment present */
|
/* bit 4 set: file comment present */
|
||||||
while(bb_xread_char(src_fd) != 0);
|
while(xread_char(src_fd) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the header checksum */
|
/* Read the header checksum */
|
||||||
if (header.formated.flags & 0x02) {
|
if (header.formated.flags & 0x02) {
|
||||||
bb_xread_char(src_fd);
|
xread_char(src_fd);
|
||||||
bb_xread_char(src_fd);
|
xread_char(src_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -14,5 +14,5 @@ void data_extract_to_buffer(archive_handle_t *archive_handle)
|
|||||||
|
|
||||||
archive_handle->buffer = xzalloc(size + 1);
|
archive_handle->buffer = xzalloc(size + 1);
|
||||||
|
|
||||||
archive_xread_all(archive_handle, archive_handle->buffer, size);
|
xread(archive_handle->src_fd, archive_handle->buffer, size);
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ int uncompress(int fd_in, int fd_out)
|
|||||||
|
|
||||||
insize = 0;
|
insize = 0;
|
||||||
|
|
||||||
inbuf[0] = bb_xread_char(fd_in);
|
inbuf[0] = xread_char(fd_in);
|
||||||
|
|
||||||
maxbits = inbuf[0] & BIT_MASK;
|
maxbits = inbuf[0] & BIT_MASK;
|
||||||
block_mode = inbuf[0] & BLOCK_MODE;
|
block_mode = inbuf[0] & BLOCK_MODE;
|
||||||
|
@ -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
|
/* 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
|
* 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() */
|
* 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");
|
bb_error_msg_and_die("unexpected end of file");
|
||||||
}
|
|
||||||
bytebuffer_size += 4;
|
bytebuffer_size += 4;
|
||||||
bytebuffer_offset = 4;
|
bytebuffer_offset = 4;
|
||||||
}
|
}
|
||||||
@ -862,7 +861,7 @@ int inflate_unzip(int in, int out)
|
|||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
int ret = inflate_get_next_window();
|
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) {
|
if (nwrote == -1) {
|
||||||
bb_perror_msg("write");
|
bb_perror_msg("write");
|
||||||
return -1;
|
return -1;
|
||||||
@ -896,7 +895,7 @@ int inflate_gunzip(int in, int out)
|
|||||||
/* top up the input buffer with the rest of the trailer */
|
/* top up the input buffer with the rest of the trailer */
|
||||||
count = bytebuffer_size - bytebuffer_offset;
|
count = bytebuffer_size - bytebuffer_offset;
|
||||||
if (count < 8) {
|
if (count < 8) {
|
||||||
bb_xread_all(in, &bytebuffer[bytebuffer_size], 8 - count);
|
xread(in, &bytebuffer[bytebuffer_size], 8 - count);
|
||||||
bytebuffer_size += 8 - count;
|
bytebuffer_size += 8 - count;
|
||||||
}
|
}
|
||||||
for (count = 0; count != 4; count++) {
|
for (count = 0; count != 4; count++) {
|
||||||
|
@ -43,7 +43,7 @@ char get_header_ar(archive_handle_t *archive_handle)
|
|||||||
if (ar.raw[0] == '\n') {
|
if (ar.raw[0] == '\n') {
|
||||||
/* fix up the header, we started reading 1 byte too early */
|
/* fix up the header, we started reading 1 byte too early */
|
||||||
memmove(ar.raw, &ar.raw[1], 59);
|
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++;
|
||||||
}
|
}
|
||||||
archive_handle->offset += 60;
|
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 */
|
* in static variable long_names for use in future entries */
|
||||||
ar_long_name_size = typed->size;
|
ar_long_name_size = typed->size;
|
||||||
ar_long_names = xmalloc(ar_long_name_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;
|
archive_handle->offset += ar_long_name_size;
|
||||||
/* This ar entries data section only contained filenames for other records
|
/* This ar entries data section only contained filenames for other records
|
||||||
* they are stored in the static ar_long_names for future reference */
|
* they are stored in the static ar_long_names for future reference */
|
||||||
|
@ -76,7 +76,8 @@ char get_header_cpio(archive_handle_t *archive_handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
file_header->name = (char *) xzalloc(namesize + 1);
|
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;
|
archive_handle->offset += namesize;
|
||||||
|
|
||||||
/* Update offset amount and skip padding before file contents */
|
/* 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)) {
|
if (S_ISLNK(file_header->mode)) {
|
||||||
file_header->link_name = (char *) xzalloc(file_header->size + 1);
|
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;
|
archive_handle->offset += file_header->size;
|
||||||
file_header->size = 0; /* Stop possible seeks in future */
|
file_header->size = 0; /* Stop possible seeks in future */
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,11 +56,7 @@ char get_header_tar(archive_handle_t *archive_handle)
|
|||||||
/* Align header */
|
/* Align header */
|
||||||
data_align(archive_handle, 512);
|
data_align(archive_handle, 512);
|
||||||
|
|
||||||
if (bb_full_read(archive_handle->src_fd, tar.raw, 512) != 512) {
|
xread(archive_handle->src_fd, tar.raw, 512);
|
||||||
/* Assume end of file */
|
|
||||||
bb_error_msg_and_die("Short header");
|
|
||||||
//return(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
archive_handle->offset += 512;
|
archive_handle->offset += 512;
|
||||||
|
|
||||||
/* If there is no filename its an empty header */
|
/* 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!
|
/* This is the second consecutive empty header! End of archive!
|
||||||
* Read until the end to empty the pipe from gz or bz2
|
* 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);
|
return(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
end = 1;
|
end = 1;
|
||||||
@ -166,14 +162,14 @@ char get_header_tar(archive_handle_t *archive_handle)
|
|||||||
#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
|
#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
|
||||||
case 'L': {
|
case 'L': {
|
||||||
longname = xzalloc(file_header->size + 1);
|
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;
|
archive_handle->offset += file_header->size;
|
||||||
|
|
||||||
return(get_header_tar(archive_handle));
|
return(get_header_tar(archive_handle));
|
||||||
}
|
}
|
||||||
case 'K': {
|
case 'K': {
|
||||||
linkname = xzalloc(file_header->size + 1);
|
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;
|
archive_handle->offset += file_header->size;
|
||||||
|
|
||||||
file_header->name = linkname;
|
file_header->name = linkname;
|
||||||
|
@ -15,7 +15,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
|
|||||||
/* Cant lseek over pipe's */
|
/* Cant lseek over pipe's */
|
||||||
archive_handle->seek = seek_by_char;
|
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)) {
|
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
|
||||||
bb_error_msg_and_die("Invalid gzip magic");
|
bb_error_msg_and_die("Invalid gzip magic");
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ void unpack_ar_archive(archive_handle_t *ar_archive)
|
|||||||
{
|
{
|
||||||
char magic[7];
|
char magic[7];
|
||||||
|
|
||||||
archive_xread_all(ar_archive, magic, 7);
|
xread(ar_archive->src_fd, magic, 7);
|
||||||
if (strncmp(magic, "!<arch>", 7) != 0) {
|
if (strncmp(magic, "!<arch>", 7) != 0) {
|
||||||
bb_error_msg_and_die("Invalid ar magic");
|
bb_error_msg_and_die("Invalid ar magic");
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ void extract_cpio_gz(int fd) {
|
|||||||
archive_handle->src_fd = fd;
|
archive_handle->src_fd = fd;
|
||||||
archive_handle->offset = 0;
|
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)) {
|
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
|
||||||
bb_error_msg_and_die("Invalid gzip magic");
|
bb_error_msg_and_die("Invalid gzip magic");
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ static void skip_header(int rpm_fd)
|
|||||||
{
|
{
|
||||||
struct rpm_header header;
|
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) {
|
if (strncmp((char *) &header.magic, RPM_HEADER_MAGIC, 3) != 0) {
|
||||||
bb_error_msg_and_die("Invalid RPM header magic"); /* Invalid magic */
|
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);
|
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) {
|
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 */
|
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 the main header */
|
||||||
skip_header(rpm_fd);
|
skip_header(rpm_fd);
|
||||||
|
|
||||||
bb_xread_all(rpm_fd, &magic, 2);
|
xread(rpm_fd, &magic, 2);
|
||||||
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
|
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
|
||||||
bb_error_msg_and_die("Invalid gzip magic");
|
bb_error_msg_and_die("Invalid gzip magic");
|
||||||
}
|
}
|
||||||
|
@ -269,9 +269,9 @@ static inline int writeTarHeader(struct TarBallInfo *tbInfo,
|
|||||||
putOctal(header.chksum, 7, chksum);
|
putOctal(header.chksum, 7, chksum);
|
||||||
|
|
||||||
/* Now write the header out to disk */
|
/* Now write the header out to disk */
|
||||||
if ((size =
|
if ((size = full_write(tbInfo->tarFd, (char *) &header,
|
||||||
bb_full_write(tbInfo->tarFd, (char *) &header,
|
sizeof(struct TarHeader))) < 0)
|
||||||
sizeof(struct TarHeader))) < 0) {
|
{
|
||||||
bb_error_msg(bb_msg_io_error, real_name);
|
bb_error_msg(bb_msg_io_error, real_name);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
@ -475,7 +475,7 @@ static inline int writeTarFile(const int tar_fd, const int verboseFlag,
|
|||||||
while (1) {
|
while (1) {
|
||||||
char buf;
|
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) {
|
if (n == 0 && vfork_exec_errno != 0) {
|
||||||
errno = vfork_exec_errno;
|
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;
|
archive_handle->seek = seek_by_char;
|
||||||
|
|
||||||
/* do the decompression, and cleanup */
|
/* do the decompression, and cleanup */
|
||||||
if (bb_xread_char(archive_handle->src_fd) != 0x1f ||
|
if (xread_char(archive_handle->src_fd) != 0x1f ||
|
||||||
bb_xread_char(archive_handle->src_fd) != 0x9d)
|
xread_char(archive_handle->src_fd) != 0x9d)
|
||||||
{
|
{
|
||||||
bb_error_msg_and_die("Invalid magic");
|
bb_error_msg_and_die("Invalid magic");
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ int uncompress_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* do the decompression, and cleanup */
|
/* 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");
|
bb_error_msg_and_die("Invalid magic");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,28 +32,10 @@
|
|||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
#if BB_BIG_ENDIAN
|
#define ZIP_FILEHEADER_MAGIC SWAP_LE32(0x04034b50)
|
||||||
static inline unsigned short
|
#define ZIP_CDS_MAGIC SWAP_LE32(0x02014b50)
|
||||||
__swap16(unsigned short x) {
|
#define ZIP_CDS_END_MAGIC SWAP_LE32(0x06054b50)
|
||||||
return (((uint16_t)(x) & 0xFF) << 8) | (((uint16_t)(x) & 0xFF00) >> 8);
|
#define ZIP_DD_MAGIC SWAP_LE32(0x08074b50)
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
extern unsigned int gunzip_crc;
|
extern unsigned int gunzip_crc;
|
||||||
extern unsigned int gunzip_bytes_out;
|
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)
|
static void unzip_create_leading_dirs(char *fn)
|
||||||
{
|
{
|
||||||
/* Create all leading directories */
|
/* Create all leading directories */
|
||||||
@ -248,7 +223,7 @@ int unzip_main(int argc, char **argv)
|
|||||||
unsigned int magic;
|
unsigned int magic;
|
||||||
|
|
||||||
/* Check magic number */
|
/* Check magic number */
|
||||||
unzip_read(src_fd, &magic, 4);
|
xread(src_fd, &magic, 4);
|
||||||
if (magic == ZIP_CDS_MAGIC) {
|
if (magic == ZIP_CDS_MAGIC) {
|
||||||
break;
|
break;
|
||||||
} else if (magic != ZIP_FILEHEADER_MAGIC) {
|
} else if (magic != ZIP_FILEHEADER_MAGIC) {
|
||||||
@ -256,19 +231,17 @@ int unzip_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read the file header */
|
/* Read the file header */
|
||||||
unzip_read(src_fd, zip_header.raw, 26);
|
xread(src_fd, zip_header.raw, 26);
|
||||||
#if BB_BIG_ENDIAN
|
zip_header.formated.version = SWAP_LE32(zip_header.formated.version);
|
||||||
zip_header.formated.version = __swap16(zip_header.formated.version);
|
zip_header.formated.flags = SWAP_LE32(zip_header.formated.flags);
|
||||||
zip_header.formated.flags = __swap16(zip_header.formated.flags);
|
zip_header.formated.method = SWAP_LE32(zip_header.formated.method);
|
||||||
zip_header.formated.method = __swap16(zip_header.formated.method);
|
zip_header.formated.modtime = SWAP_LE32(zip_header.formated.modtime);
|
||||||
zip_header.formated.modtime = __swap16(zip_header.formated.modtime);
|
zip_header.formated.moddate = SWAP_LE32(zip_header.formated.moddate);
|
||||||
zip_header.formated.moddate = __swap16(zip_header.formated.moddate);
|
zip_header.formated.crc32 = SWAP_LE32(zip_header.formated.crc32);
|
||||||
zip_header.formated.crc32 = __swap32(zip_header.formated.crc32);
|
zip_header.formated.cmpsize = SWAP_LE32(zip_header.formated.cmpsize);
|
||||||
zip_header.formated.cmpsize = __swap32(zip_header.formated.cmpsize);
|
zip_header.formated.ucmpsize = SWAP_LE32(zip_header.formated.ucmpsize);
|
||||||
zip_header.formated.ucmpsize = __swap32(zip_header.formated.ucmpsize);
|
zip_header.formated.filename_len = SWAP_LE32(zip_header.formated.filename_len);
|
||||||
zip_header.formated.filename_len = __swap16(zip_header.formated.filename_len);
|
zip_header.formated.extra_len = SWAP_LE32(zip_header.formated.extra_len);
|
||||||
zip_header.formated.extra_len = __swap16(zip_header.formated.extra_len);
|
|
||||||
#endif /* BB_BIG_ENDIAN */
|
|
||||||
if ((zip_header.formated.method != 0) && (zip_header.formated.method != 8)) {
|
if ((zip_header.formated.method != 0) && (zip_header.formated.method != 8)) {
|
||||||
bb_error_msg_and_die("Unsupported compression method %d", zip_header.formated.method);
|
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 */
|
/* Read filename */
|
||||||
free(dst_fn);
|
free(dst_fn);
|
||||||
dst_fn = xzalloc(zip_header.formated.filename_len + 1);
|
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 */
|
/* Skip extra header bytes */
|
||||||
unzip_skip(src_fd, zip_header.formated.extra_len);
|
unzip_skip(src_fd, zip_header.formated.extra_len);
|
||||||
|
@ -45,15 +45,15 @@ int loadkmap_main(int argc, char **argv)
|
|||||||
|
|
||||||
fd = bb_xopen(CURRENT_VC, O_RDWR);
|
fd = bb_xopen(CURRENT_VC, O_RDWR);
|
||||||
|
|
||||||
if ((bb_full_read(0, buff, 7) != 7) || (strncmp(buff, BINARY_KEYMAP_MAGIC, 7) != 0))
|
xread(0, buff, 7);
|
||||||
|
if (strncmp(buff, BINARY_KEYMAP_MAGIC, 7))
|
||||||
bb_error_msg_and_die("This is not a valid binary keymap.");
|
bb_error_msg_and_die("This is not a valid binary keymap.");
|
||||||
|
|
||||||
if (bb_full_read(0, flags, MAX_NR_KEYMAPS) != MAX_NR_KEYMAPS)
|
xread(0, flags, MAX_NR_KEYMAPS);
|
||||||
bb_perror_msg_and_die("Error reading keymap flags");
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
|
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
|
||||||
if (flags[i] == 1) {
|
if (flags[i] == 1) {
|
||||||
bb_full_read(0, ibuff, NR_KEYS * sizeof(u_short));
|
xread(0, ibuff, NR_KEYS * sizeof(u_short));
|
||||||
for (j = 0; j < NR_KEYS; j++) {
|
for (j = 0; j < NR_KEYS; j++) {
|
||||||
ke.kb_index = j;
|
ke.kb_index = j;
|
||||||
ke.kb_table = i;
|
ke.kb_table = i;
|
||||||
@ -63,8 +63,6 @@ int loadkmap_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't bother to close files. Exit does that
|
if (ENABLE_FEATURE_CLEAN_UP) close(fd);
|
||||||
* automagically, so we can save a few bytes */
|
return 0;
|
||||||
/* close(fd); */
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
@ -196,26 +196,20 @@ int dd_main(int argc, char **argv)
|
|||||||
tmp += d;
|
tmp += d;
|
||||||
oc += d;
|
oc += d;
|
||||||
if (oc == obs) {
|
if (oc == obs) {
|
||||||
if (bb_full_write(ofd, obuf, obs) < 0) {
|
xwrite(ofd, obuf, obs);
|
||||||
bb_perror_msg_and_die("%s", outfile);
|
|
||||||
}
|
|
||||||
out_full++;
|
out_full++;
|
||||||
oc = 0;
|
oc = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((n = bb_full_write(ofd, ibuf, n)) < 0) {
|
xwrite(ofd, ibuf, n);
|
||||||
bb_perror_msg_and_die("%s", outfile);
|
|
||||||
}
|
|
||||||
if (n == ibs) out_full++;
|
if (n == ibs) out_full++;
|
||||||
else out_part++;
|
else out_part++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ENABLE_FEATURE_DD_IBS_OBS && oc) {
|
if (ENABLE_FEATURE_DD_IBS_OBS && oc) {
|
||||||
if (bb_full_write(ofd, obuf, oc) < 0) {
|
xwrite(ofd, obuf, oc);
|
||||||
bb_perror_msg_and_die("%s", outfile);
|
|
||||||
}
|
|
||||||
out_part++;
|
out_part++;
|
||||||
}
|
}
|
||||||
if (close (ifd) < 0) {
|
if (close (ifd) < 0) {
|
||||||
|
@ -54,10 +54,9 @@ static void tail_xprint_header(const char *fmt, const char *filename)
|
|||||||
static void tail_xbb_full_write(const char *buf, size_t len)
|
static void tail_xbb_full_write(const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
/* If we get a write error, there is really no sense in continuing. */
|
/* If we get a write error, there is really no sense in continuing. */
|
||||||
if (bb_full_write(STDOUT_FILENO, buf, len) < 0) {
|
if (full_write(STDOUT_FILENO, buf, len) < 0)
|
||||||
bb_perror_nomsg_and_die();
|
bb_perror_nomsg_and_die();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t tail_read(int fd, char *buf, size_t count)
|
static ssize_t tail_read(int fd, char *buf, size_t count)
|
||||||
{
|
{
|
||||||
|
@ -133,9 +133,9 @@ extern DIR *bb_xopendir(const char *path);
|
|||||||
extern int remove_file(const char *path, int flags);
|
extern int remove_file(const char *path, int flags);
|
||||||
extern int copy_file(const char *source, const char *dest, int flags);
|
extern int copy_file(const char *source, const char *dest, int flags);
|
||||||
extern ssize_t safe_read(int fd, void *buf, size_t count);
|
extern ssize_t safe_read(int fd, void *buf, size_t count);
|
||||||
extern ssize_t bb_full_read(int fd, void *buf, size_t len);
|
extern ssize_t full_read(int fd, void *buf, size_t len);
|
||||||
extern ssize_t safe_write(int fd, const void *buf, size_t count);
|
extern ssize_t safe_write(int fd, const void *buf, size_t count);
|
||||||
extern ssize_t bb_full_write(int fd, const void *buf, size_t len);
|
extern ssize_t full_write(int fd, const void *buf, size_t len);
|
||||||
extern int recursive_action(const char *fileName, int recurse,
|
extern int recursive_action(const char *fileName, int recurse,
|
||||||
int followLinks, int depthFirst,
|
int followLinks, int depthFirst,
|
||||||
int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
|
int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
|
||||||
@ -187,6 +187,7 @@ extern void itoa_to_buf(int n, char *buf, unsigned buflen);
|
|||||||
extern char *itoa(int n);
|
extern char *itoa(int n);
|
||||||
extern void xsetgid(gid_t gid);
|
extern void xsetgid(gid_t gid);
|
||||||
extern void xsetuid(uid_t uid);
|
extern void xsetuid(uid_t uid);
|
||||||
|
extern off_t fdlength(int fd);
|
||||||
|
|
||||||
#define BB_GETOPT_ERROR 0x80000000UL
|
#define BB_GETOPT_ERROR 0x80000000UL
|
||||||
extern const char *bb_opt_complementally;
|
extern const char *bb_opt_complementally;
|
||||||
@ -477,9 +478,10 @@ extern int obscure(const char *old, const char *newval, const struct passwd *pwd
|
|||||||
|
|
||||||
extern int bb_xopen(const char *pathname, int flags);
|
extern int bb_xopen(const char *pathname, int flags);
|
||||||
extern int bb_xopen3(const char *pathname, int flags, int mode);
|
extern int bb_xopen3(const char *pathname, int flags, int mode);
|
||||||
extern ssize_t bb_xread(int fd, void *buf, size_t count);
|
extern void xread(int fd, void *buf, size_t count);
|
||||||
extern void bb_xread_all(int fd, void *buf, size_t count);
|
extern unsigned char xread_char(int fd);
|
||||||
extern unsigned char bb_xread_char(int fd);
|
extern void xlseek(int fd, off_t offset, int whence);
|
||||||
|
extern void xwrite(int fd, void *buf, size_t count);
|
||||||
|
|
||||||
#ifndef COMM_LEN
|
#ifndef COMM_LEN
|
||||||
#ifdef TASK_COMM_LEN
|
#ifdef TASK_COMM_LEN
|
||||||
|
@ -96,7 +96,6 @@ extern char get_header_tar_gz(archive_handle_t *archive_handle);
|
|||||||
extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount);
|
extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount);
|
||||||
extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int amount);
|
extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int amount);
|
||||||
|
|
||||||
extern void archive_xread_all(const archive_handle_t *archive_handle, void *buf, const size_t count);
|
|
||||||
extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);
|
extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);
|
||||||
|
|
||||||
extern void data_align(archive_handle_t *archive_handle, const unsigned short boundary);
|
extern void data_align(archive_handle_t *archive_handle, const unsigned short boundary);
|
||||||
|
@ -221,7 +221,7 @@ static void message(int device, const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((device & LOG) && (log_fd >= 0)) {
|
if ((device & LOG) && (log_fd >= 0)) {
|
||||||
bb_full_write(log_fd, msg, l);
|
full_write(log_fd, msg, l);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -230,7 +230,7 @@ static void message(int device, const char *fmt, ...)
|
|||||||
O_WRONLY | O_NOCTTY | O_NONBLOCK);
|
O_WRONLY | O_NOCTTY | O_NONBLOCK);
|
||||||
/* Always send console messages to /dev/console so people will see them. */
|
/* Always send console messages to /dev/console so people will see them. */
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
bb_full_write(fd, msg, l);
|
full_write(fd, msg, l);
|
||||||
close(fd);
|
close(fd);
|
||||||
#if ENABLE_DEBUG_INIT
|
#if ENABLE_DEBUG_INIT
|
||||||
/* all descriptors may be closed */
|
/* all descriptors may be closed */
|
||||||
@ -536,7 +536,7 @@ static pid_t run(const struct init_action *a)
|
|||||||
messageD(LOG, "Waiting for enter to start '%s'"
|
messageD(LOG, "Waiting for enter to start '%s'"
|
||||||
"(pid %d, terminal %s)\n",
|
"(pid %d, terminal %s)\n",
|
||||||
cmdpath, getpid(), a->terminal);
|
cmdpath, getpid(), a->terminal);
|
||||||
bb_full_write(1, press_enter, sizeof(press_enter) - 1);
|
full_write(1, press_enter, sizeof(press_enter) - 1);
|
||||||
while(read(0, &c, 1) == 1 && c != '\n')
|
while(read(0, &c, 1) == 1 && c != '\n')
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,8 @@ const char *change_identity_e2str ( const struct passwd *pw )
|
|||||||
return "cannot set groups";
|
return "cannot set groups";
|
||||||
endgrent ( );
|
endgrent ( );
|
||||||
|
|
||||||
if ( setgid ( pw-> pw_gid ))
|
xsetgid(pw-> pw_gid);
|
||||||
return "cannot set group id";
|
xsetuid(pw->pw_uid);
|
||||||
if ( setuid ( pw->pw_uid ))
|
|
||||||
return "cannot set user id";
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,24 +30,24 @@ static ssize_t bb_full_fd_action(int src_fd, int dst_fd, size_t size)
|
|||||||
if (src_fd < 0) goto out;
|
if (src_fd < 0) goto out;
|
||||||
while (!size || total < size)
|
while (!size || total < size)
|
||||||
{
|
{
|
||||||
ssize_t wrote, xread;
|
ssize_t wr, rd;
|
||||||
|
|
||||||
xread = safe_read(src_fd, buffer,
|
rd = safe_read(src_fd, buffer,
|
||||||
(!size || size - total > BUFSIZ) ? BUFSIZ : size - total);
|
(!size || size - total > BUFSIZ) ? BUFSIZ : size - total);
|
||||||
|
|
||||||
if (xread > 0) {
|
if (rd > 0) {
|
||||||
/* A -1 dst_fd means we need to fake it... */
|
/* A -1 dst_fd means we need to fake it... */
|
||||||
wrote = (dst_fd < 0) ? xread : bb_full_write(dst_fd, buffer, xread);
|
wr = (dst_fd < 0) ? rd : full_write(dst_fd, buffer, rd);
|
||||||
if (wrote < xread) {
|
if (wr < rd) {
|
||||||
bb_perror_msg(bb_msg_write_error);
|
bb_perror_msg(bb_msg_write_error);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
total += wrote;
|
total += wr;
|
||||||
if (total == size) status = 0;
|
if (total == size) status = 0;
|
||||||
} else if (xread < 0) {
|
} else if (rd < 0) {
|
||||||
bb_perror_msg(bb_msg_read_error);
|
bb_perror_msg(bb_msg_read_error);
|
||||||
break;
|
break;
|
||||||
} else if (xread == 0) {
|
} else if (rd == 0) {
|
||||||
/* All done. */
|
/* All done. */
|
||||||
status = 0;
|
status = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -32,7 +32,7 @@ int create_icmp6_socket(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* drop root privs if running setuid */
|
/* drop root privs if running setuid */
|
||||||
setuid(getuid());
|
xsetuid(getuid());
|
||||||
|
|
||||||
return sock;
|
return sock;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ int create_icmp_socket(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* drop root privs if running setuid */
|
/* drop root privs if running setuid */
|
||||||
setuid(getuid());
|
xsetuid(getuid());
|
||||||
|
|
||||||
return sock;
|
return sock;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* Returns the amount read, or -1 on an error.
|
* Returns the amount read, or -1 on an error.
|
||||||
* A short read is returned on an end of file.
|
* A short read is returned on an end of file.
|
||||||
*/
|
*/
|
||||||
ssize_t bb_full_read(int fd, void *buf, size_t len)
|
ssize_t full_read(int fd, void *buf, size_t len)
|
||||||
{
|
{
|
||||||
ssize_t cc;
|
ssize_t cc;
|
||||||
ssize_t total;
|
ssize_t total;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
* This does multiple writes as necessary.
|
* This does multiple writes as necessary.
|
||||||
* Returns the amount written, or -1 on an error.
|
* Returns the amount written, or -1 on an error.
|
||||||
*/
|
*/
|
||||||
ssize_t bb_full_write(int fd, const void *buf, size_t len)
|
ssize_t full_write(int fd, const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
ssize_t cc;
|
ssize_t cc;
|
||||||
ssize_t total;
|
ssize_t total;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
* Utility routines.
|
* Utility routines.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||||
|
* Copyright (C) 2005 by Rob Landley <rob@landley.net>
|
||||||
*
|
*
|
||||||
* Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
|
* Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
|
||||||
*/
|
*/
|
||||||
|
@ -120,40 +120,55 @@ int bb_xopen3(const char *pathname, int flags, int mode)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef L_xread
|
#ifdef L_xread
|
||||||
ssize_t bb_xread(int fd, void *buf, size_t count)
|
|
||||||
|
// Die with an error message if we can't read the entire buffer.
|
||||||
|
|
||||||
|
void xread(int fd, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t size;
|
|
||||||
|
|
||||||
size = read(fd, buf, count);
|
|
||||||
if (size < 0) {
|
|
||||||
bb_perror_msg_and_die(bb_msg_read_error);
|
|
||||||
}
|
|
||||||
return(size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef L_xread_all
|
|
||||||
void bb_xread_all(int fd, void *buf, size_t count)
|
|
||||||
{
|
|
||||||
ssize_t size;
|
|
||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
if ((size = bb_xread(fd, buf, count)) == 0) { /* EOF */
|
ssize_t size;
|
||||||
|
|
||||||
|
if ((size = safe_read(fd, buf, count)) < 1)
|
||||||
bb_error_msg_and_die("Short read");
|
bb_error_msg_and_die("Short read");
|
||||||
}
|
|
||||||
count -= size;
|
count -= size;
|
||||||
buf = ((char *) buf) + size;
|
buf = ((char *) buf) + size;
|
||||||
}
|
}
|
||||||
return;
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef L_xwrite
|
||||||
|
|
||||||
|
// Die with an error message if we can't write the entire buffer.
|
||||||
|
|
||||||
|
void xwrite(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
while (count) {
|
||||||
|
ssize_t size;
|
||||||
|
|
||||||
|
if ((size = safe_write(fd, buf, count)) < 1)
|
||||||
|
bb_error_msg_and_die("Short write");
|
||||||
|
count -= size;
|
||||||
|
buf = ((char *) buf) + size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef L_xlseek
|
||||||
|
|
||||||
|
// Die if we can't lseek to the right spot.
|
||||||
|
|
||||||
|
void xlseek(int fd, off_t offset, int whence)
|
||||||
|
{
|
||||||
|
if (whence != lseek(fd, offset, whence)) bb_error_msg_and_die("lseek");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef L_xread_char
|
#ifdef L_xread_char
|
||||||
unsigned char bb_xread_char(int fd)
|
unsigned char xread_char(int fd)
|
||||||
{
|
{
|
||||||
char tmp;
|
char tmp;
|
||||||
|
|
||||||
bb_xread_all(fd, &tmp, 1);
|
xread(fd, &tmp, 1);
|
||||||
|
|
||||||
return(tmp);
|
return(tmp);
|
||||||
}
|
}
|
||||||
@ -294,3 +309,41 @@ void xsetuid(uid_t uid)
|
|||||||
if (setuid(uid)) bb_error_msg_and_die("setuid");
|
if (setuid(uid)) bb_error_msg_and_die("setuid");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef L_fdlength
|
||||||
|
off_t fdlength(int fd)
|
||||||
|
{
|
||||||
|
off_t bottom = 0, top = 0, pos;
|
||||||
|
long size;
|
||||||
|
|
||||||
|
// If the ioctl works for this, return it.
|
||||||
|
|
||||||
|
if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512;
|
||||||
|
|
||||||
|
// If not, do a binary search for the last location we can read.
|
||||||
|
|
||||||
|
do {
|
||||||
|
char temp;
|
||||||
|
|
||||||
|
pos = bottom + (top - bottom) / 2;;
|
||||||
|
|
||||||
|
// If we can read from the current location, it's bigger.
|
||||||
|
|
||||||
|
if (lseek(fd, pos, 0)>=0 && safe_read(fd, &temp, 1)==1) {
|
||||||
|
if (bottom == top) bottom = top = (top+1) * 2;
|
||||||
|
else bottom = pos;
|
||||||
|
|
||||||
|
// If we can't, it's smaller.
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (bottom == top) {
|
||||||
|
if (!top) return 0;
|
||||||
|
bottom = top/2;
|
||||||
|
}
|
||||||
|
else top = pos;
|
||||||
|
}
|
||||||
|
} while (bottom + 1 != top);
|
||||||
|
|
||||||
|
return pos + 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -212,7 +212,7 @@ static int receive(char *error_buf, size_t error_buf_size,
|
|||||||
wantBlockNo++;
|
wantBlockNo++;
|
||||||
length += blockLength;
|
length += blockLength;
|
||||||
|
|
||||||
if (bb_full_write(filefd, blockBuf, blockLength) < 0) {
|
if (full_write(filefd, blockBuf, blockLength) < 0) {
|
||||||
note_error("write to file failed: %m");
|
note_error("write to file failed: %m");
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
@ -961,7 +961,7 @@ static int sendHeaders(HttpResponseNum responseNum)
|
|||||||
#if DEBUG
|
#if DEBUG
|
||||||
fprintf(stderr, "Headers: '%s'", buf);
|
fprintf(stderr, "Headers: '%s'", buf);
|
||||||
#endif
|
#endif
|
||||||
return bb_full_write(a_c_w, buf, len);
|
return full_write(a_c_w, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -1222,7 +1222,7 @@ static int sendCgi(const char *url,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if(post_readed_size > 0 && FD_ISSET(outFd, &writeSet)) {
|
} else if(post_readed_size > 0 && FD_ISSET(outFd, &writeSet)) {
|
||||||
count = bb_full_write(outFd, wbuf + post_readed_idx, post_readed_size);
|
count = full_write(outFd, wbuf + post_readed_idx, post_readed_size);
|
||||||
if(count > 0) {
|
if(count > 0) {
|
||||||
post_readed_size -= count;
|
post_readed_size -= count;
|
||||||
post_readed_idx += count;
|
post_readed_idx += count;
|
||||||
@ -1263,14 +1263,14 @@ static int sendCgi(const char *url,
|
|||||||
rbuf[count] = 0;
|
rbuf[count] = 0;
|
||||||
/* check to see if the user script added headers */
|
/* check to see if the user script added headers */
|
||||||
if(strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) {
|
if(strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) {
|
||||||
bb_full_write(s, "HTTP/1.0 200 OK\r\n", 17);
|
full_write(s, "HTTP/1.0 200 OK\r\n", 17);
|
||||||
}
|
}
|
||||||
if (strstr(rbuf, "ontent-") == 0) {
|
if (strstr(rbuf, "ontent-") == 0) {
|
||||||
bb_full_write(s, "Content-type: text/plain\r\n\r\n", 28);
|
full_write(s, "Content-type: text/plain\r\n\r\n", 28);
|
||||||
}
|
}
|
||||||
firstLine = 0;
|
firstLine = 0;
|
||||||
}
|
}
|
||||||
if (bb_full_write(s, rbuf, count) != count)
|
if (full_write(s, rbuf, count) != count)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
@ -1337,8 +1337,8 @@ static int sendFile(const char *url)
|
|||||||
char *buf = config->buf;
|
char *buf = config->buf;
|
||||||
|
|
||||||
sendHeaders(HTTP_OK);
|
sendHeaders(HTTP_OK);
|
||||||
while ((count = bb_full_read(f, buf, MAX_MEMORY_BUFF)) > 0) {
|
while ((count = full_read(f, buf, MAX_MEMORY_BUFF)) > 0) {
|
||||||
if (bb_full_write(a_c_w, buf, count) != count)
|
if (full_write(a_c_w, buf, count) != count)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
close(f);
|
close(f);
|
||||||
@ -2000,7 +2000,7 @@ int httpd_main(int argc, char *argv[])
|
|||||||
# ifdef CONFIG_FEATURE_HTTPD_SETUID
|
# ifdef CONFIG_FEATURE_HTTPD_SETUID
|
||||||
/* drop privileges */
|
/* drop privileges */
|
||||||
if(uid > 0)
|
if(uid > 0)
|
||||||
setuid(uid);
|
xsetuid(uid);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
#define xread bb_xread
|
|
||||||
|
|
||||||
static void timeout(int signum)
|
static void timeout(int signum)
|
||||||
{
|
{
|
||||||
bb_error_msg_and_die("Timed out");
|
bb_error_msg_and_die("Timed out");
|
||||||
@ -151,13 +149,14 @@ repeatyness:
|
|||||||
|
|
||||||
for (fd = 0; fd < FD_SETSIZE; fd++) {
|
for (fd = 0; fd < FD_SETSIZE; fd++) {
|
||||||
if (FD_ISSET(fd, &testfds)) {
|
if (FD_ISSET(fd, &testfds)) {
|
||||||
nread = xread(fd, bb_common_bufsiz1, sizeof(bb_common_bufsiz1));
|
nread = safe_read(fd, bb_common_bufsiz1,
|
||||||
|
sizeof(bb_common_bufsiz1));
|
||||||
|
|
||||||
if (fd == cfd) {
|
if (fd == cfd) {
|
||||||
if (!nread) exit(0);
|
if (nread<1) exit(0);
|
||||||
ofd = STDOUT_FILENO;
|
ofd = STDOUT_FILENO;
|
||||||
} else {
|
} else {
|
||||||
if (!nread) {
|
if (nread<1) {
|
||||||
// Close outgoing half-connection so they get EOF, but
|
// Close outgoing half-connection so they get EOF, but
|
||||||
// leave incoming alone so we can see response.
|
// leave incoming alone so we can see response.
|
||||||
shutdown(cfd, 1);
|
shutdown(cfd, 1);
|
||||||
@ -166,8 +165,7 @@ repeatyness:
|
|||||||
ofd = cfd;
|
ofd = cfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bb_full_write(ofd, bb_common_bufsiz1, nread) < 0)
|
xwrite(ofd, bb_common_bufsiz1, nread);
|
||||||
bb_perror_msg_and_die(bb_msg_write_error);
|
|
||||||
if (delay > 0) sleep(delay);
|
if (delay > 0) sleep(delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ static int tftp(const int cmd, const struct hostent *host,
|
|||||||
block_nr++;
|
block_nr++;
|
||||||
|
|
||||||
if ((cmd & tftp_cmd_put) && (opcode == TFTP_DATA)) {
|
if ((cmd & tftp_cmd_put) && (opcode == TFTP_DATA)) {
|
||||||
len = bb_full_read(localfd, cp, tftp_bufsize - 4);
|
len = full_read(localfd, cp, tftp_bufsize - 4);
|
||||||
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
bb_perror_msg(bb_msg_read_error);
|
bb_perror_msg(bb_msg_read_error);
|
||||||
@ -420,7 +420,7 @@ static int tftp(const int cmd, const struct hostent *host,
|
|||||||
|
|
||||||
if (tmp == block_nr) {
|
if (tmp == block_nr) {
|
||||||
|
|
||||||
len = bb_full_write(localfd, &buf[4], len - 4);
|
len = full_write(localfd, &buf[4], len - 4);
|
||||||
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
bb_perror_msg(bb_msg_write_error);
|
bb_perror_msg(bb_msg_write_error);
|
||||||
|
10
shell/ash.c
10
shell/ash.c
@ -3322,7 +3322,7 @@ evalcommand(union node *cmd, int flags)
|
|||||||
}
|
}
|
||||||
sp = arglist.list;
|
sp = arglist.list;
|
||||||
}
|
}
|
||||||
bb_full_write(preverrout_fd, "\n", 1);
|
full_write(preverrout_fd, "\n", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_is_exec = 0;
|
cmd_is_exec = 0;
|
||||||
@ -4559,7 +4559,7 @@ expandhere(union node *arg, int fd)
|
|||||||
{
|
{
|
||||||
herefd = fd;
|
herefd = fd;
|
||||||
expandarg(arg, (struct arglist *)NULL, 0);
|
expandarg(arg, (struct arglist *)NULL, 0);
|
||||||
bb_full_write(fd, stackblock(), expdest - (char *)stackblock());
|
full_write(fd, stackblock(), expdest - (char *)stackblock());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -8378,7 +8378,7 @@ growstackstr(void)
|
|||||||
{
|
{
|
||||||
size_t len = stackblocksize();
|
size_t len = stackblocksize();
|
||||||
if (herefd >= 0 && len >= 1024) {
|
if (herefd >= 0 && len >= 1024) {
|
||||||
bb_full_write(herefd, stackblock(), len);
|
full_write(herefd, stackblock(), len);
|
||||||
return stackblock();
|
return stackblock();
|
||||||
}
|
}
|
||||||
growstackblock();
|
growstackblock();
|
||||||
@ -10973,7 +10973,7 @@ openhere(union node *redir)
|
|||||||
if (redir->type == NHERE) {
|
if (redir->type == NHERE) {
|
||||||
len = strlen(redir->nhere.doc->narg.text);
|
len = strlen(redir->nhere.doc->narg.text);
|
||||||
if (len <= PIPESIZE) {
|
if (len <= PIPESIZE) {
|
||||||
bb_full_write(pip[1], redir->nhere.doc->narg.text, len);
|
full_write(pip[1], redir->nhere.doc->narg.text, len);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10987,7 +10987,7 @@ openhere(union node *redir)
|
|||||||
#endif
|
#endif
|
||||||
signal(SIGPIPE, SIG_DFL);
|
signal(SIGPIPE, SIG_DFL);
|
||||||
if (redir->type == NHERE)
|
if (redir->type == NHERE)
|
||||||
bb_full_write(pip[1], redir->nhere.doc->narg.text, len);
|
full_write(pip[1], redir->nhere.doc->narg.text, len);
|
||||||
else
|
else
|
||||||
expandhere(redir->nhere.doc, pip[1]);
|
expandhere(redir->nhere.doc, pip[1]);
|
||||||
_exit(0);
|
_exit(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user