mirror of
https://github.com/libgit2/libgit2.git
synced 2026-06-22 06:26:26 +00:00
settings: pull settings out into its own file
This commit is contained in:
@@ -5,25 +5,19 @@
|
||||
* a Linking Exception. For full terms see the included COPYING file.
|
||||
*/
|
||||
|
||||
#include "libgit2.h"
|
||||
|
||||
#include <git2.h>
|
||||
#include "alloc.h"
|
||||
#include "buf.h"
|
||||
#include "cache.h"
|
||||
#include "common.h"
|
||||
#include "filter.h"
|
||||
#include "grafts.h"
|
||||
#include "hash.h"
|
||||
#include "index.h"
|
||||
#include "merge_driver.h"
|
||||
#include "pool.h"
|
||||
#include "mwindow.h"
|
||||
#include "object.h"
|
||||
#include "odb.h"
|
||||
#include "oid.h"
|
||||
#include "rand.h"
|
||||
#include "refs.h"
|
||||
#include "runtime.h"
|
||||
#include "settings.h"
|
||||
#include "sysdir.h"
|
||||
#include "thread.h"
|
||||
#include "git2/global.h"
|
||||
@@ -31,40 +25,12 @@
|
||||
#include "streams/mbedtls.h"
|
||||
#include "streams/openssl.h"
|
||||
#include "streams/socket.h"
|
||||
#include "transports/smart.h"
|
||||
#include "transports/http.h"
|
||||
#include "transports/ssh_libssh2.h"
|
||||
|
||||
#ifdef GIT_WIN32
|
||||
# include "win32/w32_leakcheck.h"
|
||||
#endif
|
||||
|
||||
/* Declarations for tuneable settings */
|
||||
extern size_t git_mwindow__window_size;
|
||||
extern size_t git_mwindow__mapped_limit;
|
||||
extern size_t git_mwindow__file_limit;
|
||||
extern size_t git_indexer__max_objects;
|
||||
extern bool git_disable_pack_keep_file_checks;
|
||||
extern int git_odb__packed_priority;
|
||||
extern int git_odb__loose_priority;
|
||||
extern int git_socket_stream__connect_timeout;
|
||||
extern int git_socket_stream__timeout;
|
||||
|
||||
char *git__user_agent;
|
||||
char *git__ssl_ciphers;
|
||||
|
||||
static void libgit2_settings_global_shutdown(void)
|
||||
{
|
||||
git__free(git__user_agent);
|
||||
git__free(git__ssl_ciphers);
|
||||
git_repository__free_extensions();
|
||||
}
|
||||
|
||||
static int git_libgit2_settings_global_init(void)
|
||||
{
|
||||
return git_runtime_shutdown_register(libgit2_settings_global_shutdown);
|
||||
}
|
||||
|
||||
int git_libgit2_init(void)
|
||||
{
|
||||
static git_runtime_init_fn init_fns[] = {
|
||||
@@ -87,17 +53,12 @@ int git_libgit2_init(void)
|
||||
git_mbedtls_stream_global_init,
|
||||
git_mwindow_global_init,
|
||||
git_pool_global_init,
|
||||
git_libgit2_settings_global_init
|
||||
git_settings_global_init
|
||||
};
|
||||
|
||||
return git_runtime_init(init_fns, ARRAY_SIZE(init_fns));
|
||||
}
|
||||
|
||||
int git_libgit2_init_count(void)
|
||||
{
|
||||
return git_runtime_init_count();
|
||||
}
|
||||
|
||||
int git_libgit2_shutdown(void)
|
||||
{
|
||||
return git_runtime_shutdown();
|
||||
@@ -134,350 +95,3 @@ int git_libgit2_features(void)
|
||||
#endif
|
||||
;
|
||||
}
|
||||
|
||||
static int config_level_to_sysdir(int *out, int config_level)
|
||||
{
|
||||
switch (config_level) {
|
||||
case GIT_CONFIG_LEVEL_SYSTEM:
|
||||
*out = GIT_SYSDIR_SYSTEM;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_XDG:
|
||||
*out = GIT_SYSDIR_XDG;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_GLOBAL:
|
||||
*out = GIT_SYSDIR_GLOBAL;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_PROGRAMDATA:
|
||||
*out = GIT_SYSDIR_PROGRAMDATA;
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
git_error_set(
|
||||
GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *git_libgit2__user_agent(void)
|
||||
{
|
||||
return git__user_agent;
|
||||
}
|
||||
|
||||
const char *git_libgit2__ssl_ciphers(void)
|
||||
{
|
||||
return git__ssl_ciphers;
|
||||
}
|
||||
|
||||
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_SET_MWINDOW_FILE_LIMIT:
|
||||
git_mwindow__file_limit = va_arg(ap, size_t);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_MWINDOW_FILE_LIMIT:
|
||||
*(va_arg(ap, size_t *)) = git_mwindow__file_limit;
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SEARCH_PATH:
|
||||
{
|
||||
int sysdir = va_arg(ap, int);
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
int level;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = config_level_to_sysdir(&level, sysdir)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, level)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SEARCH_PATH:
|
||||
{
|
||||
int level;
|
||||
|
||||
if ((error = config_level_to_sysdir(&level, va_arg(ap, int))) >= 0)
|
||||
error = git_sysdir_set(level, va_arg(ap, const char *));
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
|
||||
{
|
||||
git_object_t type = (git_object_t)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:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_TEMPLATE_PATH:
|
||||
error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SSL_CERT_LOCATIONS:
|
||||
#ifdef GIT_OPENSSL
|
||||
{
|
||||
const char *file = va_arg(ap, const char *);
|
||||
const char *path = va_arg(ap, const char *);
|
||||
error = git_openssl__set_cert_location(file, path);
|
||||
}
|
||||
#elif defined(GIT_MBEDTLS)
|
||||
{
|
||||
const char *file = va_arg(ap, const char *);
|
||||
const char *path = va_arg(ap, const char *);
|
||||
error = git_mbedtls__set_cert_location(file, path);
|
||||
}
|
||||
#else
|
||||
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");
|
||||
error = -1;
|
||||
#endif
|
||||
break;
|
||||
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) {
|
||||
git_error_set_oom();
|
||||
error = -1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
|
||||
git_object__strict_input_validation = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
|
||||
git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SSL_CIPHERS:
|
||||
#if (GIT_OPENSSL || GIT_MBEDTLS)
|
||||
{
|
||||
git__free(git__ssl_ciphers);
|
||||
git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
|
||||
if (!git__ssl_ciphers) {
|
||||
git_error_set_oom();
|
||||
error = -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support custom ciphers");
|
||||
error = -1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_USER_AGENT:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_str_puts(&str, git__user_agent)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_OFS_DELTA:
|
||||
git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_FSYNC_GITDIR:
|
||||
git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
|
||||
git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ALLOCATOR:
|
||||
error = git_allocator_setup(va_arg(ap, git_allocator *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY:
|
||||
git_index__enforce_unsaved_safety = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_PACK_MAX_OBJECTS:
|
||||
git_indexer__max_objects = va_arg(ap, size_t);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_PACK_MAX_OBJECTS:
|
||||
*(va_arg(ap, size_t *)) = git_indexer__max_objects;
|
||||
break;
|
||||
|
||||
case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS:
|
||||
git_disable_pack_keep_file_checks = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE:
|
||||
git_http__expect_continue = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ODB_PACKED_PRIORITY:
|
||||
git_odb__packed_priority = va_arg(ap, int);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ODB_LOOSE_PRIORITY:
|
||||
git_odb__loose_priority = va_arg(ap, int);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_EXTENSIONS:
|
||||
{
|
||||
const char **extensions = va_arg(ap, const char **);
|
||||
size_t len = va_arg(ap, size_t);
|
||||
error = git_repository__set_extensions(extensions, len);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_EXTENSIONS:
|
||||
{
|
||||
git_strarray *out = va_arg(ap, git_strarray *);
|
||||
char **extensions;
|
||||
size_t len;
|
||||
|
||||
if ((error = git_repository__extensions(&extensions, &len)) < 0)
|
||||
break;
|
||||
|
||||
out->strings = extensions;
|
||||
out->count = len;
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_OWNER_VALIDATION:
|
||||
*(va_arg(ap, int *)) = git_repository__validate_ownership;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_OWNER_VALIDATION:
|
||||
git_repository__validate_ownership = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_HOMEDIR:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, GIT_SYSDIR_HOME)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_HOMEDIR:
|
||||
error = git_sysdir_set(GIT_SYSDIR_HOME, va_arg(ap, const char *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SERVER_CONNECT_TIMEOUT:
|
||||
*(va_arg(ap, int *)) = git_socket_stream__connect_timeout;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SERVER_CONNECT_TIMEOUT:
|
||||
{
|
||||
int timeout = va_arg(ap, int);
|
||||
|
||||
if (timeout < 0) {
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid connect timeout");
|
||||
error = -1;
|
||||
} else {
|
||||
git_socket_stream__connect_timeout = timeout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SERVER_TIMEOUT:
|
||||
*(va_arg(ap, int *)) = git_socket_stream__timeout;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SERVER_TIMEOUT:
|
||||
{
|
||||
int timeout = va_arg(ap, int);
|
||||
|
||||
if (timeout < 0) {
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid timeout");
|
||||
error = -1;
|
||||
} else {
|
||||
git_socket_stream__timeout = timeout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid option key");
|
||||
error = -1;
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
#ifndef INCLUDE_libgit2_h__
|
||||
#define INCLUDE_libgit2_h__
|
||||
|
||||
extern int git_libgit2_init_count(void);
|
||||
|
||||
extern const char *git_libgit2__user_agent(void);
|
||||
extern const char *git_libgit2__ssl_ciphers(void);
|
||||
|
||||
#endif
|
||||
408
src/libgit2/settings.c
Normal file
408
src/libgit2/settings.c
Normal file
@@ -0,0 +1,408 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <git2.h>
|
||||
#include "alloc.h"
|
||||
#include "buf.h"
|
||||
#include "cache.h"
|
||||
#include "common.h"
|
||||
#include "filter.h"
|
||||
#include "grafts.h"
|
||||
#include "hash.h"
|
||||
#include "index.h"
|
||||
#include "merge_driver.h"
|
||||
#include "pool.h"
|
||||
#include "mwindow.h"
|
||||
#include "object.h"
|
||||
#include "odb.h"
|
||||
#include "rand.h"
|
||||
#include "refs.h"
|
||||
#include "runtime.h"
|
||||
#include "sysdir.h"
|
||||
#include "thread.h"
|
||||
#include "git2/global.h"
|
||||
#include "streams/registry.h"
|
||||
#include "streams/mbedtls.h"
|
||||
#include "streams/openssl.h"
|
||||
#include "streams/socket.h"
|
||||
#include "transports/smart.h"
|
||||
#include "transports/http.h"
|
||||
#include "transports/ssh_libssh2.h"
|
||||
|
||||
#ifdef GIT_WIN32
|
||||
# include "win32/w32_leakcheck.h"
|
||||
#endif
|
||||
|
||||
/* Declarations for tuneable settings */
|
||||
extern size_t git_mwindow__window_size;
|
||||
extern size_t git_mwindow__mapped_limit;
|
||||
extern size_t git_mwindow__file_limit;
|
||||
extern size_t git_indexer__max_objects;
|
||||
extern bool git_disable_pack_keep_file_checks;
|
||||
extern int git_odb__packed_priority;
|
||||
extern int git_odb__loose_priority;
|
||||
extern int git_socket_stream__connect_timeout;
|
||||
extern int git_socket_stream__timeout;
|
||||
|
||||
char *git__user_agent;
|
||||
char *git__ssl_ciphers;
|
||||
|
||||
static void settings_global_shutdown(void)
|
||||
{
|
||||
git__free(git__user_agent);
|
||||
git__free(git__ssl_ciphers);
|
||||
git_repository__free_extensions();
|
||||
}
|
||||
|
||||
int git_settings_global_init(void)
|
||||
{
|
||||
return git_runtime_shutdown_register(settings_global_shutdown);
|
||||
}
|
||||
|
||||
static int config_level_to_sysdir(int *out, int config_level)
|
||||
{
|
||||
switch (config_level) {
|
||||
case GIT_CONFIG_LEVEL_SYSTEM:
|
||||
*out = GIT_SYSDIR_SYSTEM;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_XDG:
|
||||
*out = GIT_SYSDIR_XDG;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_GLOBAL:
|
||||
*out = GIT_SYSDIR_GLOBAL;
|
||||
return 0;
|
||||
case GIT_CONFIG_LEVEL_PROGRAMDATA:
|
||||
*out = GIT_SYSDIR_PROGRAMDATA;
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
git_error_set(
|
||||
GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *git_settings__user_agent(void)
|
||||
{
|
||||
return git__user_agent;
|
||||
}
|
||||
|
||||
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_SET_MWINDOW_FILE_LIMIT:
|
||||
git_mwindow__file_limit = va_arg(ap, size_t);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_MWINDOW_FILE_LIMIT:
|
||||
*(va_arg(ap, size_t *)) = git_mwindow__file_limit;
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SEARCH_PATH:
|
||||
{
|
||||
int sysdir = va_arg(ap, int);
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
int level;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = config_level_to_sysdir(&level, sysdir)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, level)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SEARCH_PATH:
|
||||
{
|
||||
int level;
|
||||
|
||||
if ((error = config_level_to_sysdir(&level, va_arg(ap, int))) >= 0)
|
||||
error = git_sysdir_set(level, va_arg(ap, const char *));
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
|
||||
{
|
||||
git_object_t type = (git_object_t)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:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_TEMPLATE_PATH:
|
||||
error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SSL_CERT_LOCATIONS:
|
||||
#ifdef GIT_OPENSSL
|
||||
{
|
||||
const char *file = va_arg(ap, const char *);
|
||||
const char *path = va_arg(ap, const char *);
|
||||
error = git_openssl__set_cert_location(file, path);
|
||||
}
|
||||
#elif defined(GIT_MBEDTLS)
|
||||
{
|
||||
const char *file = va_arg(ap, const char *);
|
||||
const char *path = va_arg(ap, const char *);
|
||||
error = git_mbedtls__set_cert_location(file, path);
|
||||
}
|
||||
#else
|
||||
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");
|
||||
error = -1;
|
||||
#endif
|
||||
break;
|
||||
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) {
|
||||
git_error_set_oom();
|
||||
error = -1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
|
||||
git_object__strict_input_validation = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
|
||||
git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SSL_CIPHERS:
|
||||
#if (GIT_OPENSSL || GIT_MBEDTLS)
|
||||
{
|
||||
git__free(git__ssl_ciphers);
|
||||
git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
|
||||
if (!git__ssl_ciphers) {
|
||||
git_error_set_oom();
|
||||
error = -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support custom ciphers");
|
||||
error = -1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_USER_AGENT:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_str_puts(&str, git__user_agent)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_OFS_DELTA:
|
||||
git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_FSYNC_GITDIR:
|
||||
git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
|
||||
git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ALLOCATOR:
|
||||
error = git_allocator_setup(va_arg(ap, git_allocator *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY:
|
||||
git_index__enforce_unsaved_safety = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_PACK_MAX_OBJECTS:
|
||||
git_indexer__max_objects = va_arg(ap, size_t);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_PACK_MAX_OBJECTS:
|
||||
*(va_arg(ap, size_t *)) = git_indexer__max_objects;
|
||||
break;
|
||||
|
||||
case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS:
|
||||
git_disable_pack_keep_file_checks = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE:
|
||||
git_http__expect_continue = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ODB_PACKED_PRIORITY:
|
||||
git_odb__packed_priority = va_arg(ap, int);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ODB_LOOSE_PRIORITY:
|
||||
git_odb__loose_priority = va_arg(ap, int);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_EXTENSIONS:
|
||||
{
|
||||
const char **extensions = va_arg(ap, const char **);
|
||||
size_t len = va_arg(ap, size_t);
|
||||
error = git_repository__set_extensions(extensions, len);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_EXTENSIONS:
|
||||
{
|
||||
git_strarray *out = va_arg(ap, git_strarray *);
|
||||
char **extensions;
|
||||
size_t len;
|
||||
|
||||
if ((error = git_repository__extensions(&extensions, &len)) < 0)
|
||||
break;
|
||||
|
||||
out->strings = extensions;
|
||||
out->count = len;
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_OWNER_VALIDATION:
|
||||
*(va_arg(ap, int *)) = git_repository__validate_ownership;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_OWNER_VALIDATION:
|
||||
git_repository__validate_ownership = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_HOMEDIR:
|
||||
{
|
||||
git_buf *out = va_arg(ap, git_buf *);
|
||||
git_str str = GIT_STR_INIT;
|
||||
const git_str *tmp;
|
||||
|
||||
if ((error = git_buf_tostr(&str, out)) < 0 ||
|
||||
(error = git_sysdir_get(&tmp, GIT_SYSDIR_HOME)) < 0 ||
|
||||
(error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
|
||||
break;
|
||||
|
||||
error = git_buf_fromstr(out, &str);
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_HOMEDIR:
|
||||
error = git_sysdir_set(GIT_SYSDIR_HOME, va_arg(ap, const char *));
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SERVER_CONNECT_TIMEOUT:
|
||||
*(va_arg(ap, int *)) = git_socket_stream__connect_timeout;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SERVER_CONNECT_TIMEOUT:
|
||||
{
|
||||
int timeout = va_arg(ap, int);
|
||||
|
||||
if (timeout < 0) {
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid connect timeout");
|
||||
error = -1;
|
||||
} else {
|
||||
git_socket_stream__connect_timeout = timeout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GIT_OPT_GET_SERVER_TIMEOUT:
|
||||
*(va_arg(ap, int *)) = git_socket_stream__timeout;
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_SERVER_TIMEOUT:
|
||||
{
|
||||
int timeout = va_arg(ap, int);
|
||||
|
||||
if (timeout < 0) {
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid timeout");
|
||||
error = -1;
|
||||
} else {
|
||||
git_socket_stream__timeout = timeout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
git_error_set(GIT_ERROR_INVALID, "invalid option key");
|
||||
error = -1;
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return error;
|
||||
}
|
||||
@@ -4,8 +4,11 @@
|
||||
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
||||
* a Linking Exception. For full terms see the included COPYING file.
|
||||
*/
|
||||
#ifndef INCLUDE_settings_h__
|
||||
#define INCLUDE_settings_h__
|
||||
|
||||
extern int git_settings_global_init(void);
|
||||
|
||||
extern const char *git_libgit2__user_agent(void);
|
||||
extern const char *git_libgit2__ssl_ciphers(void);
|
||||
extern const char *git_settings__user_agent(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
# include <openssl/bio.h>
|
||||
#endif
|
||||
|
||||
extern char *git__ssl_ciphers;
|
||||
|
||||
SSL_CTX *git__ssl_ctx;
|
||||
|
||||
#define GIT_SSL_DEFAULT_CIPHERS "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA256:DHE-DSS-AES128-SHA:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA"
|
||||
@@ -105,7 +107,7 @@ static void git_openssl_free(void *mem)
|
||||
static int openssl_init(void)
|
||||
{
|
||||
long ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
|
||||
const char *ciphers = git_libgit2__ssl_ciphers();
|
||||
const char *ciphers = git__ssl_ciphers;
|
||||
#ifdef VALGRIND
|
||||
static bool allocators_initialized = false;
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,7 @@ extern bool git_http__expect_continue;
|
||||
|
||||
GIT_INLINE(int) git_http__user_agent(git_str *buf)
|
||||
{
|
||||
const char *ua = git_libgit2__user_agent();
|
||||
const char *ua = git_settings__user_agent();
|
||||
|
||||
if (!ua)
|
||||
ua = "libgit2 " LIBGIT2_VERSION;
|
||||
|
||||
@@ -6,9 +6,9 @@ void test_core_useragent__get(void)
|
||||
const char *custom_name = "super duper git";
|
||||
git_str buf = GIT_STR_INIT;
|
||||
|
||||
cl_assert_equal_p(NULL, git_libgit2__user_agent());
|
||||
cl_assert_equal_p(NULL, git_settings__user_agent());
|
||||
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_USER_AGENT, custom_name));
|
||||
cl_assert_equal_s(custom_name, git_libgit2__user_agent());
|
||||
cl_assert_equal_s(custom_name, git_settings__user_agent());
|
||||
|
||||
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_USER_AGENT, &buf));
|
||||
cl_assert_equal_s(custom_name, buf.ptr);
|
||||
|
||||
Reference in New Issue
Block a user