odissey: allocate each string parameter separately

This commit is contained in:
Dmitry Simonenko 2017-07-13 15:32:05 +03:00
parent 9cc6411c04
commit 351b18be92
4 changed files with 54 additions and 22 deletions

View File

@ -88,6 +88,8 @@ typedef struct
od_parser_t parser; od_parser_t parser;
od_log_t *log; od_log_t *log;
od_scheme_t *scheme; od_scheme_t *scheme;
char *data;
int data_size;
} od_config_t; } od_config_t;
#define od_keyword(name, token) { token, name, sizeof(name) - 1 } #define od_keyword(name, token) { token, name, sizeof(name) - 1 }
@ -148,7 +150,7 @@ static od_keyword_t od_config_keywords[] =
}; };
static int static int
od_config_read(od_config_t *config, char *config_file) od_config_open(od_config_t *config, char *config_file)
{ {
/* read file */ /* read file */
struct stat st; struct stat st;
@ -178,14 +180,19 @@ od_config_read(od_config_t *config, char *config_file)
config_file); config_file);
return -1; return -1;
} }
config->scheme->data = config_buf;
config->scheme->data_size = st.st_size;
config->scheme->config_file = config_file; config->scheme->config_file = config_file;
od_parser_init(&config->parser, config->scheme->data, config->data = config_buf;
config->scheme->data_size); config->data_size = st.st_size;
od_parser_init(&config->parser, config->data, config->data_size);
return 0; return 0;
} }
static void
od_config_close(od_config_t *config)
{
free(config->data);
}
static void static void
od_config_error(od_config_t *config, od_token_t *token, char *fmt, ...) od_config_error(od_config_t *config, od_token_t *token, char *fmt, ...)
{ {
@ -262,7 +269,17 @@ od_config_next_string(od_config_t *config, char **value)
od_config_error(config, &token, "expected 'string'"); od_config_error(config, &token, "expected 'string'");
return false; return false;
} }
*value = token.value.string.pointer; char *copy = malloc(token.value.string.size + 1);
if (copy == NULL) {
od_parser_push(&config->parser, &token);
od_config_error(config, &token, "memory allocation error");
return false;
}
memcpy(copy, token.value.string.pointer, token.value.string.size);
copy[token.value.string.size] = 0;
if (*value)
free(*value);
*value = copy;
return true; return true;
} }
@ -822,13 +839,14 @@ od_config_parse(od_config_t *config)
int od_config_load(od_scheme_t *scheme, od_log_t *log, char *config_file) int od_config_load(od_scheme_t *scheme, od_log_t *log, char *config_file)
{ {
od_config_t config; od_config_t config;
memset(&config.parser, 0, sizeof(config.parser)); memset(&config, 0, sizeof(config));
config.log = log; config.log = log;
config.scheme = scheme; config.scheme = scheme;
int rc; int rc;
rc = od_config_read(&config, config_file); rc = od_config_open(&config, config_file);
if (rc == -1) if (rc == -1)
return -1; return -1;
rc = od_config_parse(&config); rc = od_config_parse(&config);
od_config_close(&config);
return rc; return rc;
} }

View File

@ -147,7 +147,6 @@ od_parser_next(od_parser_t *parser, od_token_t *token)
} }
token->value.string.size = token->value.string.size =
parser->pos - token->value.string.pointer; parser->pos - token->value.string.pointer;
*parser->pos = 0;
parser->pos++; parser->pos++;
return token->type; return token->type;
} }

View File

@ -24,8 +24,6 @@
void od_scheme_init(od_scheme_t *scheme) void od_scheme_init(od_scheme_t *scheme)
{ {
scheme->config_file = NULL; scheme->config_file = NULL;
scheme->data = NULL;
scheme->data_size = 0;
scheme->daemonize = 0; scheme->daemonize = 0;
scheme->log_debug = 0; scheme->log_debug = 0;
scheme->log_config = 0; scheme->log_config = 0;
@ -76,8 +74,6 @@ void od_scheme_free(od_scheme_t *scheme)
storage = od_container_of(i, od_schemestorage_t, link); storage = od_container_of(i, od_schemestorage_t, link);
od_schemestorage_unref(storage); od_schemestorage_unref(storage);
} }
if (scheme->data)
free(scheme->data);
} }
od_schemestorage_t* od_schemestorage_t*
@ -113,12 +109,28 @@ void od_schemestorage_ref(od_schemestorage_t *storage)
void od_schemestorage_unref(od_schemestorage_t *storage) void od_schemestorage_unref(od_schemestorage_t *storage)
{ {
if (storage->refs == 0) { if (storage->refs > 0)
od_list_unlink(&storage->link); --storage->refs;
free(storage); if (storage->refs > 0)
return; return;
} if (storage->name)
storage->refs--; free(storage->name);
if (storage->type)
free(storage->type);
if (storage->host)
free(storage->host);
if (storage->tls)
free(storage->tls);
if (storage->tls_ca_file)
free(storage->tls_ca_file);
if (storage->tls_key_file)
free(storage->tls_key_file);
if (storage->tls_cert_file)
free(storage->tls_cert_file);
if (storage->tls_protocols)
free(storage->tls_protocols);
od_list_unlink(&storage->link);
free(storage);
} }
od_schemedb_t* od_schemedb_t*
@ -162,7 +174,6 @@ od_schemeuser_add(od_schemedb_t *db)
user->pool_cancel = 1; user->pool_cancel = 1;
user->pool_discard = 1; user->pool_discard = 1;
user->pool_rollback = 1; user->pool_rollback = 1;
user->pool_sz = "session";
user->pool = OD_PSESSION; user->pool = OD_PSESSION;
od_list_init(&user->link); od_list_init(&user->link);
od_list_append(&db->users, &user->link); od_list_append(&db->users, &user->link);
@ -312,7 +323,13 @@ int od_scheme_validate(od_scheme_t *scheme, od_log_t *log)
db->name, user->user); db->name, user->user);
return -1; return -1;
} }
/* remote pooling mode */
/* pooling mode */
if (! user->pool_sz) {
od_error(log, "config", "db '%s' user '%s': pooling mode is not set",
db->name, user->user);
return -1;
}
if (strcmp(user->pool_sz, "session") == 0) { if (strcmp(user->pool_sz, "session") == 0) {
user->pool = OD_PSESSION; user->pool = OD_PSESSION;
} else } else

View File

@ -107,8 +107,6 @@ struct od_schemeuser
struct od_scheme struct od_scheme
{ {
char *config_file; char *config_file;
char *data;
int data_size;
/* main */ /* main */
int daemonize; int daemonize;
int log_debug; int log_debug;