X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Ffile_io.h;h=61ae78b9e270aee622376346a68e0eff7ad18af0;hp=1d258983354d2e5f95964d740fced0aa87e6840d;hb=8b676e7d340fb8197824745eb387e1d3154e6f60;hpb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518 diff --git a/include/wimlib/file_io.h b/include/wimlib/file_io.h index 1d258983..61ae78b9 100644 --- a/include/wimlib/file_io.h +++ b/include/wimlib/file_io.h @@ -1,39 +1,59 @@ #ifndef _WIMLIB_FILE_IO_H #define _WIMLIB_FILE_IO_H +#include #include #include -extern size_t -full_read(int fd, void *buf, size_t n); - -extern size_t -full_write(int fd, const void *buf, size_t n); - -extern size_t -full_pread(int fd, void *buf, size_t nbyte, off_t offset); +/* Wrapper around a file descriptor that keeps track of offset (including in + * pipes, which don't support lseek()) and a cached flag that tells whether the + * file descriptor is a pipe or not. */ +struct filedes { + int fd; + unsigned int is_pipe : 1; + off_t offset; +}; -extern size_t -full_pwrite(int fd, const void *buf, size_t count, off_t offset); +extern int +full_read(struct filedes *fd, void *buf, size_t n); +extern int +full_pread(struct filedes *fd, void *buf, size_t nbyte, off_t offset); -#ifdef __WIN32__ -struct iovec { - void *iov_base; - size_t iov_len; -}; -#else -struct iovec; -#endif +extern int +full_write(struct filedes *fd, const void *buf, size_t n); -extern size_t -full_writev(int fd, struct iovec *iov, int iovcnt); - -extern off_t -filedes_offset(int fd); +extern int +full_pwrite(struct filedes *fd, const void *buf, size_t count, off_t offset); #ifndef __WIN32__ # define O_BINARY 0 #endif +extern off_t +filedes_seek(struct filedes *fd, off_t offset); + +extern bool +filedes_is_seekable(struct filedes *fd); + +static inline void filedes_init(struct filedes *fd, int raw_fd) +{ + fd->fd = raw_fd; + fd->offset = 0; + fd->is_pipe = 0; +} + +static inline void filedes_invalidate(struct filedes *fd) +{ + fd->fd = -1; +} + +#define filedes_close(f) close((f)->fd) + +static inline bool +filedes_valid(const struct filedes *fd) +{ + return fd->fd != -1; +} + #endif /* _WIMLIB_FILE_IO_H */