diff options
Diffstat (limited to 'src/common/conf.c')
-rw-r--r-- | src/common/conf.c | 157 |
1 files changed, 133 insertions, 24 deletions
diff --git a/src/common/conf.c b/src/common/conf.c index 25f1013f5..dae7db8fc 100644 --- a/src/common/conf.c +++ b/src/common/conf.c @@ -2,8 +2,8 @@ * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * - * Copyright (C) 2012-2015 Hercules Dev Team - * Copyright (C) Athena Dev Teams + * Copyright (C) 2012-2020 Hercules Dev Team + * Copyright (C) Athena Dev Teams * * Hercules is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,16 +22,43 @@ #include "conf.h" +#include "common/nullpo.h" // nullpo_retv #include "common/showmsg.h" // ShowError #include "common/strlib.h" // safestrncpy +#include "common/utils.h" // exists #include <libconfig/libconfig.h> /* interface source */ -struct libconfig_interface libconfig_s; +static struct libconfig_interface libconfig_s; struct libconfig_interface *libconfig; /** + * Sets the server's db_path to be used by config_format_db_path + * @param db_path path to the folder where the db files are at + */ +static void config_set_db_path(const char *db_path) +{ + nullpo_retv(db_path); + safestrncpy(libconfig->db_path, db_path, sizeof(libconfig->db_path)); +} + +/** + * Writes into path_buf the fullpath to the db file in filename. + * Basically this prepends map->db_path to filename. + * @param filename File name to format (e.g. re/item_db.conf) + * @param path_buf Where to save the path to + * @param buffer_len Maximun length of path_buf + */ +static void config_format_db_path(const char *filename, char *path_buf, int buffer_len) +{ + nullpo_retv(filename); + nullpo_retv(path_buf); + + safesnprintf(path_buf, buffer_len, "%s/%s", libconfig->db_path, filename); +} + +/** * Initializes 'config' and loads a configuration file. * * Shows error and destroys 'config' in case of failure. @@ -43,9 +70,13 @@ struct libconfig_interface *libconfig; * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_load_file(struct config_t *config, const char *config_filename) +static int config_load_file(struct config_t *config, const char *config_filename) { libconfig->init(config); + if (!exists(config_filename)) { + ShowError("Unable to load '%s' - File not found\n", config_filename); + return CONFIG_FALSE; + } if (libconfig->read_file_src(config, config_filename) != CONFIG_TRUE) { ShowError("%s:%d - %s\n", config_error_file(config), config_error_line(config), config_error_text(config)); @@ -58,7 +89,7 @@ int config_load_file(struct config_t *config, const char *config_filename) // // Functions to copy settings from libconfig/contrib // -void config_setting_copy_simple(struct config_setting_t *parent, const struct config_setting_t *src) +static void config_setting_copy_simple(struct config_setting_t *parent, const struct config_setting_t *src) { if (config_setting_is_aggregate(src)) { libconfig->setting_copy_aggregate(parent, src); @@ -87,7 +118,7 @@ void config_setting_copy_simple(struct config_setting_t *parent, const struct co } } -void config_setting_copy_elem(struct config_setting_t *parent, const struct config_setting_t *src) +static void config_setting_copy_elem(struct config_setting_t *parent, const struct config_setting_t *src) { struct config_setting_t *set = NULL; @@ -108,7 +139,7 @@ void config_setting_copy_elem(struct config_setting_t *parent, const struct conf } } -void config_setting_copy_aggregate(struct config_setting_t *parent, const struct config_setting_t *src) +static void config_setting_copy_aggregate(struct config_setting_t *parent, const struct config_setting_t *src) { struct config_setting_t *newAgg; int i, n; @@ -132,7 +163,7 @@ void config_setting_copy_aggregate(struct config_setting_t *parent, const struct } } -int config_setting_copy(struct config_setting_t *parent, const struct config_setting_t *src) +static int config_setting_copy(struct config_setting_t *parent, const struct config_setting_t *src) { if (!config_setting_is_group(parent) && !config_setting_is_list(parent)) return CONFIG_FALSE; @@ -153,7 +184,7 @@ int config_setting_copy(struct config_setting_t *parent, const struct config_set * @return The converted value. * @retval false in case of failure. */ -bool config_setting_get_bool_real(const struct config_setting_t *setting) +static bool config_setting_get_bool_real(const struct config_setting_t *setting) { if (setting == NULL || setting->type != CONFIG_TYPE_BOOL) return false; @@ -171,7 +202,7 @@ bool config_setting_get_bool_real(const struct config_setting_t *setting) * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_setting_lookup_bool_real(const struct config_setting_t *setting, const char *name, bool *value) +static int config_setting_lookup_bool_real(const struct config_setting_t *setting, const char *name, bool *value) { struct config_setting_t *member = config_setting_get_member(setting, name); @@ -194,7 +225,7 @@ int config_setting_lookup_bool_real(const struct config_setting_t *setting, cons * @return The converted value. * @retval 0 in case of failure. */ -uint32 config_setting_get_uint32(const struct config_setting_t *setting) +static uint32 config_setting_get_uint32(const struct config_setting_t *setting) { if (setting == NULL || setting->type != CONFIG_TYPE_INT) return 0; @@ -215,7 +246,7 @@ uint32 config_setting_get_uint32(const struct config_setting_t *setting) * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_setting_lookup_uint32(const struct config_setting_t *setting, const char *name, uint32 *value) +static int config_setting_lookup_uint32(const struct config_setting_t *setting, const char *name, uint32 *value) { struct config_setting_t *member = config_setting_get_member(setting, name); @@ -238,7 +269,7 @@ int config_setting_lookup_uint32(const struct config_setting_t *setting, const c * @return The converted value. * @retval 0 in case of failure. */ -uint16 config_setting_get_uint16(const struct config_setting_t *setting) +static uint16 config_setting_get_uint16(const struct config_setting_t *setting) { if (setting == NULL || setting->type != CONFIG_TYPE_INT) return 0; @@ -261,7 +292,7 @@ uint16 config_setting_get_uint16(const struct config_setting_t *setting) * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_setting_lookup_uint16(const struct config_setting_t *setting, const char *name, uint16 *value) +static int config_setting_lookup_uint16(const struct config_setting_t *setting, const char *name, uint16 *value) { struct config_setting_t *member = config_setting_get_member(setting, name); @@ -284,7 +315,7 @@ int config_setting_lookup_uint16(const struct config_setting_t *setting, const c * @return The converted value. * @retval 0 in case of failure. */ -int16 config_setting_get_int16(const struct config_setting_t *setting) +static int16 config_setting_get_int16(const struct config_setting_t *setting) { if (setting == NULL || setting->type != CONFIG_TYPE_INT) return 0; @@ -307,7 +338,7 @@ int16 config_setting_get_int16(const struct config_setting_t *setting) * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_setting_lookup_int16(const struct config_setting_t *setting, const char *name, int16 *value) +static int config_setting_lookup_int16(const struct config_setting_t *setting, const char *name, int16 *value) { struct config_setting_t *member = config_setting_get_member(setting, name); @@ -333,7 +364,7 @@ int config_setting_lookup_int16(const struct config_setting_t *setting, const ch * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_setting_lookup_mutable_string(const struct config_setting_t *setting, const char *name, char *out, size_t out_size) +static int config_setting_lookup_mutable_string(const struct config_setting_t *setting, const char *name, char *out, size_t out_size) { const char *str = NULL; @@ -356,7 +387,7 @@ int config_setting_lookup_mutable_string(const struct config_setting_t *setting, * @retval CONFIG_TRUE in case of success. * @retval CONFIG_FALSE in case of failure. */ -int config_lookup_mutable_string(const struct config_t *config, const char *name, char *out, size_t out_size) +static int config_lookup_mutable_string(const struct config_t *config, const char *name, char *out, size_t out_size) { const char *str = NULL; @@ -368,9 +399,87 @@ int config_lookup_mutable_string(const struct config_t *config, const char *name return CONFIG_FALSE; } +/** + * Wrapper for config_setting_get_int64() using defined-size variables + * + * @see config_setting_get_int64_real() + */ +static int64 config_setting_get_int64_real(const struct config_setting_t *setting) +{ + return (int64)config_setting_get_int64(setting); +} + +/** + * Wrapper for config_setting_lookup_int64() using defined-size variables + * + * @see config_setting_lookup_int64() + */ +static int config_setting_lookup_int64_real(const struct config_setting_t *setting, const char *name, int64 *value) +{ + long long int lli = 0; + + if (config_setting_lookup_int64(setting, name, &lli) != CONFIG_TRUE) + return CONFIG_FALSE; + + *value = (int64)lli; + + return CONFIG_TRUE; +} + +/** + * Wrapper for config_setting_set_int64() using defined-size variables + * + * @see config_setting_set_int64() + */ +static int config_setting_set_int64_real(struct config_setting_t *setting, int64 value) +{ + return config_setting_set_int64(setting, (long long int)value); +} + +/** + * Wrapper for config_setting_get_int64_elem() using defined-size variables + * + * @see config_setting_get_int64_elem() + */ +static int64 config_setting_get_int64_elem_real(const struct config_setting_t *setting, int idx) +{ + return (int64)config_setting_get_int64_elem(setting, idx); +} + +/** + * Wrapper for config_setting_set_int64_elem() using defined-size variables + * + * @see config_setting_set_int64_elem() + */ +static struct config_setting_t *config_setting_set_int64_elem_real(struct config_setting_t *setting, int idx, int64 value) +{ + return config_setting_set_int64_elem(setting, idx, (long long int)value); +} + +/** + * Wrapper for config_lookup_int64() using defined-size variables + * + * @see config_lookup_int64() + */ +static int config_lookup_int64_real(const struct config_t *config, const char *filepath, int64 *value) +{ + long long int lli = 0; + + if (config_lookup_int64(config, filepath, &lli) != CONFIG_TRUE) + return CONFIG_FALSE; + + *value = (int64)lli; + + return CONFIG_TRUE; +} + void libconfig_defaults(void) { libconfig = &libconfig_s; + snprintf(libconfig->db_path, sizeof(libconfig->db_path), "db"); + libconfig->set_db_path = config_set_db_path; + libconfig->format_db_path = config_format_db_path; + /* */ libconfig->read = config_read; libconfig->write = config_write; /* */ @@ -388,20 +497,20 @@ void libconfig_defaults(void) { libconfig->destroy = config_destroy; /* */ libconfig->setting_get_int = config_setting_get_int; - libconfig->setting_get_int64 = config_setting_get_int64; + libconfig->setting_get_int64 = config_setting_get_int64_real; libconfig->setting_get_float = config_setting_get_float; libconfig->setting_get_bool = config_setting_get_bool; libconfig->setting_get_string = config_setting_get_string; /* */ libconfig->setting_lookup = config_setting_lookup; libconfig->setting_lookup_int = config_setting_lookup_int; - libconfig->setting_lookup_int64 = config_setting_lookup_int64; + libconfig->setting_lookup_int64 = config_setting_lookup_int64_real; libconfig->setting_lookup_float = config_setting_lookup_float; libconfig->setting_lookup_bool = config_setting_lookup_bool; libconfig->setting_lookup_string = config_setting_lookup_string; /* */ libconfig->setting_set_int = config_setting_set_int; - libconfig->setting_set_int64 = config_setting_set_int64; + libconfig->setting_set_int64 = config_setting_set_int64_real; libconfig->setting_set_float = config_setting_set_float; libconfig->setting_set_bool = config_setting_set_bool; libconfig->setting_set_string = config_setting_set_string; @@ -410,13 +519,13 @@ void libconfig_defaults(void) { libconfig->setting_get_format = config_setting_get_format; /* */ libconfig->setting_get_int_elem = config_setting_get_int_elem; - libconfig->setting_get_int64_elem = config_setting_get_int64_elem; + libconfig->setting_get_int64_elem = config_setting_get_int64_elem_real; libconfig->setting_get_float_elem = config_setting_get_float_elem; libconfig->setting_get_bool_elem = config_setting_get_bool_elem; libconfig->setting_get_string_elem = config_setting_get_string_elem; /* */ libconfig->setting_set_int_elem = config_setting_set_int_elem; - libconfig->setting_set_int64_elem = config_setting_set_int64_elem; + libconfig->setting_set_int64_elem = config_setting_set_int64_elem_real; libconfig->setting_set_float_elem = config_setting_set_float_elem; libconfig->setting_set_bool_elem = config_setting_set_bool_elem; libconfig->setting_set_string_elem = config_setting_set_string_elem; @@ -436,7 +545,7 @@ void libconfig_defaults(void) { libconfig->lookup = config_lookup; /* */ libconfig->lookup_int = config_lookup_int; - libconfig->lookup_int64 = config_lookup_int64; + libconfig->lookup_int64 = config_lookup_int64_real; libconfig->lookup_float = config_lookup_float; libconfig->lookup_bool = config_lookup_bool; libconfig->lookup_string = config_lookup_string; |