]>
Commit | Line | Data |
---|---|---|
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 | |
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 | ||
c9f5298b | 25 | int 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 */ | |
41 | extern size_t git_mwindow__window_size; | |
42 | extern size_t git_mwindow__mapped_limit; | |
43 | ||
83634d38 | 44 | static 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 | ||
60 | int 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 |