xlseek and fdlength() for the new mkswap.
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 (setegid (sct->m_gid))
- bb_error_msg_and_die
- ("BusyBox binary has insufficient rights to set proper GID for applet!");
- } else
- setgid (rgid); /* no sgid -> drop */
-
- if (sct->m_mode & S_ISUID) {
- if (seteuid (sct->m_uid))
- bb_error_msg_and_die
- ("BusyBox binary has insufficient rights to set proper UID for applet!");
- } else
- setuid (ruid); /* no suid -> drop */
+ xsetgid(sct->m_gid);
+ } else xsetgid(rgid); /* no sgid -> drop */
+
+ if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
+ else xsetuid(ruid); /* no suid -> drop */
} else {
/* default: drop all privileges */
- setgid (rgid);
- setuid (ruid);
+ xsetgid(rgid);
+ xsetuid(ruid);
}
return;
} else {
#endif
if (applet->need_suid == _BB_SUID_ALWAYS) {
- if (geteuid () != 0)
- bb_error_msg_and_die ("This applet requires root privileges!");
+ if (geteuid()) bb_error_msg_and_die("Applet requires root privileges!");
} else if (applet->need_suid == _BB_SUID_NEVER) {
- setgid (rgid); /* drop all privileges */
- setuid (ruid);
+ xsetgid(rgid); /* drop all privileges */
+ xsetuid(ruid);
}
}
#else
case -1: /* error */
exit(1);
case 0: /* child */
- bb_full_write(input[1], packed_usage, sizeof(packed_usage));
+ full_write(input[1], packed_usage, sizeof(packed_usage));
exit(0);
}
/* parent */
close(input[1]);
buf = xmalloc(SIZEOF_usage_messages);
- bb_full_read(output[0], buf, SIZEOF_usage_messages);
+ full_read(output[0], buf, SIZEOF_usage_messages);
return buf;
}
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 = y;
+ const struct BB_applet *applet = vapplet;
- return strcmp (name, applet->name);
+ return strcmp(name, applet->name);
}
extern const size_t NUM_APPLETS;
-struct BB_applet *find_applet_by_name (const char *name)
+struct BB_applet *find_applet_by_name(const char *name)
{
- return bsearch (name, applets, NUM_APPLETS, sizeof (struct BB_applet),
+ return bsearch(name, applets, NUM_APPLETS, sizeof(struct BB_applet),
applet_name_compare);
}
-void run_applet_by_name (const char *name, int argc, char **argv)
+void run_applet_by_name(const char *name, int argc, char **argv)
{
- if(ENABLE_FEATURE_SUID_CONFIG) parse_config_file ();
+ if (ENABLE_FEATURE_SUID_CONFIG) parse_config_file();
- if(!strncmp(name, "busybox", 7)) busybox_main(argc, argv);
+ if (!strncmp(name, "busybox", 7)) busybox_main(argc, argv);
/* Do a binary search to find the applet entry given the name. */
applet_using = find_applet_by_name(name);
- if(applet_using) {
+ if (applet_using) {
bb_applet_name = applet_using->name;
- if(argc==2 && !strcmp(argv[1], "--help")) bb_show_usage ();
- if(ENABLE_FEATURE_SUID) check_suid (applet_using);
- exit ((*(applet_using->main)) (argc, argv));
+ if(argc==2 && !strcmp(argv[1], "--help")) bb_show_usage();
+ if(ENABLE_FEATURE_SUID) check_suid(applet_using);
+ exit((*(applet_using->main))(argc, 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");
}
}
/* 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);
header_list.o \
header_verbose_list.o \
\
- archive_xread_all.o \
archive_xread_all_eof.o \
\
seek_by_char.o \
+++ /dev/null
-/* 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;
-}
{
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);
}
} 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) {
/* 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--;
}
}
/* 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;
archive_handle->buffer = xzalloc(size + 1);
- archive_xread_all(archive_handle, archive_handle->buffer, size);
+ xread(archive_handle->src_fd, archive_handle->buffer, size);
}
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;
/* 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;
}
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;
/* 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++) {
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;
* 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 */
}
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 */
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 {
/* 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 */
/* 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;
#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;
/* 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");
}
{
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");
}
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");
}
{
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 */
}
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 */
}
/* 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");
}
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);
}
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;
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");
}
}
/* 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");
}
#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;
}
}
-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 */
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) {
}
/* 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);
}
/* 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);
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.");
- if (bb_full_read(0, flags, MAX_NR_KEYMAPS) != MAX_NR_KEYMAPS)
- bb_perror_msg_and_die("Error reading keymap flags");
+ xread(0, flags, MAX_NR_KEYMAPS);
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
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++) {
ke.kb_index = j;
ke.kb_table = i;
}
}
- /* Don't bother to close files. Exit does that
- * automagically, so we can save a few bytes */
- /* close(fd); */
- return EXIT_SUCCESS;
+ if (ENABLE_FEATURE_CLEAN_UP) close(fd);
+ return 0;
}
tmp += d;
oc += d;
if (oc == obs) {
- if (bb_full_write(ofd, obuf, obs) < 0) {
- bb_perror_msg_and_die("%s", outfile);
- }
+ xwrite(ofd, obuf, obs);
out_full++;
oc = 0;
}
}
} else {
- if ((n = bb_full_write(ofd, ibuf, n)) < 0) {
- bb_perror_msg_and_die("%s", outfile);
- }
+ xwrite(ofd, ibuf, n);
if (n == ibs) out_full++;
else out_part++;
}
}
if (ENABLE_FEATURE_DD_IBS_OBS && oc) {
- if (bb_full_write(ofd, obuf, oc) < 0) {
- bb_perror_msg_and_die("%s", outfile);
- }
+ xwrite(ofd, obuf, oc);
out_part++;
}
if (close (ifd) < 0) {
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 (bb_full_write(STDOUT_FILENO, buf, len) < 0) {
+ if (full_write(STDOUT_FILENO, buf, len) < 0)
bb_perror_nomsg_and_die();
- }
}
static ssize_t tail_read(int fd, char *buf, size_t count)
extern int remove_file(const char *path, 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 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 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,
int followLinks, int depthFirst,
int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
extern char *itoa(int n);
extern void xsetgid(gid_t gid);
extern void xsetuid(uid_t uid);
+extern off_t fdlength(int fd);
#define BB_GETOPT_ERROR 0x80000000UL
extern const char *bb_opt_complementally;
extern int bb_xopen(const char *pathname, int flags);
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 bb_xread_all(int fd, void *buf, size_t count);
-extern unsigned char bb_xread_char(int fd);
+extern void xread(int fd, void *buf, size_t count);
+extern unsigned char 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
#ifdef TASK_COMM_LEN
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 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 void data_align(archive_handle_t *archive_handle, const unsigned short boundary);
}
}
if ((device & LOG) && (log_fd >= 0)) {
- bb_full_write(log_fd, msg, l);
+ full_write(log_fd, msg, l);
}
#endif
O_WRONLY | O_NOCTTY | O_NONBLOCK);
/* Always send console messages to /dev/console so people will see them. */
if (fd >= 0) {
- bb_full_write(fd, msg, l);
+ full_write(fd, msg, l);
close(fd);
#if ENABLE_DEBUG_INIT
/* all descriptors may be closed */
messageD(LOG, "Waiting for enter to start '%s'"
"(pid %d, terminal %s)\n",
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')
;
}
return "cannot set groups";
endgrent ( );
- if ( setgid ( pw-> pw_gid ))
- return "cannot set group id";
- if ( setuid ( pw->pw_uid ))
- return "cannot set user id";
+ xsetgid(pw-> pw_gid);
+ xsetuid(pw->pw_uid);
return NULL;
}
if (src_fd < 0) goto out;
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);
- if (xread > 0) {
+ if (rd > 0) {
/* A -1 dst_fd means we need to fake it... */
- wrote = (dst_fd < 0) ? xread : bb_full_write(dst_fd, buffer, xread);
- if (wrote < xread) {
+ wr = (dst_fd < 0) ? rd : full_write(dst_fd, buffer, rd);
+ if (wr < rd) {
bb_perror_msg(bb_msg_write_error);
break;
}
- total += wrote;
+ total += wr;
if (total == size) status = 0;
- } else if (xread < 0) {
+ } else if (rd < 0) {
bb_perror_msg(bb_msg_read_error);
break;
- } else if (xread == 0) {
+ } else if (rd == 0) {
/* All done. */
status = 0;
break;
}
/* drop root privs if running setuid */
- setuid(getuid());
+ xsetuid(getuid());
return sock;
}
}
/* drop root privs if running setuid */
- setuid(getuid());
+ xsetuid(getuid());
return sock;
}
* Returns the amount read, or -1 on an error.
* 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 total;
* This does multiple writes as necessary.
* 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 total;
* Utility routines.
*
* 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.
*/
#endif
#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;
+ while (count) {
+ ssize_t size;
- size = read(fd, buf, count);
- if (size < 0) {
- bb_perror_msg_and_die(bb_msg_read_error);
+ if ((size = safe_read(fd, buf, count)) < 1)
+ bb_error_msg_and_die("Short read");
+ count -= size;
+ buf = ((char *) buf) + size;
}
- return(size);
}
#endif
-#ifdef L_xread_all
-void bb_xread_all(int fd, void *buf, size_t count)
-{
- ssize_t size;
+#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) {
- if ((size = bb_xread(fd, buf, count)) == 0) { /* EOF */
- bb_error_msg_and_die("Short read");
- }
+ ssize_t size;
+
+ if ((size = safe_write(fd, buf, count)) < 1)
+ bb_error_msg_and_die("Short write");
count -= size;
buf = ((char *) buf) + size;
}
- return;
+}
+#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
#ifdef L_xread_char
-unsigned char bb_xread_char(int fd)
+unsigned char xread_char(int fd)
{
char tmp;
- bb_xread_all(fd, &tmp, 1);
+ xread(fd, &tmp, 1);
return(tmp);
}
if (setuid(uid)) bb_error_msg_and_die("setuid");
}
#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
wantBlockNo++;
length += blockLength;
- if (bb_full_write(filefd, blockBuf, blockLength) < 0) {
+ if (full_write(filefd, blockBuf, blockLength) < 0) {
note_error("write to file failed: %m");
goto fatal;
}
#if DEBUG
fprintf(stderr, "Headers: '%s'", buf);
#endif
- return bb_full_write(a_c_w, buf, len);
+ return full_write(a_c_w, buf, len);
}
/****************************************************************************
break;
}
} 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) {
post_readed_size -= count;
post_readed_idx += count;
rbuf[count] = 0;
/* check to see if the user script added headers */
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) {
- 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;
}
- if (bb_full_write(s, rbuf, count) != count)
+ if (full_write(s, rbuf, count) != count)
break;
#if DEBUG
char *buf = config->buf;
sendHeaders(HTTP_OK);
- while ((count = bb_full_read(f, buf, MAX_MEMORY_BUFF)) > 0) {
- if (bb_full_write(a_c_w, buf, count) != count)
+ while ((count = full_read(f, buf, MAX_MEMORY_BUFF)) > 0) {
+ if (full_write(a_c_w, buf, count) != count)
break;
}
close(f);
# ifdef CONFIG_FEATURE_HTTPD_SETUID
/* drop privileges */
if(uid > 0)
- setuid(uid);
+ xsetuid(uid);
# endif
#endif
#include "busybox.h"
-#define xread bb_xread
-
static void timeout(int signum)
{
bb_error_msg_and_die("Timed out");
for (fd = 0; fd < FD_SETSIZE; fd++) {
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 (!nread) exit(0);
+ if (nread<1) exit(0);
ofd = STDOUT_FILENO;
} else {
- if (!nread) {
+ if (nread<1) {
// Close outgoing half-connection so they get EOF, but
// leave incoming alone so we can see response.
shutdown(cfd, 1);
ofd = cfd;
}
- if (bb_full_write(ofd, bb_common_bufsiz1, nread) < 0)
- bb_perror_msg_and_die(bb_msg_write_error);
+ xwrite(ofd, bb_common_bufsiz1, nread);
if (delay > 0) sleep(delay);
}
}
block_nr++;
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) {
bb_perror_msg(bb_msg_read_error);
if (tmp == block_nr) {
- len = bb_full_write(localfd, &buf[4], len - 4);
+ len = full_write(localfd, &buf[4], len - 4);
if (len < 0) {
bb_perror_msg(bb_msg_write_error);
}
sp = arglist.list;
}
- bb_full_write(preverrout_fd, "\n", 1);
+ full_write(preverrout_fd, "\n", 1);
}
cmd_is_exec = 0;
{
herefd = fd;
expandarg(arg, (struct arglist *)NULL, 0);
- bb_full_write(fd, stackblock(), expdest - (char *)stackblock());
+ full_write(fd, stackblock(), expdest - (char *)stackblock());
}
{
size_t len = stackblocksize();
if (herefd >= 0 && len >= 1024) {
- bb_full_write(herefd, stackblock(), len);
+ full_write(herefd, stackblock(), len);
return stackblock();
}
growstackblock();
if (redir->type == NHERE) {
len = strlen(redir->nhere.doc->narg.text);
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;
}
}
#endif
signal(SIGPIPE, SIG_DFL);
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
expandhere(redir->nhere.doc, pip[1]);
_exit(0);