settings.c 6.29 KB
Newer Older
1 2 3 4 5 6 7
/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */

8 9
#include "common.h"

10
#ifdef GIT_OPENSSL
11 12 13
# include <openssl/err.h>
#endif

14 15 16 17
#ifdef GIT_MBEDTLS
# include <mbedtls/error.h>
#endif

18
#include <git2.h>
19
#include "alloc.h"
20
#include "sysdir.h"
21
#include "cache.h"
22
#include "global.h"
23
#include "object.h"
24
#include "odb.h"
25
#include "refs.h"
26
#include "index.h"
27
#include "transports/smart.h"
28
#include "streams/openssl.h"
29
#include "streams/mbedtls.h"
30 31 32 33 34 35 36 37

void git_libgit2_version(int *major, int *minor, int *rev)
{
	*major = LIBGIT2_VER_MAJOR;
	*minor = LIBGIT2_VER_MINOR;
	*rev = LIBGIT2_VER_REVISION;
}

38
int git_libgit2_features(void)
39 40 41
{
	return 0
#ifdef GIT_THREADS
42
		| GIT_FEATURE_THREADS
43
#endif
44
#ifdef GIT_HTTPS
45
		| GIT_FEATURE_HTTPS
46
#endif
47
#if defined(GIT_SSH)
48
		| GIT_FEATURE_SSH
49
#endif
50 51 52
#if defined(GIT_USE_NSEC)
		| GIT_FEATURE_NSEC
#endif
53 54 55 56 57 58
	;
}

/* Declarations for tuneable settings */
extern size_t git_mwindow__window_size;
extern size_t git_mwindow__mapped_limit;
59
extern size_t git_indexer__max_objects;
60

61
static int config_level_to_sysdir(int config_level)
62 63 64 65
{
	int val = -1;

	switch (config_level) {
66 67 68 69 70 71 72 73 74 75 76 77
	case GIT_CONFIG_LEVEL_SYSTEM:
		val = GIT_SYSDIR_SYSTEM;
		break;
	case GIT_CONFIG_LEVEL_XDG:
		val = GIT_SYSDIR_XDG;
		break;
	case GIT_CONFIG_LEVEL_GLOBAL:
		val = GIT_SYSDIR_GLOBAL;
		break;
	case GIT_CONFIG_LEVEL_PROGRAMDATA:
		val = GIT_SYSDIR_PROGRAMDATA;
		break;
78
	default:
79 80
		git_error_set(
			GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
81 82 83 84 85
	}

	return val;
}

86
extern char *git__user_agent;
87
extern char *git__ssl_ciphers;
88

89
const char *git_libgit2__user_agent(void)
90 91 92 93
{
	return git__user_agent;
}

94
const char *git_libgit2__ssl_ciphers(void)
95 96 97 98
{
	return git__ssl_ciphers;
}

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
int git_libgit2_opts(int key, ...)
{
	int error = 0;
	va_list ap;

	va_start(ap, key);

	switch (key) {
	case GIT_OPT_SET_MWINDOW_SIZE:
		git_mwindow__window_size = va_arg(ap, size_t);
		break;

	case GIT_OPT_GET_MWINDOW_SIZE:
		*(va_arg(ap, size_t *)) = git_mwindow__window_size;
		break;

	case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
		git_mwindow__mapped_limit = va_arg(ap, size_t);
		break;

	case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
		*(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
		break;

	case GIT_OPT_GET_SEARCH_PATH:
124
		if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
125 126
			git_buf *out = va_arg(ap, git_buf *);
			const git_buf *tmp;
127

128 129 130 131 132
			git_buf_sanitize(out);
			if ((error = git_sysdir_get(&tmp, error)) < 0)
				break;

			error = git_buf_sets(out, tmp->ptr);
133 134 135 136
		}
		break;

	case GIT_OPT_SET_SEARCH_PATH:
137 138
		if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
			error = git_sysdir_set(error, va_arg(ap, const char *));
139 140 141 142
		break;

	case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
		{
143
			git_object_t type = (git_object_t)va_arg(ap, int);
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
			size_t size = va_arg(ap, size_t);
			error = git_cache_set_max_object_size(type, size);
			break;
		}

	case GIT_OPT_SET_CACHE_MAX_SIZE:
		git_cache__max_storage = va_arg(ap, ssize_t);
		break;

	case GIT_OPT_ENABLE_CACHING:
		git_cache__enabled = (va_arg(ap, int) != 0);
		break;

	case GIT_OPT_GET_CACHED_MEMORY:
		*(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
		*(va_arg(ap, ssize_t *)) = git_cache__max_storage;
		break;

	case GIT_OPT_GET_TEMPLATE_PATH:
		{
164 165 166 167 168 169
			git_buf *out = va_arg(ap, git_buf *);
			const git_buf *tmp;

			git_buf_sanitize(out);
			if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
				break;
170

171
			error = git_buf_sets(out, tmp->ptr);
172 173 174 175
		}
		break;

	case GIT_OPT_SET_TEMPLATE_PATH:
176
		error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
177
		break;
178 179

	case GIT_OPT_SET_SSL_CERT_LOCATIONS:
180
#ifdef GIT_OPENSSL
181 182 183
		{
			const char *file = va_arg(ap, const char *);
			const char *path = va_arg(ap, const char *);
184
			error = git_openssl__set_cert_location(file, path);
185
		}
186 187 188 189
#elif defined(GIT_MBEDTLS)
		{
			const char *file = va_arg(ap, const char *);
			const char *path = va_arg(ap, const char *);
190 191 192 193
			if (file)
				error = git_mbedtls__set_cert_location(file, 0);
			if (error && path)
				error = git_mbedtls__set_cert_location(path, 1);
194
		}
195
#else
196
		git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");
197 198 199
		error = -1;
#endif
		break;
200 201 202 203
	case GIT_OPT_SET_USER_AGENT:
		git__free(git__user_agent);
		git__user_agent = git__strdup(va_arg(ap, const char *));
		if (!git__user_agent) {
204
			git_error_set_oom();
205 206 207 208
			error = -1;
		}

		break;
209 210 211 212 213

	case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
		git_object__strict_input_validation = (va_arg(ap, int) != 0);
		break;

214
	case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
215 216 217
		git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
		break;

218
	case GIT_OPT_SET_SSL_CIPHERS:
219
#if (GIT_OPENSSL || GIT_MBEDTLS)
220 221 222 223
		{
			git__free(git__ssl_ciphers);
			git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
			if (!git__ssl_ciphers) {
224
				git_error_set_oom();
225 226 227 228
				error = -1;
			}
		}
#else
229
		git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support custom ciphers");
230 231 232 233
		error = -1;
#endif
		break;

234 235 236 237 238 239 240 241
	case GIT_OPT_GET_USER_AGENT:
		{
			git_buf *out = va_arg(ap, git_buf *);
			git_buf_sanitize(out);
			error = git_buf_sets(out, git__user_agent);
		}
		break;

242 243 244 245
	case GIT_OPT_ENABLE_OFS_DELTA:
		git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
		break;

246 247
	case GIT_OPT_ENABLE_FSYNC_GITDIR:
		git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
248 249
		break;

250 251 252 253 254 255 256 257 258 259 260 261
	case GIT_OPT_GET_WINDOWS_SHAREMODE:
#ifdef GIT_WIN32
		*(va_arg(ap, unsigned long *)) = git_win32__createfile_sharemode;
#endif
		break;

	case GIT_OPT_SET_WINDOWS_SHAREMODE:
#ifdef GIT_WIN32
		git_win32__createfile_sharemode = va_arg(ap, unsigned long);
#endif
		break;

262 263 264 265
	case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
		git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
		break;

266 267 268 269
	case GIT_OPT_SET_ALLOCATOR:
		error = git_allocator_setup(va_arg(ap, git_allocator *));
		break;

270 271 272 273
	case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY:
		git_index__enforce_unsaved_safety = (va_arg(ap, int) != 0);
		break;

274
	case GIT_OPT_SET_PACK_MAX_OBJECTS:
275 276 277
		git_indexer__max_objects = va_arg(ap, size_t);
		break;

278
	case GIT_OPT_GET_PACK_MAX_OBJECTS:
279 280 281
		*(va_arg(ap, size_t *)) = git_indexer__max_objects;
		break;

282
	default:
283
		git_error_set(GIT_ERROR_INVALID, "invalid option key");
284
		error = -1;
285 286 287 288 289 290
	}

	va_end(ap);

	return error;
}