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.
9 # include <openssl/err.h>
20 #include "transports/smart.h"
22 void git_libgit2_version(int *major
, int *minor
, int *rev
)
24 *major
= LIBGIT2_VER_MAJOR
;
25 *minor
= LIBGIT2_VER_MINOR
;
26 *rev
= LIBGIT2_VER_REVISION
;
29 int git_libgit2_features(void)
35 #if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
41 #if defined(GIT_USE_NSEC)
47 /* Declarations for tuneable settings */
48 extern size_t git_mwindow__window_size
;
49 extern size_t git_mwindow__mapped_limit
;
51 static int config_level_to_sysdir(int config_level
)
55 switch (config_level
) {
56 case GIT_CONFIG_LEVEL_SYSTEM
:
57 val
= GIT_SYSDIR_SYSTEM
;
59 case GIT_CONFIG_LEVEL_XDG
:
62 case GIT_CONFIG_LEVEL_GLOBAL
:
63 val
= GIT_SYSDIR_GLOBAL
;
65 case GIT_CONFIG_LEVEL_PROGRAMDATA
:
66 val
= GIT_SYSDIR_PROGRAMDATA
;
70 GITERR_INVALID
, "invalid config path selector %d", config_level
);
76 extern char *git__user_agent
;
77 extern char *git__ssl_ciphers
;
79 const char *git_libgit2__user_agent(void)
81 return git__user_agent
;
84 const char *git_libgit2__ssl_ciphers(void)
86 return git__ssl_ciphers
;
89 int git_libgit2_opts(int key
, ...)
97 case GIT_OPT_SET_MWINDOW_SIZE
:
98 git_mwindow__window_size
= va_arg(ap
, size_t);
101 case GIT_OPT_GET_MWINDOW_SIZE
:
102 *(va_arg(ap
, size_t *)) = git_mwindow__window_size
;
105 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT
:
106 git_mwindow__mapped_limit
= va_arg(ap
, size_t);
109 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT
:
110 *(va_arg(ap
, size_t *)) = git_mwindow__mapped_limit
;
113 case GIT_OPT_GET_SEARCH_PATH
:
114 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0) {
115 git_buf
*out
= va_arg(ap
, git_buf
*);
118 git_buf_sanitize(out
);
119 if ((error
= git_sysdir_get(&tmp
, error
)) < 0)
122 error
= git_buf_sets(out
, tmp
->ptr
);
126 case GIT_OPT_SET_SEARCH_PATH
:
127 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0)
128 error
= git_sysdir_set(error
, va_arg(ap
, const char *));
131 case GIT_OPT_SET_CACHE_OBJECT_LIMIT
:
133 git_otype type
= (git_otype
)va_arg(ap
, int);
134 size_t size
= va_arg(ap
, size_t);
135 error
= git_cache_set_max_object_size(type
, size
);
139 case GIT_OPT_SET_CACHE_MAX_SIZE
:
140 git_cache__max_storage
= va_arg(ap
, ssize_t
);
143 case GIT_OPT_ENABLE_CACHING
:
144 git_cache__enabled
= (va_arg(ap
, int) != 0);
147 case GIT_OPT_GET_CACHED_MEMORY
:
148 *(va_arg(ap
, ssize_t
*)) = git_cache__current_storage
.val
;
149 *(va_arg(ap
, ssize_t
*)) = git_cache__max_storage
;
152 case GIT_OPT_GET_TEMPLATE_PATH
:
154 git_buf
*out
= va_arg(ap
, git_buf
*);
157 git_buf_sanitize(out
);
158 if ((error
= git_sysdir_get(&tmp
, GIT_SYSDIR_TEMPLATE
)) < 0)
161 error
= git_buf_sets(out
, tmp
->ptr
);
165 case GIT_OPT_SET_TEMPLATE_PATH
:
166 error
= git_sysdir_set(GIT_SYSDIR_TEMPLATE
, va_arg(ap
, const char *));
169 case GIT_OPT_SET_SSL_CERT_LOCATIONS
:
172 const char *file
= va_arg(ap
, const char *);
173 const char *path
= va_arg(ap
, const char *);
174 if (!SSL_CTX_load_verify_locations(git__ssl_ctx
, file
, path
)) {
175 giterr_set(GITERR_NET
, "SSL error: %s",
176 ERR_error_string(ERR_get_error(), NULL
));
181 giterr_set(GITERR_NET
, "cannot set certificate locations: OpenSSL is not enabled");
185 case GIT_OPT_SET_USER_AGENT
:
186 git__free(git__user_agent
);
187 git__user_agent
= git__strdup(va_arg(ap
, const char *));
188 if (!git__user_agent
) {
195 case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION
:
196 git_object__strict_input_validation
= (va_arg(ap
, int) != 0);
199 case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION
:
200 git_reference__enable_symbolic_ref_target_validation
= (va_arg(ap
, int) != 0);
203 case GIT_OPT_SET_SSL_CIPHERS
:
206 git__free(git__ssl_ciphers
);
207 git__ssl_ciphers
= git__strdup(va_arg(ap
, const char *));
208 if (!git__ssl_ciphers
) {
214 giterr_set(GITERR_NET
, "cannot set custom ciphers: OpenSSL is not enabled");
219 case GIT_OPT_GET_USER_AGENT
:
221 git_buf
*out
= va_arg(ap
, git_buf
*);
222 git_buf_sanitize(out
);
223 error
= git_buf_sets(out
, git__user_agent
);
227 case GIT_OPT_ENABLE_OFS_DELTA
:
228 git_smart__ofs_delta_enabled
= (va_arg(ap
, int) != 0);
231 case GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION
:
232 git_object__synchronous_writing
= (va_arg(ap
, int) != 0);
235 case GIT_OPT_GET_WINDOWS_SHAREMODE
:
237 *(va_arg(ap
, unsigned long *)) = git_win32__createfile_sharemode
;
241 case GIT_OPT_SET_WINDOWS_SHAREMODE
:
243 git_win32__createfile_sharemode
= va_arg(ap
, unsigned long);
247 case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION
:
248 git_odb__strict_hash_verification
= (va_arg(ap
, int) != 0);
252 giterr_set(GITERR_INVALID
, "invalid option key");