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