2 * Copyright (C) the libgit2 contributors. All rights reserved.
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.
11 # include <openssl/err.h>
15 # include <mbedtls/error.h>
27 #include "transports/smart.h"
28 #include "transports/http.h"
29 #include "streams/openssl.h"
30 #include "streams/mbedtls.h"
32 int git_libgit2_version(int *major
, int *minor
, int *rev
)
34 *major
= LIBGIT2_VER_MAJOR
;
35 *minor
= LIBGIT2_VER_MINOR
;
36 *rev
= LIBGIT2_VER_REVISION
;
41 int git_libgit2_features(void)
53 #if defined(GIT_USE_NSEC)
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
;
65 static int config_level_to_sysdir(int config_level
)
69 switch (config_level
) {
70 case GIT_CONFIG_LEVEL_SYSTEM
:
71 val
= GIT_SYSDIR_SYSTEM
;
73 case GIT_CONFIG_LEVEL_XDG
:
76 case GIT_CONFIG_LEVEL_GLOBAL
:
77 val
= GIT_SYSDIR_GLOBAL
;
79 case GIT_CONFIG_LEVEL_PROGRAMDATA
:
80 val
= GIT_SYSDIR_PROGRAMDATA
;
84 GIT_ERROR_INVALID
, "invalid config path selector %d", config_level
);
90 extern char *git__user_agent
;
91 extern char *git__ssl_ciphers
;
93 const char *git_libgit2__user_agent(void)
95 return git__user_agent
;
98 const char *git_libgit2__ssl_ciphers(void)
100 return git__ssl_ciphers
;
103 int git_libgit2_opts(int key
, ...)
111 case GIT_OPT_SET_MWINDOW_SIZE
:
112 git_mwindow__window_size
= va_arg(ap
, size_t);
115 case GIT_OPT_GET_MWINDOW_SIZE
:
116 *(va_arg(ap
, size_t *)) = git_mwindow__window_size
;
119 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT
:
120 git_mwindow__mapped_limit
= va_arg(ap
, size_t);
123 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT
:
124 *(va_arg(ap
, size_t *)) = git_mwindow__mapped_limit
;
127 case GIT_OPT_GET_SEARCH_PATH
:
128 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0) {
129 git_buf
*out
= va_arg(ap
, git_buf
*);
132 git_buf_sanitize(out
);
133 if ((error
= git_sysdir_get(&tmp
, error
)) < 0)
136 error
= git_buf_sets(out
, tmp
->ptr
);
140 case GIT_OPT_SET_SEARCH_PATH
:
141 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0)
142 error
= git_sysdir_set(error
, va_arg(ap
, const char *));
145 case GIT_OPT_SET_CACHE_OBJECT_LIMIT
:
147 git_object_t type
= (git_object_t
)va_arg(ap
, int);
148 size_t size
= va_arg(ap
, size_t);
149 error
= git_cache_set_max_object_size(type
, size
);
153 case GIT_OPT_SET_CACHE_MAX_SIZE
:
154 git_cache__max_storage
= va_arg(ap
, ssize_t
);
157 case GIT_OPT_ENABLE_CACHING
:
158 git_cache__enabled
= (va_arg(ap
, int) != 0);
161 case GIT_OPT_GET_CACHED_MEMORY
:
162 *(va_arg(ap
, ssize_t
*)) = git_cache__current_storage
.val
;
163 *(va_arg(ap
, ssize_t
*)) = git_cache__max_storage
;
166 case GIT_OPT_GET_TEMPLATE_PATH
:
168 git_buf
*out
= va_arg(ap
, git_buf
*);
171 git_buf_sanitize(out
);
172 if ((error
= git_sysdir_get(&tmp
, GIT_SYSDIR_TEMPLATE
)) < 0)
175 error
= git_buf_sets(out
, tmp
->ptr
);
179 case GIT_OPT_SET_TEMPLATE_PATH
:
180 error
= git_sysdir_set(GIT_SYSDIR_TEMPLATE
, va_arg(ap
, const char *));
183 case GIT_OPT_SET_SSL_CERT_LOCATIONS
:
186 const char *file
= va_arg(ap
, const char *);
187 const char *path
= va_arg(ap
, const char *);
188 error
= git_openssl__set_cert_location(file
, path
);
190 #elif defined(GIT_MBEDTLS)
192 const char *file
= va_arg(ap
, const char *);
193 const char *path
= va_arg(ap
, const char *);
195 error
= git_mbedtls__set_cert_location(file
, 0);
197 error
= git_mbedtls__set_cert_location(path
, 1);
200 git_error_set(GIT_ERROR_SSL
, "TLS backend doesn't support certificate locations");
204 case GIT_OPT_SET_USER_AGENT
:
205 git__free(git__user_agent
);
206 git__user_agent
= git__strdup(va_arg(ap
, const char *));
207 if (!git__user_agent
) {
214 case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION
:
215 git_object__strict_input_validation
= (va_arg(ap
, int) != 0);
218 case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION
:
219 git_reference__enable_symbolic_ref_target_validation
= (va_arg(ap
, int) != 0);
222 case GIT_OPT_SET_SSL_CIPHERS
:
223 #if (GIT_OPENSSL || GIT_MBEDTLS)
225 git__free(git__ssl_ciphers
);
226 git__ssl_ciphers
= git__strdup(va_arg(ap
, const char *));
227 if (!git__ssl_ciphers
) {
233 git_error_set(GIT_ERROR_SSL
, "TLS backend doesn't support custom ciphers");
238 case GIT_OPT_GET_USER_AGENT
:
240 git_buf
*out
= va_arg(ap
, git_buf
*);
241 git_buf_sanitize(out
);
242 error
= git_buf_sets(out
, git__user_agent
);
246 case GIT_OPT_ENABLE_OFS_DELTA
:
247 git_smart__ofs_delta_enabled
= (va_arg(ap
, int) != 0);
250 case GIT_OPT_ENABLE_FSYNC_GITDIR
:
251 git_repository__fsync_gitdir
= (va_arg(ap
, int) != 0);
254 case GIT_OPT_GET_WINDOWS_SHAREMODE
:
256 *(va_arg(ap
, unsigned long *)) = git_win32__createfile_sharemode
;
260 case GIT_OPT_SET_WINDOWS_SHAREMODE
:
262 git_win32__createfile_sharemode
= va_arg(ap
, unsigned long);
266 case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION
:
267 git_odb__strict_hash_verification
= (va_arg(ap
, int) != 0);
270 case GIT_OPT_SET_ALLOCATOR
:
271 error
= git_allocator_setup(va_arg(ap
, git_allocator
*));
274 case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY
:
275 git_index__enforce_unsaved_safety
= (va_arg(ap
, int) != 0);
278 case GIT_OPT_SET_PACK_MAX_OBJECTS
:
279 git_indexer__max_objects
= va_arg(ap
, size_t);
282 case GIT_OPT_GET_PACK_MAX_OBJECTS
:
283 *(va_arg(ap
, size_t *)) = git_indexer__max_objects
;
286 case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS
:
287 git_disable_pack_keep_file_checks
= (va_arg(ap
, int) != 0);
290 case GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE
:
291 git_http__expect_continue
= (va_arg(ap
, int) != 0);
295 git_error_set(GIT_ERROR_INVALID
, "invalid option key");