From 32c761fed48a5b781c9177878a57a2d153caf680 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 3 Dec 2002 10:55:51 +0000 Subject: [PATCH] safe-read.c, safe-write.c: Change variable names and comments, but not semantics, to minimize the differences between these two files. --- lib/safe-read.c | 24 +++++++++--------------- lib/safe-write.c | 40 ++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/lib/safe-read.c b/lib/safe-read.c index 5d2cd9dded..f31ddc1041 100644 --- a/lib/safe-read.c +++ b/lib/safe-read.c @@ -57,31 +57,25 @@ extern int errno; # define INT_MAX TYPE_MAXIMUM (int) #endif -/* We don't pass an nbytes count > SSIZE_MAX to read() - POSIX says the - effect would be implementation-defined. Also we don't pass an nbytes - count > INT_MAX but <= SSIZE_MAX to read() - this triggers a bug in - Tru64 5.1. */ -#define MAX_BYTES_TO_READ INT_MAX - /* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted. - Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR + Return the actual number of bytes read, zero for EOF, or SAFE_RW_ERROR upon error. */ size_t safe_read (int fd, void *buf, size_t count) { - size_t nbytes_to_read = count; ssize_t result; - /* Limit the number of bytes to read, to avoid running into unspecified - behaviour. But keep the file pointer block aligned when doing so. - Note that in this case we don't need to call read() multiple times here, - because the caller is prepared to partial results. */ - if (nbytes_to_read > MAX_BYTES_TO_READ) - nbytes_to_read = MAX_BYTES_TO_READ & ~8191; + /* POSIX limits COUNT to SSIZE_MAX, but we limit it further, requiring + that COUNT <= INT_MAX, to avoid triggering a bug in Tru64 5.1. + When decreasing COUNT, keep the file pointer block-aligned. + Note that in any case, read may succeed, yet read fewer than COUNT + bytes, so the caller must be prepared to handle partial results. */ + if (count > INT_MAX) + count = INT_MAX & ~8191; do { - result = read (fd, buf, nbytes_to_read); + result = read (fd, buf, count); } while (result < 0 && IS_EINTR (errno)); diff --git a/lib/safe-write.c b/lib/safe-write.c index 8c60bba39e..47200c3fb1 100644 --- a/lib/safe-write.c +++ b/lib/safe-write.c @@ -1,4 +1,4 @@ -/* An interface to write() that retries after interrupts. +/* An interface to write that retries after interrupts. Copyright (C) 1993, 1994, 1998, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -33,6 +33,12 @@ extern int errno; #endif +#ifdef EINTR +# define IS_EINTR(x) ((x) == EINTR) +#else +# define IS_EINTR(x) 0 +#endif + #include #ifndef CHAR_BIT @@ -51,37 +57,27 @@ extern int errno; # define INT_MAX TYPE_MAXIMUM (int) #endif -/* We don't pass an nbytes count > SSIZE_MAX to write() - POSIX says the - effect would be implementation-defined. Also we don't pass an nbytes - count > INT_MAX but <= SSIZE_MAX to write() - this triggers a bug in - Tru64 5.1. */ -#define MAX_BYTES_TO_READ INT_MAX - /* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted. - Return the actual number of bytes written, zero for EOF, or (size_t) -1 - for an error. */ + Return the actual number of bytes written, zero for EOF, or SAFE_RW_ERROR + upon error. */ size_t safe_write (int fd, const void *buf, size_t count) { - size_t nbytes_to_write = count; ssize_t result; - /* Limit the number of bytes to write, to avoid running into unspecified - behaviour. But keep the file pointer block aligned when doing so. - Note that in this case we don't need to call write() multiple times here, - because the caller is prepared to partial results. */ - if (nbytes_to_write > MAX_BYTES_TO_READ) - nbytes_to_write = MAX_BYTES_TO_READ & ~8191; + /* POSIX limits COUNT to SSIZE_MAX, but we limit it further, requiring + that COUNT <= INT_MAX, to avoid triggering a bug in Tru64 5.1. + When decreasing COUNT, keep the file pointer block-aligned. + Note that in any case, write may succeed, yet write fewer than COUNT + bytes, so the caller must be prepared to handle partial results. */ + if (count > INT_MAX) + count = INT_MAX & ~8191; do { - result = write (fd, buf, nbytes_to_write); + result = write (fd, buf, count); } -#ifdef EINTR - while (result < 0 && errno == EINTR); -#else - while (0); -#endif + while (result < 0 && IS_EINTR (errno)); return (size_t) result; } -- 2.30.2