]> wimlib.net Git - wimlib/blob - include/wimlib/file_io.h
de59cfa07d8b9be48d0a1efcb123c1b5f1723c91
[wimlib] / include / wimlib / file_io.h
1 #ifndef _WIMLIB_FILE_IO_H
2 #define _WIMLIB_FILE_IO_H
3
4 #include <stddef.h>
5 #include <sys/types.h>
6
7 struct filedes {
8         int fd;
9         unsigned int is_pipe : 1;
10         off_t offset;
11 };
12
13 extern int
14 full_read(struct filedes *fd, void *buf, size_t n);
15
16 extern int
17 full_pread(struct filedes *fd, void *buf, size_t nbyte, off_t offset);
18
19 extern int
20 full_write(struct filedes *fd, const void *buf, size_t n);
21
22 extern int
23 full_pwrite(struct filedes *fd, const void *buf, size_t count, off_t offset);
24
25 extern ssize_t
26 raw_pread(struct filedes *fd, void *buf, size_t nbyte, off_t offset);
27
28 extern ssize_t
29 raw_pwrite(struct filedes *fd, const void *buf, size_t count, off_t offset);
30
31 #ifdef __WIN32__
32 struct iovec {
33         void *iov_base;
34         size_t iov_len;
35 };
36 #else
37 struct iovec;
38 #endif
39
40 extern int
41 full_writev(struct filedes *fd, struct iovec *iov, int iovcnt);
42
43 #ifndef __WIN32__
44 #  define O_BINARY 0
45 #endif
46
47 extern off_t
48 filedes_seek(struct filedes *fd, off_t offset);
49
50 extern bool
51 filedes_is_seekable(struct filedes *fd);
52
53 static inline void filedes_init(struct filedes *fd, int raw_fd)
54 {
55         fd->fd = raw_fd;
56         fd->offset = 0;
57         fd->is_pipe = 0;
58 }
59
60 static inline void filedes_invalidate(struct filedes *fd)
61 {
62         fd->fd = -1;
63 }
64
65 static inline void filedes_copy(struct filedes *dst, const struct filedes *src)
66 {
67         *dst = *src;
68 }
69
70 #define filedes_close(f) close((f)->fd)
71
72 static inline bool
73 filedes_valid(const struct filedes *fd)
74 {
75         return fd->fd != -1;
76 }
77
78 #endif /* _WIMLIB_FILE_IO_H */