X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsafe-write.c;h=a2c3b4df1d11c8f2b1628b9f09cbbf29dd6bdd9e;hb=afc6cbe4fe4892c5ee4166cab87fede6f294a27d;hp=55962039e5fc655f96caccb0103f44ec75000e4e;hpb=849efe7683e163ede9240b27d675977c71c76ce8;p=gnulib.git diff --git a/lib/safe-write.c b/lib/safe-write.c index 55962039e..a2c3b4df1 100644 --- a/lib/safe-write.c +++ b/lib/safe-write.c @@ -1,10 +1,10 @@ -/* 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, 2009-2010 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,72 +12,7 @@ GNU General Public License for more details. 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. */ + along with this program. If not, see . */ -#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 - -/* 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 total_written = 0; - - 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; - - result = write (fd, ptr, nbytes_to_write); - if (result < 0) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - return result; - } - total_written += result; - ptr += result; - count -= result; - } - while (count > 0); - } - - return total_written; -} +#define SAFE_WRITE +#include "safe-read.c"