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

Contents of /trunk/libsbutil/sb_close.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 326 - (hide annotations) (download) (as text)
Tue Jul 11 16:40:23 2006 UTC (8 years, 2 months ago) by azarah
Original Path: trunk/libsbutil/sbio.c
File MIME type: text/x-csrc
File size: 2951 byte(s)
Fix breakage of last commit.

1 azarah 317 /*
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 azarah 325 do {
56     fd = sbio_open(path, flags, mode);
57 azarah 326 } while ((-1 == fd) && (EINTR == errno));
58 azarah 325
59     if ((-1 != fd) && (0 != errno))
60     /* Do not trigger debugging */
61     errno = 0;
62    
63 azarah 317 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