summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2017-08-16 15:45:12 +0300
committerValentin Bartenev <vbart@nginx.com>2017-08-16 15:45:12 +0300
commit95907e29128c51be79aec0b5149e2639c3fd9042 (patch)
tree56e266c7a914e2cd8e32a8c3de9f3d41447340f6
parent2dd8048bf9d80d045f3df8f0930c3325bf8a14f9 (diff)
downloadunit-95907e29128c51be79aec0b5149e2639c3fd9042.tar.gz
unit-95907e29128c51be79aec0b5149e2639c3fd9042.tar.bz2
Object mapping interface extended with more string types.
-rw-r--r--src/nxt_conf.c47
-rw-r--r--src/nxt_conf.h6
-rw-r--r--src/nxt_master_process.c2
-rw-r--r--src/nxt_router.c12
4 files changed, 52 insertions, 15 deletions
diff --git a/src/nxt_conf.c b/src/nxt_conf.c
index d205ca71..12e35ebc 100644
--- a/src/nxt_conf.c
+++ b/src/nxt_conf.c
@@ -420,9 +420,10 @@ nxt_conf_get_object_member(nxt_conf_value_t *value, nxt_str_t *name,
nxt_int_t
-nxt_conf_map_object(nxt_conf_value_t *value, nxt_conf_map_t *map, nxt_uint_t n,
- void *data)
+nxt_conf_map_object(nxt_mp_t *mp, nxt_conf_value_t *value, nxt_conf_map_t *map,
+ nxt_uint_t n, void *data)
{
+ nxt_str_t str, *s;
nxt_uint_t i;
nxt_conf_value_t *v;
@@ -436,6 +437,7 @@ nxt_conf_map_object(nxt_conf_value_t *value, nxt_conf_map_t *map, nxt_uint_t n,
nxt_msec_t msec;
double dbl;
nxt_str_t str;
+ char *cstrz;
void *v;
} *ptr;
@@ -515,15 +517,48 @@ nxt_conf_map_object(nxt_conf_value_t *value, nxt_conf_map_t *map, nxt_uint_t n,
break;
case NXT_CONF_MAP_STR:
+ case NXT_CONF_MAP_STR_COPY:
+ case NXT_CONF_MAP_CSTRZ:
- if (v->type == NXT_CONF_VALUE_SHORT_STRING
- || v->type == NXT_CONF_VALUE_STRING)
+ if (v->type != NXT_CONF_VALUE_SHORT_STRING
+ && v->type != NXT_CONF_VALUE_STRING)
{
- nxt_conf_get_string(v, &ptr->str);
+ break;
}
- break;
+ nxt_conf_get_string(v, &str);
+
+ switch (map[i].type) {
+
+ case NXT_CONF_MAP_STR:
+ ptr->str = str;
+ break;
+
+ case NXT_CONF_MAP_STR_COPY:
+
+ s = nxt_str_dup(mp, &ptr->str, &str);
+
+ if (nxt_slow_path(s == NULL)) {
+ return NXT_ERROR;
+ }
+
+ break;
+ case NXT_CONF_MAP_CSTRZ:
+
+ ptr->cstrz = nxt_str_cstrz(mp, &str);
+
+ if (nxt_slow_path(ptr->cstrz == NULL)) {
+ return NXT_ERROR;
+ }
+
+ break;
+
+ default:
+ nxt_unreachable();
+ }
+
+ break;
case NXT_CONF_MAP_PTR:
diff --git a/src/nxt_conf.h b/src/nxt_conf.h
index 30863fbf..3ff07e08 100644
--- a/src/nxt_conf.h
+++ b/src/nxt_conf.h
@@ -38,6 +38,8 @@ typedef enum {
NXT_CONF_MAP_MSEC,
NXT_CONF_MAP_DOUBLE,
NXT_CONF_MAP_STR,
+ NXT_CONF_MAP_STR_COPY,
+ NXT_CONF_MAP_CSTRZ,
NXT_CONF_MAP_PTR,
} nxt_conf_map_type_t;
@@ -63,8 +65,8 @@ nxt_conf_value_t *nxt_conf_get_object_member(nxt_conf_value_t *value,
nxt_conf_value_t *nxt_conf_next_object_member(nxt_conf_value_t *value,
nxt_str_t *name, uint32_t *next);
-nxt_int_t nxt_conf_map_object(nxt_conf_value_t *value, nxt_conf_map_t *map,
- nxt_uint_t n, void *data);
+nxt_int_t nxt_conf_map_object(nxt_mp_t *mp, nxt_conf_value_t *value,
+ nxt_conf_map_t *map, nxt_uint_t n, void *data);
nxt_int_t nxt_conf_op_compile(nxt_mp_t *mp, nxt_conf_op_t **ops,
nxt_conf_value_t *root, nxt_str_t *path, nxt_conf_value_t *value);
diff --git a/src/nxt_master_process.c b/src/nxt_master_process.c
index a1a44cd2..3e72ce85 100644
--- a/src/nxt_master_process.c
+++ b/src/nxt_master_process.c
@@ -190,7 +190,7 @@ nxt_port_master_start_worker_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
app_conf.user = nobody;
- ret = nxt_conf_map_object(conf, nxt_common_app_conf,
+ ret = nxt_conf_map_object(mp, conf, nxt_common_app_conf,
nxt_nitems(nxt_common_app_conf), &app_conf);
if (ret != NXT_OK) {
nxt_log(task, NXT_LOG_CRIT, "root map error");
diff --git a/src/nxt_router.c b/src/nxt_router.c
index e55f0fb0..5a053278 100644
--- a/src/nxt_router.c
+++ b/src/nxt_router.c
@@ -667,7 +667,9 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
return NXT_ERROR;
}
- ret = nxt_conf_map_object(conf, nxt_router_conf,
+ mp = tmcf->conf->mem_pool;
+
+ ret = nxt_conf_map_object(mp, conf, nxt_router_conf,
nxt_nitems(nxt_router_conf), tmcf->conf);
if (ret != NXT_OK) {
nxt_log(task, NXT_LOG_CRIT, "root map error");
@@ -723,7 +725,7 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
continue;
}
- ret = nxt_conf_map_object(application, nxt_router_app_conf,
+ ret = nxt_conf_map_object(mp, application, nxt_router_app_conf,
nxt_nitems(nxt_router_app_conf), &apcf);
if (ret != NXT_OK) {
nxt_log(task, NXT_LOG_CRIT, "application map error");
@@ -782,8 +784,6 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
next = 0;
- mp = tmcf->conf->mem_pool;
-
for ( ;; ) {
listener = nxt_conf_next_object_member(listeners, &name, &next);
if (listener == NULL) {
@@ -806,7 +806,7 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
goto fail;
}
- ret = nxt_conf_map_object(listener, nxt_router_listener_conf,
+ ret = nxt_conf_map_object(mp, listener, nxt_router_listener_conf,
nxt_nitems(nxt_router_listener_conf), &lscf);
if (ret != NXT_OK) {
nxt_log(task, NXT_LOG_CRIT, "listener map error");
@@ -825,7 +825,7 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
skcf->body_read_timeout = 5000;
if (http != NULL) {
- ret = nxt_conf_map_object(http, nxt_router_http_conf,
+ ret = nxt_conf_map_object(mp, http, nxt_router_http_conf,
nxt_nitems(nxt_router_http_conf), skcf);
if (ret != NXT_OK) {
nxt_log(task, NXT_LOG_CRIT, "http map error");