mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 15:01:10 +00:00
Add a file reading routine along with an io buffer type
In particular, the gitfo_read_file() routine can be used to slurp the complete file contents into an gitfo_buf structure. The buffer content will be allocated by malloc() and may be released by the gitfo_free_buf() routine. The io buffer type can be initialised on the stack with the GITFO_BUF_INIT macro. Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
def425bf85
commit
75d5843055
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user