X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsafe-write.c;h=4c375a6ca1905cde59f23f95d03a94b6d9865862;hb=0191a7041eba6c7f9190e56dea2430ded092fc68;hp=8c60bba39e0c0f83303c754b5eceb69e04ab7a37;hpb=2cb98f7c62c63eedab93f2a0cc53383c5d8af9f0;p=gnulib.git diff --git a/lib/safe-write.c b/lib/safe-write.c index 8c60bba39..4c375a6ca 100644 --- a/lib/safe-write.c +++ b/lib/safe-write.c @@ -1,5 +1,5 @@ -/* An interface to write() that retries after interrupts. - Copyright (C) 1993, 1994, 1998, 2002 Free Software Foundation, Inc. +/* An interface to write that retries after interrupts. + Copyright (C) 2002 Free Software Foundation, Inc. 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 @@ -13,75 +13,7 @@ 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. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#if HAVE_CONFIG_H -# include -#endif - -/* Specification. */ -#include "safe-write.h" - -/* Get ssize_t. */ -#include -#if HAVE_UNISTD_H -# include -#endif - -#include -#ifndef errno -extern int errno; -#endif - -#include - -#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 - 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. */ -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; - - do - { - result = write (fd, buf, nbytes_to_write); - } -#ifdef EINTR - while (result < 0 && errno == EINTR); -#else - while (0); -#endif - - return (size_t) result; -} +#define SAFE_WRITE +#include "safe-read.c"