]> git.proxmox.com Git - libgit2.git/blame - src/settings.c
New upstream version 1.1.0+dfsg.1
[libgit2.git] / src / settings.c
CommitLineData
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 32int 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 41int 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 */
60extern size_t git_mwindow__window_size;
61extern size_t git_mwindow__mapped_limit;
22a2d3d5 62extern size_t git_mwindow__file_limit;
ac3d33df 63extern size_t git_indexer__max_objects;
22a2d3d5 64extern bool git_disable_pack_keep_file_checks;
e85bbd52 65
83634d38 66static 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 91extern char *git__user_agent;
fa72d6da 92extern char *git__ssl_ciphers;
de870533 93
8fd74c08 94const char *git_libgit2__user_agent(void)
de870533
CMN
95{
96 return git__user_agent;
97}
98
8fd74c08 99const char *git_libgit2__ssl_ciphers(void)
fa72d6da
DB
100{
101 return git__ssl_ciphers;
102}
103
e85bbd52
ET
104int 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}