]> git.proxmox.com Git - libgit2.git/blob - src/settings.c
Merge pull request #3644 from ethomson/debug_pool
[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
18 void git_libgit2_version(int *major, int *minor, int *rev)
19 {
20 *major = LIBGIT2_VER_MAJOR;
21 *minor = LIBGIT2_VER_MINOR;
22 *rev = LIBGIT2_VER_REVISION;
23 }
24
25 int git_libgit2_features()
26 {
27 return 0
28 #ifdef GIT_THREADS
29 | GIT_FEATURE_THREADS
30 #endif
31 #if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
32 | GIT_FEATURE_HTTPS
33 #endif
34 #if defined(GIT_SSH)
35 | GIT_FEATURE_SSH
36 #endif
37 #if defined(GIT_USE_NSEC)
38 | GIT_FEATURE_NSEC
39 #endif
40 ;
41 }
42
43 /* Declarations for tuneable settings */
44 extern size_t git_mwindow__window_size;
45 extern size_t git_mwindow__mapped_limit;
46
47 static int config_level_to_sysdir(int config_level)
48 {
49 int val = -1;
50
51 switch (config_level) {
52 case GIT_CONFIG_LEVEL_SYSTEM:
53 val = GIT_SYSDIR_SYSTEM;
54 break;
55 case GIT_CONFIG_LEVEL_XDG:
56 val = GIT_SYSDIR_XDG;
57 break;
58 case GIT_CONFIG_LEVEL_GLOBAL:
59 val = GIT_SYSDIR_GLOBAL;
60 break;
61 case GIT_CONFIG_LEVEL_PROGRAMDATA:
62 val = GIT_SYSDIR_PROGRAMDATA;
63 break;
64 default:
65 giterr_set(
66 GITERR_INVALID, "Invalid config path selector %d", config_level);
67 }
68
69 return val;
70 }
71
72 extern char *git__user_agent;
73
74 const char *git_libgit2__user_agent()
75 {
76 return git__user_agent;
77 }
78
79 int git_libgit2_opts(int key, ...)
80 {
81 int error = 0;
82 va_list ap;
83
84 va_start(ap, key);
85
86 switch (key) {
87 case GIT_OPT_SET_MWINDOW_SIZE:
88 git_mwindow__window_size = va_arg(ap, size_t);
89 break;
90
91 case GIT_OPT_GET_MWINDOW_SIZE:
92 *(va_arg(ap, size_t *)) = git_mwindow__window_size;
93 break;
94
95 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
96 git_mwindow__mapped_limit = va_arg(ap, size_t);
97 break;
98
99 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
100 *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
101 break;
102
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 *);
106 const git_buf *tmp;
107
108 git_buf_sanitize(out);
109 if ((error = git_sysdir_get(&tmp, error)) < 0)
110 break;
111
112 error = git_buf_sets(out, tmp->ptr);
113 }
114 break;
115
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 *));
119 break;
120
121 case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
122 {
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);
126 break;
127 }
128
129 case GIT_OPT_SET_CACHE_MAX_SIZE:
130 git_cache__max_storage = va_arg(ap, ssize_t);
131 break;
132
133 case GIT_OPT_ENABLE_CACHING:
134 git_cache__enabled = (va_arg(ap, int) != 0);
135 break;
136
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;
140 break;
141
142 case GIT_OPT_GET_TEMPLATE_PATH:
143 {
144 git_buf *out = va_arg(ap, git_buf *);
145 const git_buf *tmp;
146
147 git_buf_sanitize(out);
148 if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
149 break;
150
151 error = git_buf_sets(out, tmp->ptr);
152 }
153 break;
154
155 case GIT_OPT_SET_TEMPLATE_PATH:
156 error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
157 break;
158
159 case GIT_OPT_SET_SSL_CERT_LOCATIONS:
160 #ifdef GIT_OPENSSL
161 {
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));
167 error = -1;
168 }
169 }
170 #else
171 giterr_set(GITERR_NET, "Cannot set certificate locations: OpenSSL is not enabled");
172 error = -1;
173 #endif
174 break;
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) {
179 giterr_set_oom();
180 error = -1;
181 }
182
183 break;
184 default:
185 giterr_set(GITERR_INVALID, "invalid option key");
186 error = -1;
187 }
188
189 va_end(ap);
190
191 return error;
192 }
193