- ssize_t bytes_read;
- size_t bytes_remaining;
-
- for (bytes_remaining = count;
- bytes_remaining != 0;
- bytes_remaining -= bytes_read, buf += bytes_read,
- offset += bytes_read)
- {
- bytes_read = pread(fd, buf, bytes_remaining, offset);
- if (bytes_read <= 0) {
- if (bytes_read == 0)
- errno = EIO;
- else if (errno == EINTR)
- continue;
- break;
- }
- }
- return count - bytes_remaining;
-}
-
-/* Like pwrite(), but keep trying until everything has been written or we know
- * for sure that there was an error. */
-size_t
-full_pwrite(int 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, buf, bytes_remaining, offset);
- if (bytes_written < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- }
- return count - bytes_remaining;
-}
-
-/* Like writev(), but keep trying until everything has been written or we know
- * for sure that there was an error. */
-size_t
-full_writev(int fd, struct iovec *iov, int iovcnt)
-{
- size_t total_bytes_written = 0;
- while (iovcnt > 0) {
- ssize_t bytes_written;
-
- bytes_written = writev(fd, iov, iovcnt);
- if (bytes_written < 0) {
- if (errno == EINTR)
- continue;
- break;
- }
- total_bytes_written += bytes_written;
- while (bytes_written) {
- if (bytes_written >= iov[0].iov_len) {
- bytes_written -= iov[0].iov_len;
- iov++;
- iovcnt--;
- } else {
- iov[0].iov_base += bytes_written;
- iov[0].iov_len -= bytes_written;
- bytes_written = 0;
- }
- }
- }
- return total_bytes_written;
-}
-
-off_t
-filedes_offset(filedes_t fd)
-{
- return lseek(fd, 0, SEEK_CUR);