summaryrefslogtreecommitdiff
path: root/src/fileops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fileops.c')
-rw-r--r--src/fileops.c49
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;
+}