Line Flow Count Block(s) Source
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 -
8 - #include "common.h"
9 -
10 - #ifdef GIT_OPENSSL
11 - # include <openssl/err.h>
12 - #endif
13 -
14 - #ifdef GIT_MBEDTLS
15 - # include <mbedtls/error.h>
16 - #endif
17 -
18 - #include <git2.h>
19 - #include "alloc.h"
20 - #include "sysdir.h"
21 - #include "cache.h"
22 - #include "global.h"
23 - #include "object.h"
24 - #include "odb.h"
25 - #include "refs.h"
26 - #include "index.h"
27 - #include "transports/smart.h"
28 - #include "transports/http.h"
29 - #include "streams/openssl.h"
30 - #include "streams/mbedtls.h"
31 -
32 1 2 int git_libgit2_version(int *major, int *minor, int *rev)
33 - {
34 1 2 *major = LIBGIT2_VER_MAJOR;
35 1 2 *minor = LIBGIT2_VER_MINOR;
36 1 2 *rev = LIBGIT2_VER_REVISION;
37 -
38 1 2 return 0;
39 - }
40 -
41 1 2 int git_libgit2_features(void)
42 - {
43 1 2 return 0
44 - #ifdef GIT_THREADS
45 - | GIT_FEATURE_THREADS
46 - #endif
47 - #ifdef GIT_HTTPS
48 - | GIT_FEATURE_HTTPS
49 - #endif
50 - #if defined(GIT_SSH)
51 - | GIT_FEATURE_SSH
52 - #endif
53 - #if defined(GIT_USE_NSEC)
54 - | GIT_FEATURE_NSEC
55 - #endif
56 - ;
57 - }
58 -
59 - /* Declarations for tuneable settings */
60 - extern size_t git_mwindow__window_size;
61 - extern size_t git_mwindow__mapped_limit;
62 - extern size_t git_indexer__max_objects;
63 - extern bool git_disable_pack_keep_file_checks;
64 -
65 466 2 static int config_level_to_sysdir(int config_level)
66 - {
67 466 2 int val = -1;
68 -
69 466 2 switch (config_level) {
70 - case GIT_CONFIG_LEVEL_SYSTEM:
71 52 3 val = GIT_SYSDIR_SYSTEM;
72 52 3 break;
73 - case GIT_CONFIG_LEVEL_XDG:
74 50 4 val = GIT_SYSDIR_XDG;
75 50 4 break;
76 - case GIT_CONFIG_LEVEL_GLOBAL:
77 323 5 val = GIT_SYSDIR_GLOBAL;
78 323 5 break;
79 - case GIT_CONFIG_LEVEL_PROGRAMDATA:
80 41 6 val = GIT_SYSDIR_PROGRAMDATA;
81 41 6 break;
82 - default:
83 ##### 7 git_error_set(
84 - GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
85 - }
86 -
87 466 8 return val;
88 - }
89 -
90 - extern char *git__user_agent;
91 - extern char *git__ssl_ciphers;
92 -
93 87 2 const char *git_libgit2__user_agent(void)
94 - {
95 87 2 return git__user_agent;
96 - }
97 -
98 9 2 const char *git_libgit2__ssl_ciphers(void)
99 - {
100 9 2 return git__ssl_ciphers;
101 - }
102 -
103 759 2 int git_libgit2_opts(int key, ...)
104 - {
105 759 2 int error = 0;
106 - va_list ap;
107 -
108 759 2 va_start(ap, key);
109 -
110 759 2 switch (key) {
111 - case GIT_OPT_SET_MWINDOW_SIZE:
112 2 3-5 git_mwindow__window_size = va_arg(ap, size_t);
113 2 6 break;
114 -
115 - case GIT_OPT_GET_MWINDOW_SIZE:
116 3 7-9 *(va_arg(ap, size_t *)) = git_mwindow__window_size;
117 3 10 break;
118 -
119 - case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
120 ##### 11-13 git_mwindow__mapped_limit = va_arg(ap, size_t);
121 ##### 14 break;
122 -
123 - case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
124 ##### 15-17 *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
125 ##### 18 break;
126 -
127 - case GIT_OPT_GET_SEARCH_PATH:
128 119 19-23 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
129 119 24-26 git_buf *out = va_arg(ap, git_buf *);
130 - const git_buf *tmp;
131 -
132 119 27 git_buf_sanitize(out);
133 119 28,29 if ((error = git_sysdir_get(&tmp, error)) < 0)
134 ##### 30 break;
135 -
136 119 31,32 error = git_buf_sets(out, tmp->ptr);
137 - }
138 119 33 break;
139 -
140 - case GIT_OPT_SET_SEARCH_PATH:
141 347 34-38 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
142 347 39-42 error = git_sysdir_set(error, va_arg(ap, const char *));
143 347 43 break;
144 -
145 - case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
146 - {
147 40 44-46 git_object_t type = (git_object_t)va_arg(ap, int);
148 40 47-49 size_t size = va_arg(ap, size_t);
149 40 50 error = git_cache_set_max_object_size(type, size);
150 40 51 break;
151 - }
152 -
153 - case GIT_OPT_SET_CACHE_MAX_SIZE:
154 ##### 52-54 git_cache__max_storage = va_arg(ap, ssize_t);
155 ##### 55 break;
156 -
157 - case GIT_OPT_ENABLE_CACHING:
158 ##### 56-58 git_cache__enabled = (va_arg(ap, int) != 0);
159 ##### 59 break;
160 -
161 - case GIT_OPT_GET_CACHED_MEMORY:
162 ##### 60-62 *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
163 ##### 63-65 *(va_arg(ap, ssize_t *)) = git_cache__max_storage;
164 ##### 66 break;
165 -
166 - case GIT_OPT_GET_TEMPLATE_PATH:
167 - {
168 ##### 67-69 git_buf *out = va_arg(ap, git_buf *);
169 - const git_buf *tmp;
170 -
171 ##### 70 git_buf_sanitize(out);
172 ##### 71,72 if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
173 ##### 73 break;
174 -
175 ##### 74 error = git_buf_sets(out, tmp->ptr);
176 - }
177 ##### 75 break;
178 -
179 - case GIT_OPT_SET_TEMPLATE_PATH:
180 ##### 76-79 error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
181 ##### 80 break;
182 -
183 - case GIT_OPT_SET_SSL_CERT_LOCATIONS:
184 - #ifdef GIT_OPENSSL
185 - {
186 ##### 81-83 const char *file = va_arg(ap, const char *);
187 ##### 84-86 const char *path = va_arg(ap, const char *);
188 ##### 87 error = git_openssl__set_cert_location(file, path);
189 - }
190 - #elif defined(GIT_MBEDTLS)
191 - {
192 - const char *file = va_arg(ap, const char *);
193 - const char *path = va_arg(ap, const char *);
194 - if (file)
195 - error = git_mbedtls__set_cert_location(file, 0);
196 - if (error && path)
197 - error = git_mbedtls__set_cert_location(path, 1);
198 - }
199 - #else
200 - git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");
201 - error = -1;
202 - #endif
203 ##### 88 break;
204 - case GIT_OPT_SET_USER_AGENT:
205 1 89 git__free(git__user_agent);
206 1 90-93 git__user_agent = git__strdup(va_arg(ap, const char *));
207 1 94 if (!git__user_agent) {
208 ##### 95 git_error_set_oom();
209 ##### 96 error = -1;
210 - }
211 -
212 1 97 break;
213 -
214 - case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
215 35 98-100 git_object__strict_input_validation = (va_arg(ap, int) != 0);
216 35 101 break;
217 -
218 - case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
219 14 102-104 git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
220 14 105 break;
221 -
222 - case GIT_OPT_SET_SSL_CIPHERS:
223 - #if (GIT_OPENSSL || GIT_MBEDTLS)
224 - {
225 ##### 106 git__free(git__ssl_ciphers);
226 ##### 107-110 git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
227 ##### 111 if (!git__ssl_ciphers) {
228 ##### 112 git_error_set_oom();
229 ##### 113 error = -1;
230 - }
231 - }
232 - #else
233 - git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support custom ciphers");
234 - error = -1;
235 - #endif
236 ##### 114 break;
237 -
238 - case GIT_OPT_GET_USER_AGENT:
239 - {
240 1 115-117 git_buf *out = va_arg(ap, git_buf *);
241 1 118 git_buf_sanitize(out);
242 1 119 error = git_buf_sets(out, git__user_agent);
243 - }
244 1 120 break;
245 -
246 - case GIT_OPT_ENABLE_OFS_DELTA:
247 ##### 121-123 git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
248 ##### 124 break;
249 -
250 - case GIT_OPT_ENABLE_FSYNC_GITDIR:
251 38 125-127 git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
252 38 128 break;
253 -
254 - case GIT_OPT_GET_WINDOWS_SHAREMODE:
255 - #ifdef GIT_WIN32
256 - *(va_arg(ap, unsigned long *)) = git_win32__createfile_sharemode;
257 - #endif
258 ##### 129 break;
259 -
260 - case GIT_OPT_SET_WINDOWS_SHAREMODE:
261 - #ifdef GIT_WIN32
262 - git_win32__createfile_sharemode = va_arg(ap, unsigned long);
263 - #endif
264 ##### 130 break;
265 -
266 - case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
267 22 131-133 git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
268 22 134 break;
269 -
270 - case GIT_OPT_SET_ALLOCATOR:
271 4 135-138 error = git_allocator_setup(va_arg(ap, git_allocator *));
272 4 139 break;
273 -
274 - case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY:
275 35 140-142 git_index__enforce_unsaved_safety = (va_arg(ap, int) != 0);
276 35 143 break;
277 -
278 - case GIT_OPT_SET_PACK_MAX_OBJECTS:
279 ##### 144-146 git_indexer__max_objects = va_arg(ap, size_t);
280 ##### 147 break;
281 -
282 - case GIT_OPT_GET_PACK_MAX_OBJECTS:
283 ##### 148-150 *(va_arg(ap, size_t *)) = git_indexer__max_objects;
284 ##### 151 break;
285 -
286 - case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS:
287 13 152-154 git_disable_pack_keep_file_checks = (va_arg(ap, int) != 0);
288 13 155 break;
289 -
290 - case GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE:
291 84 156-158 git_http__expect_continue = (va_arg(ap, int) != 0);
292 84 159 break;
293 -
294 - default:
295 1 160 git_error_set(GIT_ERROR_INVALID, "invalid option key");
296 1 161 error = -1;
297 - }
298 -
299 759 162 va_end(ap);
300 -
301 759 162 return error;
302 - }