|
Packit |
ae9e2a |
/*
|
|
Packit |
ae9e2a |
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
Packit |
ae9e2a |
*
|
|
Packit |
ae9e2a |
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
Packit |
ae9e2a |
* a Linking Exception. For full terms see the included COPYING file.
|
|
Packit |
ae9e2a |
*/
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
#ifdef GIT_OPENSSL
|
|
Packit |
ae9e2a |
# include <openssl/err.h>
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
#include <git2.h>
|
|
Packit |
ae9e2a |
#include "common.h"
|
|
Packit |
ae9e2a |
#include "sysdir.h"
|
|
Packit |
ae9e2a |
#include "cache.h"
|
|
Packit |
ae9e2a |
#include "global.h"
|
|
Packit |
ae9e2a |
#include "object.h"
|
|
Packit |
ae9e2a |
#include "odb.h"
|
|
Packit |
ae9e2a |
#include "refs.h"
|
|
Packit |
ae9e2a |
#include "transports/smart.h"
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
void git_libgit2_version(int *major, int *minor, int *rev)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
*major = LIBGIT2_VER_MAJOR;
|
|
Packit |
ae9e2a |
*minor = LIBGIT2_VER_MINOR;
|
|
Packit |
ae9e2a |
*rev = LIBGIT2_VER_REVISION;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
int git_libgit2_features(void)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
return 0
|
|
Packit |
ae9e2a |
#ifdef GIT_THREADS
|
|
Packit |
ae9e2a |
| GIT_FEATURE_THREADS
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
#ifdef GIT_HTTPS
|
|
Packit |
ae9e2a |
| GIT_FEATURE_HTTPS
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
#if defined(GIT_SSH)
|
|
Packit |
ae9e2a |
| GIT_FEATURE_SSH
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
#if defined(GIT_USE_NSEC)
|
|
Packit |
ae9e2a |
| GIT_FEATURE_NSEC
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
/* Declarations for tuneable settings */
|
|
Packit |
ae9e2a |
extern size_t git_mwindow__window_size;
|
|
Packit |
ae9e2a |
extern size_t git_mwindow__mapped_limit;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
static int config_level_to_sysdir(int config_level)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
int val = -1;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
switch (config_level) {
|
|
Packit |
ae9e2a |
case GIT_CONFIG_LEVEL_SYSTEM:
|
|
Packit |
ae9e2a |
val = GIT_SYSDIR_SYSTEM;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
case GIT_CONFIG_LEVEL_XDG:
|
|
Packit |
ae9e2a |
val = GIT_SYSDIR_XDG;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
case GIT_CONFIG_LEVEL_GLOBAL:
|
|
Packit |
ae9e2a |
val = GIT_SYSDIR_GLOBAL;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
case GIT_CONFIG_LEVEL_PROGRAMDATA:
|
|
Packit |
ae9e2a |
val = GIT_SYSDIR_PROGRAMDATA;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
default:
|
|
Packit |
ae9e2a |
giterr_set(
|
|
Packit |
ae9e2a |
GITERR_INVALID, "invalid config path selector %d", config_level);
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
return val;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
extern char *git__user_agent;
|
|
Packit |
ae9e2a |
extern char *git__ssl_ciphers;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
const char *git_libgit2__user_agent(void)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
return git__user_agent;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
const char *git_libgit2__ssl_ciphers(void)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
return git__ssl_ciphers;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
int git_libgit2_opts(int key, ...)
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
int error = 0;
|
|
Packit |
ae9e2a |
va_list ap;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
va_start(ap, key);
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
switch (key) {
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_MWINDOW_SIZE:
|
|
Packit |
ae9e2a |
git_mwindow__window_size = va_arg(ap, size_t);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_MWINDOW_SIZE:
|
|
Packit |
ae9e2a |
*(va_arg(ap, size_t *)) = git_mwindow__window_size;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
|
|
Packit |
ae9e2a |
git_mwindow__mapped_limit = va_arg(ap, size_t);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
|
|
Packit |
ae9e2a |
*(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_SEARCH_PATH:
|
|
Packit |
ae9e2a |
if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
|
|
Packit |
ae9e2a |
git_buf *out = va_arg(ap, git_buf *);
|
|
Packit |
ae9e2a |
const git_buf *tmp;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
git_buf_sanitize(out);
|
|
Packit |
ae9e2a |
if ((error = git_sysdir_get(&tmp, error)) < 0)
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
error = git_buf_sets(out, tmp->ptr);
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_SEARCH_PATH:
|
|
Packit |
ae9e2a |
if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
|
|
Packit |
ae9e2a |
error = git_sysdir_set(error, va_arg(ap, const char *));
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
git_otype type = (git_otype)va_arg(ap, int);
|
|
Packit |
ae9e2a |
size_t size = va_arg(ap, size_t);
|
|
Packit |
ae9e2a |
error = git_cache_set_max_object_size(type, size);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_CACHE_MAX_SIZE:
|
|
Packit |
ae9e2a |
git_cache__max_storage = va_arg(ap, ssize_t);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_CACHING:
|
|
Packit |
ae9e2a |
git_cache__enabled = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_CACHED_MEMORY:
|
|
Packit |
ae9e2a |
*(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
|
|
Packit |
ae9e2a |
*(va_arg(ap, ssize_t *)) = git_cache__max_storage;
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_TEMPLATE_PATH:
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
git_buf *out = va_arg(ap, git_buf *);
|
|
Packit |
ae9e2a |
const git_buf *tmp;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
git_buf_sanitize(out);
|
|
Packit |
ae9e2a |
if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
error = git_buf_sets(out, tmp->ptr);
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_TEMPLATE_PATH:
|
|
Packit |
ae9e2a |
error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_SSL_CERT_LOCATIONS:
|
|
Packit |
ae9e2a |
#ifdef GIT_OPENSSL
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
const char *file = va_arg(ap, const char *);
|
|
Packit |
ae9e2a |
const char *path = va_arg(ap, const char *);
|
|
Packit |
ae9e2a |
if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) {
|
|
Packit |
ae9e2a |
giterr_set(GITERR_NET, "SSL error: %s",
|
|
Packit |
ae9e2a |
ERR_error_string(ERR_get_error(), NULL));
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
#else
|
|
Packit |
ae9e2a |
giterr_set(GITERR_NET, "cannot set certificate locations: OpenSSL is not enabled");
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_USER_AGENT:
|
|
Packit |
ae9e2a |
git__free(git__user_agent);
|
|
Packit |
ae9e2a |
git__user_agent = git__strdup(va_arg(ap, const char *));
|
|
Packit |
ae9e2a |
if (!git__user_agent) {
|
|
Packit |
ae9e2a |
giterr_set_oom();
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
|
|
Packit |
ae9e2a |
git_object__strict_input_validation = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
|
|
Packit |
ae9e2a |
git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_SSL_CIPHERS:
|
|
Packit |
ae9e2a |
#ifdef GIT_OPENSSL
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
git__free(git__ssl_ciphers);
|
|
Packit |
ae9e2a |
git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
|
|
Packit |
ae9e2a |
if (!git__ssl_ciphers) {
|
|
Packit |
ae9e2a |
giterr_set_oom();
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
#else
|
|
Packit |
ae9e2a |
giterr_set(GITERR_NET, "cannot set custom ciphers: OpenSSL is not enabled");
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_USER_AGENT:
|
|
Packit |
ae9e2a |
{
|
|
Packit |
ae9e2a |
git_buf *out = va_arg(ap, git_buf *);
|
|
Packit |
ae9e2a |
git_buf_sanitize(out);
|
|
Packit |
ae9e2a |
error = git_buf_sets(out, git__user_agent);
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_OFS_DELTA:
|
|
Packit |
ae9e2a |
git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_FSYNC_GITDIR:
|
|
Packit |
ae9e2a |
git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_GET_WINDOWS_SHAREMODE:
|
|
Packit |
ae9e2a |
#ifdef GIT_WIN32
|
|
Packit |
ae9e2a |
*(va_arg(ap, unsigned long *)) = git_win32__createfile_sharemode;
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_SET_WINDOWS_SHAREMODE:
|
|
Packit |
ae9e2a |
#ifdef GIT_WIN32
|
|
Packit |
ae9e2a |
git_win32__createfile_sharemode = va_arg(ap, unsigned long);
|
|
Packit |
ae9e2a |
#endif
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
|
|
Packit |
ae9e2a |
git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
|
|
Packit |
ae9e2a |
break;
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
default:
|
|
Packit |
ae9e2a |
giterr_set(GITERR_INVALID, "invalid option key");
|
|
Packit |
ae9e2a |
error = -1;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
va_end(ap);
|
|
Packit |
ae9e2a |
|
|
Packit |
ae9e2a |
return error;
|
|
Packit |
ae9e2a |
}
|
|
Packit |
ae9e2a |
|