diff options
Diffstat (limited to 'src/fileops.c')
-rw-r--r-- | src/fileops.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/fileops.c b/src/fileops.c new file mode 100644 index 000000000..1ca0fbb08 --- /dev/null +++ b/src/fileops.c @@ -0,0 +1,49 @@ +#include "fileops.h" + +int gitfo_read(git_file fd, void *buf, size_t cnt) +{ + char *b = buf; + while (cnt) { + ssize_t r = read(fd, b, cnt); + if (r < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return -1; + } + if (!r) { + errno = EPIPE; + return -1; + } + cnt -= r; + b += r; + } + return GIT_SUCCESS; +} + +int gitfo_write(git_file fd, void *buf, size_t cnt) +{ + char *b = buf; + while (cnt) { + ssize_t r = write(fd, b, cnt); + if (r < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return -1; + } + if (!r) { + errno = EPIPE; + return -1; + } + cnt -= r; + b += r; + } + return GIT_SUCCESS; +} + +off_t gitfo_size(git_file fd) +{ + gitfo_statbuf sb; + if (fstat(fd, &sb)) + return -1; + return sb.st_size; +} |