summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/os/unix.c53
1 files changed, 41 insertions, 12 deletions
diff --git a/src/os/unix.c b/src/os/unix.c
index d132e9755..767f20ca8 100644
--- a/src/os/unix.c
+++ b/src/os/unix.c
@@ -26,22 +26,51 @@
#include <errno.h>
#include "git/common.h"
-ssize_t git_fread(git_file fd, void *buf, size_t cnt)
+int git_fopen(git_file *out, const char *path, int flags)
{
- for (;;) {
- ssize_t r = read(fd, buf, cnt);
- if (r < 0 && (errno == EINTR || errno == EAGAIN))
- continue;
- return r;
+ int r = open(path, flags);
+ if (r < 0)
+ return -1;
+ *out = r;
+ return GIT_SUCCESS;
+}
+
+int git_fread(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;
}
-ssize_t git_fwrite(git_file fd, void *buf, size_t cnt)
+int git_fwrite(git_file fd, void *buf, size_t cnt)
{
- for (;;) {
- ssize_t r = write(fd, buf, cnt);
- if (r < 0 && (errno == EINTR || errno == EAGAIN))
- continue;
- return r;
+ 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;
}