summaryrefslogtreecommitdiff
path: root/qpid/extras/dispatch/src
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/extras/dispatch/src')
-rw-r--r--qpid/extras/dispatch/src/config.c17
-rw-r--r--qpid/extras/dispatch/src/config_private.h2
-rw-r--r--qpid/extras/dispatch/src/dispatch.c70
-rw-r--r--qpid/extras/dispatch/src/dispatch_private.h2
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