annotate lib/safe-read.c @ 7292:17785d5bede0

Fix docstrings
author Sergey Poznyakoff <gray@gnu.org.ua>
date Sun, 10 Sep 2006 11:52:44 +0000
parents fd0ccce602e4
children 8a1a9361108c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4056
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
1 /* An interface to read and write that retries after interrupts.
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
2
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
3 Copyright (C) 1993, 1994, 1998, 2002, 2003, 2004, 2005 Free Software
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
4 Foundation, Inc.
182
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
5
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
6 This program is free software; you can redistribute it and/or modify
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
7 it under the terms of the GNU General Public License as published by
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
9 any later version.
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
10
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
11 This program is distributed in the hope that it will be useful,
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
14 GNU General Public License for more details.
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
15
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
16 You should have received a copy of the GNU General Public License
650
b4ef1c1a0171 update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents: 642
diff changeset
17 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
182
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
19
6259
96c32553b4c6 Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
20 #ifdef HAVE_CONFIG_H
642
02a593f698b9 Indent nested CPP-directives.
Jim Meyering <jim@meyering.net>
parents: 371
diff changeset
21 # include <config.h>
182
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
22 #endif
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
23
4144
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
24 /* Specification. */
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
25 #ifdef SAFE_WRITE
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
26 # include "safe-write.h"
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
27 #else
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
28 # include "safe-read.h"
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
29 #endif
96e52fc820a5 Include specification first.
Bruno Haible <bruno@clisp.org>
parents: 4056
diff changeset
30
4002
9fcf64c770ed Orthogonal approach to read()/write() that handles EINTR and counts > 2^31
Bruno Haible <bruno@clisp.org>
parents: 2807
diff changeset
31 /* Get ssize_t. */
182
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
32 #include <sys/types.h>
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
33 #include <unistd.h>
182
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
34
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
35 #include <errno.h>
83507c652f09 merge with 3.9c
Jim Meyering <jim@meyering.net>
parents: 179
diff changeset
36
4050
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
37 #ifdef EINTR
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
38 # define IS_EINTR(x) ((x) == EINTR)
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
39 #else
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
40 # define IS_EINTR(x) 0
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
41 #endif
2995e830608c (IS_EINTR): Define.
Jim Meyering <jim@meyering.net>
parents: 4049
diff changeset
42
4002
9fcf64c770ed Orthogonal approach to read()/write() that handles EINTR and counts > 2^31
Bruno Haible <bruno@clisp.org>
parents: 2807
diff changeset
43 #include <limits.h>
1320
abeaa95922bd (noinst_HEADERS): Add safe-read.h.
Jim Meyering <jim@meyering.net>
parents: 728
diff changeset
44
4056
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
45 #ifdef SAFE_WRITE
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
46 # define safe_rw safe_write
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
47 # define rw write
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
48 #else
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
49 # define safe_rw safe_read
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
50 # define rw read
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
51 # undef const
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
52 # define const /* empty */
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
53 #endif
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
54
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
55 /* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
56 interrupted. Return the actual number of bytes read(written), zero for EOF,
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
57 or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */
4002
9fcf64c770ed Orthogonal approach to read()/write() that handles EINTR and counts > 2^31
Bruno Haible <bruno@clisp.org>
parents: 2807
diff changeset
58 size_t
4056
9294b143dc83 Rework so that it may serve to define safe_write, too.
Jim Meyering <jim@meyering.net>
parents: 4054
diff changeset
59 safe_rw (int fd, void const *buf, size_t count)
4002
9fcf64c770ed Orthogonal approach to read()/write() that handles EINTR and counts > 2^31
Bruno Haible <bruno@clisp.org>
parents: 2807
diff changeset
60 {
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
61 /* Work around a bug in Tru64 5.1. Attempting to read more than
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
62 INT_MAX bytes fails with errno == EINVAL. See
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
63 <http://lists.gnu.org/archive/html/bug-gnu-utils/2002-04/msg00010.html>.
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
64 When decreasing COUNT, keep it block-aligned. */
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
65 enum { BUGGY_READ_MAXIMUM = INT_MAX & ~8191 };
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
66
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
67 for (;;)
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
68 {
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
69 ssize_t result = rw (fd, buf, count);
179
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
71 if (0 <= result)
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
72 return result;
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
73 else if (IS_EINTR (errno))
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
74 continue;
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
75 else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count)
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
76 count = BUGGY_READ_MAXIMUM;
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
77 else
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4333
diff changeset
78 return result;
371
2f5dae439e46 See log in textutils/lib/.
Jim Meyering <jim@meyering.net>
parents: 364
diff changeset
79 }
179
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 }