1 /* 2 * Copyright (C) the libgit2 contributors. All rights reserved. 3 * 4 * This file is part of libgit2, distributed under the GNU GPL v2 with 5 * a Linking Exception. For full terms see the included COPYING file. 6 */ 7 #ifndef INCLUDE_filebuf_h__ 8 #define INCLUDE_filebuf_h__ 9 10 #include "common.h" 11 12 #include "futils.h" 13 #include "hash.h" 14 #include <zlib.h> 15 16 #ifdef GIT_THREADS 17 # define GIT_FILEBUF_THREADS 18 #endif 19 20 #define GIT_FILEBUF_HASH_CONTENTS (1 << 0) 21 #define GIT_FILEBUF_APPEND (1 << 2) 22 #define GIT_FILEBUF_CREATE_LEADING_DIRS (1 << 3) 23 #define GIT_FILEBUF_TEMPORARY (1 << 4) 24 #define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5) 25 #define GIT_FILEBUF_FSYNC (1 << 6) 26 #define GIT_FILEBUF_DEFLATE_SHIFT (7) 27 28 #define GIT_FILELOCK_EXTENSION ".lock\0" 29 #define GIT_FILELOCK_EXTLENGTH 6 30 31 typedef struct git_filebuf git_filebuf; 32 struct git_filebuf { 33 char *path_original; 34 char *path_lock; 35 36 int (*write)(git_filebuf *file, void *source, size_t len); 37 38 bool compute_digest; 39 git_hash_ctx digest; 40 41 unsigned char *buffer; 42 unsigned char *z_buf; 43 44 z_stream zs; 45 int flush_mode; 46 47 size_t buf_size, buf_pos; 48 git_file fd; 49 bool fd_is_open; 50 bool created_lock; 51 bool did_rename; 52 bool do_not_buffer; 53 bool do_fsync; 54 int last_error; 55 }; 56 57 #define GIT_FILEBUF_INIT {0} 58 59 /* 60 * The git_filebuf object lifecycle is: 61 * - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT. 62 * 63 * - Call git_filebuf_open() to initialize the filebuf for use. 64 * 65 * - Make as many calls to git_filebuf_write(), git_filebuf_printf(), 66 * git_filebuf_reserve() as you like. The error codes for these 67 * functions don't need to be checked. They are stored internally 68 * by the file buffer. 69 * 70 * - While you are writing, you may call git_filebuf_hash() to get 71 * the hash of all you have written so far. This function will 72 * fail if any of the previous writes to the buffer failed. 73 * 74 * - To close the git_filebuf, you may call git_filebuf_commit() or 75 * git_filebuf_commit_at() to save the file, or 76 * git_filebuf_cleanup() to abandon the file. All of these will 77 * free the git_filebuf object. Likewise, all of these will fail 78 * if any of the previous writes to the buffer failed, and set 79 * an error code accordingly. 80 */ 81 int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len); 82 int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len); 83 int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); 84 85 int git_filebuf_open(git_filebuf *lock, const char *path, int flags, mode_t mode); 86 int git_filebuf_open_withsize(git_filebuf *file, const char *path, int flags, mode_t mode, size_t size); 87 int git_filebuf_commit(git_filebuf *lock); 88 int git_filebuf_commit_at(git_filebuf *lock, const char *path); 89 void git_filebuf_cleanup(git_filebuf *lock); 90 int git_filebuf_hash(git_oid *oid, git_filebuf *file); 91 int git_filebuf_flush(git_filebuf *file); 92 int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file); 93 94 #endif 95