diff options
Diffstat (limited to 'qpid/extras/dispatch/src')
| -rw-r--r-- | qpid/extras/dispatch/src/config.c | 17 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/config_private.h | 2 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/dispatch.c | 70 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/dispatch_private.h | 2 |
4 files changed, 72 insertions, 19 deletions
diff --git a/qpid/extras/dispatch/src/config.c b/qpid/extras/dispatch/src/config.c index bc99d7f91c..407f2ffb4b 100644 --- a/qpid/extras/dispatch/src/config.c +++ b/qpid/extras/dispatch/src/config.c @@ -47,7 +47,7 @@ void dx_config_finalize() } -dx_config_t *dx_config(char *filename) +dx_config_t *dx_config(const char *filename) { dx_config_t *config = new_dx_config_t(); @@ -116,8 +116,9 @@ int dx_config_item_count(const dx_config_t *config, const char *section) pMethod = PyObject_GetAttrString(config->pObject, "item_count"); if (!pMethod || !PyCallable_Check(pMethod)) { dx_log(log_module, LOG_ERROR, "Problem with configuration module: No callable 'item_count'"); - if (pMethod) + if (pMethod) { Py_DECREF(pMethod); + } return 0; } @@ -128,8 +129,9 @@ int dx_config_item_count(const dx_config_t *config, const char *section) Py_DECREF(pArgs); if (pResult && PyInt_Check(pResult)) result = (int) PyInt_AsLong(pResult); - if (pResult) + if (pResult) { Py_DECREF(pResult); + } Py_DECREF(pMethod); return result; @@ -148,8 +150,9 @@ static PyObject *item_value(const dx_config_t *config, const char *section, int pMethod = PyObject_GetAttrString(config->pObject, method); if (!pMethod || !PyCallable_Check(pMethod)) { dx_log(log_module, LOG_ERROR, "Problem with configuration module: No callable '%s'", method); - if (pMethod) + if (pMethod) { Py_DECREF(pMethod); + } return 0; } @@ -179,8 +182,9 @@ const char *dx_config_item_value_string(const dx_config_t *config, const char *s strncpy(value, PyString_AsString(pResult), size + 1); } - if (pResult) + if (pResult) { Py_DECREF(pResult); + } return value; } @@ -194,8 +198,9 @@ uint32_t dx_config_item_value_int(const dx_config_t *config, const char *section if (pResult && PyLong_Check(pResult)) value = (uint32_t) PyLong_AsLong(pResult); - if (pResult) + if (pResult) { Py_DECREF(pResult); + } return value; } diff --git a/qpid/extras/dispatch/src/config_private.h b/qpid/extras/dispatch/src/config_private.h index bb114ebde0..3c95f6451f 100644 --- a/qpid/extras/dispatch/src/config_private.h +++ b/qpid/extras/dispatch/src/config_private.h @@ -23,7 +23,7 @@ void dx_config_initialize(); void dx_config_finalize(); -dx_config_t *dx_config(char *filename); +dx_config_t *dx_config(const char *filename); void dx_config_free(dx_config_t *config); #endif diff --git a/qpid/extras/dispatch/src/dispatch.c b/qpid/extras/dispatch/src/dispatch.c index 3c8fa9ba83..23199c7c99 100644 --- a/qpid/extras/dispatch/src/dispatch.c +++ b/qpid/extras/dispatch/src/dispatch.c @@ -19,10 +19,11 @@ #include "python_embedded.h" #include <qpid/dispatch.h> +#include <qpid/dispatch/server.h> +#include <qpid/dispatch/ctools.h> #include "dispatch_private.h" #include "alloc_private.h" #include "log_private.h" -#include "config_private.h" /** * Private Function Prototypes @@ -42,9 +43,24 @@ void dx_agent_free(dx_agent_t *agent); static const char *CONF_CONTAINER = "container"; static const char *CONF_ROUTER = "router"; +static const char *CONF_LISTENER = "listener"; -dx_dispatch_t *dx_dispatch() +typedef struct dx_config_listener_t { + DEQ_LINKS(struct dx_config_listener_t); + dx_server_config_t configuration; + dx_listener_t *listener; +} dx_config_listener_t; + + +ALLOC_DECLARE(dx_config_listener_t); +ALLOC_DEFINE(dx_config_listener_t); +DEQ_DECLARE(dx_config_listener_t, listener_list_t); + +listener_list_t listeners; + + +dx_dispatch_t *dx_dispatch(const char *config_path) { dx_dispatch_t *dx = NEW(dx_dispatch_t); @@ -57,20 +73,22 @@ dx_dispatch_t *dx_dispatch() dx_log_initialize(); dx_alloc_initialize(); + DEQ_INIT(listeners); + dx_config_initialize(); - dx_config_t *config = dx_config("../etc/qpid-dispatch.conf"); + dx->config = dx_config(config_path); - if (config) { - int count = dx_config_item_count(config, CONF_CONTAINER); + if (dx->config) { + int count = dx_config_item_count(dx->config, CONF_CONTAINER); if (count == 1) { - thread_count = dx_config_item_value_int(config, CONF_CONTAINER, 0, "worker-threads"); - container_name = dx_config_item_value_string(config, CONF_CONTAINER, 0, "container-name"); + thread_count = dx_config_item_value_int(dx->config, CONF_CONTAINER, 0, "worker-threads"); + container_name = dx_config_item_value_string(dx->config, CONF_CONTAINER, 0, "container-name"); } - count = dx_config_item_count(config, CONF_ROUTER); + count = dx_config_item_count(dx->config, CONF_ROUTER); if (count == 1) { - router_area = dx_config_item_value_string(config, CONF_ROUTER, 0, "area"); - router_id = dx_config_item_value_string(config, CONF_ROUTER, 0, "router-id"); + router_area = dx_config_item_value_string(dx->config, CONF_ROUTER, 0, "area"); + router_id = dx_config_item_value_string(dx->config, CONF_ROUTER, 0, "router-id"); } } @@ -95,14 +113,13 @@ dx_dispatch_t *dx_dispatch() dx_container_setup_agent(dx); dx_router_setup_agent(dx); - dx_config_free(config); - return dx; } void dx_dispatch_free(dx_dispatch_t *dx) { + dx_config_free(dx->config); dx_config_finalize(); dx_agent_free(dx->agent); dx_router_free(dx->router); @@ -112,3 +129,32 @@ void dx_dispatch_free(dx_dispatch_t *dx) dx_python_finalize(); } + +static void configure_connections(dx_dispatch_t *dx) +{ + int count; + + if (!dx->config) + return; + + count = dx_config_item_count(dx->config, CONF_LISTENER); + for (int i = 0; i < count; i++) { + dx_config_listener_t *l = new_dx_config_listener_t(); + memset(l, 0, sizeof(dx_config_listener_t)); + + l->configuration.host = dx_config_item_value_string(dx->config, CONF_LISTENER, i, "addr"); + l->configuration.port = dx_config_item_value_string(dx->config, CONF_LISTENER, i, "port"); + l->configuration.sasl_mechanisms = + dx_config_item_value_string(dx->config, CONF_LISTENER, i, "sasl-mechansism"); + l->configuration.ssl_enabled = 0; + + l->listener = dx_server_listen(dx, &l->configuration, l); + } +} + + +void dx_dispatch_configure(dx_dispatch_t *dx) +{ + configure_connections(dx); +} + diff --git a/qpid/extras/dispatch/src/dispatch_private.h b/qpid/extras/dispatch/src/dispatch_private.h index 699e3a2be4..ef93441776 100644 --- a/qpid/extras/dispatch/src/dispatch_private.h +++ b/qpid/extras/dispatch/src/dispatch_private.h @@ -20,6 +20,7 @@ */ #include "server_private.h" +#include "config_private.h" typedef struct dx_container_t dx_container_t; typedef struct dx_router_t dx_router_t; @@ -30,6 +31,7 @@ struct dx_dispatch_t { dx_container_t *container; dx_router_t *router; dx_agent_t *agent; + dx_config_t *config; }; #endif |
