When cp ran out of space it didn't return a nonzero error code. Fixes bug 493.
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)
| @@ -4,19 +4,7 @@ | |
| * | |
| * Copyright (C) 1999-2005 by Erik Andersen <[email protected]> | |
| * | |
| - | * This program is free software; you can redistribute it and/or modify |
| - | * it under the terms of the GNU General Public License as published by |
| - | * the Free Software Foundation; either version 2 of the License, or |
| - | * (at your option) any later version. |
| - | * |
| - | * This program is distributed in the hope that it will be useful, |
| - | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| - | * General Public License for more details. |
| - | * |
| - | * You should have received a copy of the GNU General Public License |
| - | * along with this program; if not, write to the Free Software |
| - | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| + | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
| */ | |
| #include <errno.h> | |
| @@ -34,59 +22,41 @@ | |
| #endif | |
| - | static size_t bb_full_fd_action(int src_fd, int dst_fd, const size_t size2) |
| + | static ssize_t bb_full_fd_action(int src_fd, int dst_fd, size_t size) |
| { | |
| - | int status; |
| - | size_t xread, wrote, total, size = size2; |
| - | |
| - | if (src_fd < 0) { |
| - | return -1; |
| - | } |
| + | int status = -1; |
| + | size_t total = 0; |
| + | RESERVE_CONFIG_BUFFER(buffer,BUFSIZ); |
| - | if (size == 0) { |
| - | /* If size is 0 copy until EOF */ |
| - | size = ULONG_MAX; |
| - | } |
| + | if (src_fd < 0) goto out; |
| + | while (!size || total < size) |
| { | |
| - | RESERVE_CONFIG_BUFFER(buffer,BUFSIZ); |
| - | total = 0; |
| - | wrote = 0; |
| - | status = -1; |
| - | while (total < size) |
| - | { |
| - | xread = BUFSIZ; |
| - | if (size < (total + BUFSIZ)) |
| - | xread = size - total; |
| - | xread = bb_full_read(src_fd, buffer, xread); |
| - | if (xread > 0) { |
| - | if (dst_fd < 0) { |
| - | /* A -1 dst_fd means we need to fake it... */ |
| - | wrote = xread; |
| - | } else { |
| - | wrote = bb_full_write(dst_fd, buffer, xread); |
| - | } |
| - | if (wrote < xread) { |
| - | bb_perror_msg(bb_msg_write_error); |
| - | break; |
| - | } |
| - | total += wrote; |
| - | } else if (xread < 0) { |
| - | bb_perror_msg(bb_msg_read_error); |
| - | break; |
| - | } else if (xread == 0) { |
| - | /* All done. */ |
| - | status = 0; |
| + | ssize_t wrote, xread = (size && size < BUFSIZ) ? size : BUFSIZ; |
| + | xread = bb_full_read(src_fd, buffer, xread); |
| + | if (xread > 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) { |
| + | bb_perror_msg(bb_msg_write_error); |
| break; | |
| } | |
| + | total += wrote; |
| + | size -= wrote; |
| + | } else if (xread < 0) { |
| + | bb_perror_msg(bb_msg_read_error); |
| + | break; |
| + | } else if (xread == 0) { |
| + | /* All done. */ |
| + | status = 0; |
| + | break; |
| } | |
| - | RELEASE_CONFIG_BUFFER(buffer); |
| } | |
| + | |
| + | out: |
| + | RELEASE_CONFIG_BUFFER(buffer); |
| - | if (status == 0 || total) |
| - | return total; |
| - | /* Some sortof error occured */ |
| - | return -1; |
| + | return status ? status : total; |
| } | |