/[path-sandbox]/trunk/libsbutil/sbio.c
Gentoo

Contents of /trunk/libsbutil/sbio.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 325 - (show annotations) (download) (as text)
Tue Jul 11 16:36:19 2006 UTC (8 years ago) by azarah
File MIME type: text/x-csrc
File size: 2949 byte(s)
Add EINTR check back to sb_open(), as FreeBSD for one seem to be able to fail with errno set to it.

1 /*
2 * sbio.c
3 *
4 * IO functions.
5 *
6 * Copyright 1999-2006 Gentoo Foundation
7 *
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation version 2 of the License.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 * $Header$
23 */
24
25
26 #include <errno.h>
27 #include <stdio.h>
28 #include <sys/stat.h>
29 #include <unistd.h>
30 #include <fcntl.h>
31
32 #include "sbutil.h"
33
34
35 static int (*sbio_open)(const char *, int, mode_t) = (void *)open;
36
37
38 void sb_set_open(void *new_open)
39 {
40 if (!check_ptr(new_open))
41 return;
42
43 sbio_open = new_open;
44 }
45
46 /* General purpose function to _reliably_ open a file
47 *
48 * Returns the file descriptor or -1 on error (and errno set)
49 */
50
51 int sb_open(const char *path, int flags, mode_t mode)
52 {
53 int fd;
54
55 do {
56 fd = sbio_open(path, flags, mode);
57 while ((-1 == fd) && (EINTR == errno));
58
59 if ((-1 != fd) && (0 != errno))
60 /* Do not trigger debugging */
61 errno = 0;
62
63 if (-1 == fd)
64 DBG_MSG("Failed to open file '%s'!\n", path);
65
66 return fd;
67 }
68
69 /* General purpose function to _reliably_ read from a file.
70 *
71 * Returns total read bytes or -1 on error.
72 */
73
74 size_t sb_read(int fd, void *buf, size_t count)
75 {
76 ssize_t n;
77 size_t accum = 0;
78
79 do {
80 n = read(fd, buf + accum, count - accum);
81
82 if (n > 0) {
83 accum += n;
84 continue;
85 }
86
87 if (n < 0) {
88 if (EINTR == errno) {
89 /* Reset errno to not trigger DBG_MSG */
90 errno = 0;
91 continue;
92 }
93
94 DBG_MSG("Failed to read from fd=%i!\n", fd);
95 return -1;
96 }
97
98 /* Found EOF */
99 break;
100 } while (accum < count);
101
102 return accum;
103 }
104
105 /* General purpose function to _reliably_ write to a file
106 *
107 * If returned value is less than count, there was a fatal
108 * error and value tells how many bytes were actually written
109 */
110
111 size_t sb_write(int fd, const void *buf, size_t count)
112 {
113 ssize_t n;
114 size_t accum = 0;
115
116 do {
117 n = write(fd, buf + accum, count - accum);
118 if (n < 0) {
119 if (EINTR == errno) {
120 /* Reset errno to not trigger DBG_MSG */
121 errno = 0;
122 continue;
123 }
124
125 DBG_MSG("Failed to write to fd=%i!\n", fd);
126 break;
127 }
128
129 accum += n;
130 } while (accum < count);
131
132 return accum;
133 }
134
135 /* General purpose function to _reliably_ close a file
136 *
137 * Returns 0 if successful or negative number on error (and errno set)
138 */
139
140 int sb_close(int fd)
141 {
142 int res;
143
144 do {
145 res = close(fd);
146 } while ((res < 0) && (EINTR == errno));
147
148 /* Do not care about errors here */
149 errno = 0;
150
151 return res;
152 }

  ViewVC Help
Powered by ViewVC 1.1.20