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