summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.h1
-rw-r--r--src/fileops.c37
-rw-r--r--src/fileops.h11
3 files changed, 49 insertions, 0 deletions
diff --git a/src/common.h b/src/common.h
index f5be02b49..bdf233425 100644
--- a/src/common.h
+++ b/src/common.h
@@ -4,6 +4,7 @@
#include "cc-compat.h"
#include "util.h"
#include "errors.h"
+#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
diff --git a/src/fileops.c b/src/fileops.c
index e5f6ef800..caa7d9e0c 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -49,6 +49,43 @@ off_t gitfo_size(git_file fd)
return sb.st_size;
}
+int gitfo_read_file(gitfo_buf *obj, const char *path)
+{
+ git_file fd;
+ off_t len;
+ void *buff;
+
+ assert(obj && path && *path);
+
+ if ((fd = gitfo_open(path, O_RDONLY)) < 0)
+ return GIT_ERROR; /* TODO: error handling */
+
+ if (((len = gitfo_size(fd)) < 0) || ((buff = malloc(len)) == NULL)) {
+ gitfo_close(fd);
+ return GIT_ERROR; /* TODO: error handling */
+ }
+
+ if (gitfo_read(fd, buff, len) < 0) {
+ gitfo_close(fd);
+ free(buff);
+ return GIT_ERROR; /* TODO: error handling */
+ }
+
+ gitfo_close(fd);
+
+ obj->data = buff;
+ obj->len = len;
+
+ return GIT_SUCCESS;
+}
+
+void gitfo_free_buf(gitfo_buf *obj)
+{
+ assert(obj);
+ free(obj->data);
+ obj->data = NULL;
+}
+
/* cached diskio */
struct gitfo_cache {
git_file fd;
diff --git a/src/fileops.h b/src/fileops.h
index 2683a6b43..d25d5d3bc 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -21,10 +21,18 @@
#include "errors.h"
#include "git/fileops.h"
+#define GITFO_BUF_INIT {NULL, 0}
+
typedef int git_file;
typedef struct stat gitfo_statbuf;
typedef struct gitfo_cache gitfo_cache;
+typedef struct { /* file io buffer */
+ void *data; /* data bytes */
+ size_t len; /* data length */
+} gitfo_buf;
+
+
#define gitfo_open(path, flags) open(path, flags)
#define gitfo_close(fd) close(fd)
@@ -37,6 +45,9 @@ extern off_t gitfo_size(git_file fd);
#define gitfo_stat(path, buf) stat(path, buf)
#define gitfo_fsync(fd) fsync(fd)
+extern int gitfo_read_file(gitfo_buf *obj, const char *path);
+extern void gitfo_free_buf(gitfo_buf *obj);
+
extern gitfo_cache *gitfo_enable_caching(git_file fd, size_t cache_size);
extern int gitfo_write_cached(gitfo_cache *ioc, void *buf, size_t len);
extern int gitfo_flush_cached(gitfo_cache *ioc);