]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - include/all-io.h
2 * No copyright is claimed. This code is in the public domain; do with
5 * Written by Karel Zak <kzak@redhat.com>
6 * Petr Uzel <petr.uzel@suse.cz>
9 #ifndef UTIL_LINUX_ALL_IO_H
10 #define UTIL_LINUX_ALL_IO_H
15 #include <sys/types.h>
16 #ifdef HAVE_SYS_SENDFILE_H
17 # include <sys/sendfile.h>
22 static inline int write_all(int fd
, const void *buf
, size_t count
)
28 tmp
= write(fd
, buf
, count
);
32 buf
= (const void *) ((const char *) buf
+ tmp
);
33 } else if (errno
!= EINTR
&& errno
!= EAGAIN
)
35 if (errno
== EAGAIN
) /* Try later, *sigh* */
41 static inline int fwrite_all(const void *ptr
, size_t size
,
42 size_t nmemb
, FILE *stream
)
48 tmp
= fwrite(ptr
, size
, nmemb
, stream
);
52 ptr
= (const void *) ((const char *) ptr
+ (tmp
* size
));
53 } else if (errno
!= EINTR
&& errno
!= EAGAIN
)
55 if (errno
== EAGAIN
) /* Try later, *sigh* */
61 static inline ssize_t
read_all(int fd
, char *buf
, size_t count
)
67 memset(buf
, 0, count
);
69 ret
= read(fd
, buf
, count
);
71 if ((errno
== EAGAIN
|| errno
== EINTR
) && (tries
++ < 5)) {
87 static inline ssize_t
read_all_alloc(int fd
, char **buf
)
89 size_t size
= 1024, c
= 0;
97 ret
= read_all(fd
, *buf
+ c
, size
- c
);
110 *buf
= realloc(*buf
, size
);
117 static inline ssize_t
sendfile_all(int out
, int in
, off_t
*off
, size_t count
)
119 #if defined(HAVE_SENDFILE) && defined(__linux__)
124 ret
= sendfile(out
, in
, off
, count
);
126 if ((errno
== EAGAIN
|| errno
== EINTR
) && (tries
++ < 5)) {
144 #endif /* UTIL_LINUX_ALL_IO_H */