Mercurial > hg > octave-jordi > gnulib-hg
diff lib/safe-write.c @ 4049:6a1238f585b1
Synchronize safe-write with safe-read.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Mon, 02 Dec 2002 18:53:53 +0000 |
parents | 9fcf64c770ed |
children | 9bc86ccaeda6 |
line wrap: on
line diff
--- a/lib/safe-write.c +++ b/lib/safe-write.c @@ -35,6 +35,22 @@ #include <limits.h> +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +/* The extra casts work around common compiler bugs. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. + It is necessary at least when t == time_t. */ +#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) +#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) + +#ifndef INT_MAX +# 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 @@ -47,37 +63,25 @@ size_t safe_write (int fd, const void *buf, size_t count) { - size_t total_written = 0; + size_t nbytes_to_write = count; + ssize_t result; - if (count > 0) - { - const char *ptr = (const char *) buf; - do - { - size_t nbytes_to_write = count; - ssize_t result; - - /* Limit the number of bytes to write in one round, to avoid running - into unspecified behaviour. But keep the file pointer block - aligned when doing so. */ - if (nbytes_to_write > MAX_BYTES_TO_READ) - nbytes_to_write = MAX_BYTES_TO_READ & ~8191; + /* 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; - result = write (fd, ptr, nbytes_to_write); - if (result < 0) - { + do + { + result = write (fd, buf, nbytes_to_write); + } #ifdef EINTR - if (errno == EINTR) - continue; + while (result < 0 && errno == EINTR); +#else + while (0); #endif - return result; - } - total_written += result; - ptr += result; - count -= result; - } - while (count > 0); - } - return total_written; + return (size_t) result; }