mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 23:03:35 +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 "cc-compat.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -49,6 +49,43 @@ off_t gitfo_size(git_file fd)
|
|||||||
return sb.st_size;
|
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 */
|
/* cached diskio */
|
||||||
struct gitfo_cache {
|
struct gitfo_cache {
|
||||||
git_file fd;
|
git_file fd;
|
||||||
|
@ -21,10 +21,18 @@
|
|||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
#include "git/fileops.h"
|
#include "git/fileops.h"
|
||||||
|
|
||||||
|
#define GITFO_BUF_INIT {NULL, 0}
|
||||||
|
|
||||||
typedef int git_file;
|
typedef int git_file;
|
||||||
typedef struct stat gitfo_statbuf;
|
typedef struct stat gitfo_statbuf;
|
||||||
typedef struct gitfo_cache gitfo_cache;
|
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_open(path, flags) open(path, flags)
|
||||||
#define gitfo_close(fd) close(fd)
|
#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_stat(path, buf) stat(path, buf)
|
||||||
#define gitfo_fsync(fd) fsync(fd)
|
#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 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_write_cached(gitfo_cache *ioc, void *buf, size_t len);
|
||||||
extern int gitfo_flush_cached(gitfo_cache *ioc);
|
extern int gitfo_flush_cached(gitfo_cache *ioc);
|
||||||
|
Loading…
Reference in New Issue
Block a user