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>
18 void git_libgit2_version(int *major
, int *minor
, int *rev
)
20 *major
= LIBGIT2_VER_MAJOR
;
21 *minor
= LIBGIT2_VER_MINOR
;
22 *rev
= LIBGIT2_VER_REVISION
;
25 int git_libgit2_features()
31 #if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
37 #if defined(GIT_USE_NSEC)
43 /* Declarations for tuneable settings */
44 extern size_t git_mwindow__window_size
;
45 extern size_t git_mwindow__mapped_limit
;
47 static int config_level_to_sysdir(int config_level
)
51 switch (config_level
) {
52 case GIT_CONFIG_LEVEL_SYSTEM
:
53 val
= GIT_SYSDIR_SYSTEM
;
55 case GIT_CONFIG_LEVEL_XDG
:
58 case GIT_CONFIG_LEVEL_GLOBAL
:
59 val
= GIT_SYSDIR_GLOBAL
;
61 case GIT_CONFIG_LEVEL_PROGRAMDATA
:
62 val
= GIT_SYSDIR_PROGRAMDATA
;
66 GITERR_INVALID
, "Invalid config path selector %d", config_level
);
72 extern char *git__user_agent
;
74 const char *git_libgit2__user_agent()
76 return git__user_agent
;
79 int git_libgit2_opts(int key
, ...)
87 case GIT_OPT_SET_MWINDOW_SIZE
:
88 git_mwindow__window_size
= va_arg(ap
, size_t);
91 case GIT_OPT_GET_MWINDOW_SIZE
:
92 *(va_arg(ap
, size_t *)) = git_mwindow__window_size
;
95 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT
:
96 git_mwindow__mapped_limit
= va_arg(ap
, size_t);
99 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT
:
100 *(va_arg(ap
, size_t *)) = git_mwindow__mapped_limit
;
103 case GIT_OPT_GET_SEARCH_PATH
:
104 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0) {
105 git_buf
*out
= va_arg(ap
, git_buf
*);
108 git_buf_sanitize(out
);
109 if ((error
= git_sysdir_get(&tmp
, error
)) < 0)
112 error
= git_buf_sets(out
, tmp
->ptr
);
116 case GIT_OPT_SET_SEARCH_PATH
:
117 if ((error
= config_level_to_sysdir(va_arg(ap
, int))) >= 0)
118 error
= git_sysdir_set(error
, va_arg(ap
, const char *));
121 case GIT_OPT_SET_CACHE_OBJECT_LIMIT
:
123 git_otype type
= (git_otype
)va_arg(ap
, int);
124 size_t size
= va_arg(ap
, size_t);
125 error
= git_cache_set_max_object_size(type
, size
);
129 case GIT_OPT_SET_CACHE_MAX_SIZE
:
130 git_cache__max_storage
= va_arg(ap
, ssize_t
);
133 case GIT_OPT_ENABLE_CACHING
:
134 git_cache__enabled
= (va_arg(ap
, int) != 0);
137 case GIT_OPT_GET_CACHED_MEMORY
:
138 *(va_arg(ap
, ssize_t
*)) = git_cache__current_storage
.val
;
139 *(va_arg(ap
, ssize_t
*)) = git_cache__max_storage
;
142 case GIT_OPT_GET_TEMPLATE_PATH
:
144 git_buf
*out
= va_arg(ap
, git_buf
*);
147 git_buf_sanitize(out
);
148 if ((error
= git_sysdir_get(&tmp
, GIT_SYSDIR_TEMPLATE
)) < 0)
151 error
= git_buf_sets(out
, tmp
->ptr
);
155 case GIT_OPT_SET_TEMPLATE_PATH
:
156 error
= git_sysdir_set(GIT_SYSDIR_TEMPLATE
, va_arg(ap
, const char *));
159 case GIT_OPT_SET_SSL_CERT_LOCATIONS
:
162 const char *file
= va_arg(ap
, const char *);
163 const char *path
= va_arg(ap
, const char *);
164 if (!SSL_CTX_load_verify_locations(git__ssl_ctx
, file
, path
)) {
165 giterr_set(GITERR_NET
, "SSL error: %s",
166 ERR_error_string(ERR_get_error(), NULL
));
171 giterr_set(GITERR_NET
, "Cannot set certificate locations: OpenSSL is not enabled");
175 case GIT_OPT_SET_USER_AGENT
:
176 git__free(git__user_agent
);
177 git__user_agent
= git__strdup(va_arg(ap
, const char *));
178 if (!git__user_agent
) {
185 giterr_set(GITERR_INVALID
, "invalid option key");