Cleaup read() and write() variants, plus a couple of new functions like xlseek and fdlength() for the new mkswap.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -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!"); | |
| 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 { | |
| @@ -374,11 +367,10 @@ static void check_suid (struct BB_applet *applet) | |
| #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 | |
| @@ -419,14 +411,14 @@ static const char *unpack_usage_messages(void) | |
| 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; | |
| } | |
| @@ -454,33 +446,32 @@ void bb_show_usage (void) | |
| 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)); |
| } | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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); | |
| @@ -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 \ | |
| @@ -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; | |
| - | 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); | |
| } | |
| @@ -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; | |
| @@ -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); |
| } | |
| @@ -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; | |
| @@ -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++) { | |
| @@ -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 */ | |
| @@ -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 { | |
| @@ -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; | |
| @@ -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"); | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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"); | |
| } | |
| @@ -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); | |
| @@ -45,15 +45,15 @@ int loadkmap_main(int argc, char **argv) | |
| 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; | |
| @@ -63,8 +63,6 @@ int loadkmap_main(int argc, char **argv) | |
| } | |
| } | |
| - | /* 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; |
| } | |
| @@ -196,26 +196,20 @@ int dd_main(int argc, char **argv) | |
| 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) { | |
| @@ -54,9 +54,8 @@ static void tail_xprint_header(const char *fmt, const char *filename) | |
| 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) | |
| @@ -133,9 +133,9 @@ extern DIR *bb_xopendir(const char *path); | |
| 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), | |
| @@ -187,6 +187,7 @@ extern void itoa_to_buf(int n, char *buf, unsigned buflen); | |
| 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; | |
| @@ -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_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 | |
| @@ -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_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); | |
| @@ -221,7 +221,7 @@ static void message(int device, const char *fmt, ...) | |
| } | |
| } | |
| if ((device & LOG) && (log_fd >= 0)) { | |
| - | bb_full_write(log_fd, msg, l); |
| + | full_write(log_fd, msg, l); |
| } | |
| #endif | |
| @@ -230,7 +230,7 @@ static void message(int device, const char *fmt, ...) | |
| 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 */ | |
| @@ -536,7 +536,7 @@ static pid_t run(const struct init_action *a) | |
| 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') | |
| ; | |
| } | |
| @@ -46,10 +46,8 @@ const char *change_identity_e2str ( const struct passwd *pw ) | |
| 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; | |
| } | |
| @@ -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; | |
| 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; | |
| @@ -32,7 +32,7 @@ int create_icmp6_socket(void) | |
| } | |
| /* drop root privs if running setuid */ | |
| - | setuid(getuid()); |
| + | xsetuid(getuid()); |
| return sock; | |
| } | |
| @@ -31,7 +31,7 @@ int create_icmp_socket(void) | |
| } | |
| /* drop root privs if running setuid */ | |
| - | setuid(getuid()); |
| + | xsetuid(getuid()); |
| return sock; | |
| } | |
| @@ -17,7 +17,7 @@ | |
| * 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; | |
| @@ -16,7 +16,7 @@ | |
| * 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; | |
| @@ -3,6 +3,7 @@ | |
| * Utility routines. | |
| * | |
| * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> | |
| + | * Copyright (C) 2005 by Rob Landley <[email protected]> |
| * | |
| * 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 | |
| #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); | |
| } | |
| @@ -294,3 +309,41 @@ void xsetuid(uid_t uid) | |
| 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 |
| @@ -212,7 +212,7 @@ static int receive(char *error_buf, size_t error_buf_size, | |
| 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; | |
| } | |
| @@ -961,7 +961,7 @@ static int sendHeaders(HttpResponseNum responseNum) | |
| #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); |
| } | |
| /**************************************************************************** | |
| @@ -1222,7 +1222,7 @@ static int sendCgi(const char *url, | |
| 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; | |
| @@ -1263,14 +1263,14 @@ static int sendCgi(const char *url, | |
| 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 | |
| @@ -1337,8 +1337,8 @@ static int sendFile(const char *url) | |
| 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); | |
| @@ -2000,7 +2000,7 @@ int httpd_main(int argc, char *argv[]) | |
| # ifdef CONFIG_FEATURE_HTTPD_SETUID | |
| /* drop privileges */ | |
| if(uid > 0) | |
| - | setuid(uid); |
| + | xsetuid(uid); |
| # endif | |
| #endif | |
| @@ -9,8 +9,6 @@ | |
| #include "busybox.h" | |
| - | #define xread bb_xread |
| - | |
| static void timeout(int signum) | |
| { | |
| bb_error_msg_and_die("Timed out"); | |
| @@ -151,13 +149,14 @@ repeatyness: | |
| 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); | |
| @@ -166,8 +165,7 @@ repeatyness: | |
| 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); | |
| } | |
| } | |
| @@ -249,7 +249,7 @@ static int tftp(const int cmd, const struct hostent *host, | |
| 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); | |
| @@ -420,7 +420,7 @@ static int tftp(const int cmd, const struct hostent *host, | |
| 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); | |
| @@ -3322,7 +3322,7 @@ evalcommand(union node *cmd, int flags) | |
| } | |
| sp = arglist.list; | |
| } | |
| - | bb_full_write(preverrout_fd, "\n", 1); |
| + | full_write(preverrout_fd, "\n", 1); |
| } | |
| cmd_is_exec = 0; | |
| @@ -4559,7 +4559,7 @@ expandhere(union node *arg, int fd) | |
| { | |
| herefd = fd; | |
| 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(); | |
| if (herefd >= 0 && len >= 1024) { | |
| - | bb_full_write(herefd, stackblock(), len); |
| + | full_write(herefd, stackblock(), len); |
| return stackblock(); | |
| } | |
| growstackblock(); | |
| @@ -10973,7 +10973,7 @@ openhere(union node *redir) | |
| 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; | |
| } | |
| } | |
| @@ -10987,7 +10987,7 @@ openhere(union node *redir) | |
| #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); | |