On 11/28/2011 01:36 PM, Adam Stokes wrote:
- Windows variant for qpidd broker and routing
needed for broker federation.
Signed-off-by: Adam Stokes<astokes(a)fedoraproject.org>
---
src/broker/broker_federation.c | 5 +-
src/broker/broker_windows.c | 97 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 3 deletions(-)
create mode 100644 src/broker/broker_windows.c
Has this been tested to at least some degree?
diff --git a/src/broker/broker_federation.c
b/src/broker/broker_federation.c
index 27156a1..20ffc14 100644
--- a/src/broker/broker_federation.c
+++ b/src/broker/broker_federation.c
@@ -120,8 +120,7 @@ broker_federation_configure(void)
const char *proxy_service_dir = getenv("VP_G_HOST_DIR");
char local[16];
char peers[1024];
- char *p = NULL;
- char *peer;
+ char *peer = NULL;
if (g_file_test(proxy_service_dir, G_FILE_TEST_IS_DIR)) {
char remote[16];
@@ -133,7 +132,7 @@ broker_federation_configure(void)
mh_string_copy(peers, brokers, sizeof(peers));
- while ((peer = strtok(peers, ",; ")) != NULL) {
+ while ((peer = strtok(peer ? NULL : peers, ",; ")) != NULL) {
if (IS_DNS_SRV(peer, TCP) || IS_DNS_SRV(peer, TLS)) {
peer = broker_lookup(peer);
}
diff --git a/src/broker/broker_windows.c b/src/broker/broker_windows.c
new file mode 100644
index 0000000..a0d51b5
--- /dev/null
+++ b/src/broker/broker_windows.c
@@ -0,0 +1,97 @@
+#include<stdio.h>
+#include<wchar.h>
+
+#include<windows.h>
+
+#include "broker.h"
+#include "broker_os.h"
+#include "broker_federation.h"
+
+
+#define CMD_LINE_LENGTH 32768
+
+#define QPID_BROKER L"qpidd"
+#define QPID_ROUTE L"qpid-route"
+
+
+static int start_process(const wchar_t *proc, wchar_t *cmdline)
+{
+ STARTUPINFO startupinfo;
+ PROCESS_INFORMATION procinfo;
+ BOOL result;
+
+ GetStartupInfo(&startupinfo);
+
+ result = CreateProcess(proc, cmdline,
+ NULL, NULL, FALSE, 0, NULL, NULL,
+&startupinfo,&procinfo);
+
+ CloseHandle(procinfo.hProcess);
+ CloseHandle(procinfo.hThread);
+
+ return result == FALSE;
+}
+
+int broker_os_start_broker(char * const args[])
+{
+ int ret;
+ wchar_t cmdline[CMD_LINE_LENGTH];
+ int i = 0;
+ const char *arg;
+
+ for (arg = *args; arg; arg++) {
+ int c = snwprintf(cmdline + i, CMD_LINE_LENGTH - i, L"%s ", arg);
This will crash. You should be able to change it to something like ...
char * const *arg;
for (arg = args; *arg; arg++) {
int c = snwprintf(cmdline + i, CMD_LINE_LENGTH - i, L"%s ", *arg);
+ if (c< 0 || (i += c)>= (CMD_LINE_LENGTH - 1)) {
+ return -1;
+ }
+ }
+
+ ret = start_process(QPID_BROKER, cmdline);
+
+ broker_federation_configure();
+
+ return ret ? -1 : 0;
+}
+
+int broker_os_add_qpid_route_link(const char *local, const char *remote)
+{
+ wchar_t cmd[1024];
+
+ snwprintf(cmd, sizeof(cmd) / sizeof(*cmd),
You can use DIMOF() here and below instead of sizeof()/sizeof() which is
in matahari's utilities.h I think.
+ L"%ls link add %s untrusted/untrusted@%s
PLAIN", QPID_ROUTE,
+ local, remote);
+
+ if (start_process(QPID_ROUTE, cmd)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+int broker_os_add_qpid_route(const struct mh_qpid_route *route)
+{
+ wchar_t cmd[1024];
+
+ if (route->aggregate&& route->srclocal) {
+ snwprintf(cmd, sizeof(cmd) / sizeof(*cmd),
+ L"%ls --src-local route add %s %s %s %s", QPID_ROUTE,
+ route->dest, route->src, route->exchange,
route->route_key);
+ } else if (route->aggregate) {
+ snwprintf(cmd, sizeof(cmd) / sizeof(*cmd),
+ L"%ls route add %s %s %s %s", QPID_ROUTE,
+ route->dest, route->src, route->exchange,
route->route_key);
+ } else {
+ snwprintf(cmd, sizeof(cmd) / sizeof(*cmd),
+ L"%ls --timeout=5 dynamic add %s %s %s", QPID_ROUTE,
+ route->dest, route->src, route->exchange);
+ }
+
+ if (start_process(QPID_ROUTE, cmd)) {
+ return -1;
+ }
+
+ return 0;
+}
+
--
Russell Bryant