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