X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Ffile_io.c;h=26584b9aa6f34f22c4250e1e21ba7fea97b31e2a;hp=014db8cfdebb6e6aaedb9c511b4a3d41ee8cd7dd;hb=58ccad75516dcb536515cfb672e150670f44b957;hpb=bdcbe480fbc8684fcc618adbf94d9a7d1794378a diff --git a/src/file_io.c b/src/file_io.c index 014db8cf..26584b9a 100644 --- a/src/file_io.c +++ b/src/file_io.c @@ -5,71 +5,59 @@ /* * Copyright (C) 2013 Eric Biggers * - * This file is part of wimlib, a library for working with WIM files. + * This file is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. * - * wimlib 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 3 of the License, or (at your option) - * any later version. - * - * wimlib 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 + * This file 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 Lesser General Public License for more * details. * - * You should have received a copy of the GNU General Public License - * along with wimlib; if not, see http://www.gnu.org/licenses/. + * You should have received a copy of the GNU Lesser General Public License + * along with this file; if not, see http://www.gnu.org/licenses/. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include "wimlib/error.h" -#include "wimlib/file_io.h" -#include "wimlib/util.h" -#ifdef __WIN32__ -# include "wimlib/win32.h" /* For pread(), pwrite() replacements */ -#else -# include /* for writev() and `struct iovec' */ -#endif - #include #include +#include "wimlib/error.h" +#include "wimlib/file_io.h" +#include "wimlib/util.h" +#include "wimlib/win32.h" /* For pread(), pwrite() replacements */ -/* Wrapper around read() that checks for errors keeps retrying until all +/* + * Wrapper around read() that checks for errors and keeps retrying until all * requested bytes have been read or until end-of file has occurred. * * Return values: * WIMLIB_ERR_SUCCESS (0) * WIMLIB_ERR_READ (errno set) - * WIMLIB_ERR_UNEXPECTED_END_OF_FILE (errno set to 0) + * WIMLIB_ERR_UNEXPECTED_END_OF_FILE (errno set to EINVAL) */ int full_read(struct filedes *fd, void *buf, size_t count) { - ssize_t bytes_read; - size_t bytes_remaining; - - for (bytes_remaining = count; - bytes_remaining != 0; - bytes_remaining -= bytes_read, buf += bytes_read) - { - bytes_read = read(fd->fd, buf, bytes_remaining); - if (unlikely(bytes_read <= 0)) { - if (bytes_read == 0) { - errno = 0; + while (count) { + ssize_t ret = read(fd->fd, buf, count); + if (unlikely(ret <= 0)) { + if (ret == 0) { + errno = EINVAL; return WIMLIB_ERR_UNEXPECTED_END_OF_FILE; - } else if (errno == EINTR) { - continue; - } else { - return WIMLIB_ERR_READ; } + if (errno == EINTR) + continue; + return WIMLIB_ERR_READ; } + buf += ret; + count -= ret; + fd->offset += ret; } - count -= bytes_remaining; - fd->offset += count; return 0; } @@ -102,7 +90,8 @@ pipe_read(struct filedes *fd, void *buf, size_t count, off_t offset) return full_read(fd, buf, count); } -/* Wrapper around pread() that checks for errors and keeps retrying until all +/* + * Wrapper around pread() that checks for errors and keeps retrying until all * requested bytes have been read or until end-of file has occurred. This also * transparently handle reading from pipe files, but the caller needs to be sure * the requested offset is greater than or equal to the current offset, or else @@ -111,37 +100,33 @@ pipe_read(struct filedes *fd, void *buf, size_t count, off_t offset) * Return values: * WIMLIB_ERR_SUCCESS (0) * WIMLIB_ERR_READ (errno set) - * WIMLIB_ERR_UNEXPECTED_END_OF_FILE (errno set to 0) + * WIMLIB_ERR_UNEXPECTED_END_OF_FILE (errno set to EINVAL) * WIMLIB_ERR_RESOURCE_ORDER (errno set to ESPIPE) */ int full_pread(struct filedes *fd, void *buf, size_t count, off_t offset) { - ssize_t bytes_read; - size_t bytes_remaining; - if (fd->is_pipe) goto is_pipe; - for (bytes_remaining = count; - bytes_remaining != 0; - bytes_remaining -= bytes_read, buf += bytes_read, - offset += bytes_read) - { - bytes_read = pread(fd->fd, buf, bytes_remaining, offset); - if (unlikely(bytes_read <= 0)) { - if (bytes_read == 0) { - errno = 0; + while (count) { + ssize_t ret = pread(fd->fd, buf, count, offset); + if (unlikely(ret <= 0)) { + if (ret == 0) { + errno = EINVAL; return WIMLIB_ERR_UNEXPECTED_END_OF_FILE; - } else if (errno == EINTR) { + } + if (errno == EINTR) continue; - } else if (errno == ESPIPE) { + if (errno == ESPIPE) { fd->is_pipe = 1; goto is_pipe; - } else { - return WIMLIB_ERR_READ; } + return WIMLIB_ERR_READ; } + buf += ret; + count -= ret; + offset += ret; } return 0; @@ -149,7 +134,8 @@ is_pipe: return pipe_read(fd, buf, count, offset); } -/* Wrapper around write() that checks for errors and keeps retrying until all +/* + * Wrapper around write() that checks for errors and keeps retrying until all * requested bytes have been written. * * Return values: @@ -159,65 +145,46 @@ is_pipe: int full_write(struct filedes *fd, const void *buf, size_t count) { - ssize_t bytes_written; - size_t bytes_remaining; - - for (bytes_remaining = count; - bytes_remaining != 0; - bytes_remaining -= bytes_written, buf += bytes_written) - { - bytes_written = write(fd->fd, buf, bytes_remaining); - if (unlikely(bytes_written < 0)) { + while (count) { + ssize_t ret = write(fd->fd, buf, count); + if (unlikely(ret < 0)) { if (errno == EINTR) continue; return WIMLIB_ERR_WRITE; } + buf += ret; + count -= ret; + fd->offset += ret; } - fd->offset += count; return 0; } -/* Wrapper around pwrite() that checks for errors and keeps retrying until all +/* + * Wrapper around pwrite() that checks for errors and keeps retrying until all * requested bytes have been written. * * Return values: * WIMLIB_ERR_SUCCESS (0) * WIMLIB_ERR_WRITE (errno set) - * */ + */ int full_pwrite(struct filedes *fd, const void *buf, size_t count, off_t offset) { - ssize_t bytes_written; - size_t bytes_remaining; - - for (bytes_remaining = count; - bytes_remaining != 0; - bytes_remaining -= bytes_written, buf += bytes_written, - offset += bytes_written) - { - bytes_written = pwrite(fd->fd, buf, bytes_remaining, offset); - if (unlikely(bytes_written < 0)) { + while (count) { + ssize_t ret = pwrite(fd->fd, buf, count, offset); + if (unlikely(ret < 0)) { if (errno == EINTR) continue; return WIMLIB_ERR_WRITE; } + buf += ret; + count -= ret; + offset += ret; } return 0; } -ssize_t -raw_pread(struct filedes *fd, void *buf, size_t count, off_t offset) -{ - return pread(fd->fd, buf, count, offset); -} - -ssize_t -raw_pwrite(struct filedes *fd, const void *buf, size_t count, off_t offset) -{ - return pwrite(fd->fd, buf, count, offset); -} - off_t filedes_seek(struct filedes *fd, off_t offset) { if (fd->is_pipe) {