1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-04-20 10:51:48 +02:00

Rework so that it may serve to define full_read, too.

This commit is contained in:
Jim Meyering
2003-01-07 14:03:15 +00:00
parent 0f0a65766e
commit e76d578bad

View File

@@ -1,7 +1,6 @@
/* An interface to write() that writes all it is asked to write.
/* An interface to read and write that retries (if necessary) until complete.
Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002 Free Software
Foundation, Inc.
Copyright (C) 1993, 1994, 1997-2003 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
@@ -21,41 +20,61 @@
# include <config.h>
#endif
/* Specification. */
#include "full-write.h"
#ifdef FULL_READ
# include "full-read.h"
# include "safe-read.h"
# define safe_rw safe_read
# define full_rw full_read
# undef const
# define const /* empty */
#else
# include "full-write.h"
# include "safe-write.h"
# define safe_rw safe_write
# define full_rw full_write
#endif
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#include "safe-write.h"
#ifdef FULL_READ
/* Set errno to zero upon EOF. */
# define ZERO_BYTE_TRANSFER_ERRNO 0
#else
/* Some buggy drivers return 0 when one tries to write beyond
a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
Set errno to ENOSPC so they get a sensible diagnostic. */
# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
#endif
/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
or if partial writes occur. Return the number of bytes successfully
written, setting errno if that is less than COUNT. */
/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
interrupted or if a partial write(read) occurs. Return the number
of bytes transferred.
When writing, set errno if fewer than COUNT bytes are written.
When reading, if fewer than COUNT bytes are read, you must examine
errno to distinguish failure from EOF (errno == 0). */
size_t
full_write (int fd, const void *buf, size_t count)
full_rw (int fd, const void *buf, size_t count)
{
size_t total_written = 0;
size_t total = 0;
const char *ptr = buf;
while (count > 0)
{
size_t written = safe_write (fd, ptr, count);
if (written == (size_t)-1)
size_t n_rw = safe_rw (fd, ptr, count);
if (n_rw == (size_t) -1)
break;
if (written == 0)
if (n_rw == 0)
{
/* Some buggy drivers return 0 when you fall off a device's
end. (Example: Linux 1.2.13 on /dev/fd0.) */
errno = ENOSPC;
errno = ZERO_BYTE_TRANSFER_ERRNO;
break;
}
total_written += written;
ptr += written;
count -= written;
total += n_rw;
ptr += n_rw;
count -= n_rw;
}
return total_written;
return total;
}