]>
Commit | Line | Data |
---|---|---|
bb742ede | 1 | /* |
359fc2d2 | 2 | * Copyright (C) the libgit2 contributors. All rights reserved. |
bb742ede VM |
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 | */ | |
817c2820 VM |
7 | #ifndef INCLUDE_filebuf_h__ |
8 | #define INCLUDE_filebuf_h__ | |
9 | ||
eae0bfdc PP |
10 | #include "common.h" |
11 | ||
0c9c969a | 12 | #include "futils.h" |
817c2820 | 13 | #include "hash.h" |
0c3bae62 | 14 | #include <zlib.h> |
817c2820 VM |
15 | |
16 | #ifdef GIT_THREADS | |
17 | # define GIT_FILEBUF_THREADS | |
18 | #endif | |
19 | ||
72a3fe42 VM |
20 | #define GIT_FILEBUF_HASH_CONTENTS (1 << 0) |
21 | #define GIT_FILEBUF_APPEND (1 << 2) | |
0c9c969a | 22 | #define GIT_FILEBUF_CREATE_LEADING_DIRS (1 << 3) |
72a3fe42 | 23 | #define GIT_FILEBUF_TEMPORARY (1 << 4) |
4d53f3e2 | 24 | #define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5) |
fc77891f ET |
25 | #define GIT_FILEBUF_FSYNC (1 << 6) |
26 | #define GIT_FILEBUF_DEFLATE_SHIFT (7) | |
817c2820 | 27 | |
86194b24 VM |
28 | #define GIT_FILELOCK_EXTENSION ".lock\0" |
29 | #define GIT_FILELOCK_EXTLENGTH 6 | |
30 | ||
06280457 | 31 | typedef struct git_filebuf git_filebuf; |
817c2820 VM |
32 | struct git_filebuf { |
33 | char *path_original; | |
34 | char *path_lock; | |
35 | ||
06280457 | 36 | int (*write)(git_filebuf *file, void *source, size_t len); |
72a3fe42 | 37 | |
2a612fe3 ET |
38 | bool compute_digest; |
39 | git_hash_ctx digest; | |
817c2820 VM |
40 | |
41 | unsigned char *buffer; | |
72a3fe42 VM |
42 | unsigned char *z_buf; |
43 | ||
44 | z_stream zs; | |
45 | int flush_mode; | |
817c2820 VM |
46 | |
47 | size_t buf_size, buf_pos; | |
48 | git_file fd; | |
e1de726c | 49 | bool fd_is_open; |
19d9beb7 CMN |
50 | bool created_lock; |
51 | bool did_rename; | |
4d53f3e2 | 52 | bool do_not_buffer; |
fc77891f | 53 | bool do_fsync; |
dda708e7 | 54 | int last_error; |
817c2820 VM |
55 | }; |
56 | ||
b762e576 RB |
57 | #define GIT_FILEBUF_INIT {0} |
58 | ||
dda708e7 VM |
59 | /* |
60 | * The git_filebuf object lifecycle is: | |
b762e576 | 61 | * - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT. |
dda708e7 | 62 | * |
b762e576 | 63 | * - Call git_filebuf_open() to initialize the filebuf for use. |
dda708e7 | 64 | * |
b762e576 | 65 | * - Make as many calls to git_filebuf_write(), git_filebuf_printf(), |
dda708e7 VM |
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 | * | |
b762e576 | 70 | * - While you are writing, you may call git_filebuf_hash() to get |
dda708e7 VM |
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 | * | |
b762e576 RB |
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 | |
dda708e7 VM |
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. | |
b762e576 | 80 | */ |
72a3fe42 | 81 | int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len); |
817c2820 | 82 | int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len); |
afeecf4f | 83 | int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3); |
817c2820 | 84 | |
1d3a8aeb | 85 | int git_filebuf_open(git_filebuf *lock, const char *path, int flags, mode_t mode); |
3fa764ed | 86 | int git_filebuf_open_withsize(git_filebuf *file, const char *path, int flags, mode_t mode, size_t size); |
1d3a8aeb ET |
87 | int git_filebuf_commit(git_filebuf *lock); |
88 | int git_filebuf_commit_at(git_filebuf *lock, const char *path); | |
817c2820 VM |
89 | void git_filebuf_cleanup(git_filebuf *lock); |
90 | int git_filebuf_hash(git_oid *oid, git_filebuf *file); | |
9bea8e85 | 91 | int git_filebuf_flush(git_filebuf *file); |
744cc03e | 92 | int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file); |
817c2820 VM |
93 | |
94 | #endif |