]> git.proxmox.com Git - libgit2.git/blame - src/settings.c
Include stacktrace summary in memory leak output.
[libgit2.git] / src / settings.c
CommitLineData
e85bbd52
ET
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
24e53d2f 8#ifdef GIT_OPENSSL
737b445a
WS
9# include <openssl/err.h>
10#endif
11
e85bbd52
ET
12#include <git2.h>
13#include "common.h"
83634d38 14#include "sysdir.h"
e85bbd52 15#include "cache.h"
737b445a 16#include "global.h"
e85bbd52
ET
17
18void 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
c9f5298b 25int git_libgit2_features()
e85bbd52
ET
26{
27 return 0
28#ifdef GIT_THREADS
ebb3c506 29 | GIT_FEATURE_THREADS
e85bbd52 30#endif
24e53d2f 31#if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
ebb3c506 32 | GIT_FEATURE_HTTPS
e85bbd52
ET
33#endif
34#if defined(GIT_SSH)
ebb3c506 35 | GIT_FEATURE_SSH
e85bbd52
ET
36#endif
37 ;
38}
39
40/* Declarations for tuneable settings */
41extern size_t git_mwindow__window_size;
42extern size_t git_mwindow__mapped_limit;
43
83634d38 44static int config_level_to_sysdir(int config_level)
e85bbd52
ET
45{
46 int val = -1;
47
48 switch (config_level) {
83634d38
ET
49 case GIT_CONFIG_LEVEL_SYSTEM: val = GIT_SYSDIR_SYSTEM; break;
50 case GIT_CONFIG_LEVEL_XDG: val = GIT_SYSDIR_XDG; break;
51 case GIT_CONFIG_LEVEL_GLOBAL: val = GIT_SYSDIR_GLOBAL; break;
e85bbd52
ET
52 default:
53 giterr_set(
54 GITERR_INVALID, "Invalid config path selector %d", config_level);
55 }
56
57 return val;
58}
59
60int git_libgit2_opts(int key, ...)
61{
62 int error = 0;
63 va_list ap;
64
65 va_start(ap, key);
66
67 switch (key) {
68 case GIT_OPT_SET_MWINDOW_SIZE:
69 git_mwindow__window_size = va_arg(ap, size_t);
70 break;
71
72 case GIT_OPT_GET_MWINDOW_SIZE:
73 *(va_arg(ap, size_t *)) = git_mwindow__window_size;
74 break;
75
76 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
77 git_mwindow__mapped_limit = va_arg(ap, size_t);
78 break;
79
80 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
81 *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
82 break;
83
84 case GIT_OPT_GET_SEARCH_PATH:
83634d38 85 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
42dee8ec
CMN
86 git_buf *out = va_arg(ap, git_buf *);
87 const git_buf *tmp;
e85bbd52 88
42dee8ec
CMN
89 git_buf_sanitize(out);
90 if ((error = git_sysdir_get(&tmp, error)) < 0)
91 break;
92
93 error = git_buf_sets(out, tmp->ptr);
e85bbd52
ET
94 }
95 break;
96
97 case GIT_OPT_SET_SEARCH_PATH:
83634d38
ET
98 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
99 error = git_sysdir_set(error, va_arg(ap, const char *));
e85bbd52
ET
100 break;
101
102 case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
103 {
104 git_otype type = (git_otype)va_arg(ap, int);
105 size_t size = va_arg(ap, size_t);
106 error = git_cache_set_max_object_size(type, size);
107 break;
108 }
109
110 case GIT_OPT_SET_CACHE_MAX_SIZE:
111 git_cache__max_storage = va_arg(ap, ssize_t);
112 break;
113
114 case GIT_OPT_ENABLE_CACHING:
115 git_cache__enabled = (va_arg(ap, int) != 0);
116 break;
117
118 case GIT_OPT_GET_CACHED_MEMORY:
119 *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
120 *(va_arg(ap, ssize_t *)) = git_cache__max_storage;
121 break;
122
123 case GIT_OPT_GET_TEMPLATE_PATH:
124 {
42dee8ec
CMN
125 git_buf *out = va_arg(ap, git_buf *);
126 const git_buf *tmp;
127
128 git_buf_sanitize(out);
129 if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
130 break;
e85bbd52 131
42dee8ec 132 error = git_buf_sets(out, tmp->ptr);
e85bbd52
ET
133 }
134 break;
135
136 case GIT_OPT_SET_TEMPLATE_PATH:
83634d38 137 error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
e85bbd52 138 break;
737b445a
WS
139
140 case GIT_OPT_SET_SSL_CERT_LOCATIONS:
24e53d2f 141#ifdef GIT_OPENSSL
737b445a
WS
142 {
143 const char *file = va_arg(ap, const char *);
144 const char *path = va_arg(ap, const char *);
145 if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) {
146 giterr_set(GITERR_NET, "SSL error: %s",
147 ERR_error_string(ERR_get_error(), NULL));
148 error = -1;
149 }
150 }
151#else
152 giterr_set(GITERR_NET, "Cannot set certificate locations: OpenSSL is not enabled");
153 error = -1;
154#endif
155 break;
e85bbd52
ET
156 }
157
158 va_end(ap);
159
160 return error;
161}
162