]> git.proxmox.com Git - libgit2.git/blob - src/settings.c
Merge pull request #3881 from pks-t/pks/fix-clar-suite-prefix-computation
[libgit2.git] / src / settings.c
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
8 #ifdef GIT_OPENSSL
9 # include <openssl/err.h>
10 #endif
11
12 #include <git2.h>
13 #include "common.h"
14 #include "sysdir.h"
15 #include "cache.h"
16 #include "global.h"
17 #include "object.h"
18
19 void git_libgit2_version(int *major, int *minor, int *rev)
20 {
21 *major = LIBGIT2_VER_MAJOR;
22 *minor = LIBGIT2_VER_MINOR;
23 *rev = LIBGIT2_VER_REVISION;
24 }
25
26 int git_libgit2_features(void)
27 {
28 return 0
29 #ifdef GIT_THREADS
30 | GIT_FEATURE_THREADS
31 #endif
32 | GIT_FEATURE_HTTPS
33 #if defined(GIT_SSH)
34 | GIT_FEATURE_SSH
35 #endif
36 #if defined(GIT_USE_NSEC)
37 | GIT_FEATURE_NSEC
38 #endif
39 ;
40 }
41
42 /* Declarations for tuneable settings */
43 extern size_t git_mwindow__window_size;
44 extern size_t git_mwindow__mapped_limit;
45
46 static int config_level_to_sysdir(int config_level)
47 {
48 int val = -1;
49
50 switch (config_level) {
51 case GIT_CONFIG_LEVEL_SYSTEM:
52 val = GIT_SYSDIR_SYSTEM;
53 break;
54 case GIT_CONFIG_LEVEL_XDG:
55 val = GIT_SYSDIR_XDG;
56 break;
57 case GIT_CONFIG_LEVEL_GLOBAL:
58 val = GIT_SYSDIR_GLOBAL;
59 break;
60 case GIT_CONFIG_LEVEL_PROGRAMDATA:
61 val = GIT_SYSDIR_PROGRAMDATA;
62 break;
63 default:
64 giterr_set(
65 GITERR_INVALID, "Invalid config path selector %d", config_level);
66 }
67
68 return val;
69 }
70
71 extern char *git__user_agent;
72 extern char *git__ssl_ciphers;
73
74 const char *git_libgit2__user_agent(void)
75 {
76 return git__user_agent;
77 }
78
79 const char *git_libgit2__ssl_ciphers(void)
80 {
81 return git__ssl_ciphers;
82 }
83
84 int git_libgit2_opts(int key, ...)
85 {
86 int error = 0;
87 va_list ap;
88
89 va_start(ap, key);
90
91 switch (key) {
92 case GIT_OPT_SET_MWINDOW_SIZE:
93 git_mwindow__window_size = va_arg(ap, size_t);
94 break;
95
96 case GIT_OPT_GET_MWINDOW_SIZE:
97 *(va_arg(ap, size_t *)) = git_mwindow__window_size;
98 break;
99
100 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
101 git_mwindow__mapped_limit = va_arg(ap, size_t);
102 break;
103
104 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
105 *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
106 break;
107
108 case GIT_OPT_GET_SEARCH_PATH:
109 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
110 git_buf *out = va_arg(ap, git_buf *);
111 const git_buf *tmp;
112
113 git_buf_sanitize(out);
114 if ((error = git_sysdir_get(&tmp, error)) < 0)
115 break;
116
117 error = git_buf_sets(out, tmp->ptr);
118 }
119 break;
120
121 case GIT_OPT_SET_SEARCH_PATH:
122 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
123 error = git_sysdir_set(error, va_arg(ap, const char *));
124 break;
125
126 case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
127 {
128 git_otype type = (git_otype)va_arg(ap, int);
129 size_t size = va_arg(ap, size_t);
130 error = git_cache_set_max_object_size(type, size);
131 break;
132 }
133
134 case GIT_OPT_SET_CACHE_MAX_SIZE:
135 git_cache__max_storage = va_arg(ap, ssize_t);
136 break;
137
138 case GIT_OPT_ENABLE_CACHING:
139 git_cache__enabled = (va_arg(ap, int) != 0);
140 break;
141
142 case GIT_OPT_GET_CACHED_MEMORY:
143 *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
144 *(va_arg(ap, ssize_t *)) = git_cache__max_storage;
145 break;
146
147 case GIT_OPT_GET_TEMPLATE_PATH:
148 {
149 git_buf *out = va_arg(ap, git_buf *);
150 const git_buf *tmp;
151
152 git_buf_sanitize(out);
153 if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
154 break;
155
156 error = git_buf_sets(out, tmp->ptr);
157 }
158 break;
159
160 case GIT_OPT_SET_TEMPLATE_PATH:
161 error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
162 break;
163
164 case GIT_OPT_SET_SSL_CERT_LOCATIONS:
165 #ifdef GIT_OPENSSL
166 {
167 const char *file = va_arg(ap, const char *);
168 const char *path = va_arg(ap, const char *);
169 if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) {
170 giterr_set(GITERR_NET, "SSL error: %s",
171 ERR_error_string(ERR_get_error(), NULL));
172 error = -1;
173 }
174 }
175 #else
176 giterr_set(GITERR_NET, "cannot set certificate locations: OpenSSL is not enabled");
177 error = -1;
178 #endif
179 break;
180 case GIT_OPT_SET_USER_AGENT:
181 git__free(git__user_agent);
182 git__user_agent = git__strdup(va_arg(ap, const char *));
183 if (!git__user_agent) {
184 giterr_set_oom();
185 error = -1;
186 }
187
188 break;
189
190 case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
191 git_object__strict_input_validation = (va_arg(ap, int) != 0);
192 break;
193
194 case GIT_OPT_SET_SSL_CIPHERS:
195 #ifdef GIT_OPENSSL
196 {
197 git__free(git__ssl_ciphers);
198 git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
199 if (!git__ssl_ciphers) {
200 giterr_set_oom();
201 error = -1;
202 }
203 }
204 #else
205 giterr_set(GITERR_NET, "cannot set custom ciphers: OpenSSL is not enabled");
206 error = -1;
207 #endif
208 break;
209
210 case GIT_OPT_GET_USER_AGENT:
211 {
212 git_buf *out = va_arg(ap, git_buf *);
213 git_buf_sanitize(out);
214 error = git_buf_sets(out, git__user_agent);
215 }
216 break;
217
218 default:
219 giterr_set(GITERR_INVALID, "invalid option key");
220 error = -1;
221 }
222
223 va_end(ap);
224
225 return error;
226 }
227