settings.c 5.08 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
#ifdef GIT_OPENSSL
9 10 11
# include <openssl/err.h>
#endif

12 13
#include <git2.h>
#include "common.h"
14
#include "sysdir.h"
15
#include "cache.h"
16
#include "global.h"
17
#include "object.h"
18
#include "refs.h"
19
#include "transports/smart.h"
20 21 22 23 24 25 26 27

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

28
int git_libgit2_features(void)
29 30 31
{
	return 0
#ifdef GIT_THREADS
32
		| GIT_FEATURE_THREADS
33
#endif
34
#if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
35
		| GIT_FEATURE_HTTPS
36
#endif
37
#if defined(GIT_SSH)
38
		| GIT_FEATURE_SSH
39
#endif
40 41 42
#if defined(GIT_USE_NSEC)
		| GIT_FEATURE_NSEC
#endif
43 44 45 46 47 48 49
	;
}

/* Declarations for tuneable settings */
extern size_t git_mwindow__window_size;
extern size_t git_mwindow__mapped_limit;

50
static int config_level_to_sysdir(int config_level)
51 52 53 54
{
	int val = -1;

	switch (config_level) {
55 56 57 58 59 60 61 62 63 64 65 66
	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;
67 68
	default:
		giterr_set(
69
			GITERR_INVALID, "invalid config path selector %d", config_level);
70 71 72 73 74
	}

	return val;
}

75
extern char *git__user_agent;
76
extern char *git__ssl_ciphers;
77

78
const char *git_libgit2__user_agent(void)
79 80 81 82
{
	return git__user_agent;
}

83
const char *git_libgit2__ssl_ciphers(void)
84 85 86 87
{
	return git__ssl_ciphers;
}

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
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:
113
		if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
114 115
			git_buf *out = va_arg(ap, git_buf *);
			const git_buf *tmp;
116

117 118 119 120 121
			git_buf_sanitize(out);
			if ((error = git_sysdir_get(&tmp, error)) < 0)
				break;

			error = git_buf_sets(out, tmp->ptr);
122 123 124 125
		}
		break;

	case GIT_OPT_SET_SEARCH_PATH:
126 127
		if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
			error = git_sysdir_set(error, va_arg(ap, const char *));
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
		break;

	case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
		{
			git_otype type = (git_otype)va_arg(ap, int);
			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:
		{
153 154 155 156 157 158
			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;
159

160
			error = git_buf_sets(out, tmp->ptr);
161 162 163 164
		}
		break;

	case GIT_OPT_SET_TEMPLATE_PATH:
165
		error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
166
		break;
167 168

	case GIT_OPT_SET_SSL_CERT_LOCATIONS:
169
#ifdef GIT_OPENSSL
170 171 172 173 174 175 176 177 178 179
		{
			const char *file = va_arg(ap, const char *);
			const char *path = va_arg(ap, const char *);
			if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) {
				giterr_set(GITERR_NET, "SSL error: %s",
					ERR_error_string(ERR_get_error(), NULL));
				error = -1;
			}
		}
#else
180
		giterr_set(GITERR_NET, "cannot set certificate locations: OpenSSL is not enabled");
181 182 183
		error = -1;
#endif
		break;
184 185 186 187 188 189 190 191 192
	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) {
			giterr_set_oom();
			error = -1;
		}

		break;
193 194 195 196 197

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

198
	case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
199 200 201
		git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
		break;

202 203 204 205 206 207 208 209 210 211 212
	case GIT_OPT_SET_SSL_CIPHERS:
#ifdef GIT_OPENSSL
		{
			git__free(git__ssl_ciphers);
			git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
			if (!git__ssl_ciphers) {
				giterr_set_oom();
				error = -1;
			}
		}
#else
213
		giterr_set(GITERR_NET, "cannot set custom ciphers: OpenSSL is not enabled");
214 215 216 217
		error = -1;
#endif
		break;

218 219 220 221 222 223 224 225
	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;

226 227 228 229
	case GIT_OPT_ENABLE_OFS_DELTA:
		git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
		break;

230 231 232
	default:
		giterr_set(GITERR_INVALID, "invalid option key");
		error = -1;
233 234 235 236 237 238 239
	}

	va_end(ap);

	return error;
}