Imported Upstream version 1.16.10
[services/dpkg.git] / lib / dpkg / fdio.c
1 /*
2  * libdpkg - Debian packaging suite library routines
3  * fdio.c - safe file descriptor based input/output
4  *
5  * Copyright © 2009-2010 Guillem Jover <guillem@debian.org>
6  *
7  * This is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22 #include <compat.h>
23
24 #include <errno.h>
25 #include <unistd.h>
26
27 #include <dpkg/fdio.h>
28
29 ssize_t
30 fd_read(int fd, void *buf, size_t len)
31 {
32         ssize_t total = 0;
33         char *ptr = buf;
34
35         while (len > 0) {
36                 ssize_t n;
37
38                 n = read(fd, ptr + total, len);
39                 if (n == -1) {
40                         if (errno == EINTR || errno == EAGAIN)
41                                 continue;
42                         return total ? -total : n;
43                 }
44                 if (n == 0)
45                         break;
46
47                 total += n;
48                 len -= n;
49         }
50
51         return total;
52 }
53
54 ssize_t
55 fd_write(int fd, const void *buf, size_t len)
56 {
57         ssize_t total = 0;
58         const char *ptr = buf;
59
60         while (len > 0) {
61                 ssize_t n;
62
63                 n = write(fd, ptr + total, len);
64                 if (n == -1) {
65                         if (errno == EINTR || errno == EAGAIN)
66                                 continue;
67                         return total ? -total : n;
68                 }
69                 if (n == 0)
70                         break;
71
72                 total += n;
73                 len -= n;
74         }
75
76         return total;
77 }