summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2002-12-03 18:30:29 +0000
committerJim Meyering <jim@meyering.net>2002-12-03 18:30:29 +0000
commita1f5754a17ae911461e957281d8850b46903ebf9 (patch)
tree51481aaca2e2dc1883342ea5d72ff73b26dac3ef /lib
parentef97c32946b3dd67d25f527da1e603319bec2042 (diff)
downloadcoreutils-a1f5754a17ae911461e957281d8850b46903ebf9.tar.xz
New file, from which to generate safe-read.c and safe-write.c.
Diffstat (limited to 'lib')
-rw-r--r--lib/safe-rw.cin86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/safe-rw.cin b/lib/safe-rw.cin
new file mode 100644
index 000000000..2e2e2239b
--- /dev/null
+++ b/lib/safe-rw.cin
@@ -0,0 +1,86 @@
+/* @IGNORE@ -*- c -*- */
+/* @IGNORE@ This file is a template from which both safe-read.c and
+ @IGNORE@ safe-write.c are generated. */
+/* An interface to @rw@ 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
+ 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.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "safe-@rw@.h"
+
+/* Get ssize_t. */
+#include <sys/types.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+#ifdef EINTR
+# define IS_EINTR(x) ((x) == EINTR)
+#else
+# define IS_EINTR(x) 0
+#endif
+
+#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
+
+/* @Rw@ up to COUNT bytes at BUF @from_to@ descriptor FD, retrying if interrupted.
+ Return the actual number of bytes @read_written@, zero for EOF, or SAFE_@RW@_ERROR
+ upon error. */
+size_t
+safe_@rw@ (int fd, void @const@*buf, size_t count)
+{
+ ssize_t result;
+
+ /* 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, @rw@ may succeed, yet @rw@ fewer than COUNT
+ bytes, so the caller must be prepared to handle partial results. */
+ if (count > INT_MAX)
+ count = INT_MAX & ~8191;
+
+ do
+ {
+ result = @rw@ (fd, buf, count);
+ }
+ while (result < 0 && IS_EINTR (errno));
+
+ return (size_t) result;
+}