You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2012/03/19 14:51:02 UTC
svn commit: r1302438 - in /qpid/proton/proton-c: include/proton/ src/
src/dispatcher/ src/engine/ src/sasl/ src/types/
Author: rhs
Date: Mon Mar 19 13:51:02 2012
New Revision: 1302438
URL: http://svn.apache.org/viewvc?rev=1302438&view=rev
Log:
cleaned up trace code; added container and hostname; added command line args
Modified:
qpid/proton/proton-c/include/proton/driver.h
qpid/proton/proton-c/include/proton/engine.h
qpid/proton/proton-c/include/proton/sasl.h
qpid/proton/proton-c/include/proton/util.h
qpid/proton/proton-c/src/dispatcher/dispatcher.c
qpid/proton/proton-c/src/dispatcher/dispatcher.h
qpid/proton/proton-c/src/driver.c
qpid/proton/proton-c/src/engine/engine-internal.h
qpid/proton/proton-c/src/engine/engine.c
qpid/proton/proton-c/src/proton.c
qpid/proton/proton-c/src/sasl/sasl.c
qpid/proton/proton-c/src/types/binary.c
qpid/proton/proton-c/src/util.c
qpid/proton/proton-c/src/util.h
Modified: qpid/proton/proton-c/include/proton/driver.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/include/proton/driver.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/include/proton/driver.h (original)
+++ qpid/proton/proton-c/include/proton/driver.h Mon Mar 19 13:51:02 2012
@@ -34,12 +34,14 @@ typedef void (pn_callback_t)(pn_selectab
#define PN_SEL_WR (0x0002)
pn_driver_t *pn_driver(void);
+void pn_driver_trace(pn_driver_t *d, pn_trace_t trace);
void pn_driver_run(pn_driver_t *d);
void pn_driver_stop(pn_driver_t *d);
void pn_driver_destroy(pn_driver_t *d);
pn_selectable_t *pn_acceptor(pn_driver_t *driver, char *host, char *port, pn_callback_t *callback, void* context);
pn_selectable_t *pn_connector(pn_driver_t *driver, char *host, char *port, pn_callback_t *callback, void* context);
+void pn_selectable_trace(pn_selectable_t *sel, pn_trace_t trace);
pn_sasl_t *pn_selectable_sasl(pn_selectable_t *sel);
pn_connection_t *pn_selectable_connection(pn_selectable_t *sel);
void *pn_selectable_context(pn_selectable_t *sel);
Modified: qpid/proton/proton-c/include/proton/engine.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/include/proton/engine.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/include/proton/engine.h (original)
+++ qpid/proton/proton-c/include/proton/engine.h Mon Mar 19 13:51:02 2012
@@ -41,6 +41,8 @@ typedef enum pn_endpoint_state_t {UNINIT
typedef enum pn_endpoint_type_t {CONNECTION=1, TRANSPORT=2, SESSION=3, SENDER=4, RECEIVER=5} pn_endpoint_type_t;
typedef enum pn_disposition_t {PN_RECEIVED=1, PN_ACCEPTED=2, PN_REJECTED=3, PN_RELEASED=4, PN_MODIFIED=5} pn_disposition_t;
+typedef enum pn_trace_t {PN_TRACE_OFF=0, PN_TRACE_RAW=1, PN_TRACE_FRM=2} pn_trace_t;
+
/* Currently the way inheritence is done it is safe to "upcast" from
pn_{transport,connection,session,link,sender,or receiver}_t to
pn_endpoint_t and to "downcast" based on the endpoint type. I'm
@@ -58,6 +60,8 @@ void pn_close(pn_endpoint_t *endpoint);
// connection
pn_connection_t *pn_connection();
+void pn_connection_set_container(pn_connection_t *connection, const wchar_t *container);
+void pn_connection_set_hostname(pn_connection_t *connection, const wchar_t *hostname);
pn_delivery_t *pn_work_head(pn_connection_t *connection);
pn_delivery_t *pn_work_next(pn_delivery_t *delivery);
@@ -77,7 +81,8 @@ pn_endpoint_t *pn_endpoint_next(pn_endpo
#define PN_ERR (-2)
ssize_t pn_input(pn_transport_t *transport, char *bytes, size_t available);
ssize_t pn_output(pn_transport_t *transport, char *bytes, size_t size);
-time_t pn_tick(pn_transport_t *engine, time_t now);
+time_t pn_tick(pn_transport_t *transport, time_t now);
+void pn_trace(pn_transport_t *transport, pn_trace_t trace);
// session
pn_sender_t *pn_sender(pn_session_t *session, const wchar_t *name);
Modified: qpid/proton/proton-c/include/proton/sasl.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/include/proton/sasl.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/include/proton/sasl.h (original)
+++ qpid/proton/proton-c/include/proton/sasl.h Mon Mar 19 13:51:02 2012
@@ -41,6 +41,7 @@ pn_binary_t *pn_sasl_response(pn_sasl_t
pn_sasl_outcome_t pn_sasl_outcome(pn_sasl_t *sasl);
ssize_t pn_sasl_input(pn_sasl_t *sasl, char *bytes, size_t available);
ssize_t pn_sasl_output(pn_sasl_t *sasl, char *bytes, size_t size);
+void pn_sasl_trace(pn_sasl_t *sasl, pn_trace_t trace);
void pn_sasl_destroy(pn_sasl_t *sasl);
#endif /* sasl.h */
Modified: qpid/proton/proton-c/include/proton/util.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/include/proton/util.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/include/proton/util.h (original)
+++ qpid/proton/proton-c/include/proton/util.h Mon Mar 19 13:51:02 2012
@@ -24,6 +24,7 @@
#include <stdarg.h>
+void parse_url(char *url, char **user, char **pass, char **host, char **port);
void pn_fatal(char *fmt, ...);
void pn_vfatal(char *fmt, va_list ap);
Modified: qpid/proton/proton-c/src/dispatcher/dispatcher.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/dispatcher/dispatcher.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/dispatcher/dispatcher.c (original)
+++ qpid/proton/proton-c/src/dispatcher/dispatcher.c Mon Mar 19 13:51:02 2012
@@ -19,12 +19,13 @@
*
*/
-#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <proton/framing.h>
+#include <proton/engine.h>
#include "dispatcher.h"
+#include "../util.h"
pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context)
{
@@ -32,6 +33,7 @@ pn_dispatcher_t *pn_dispatcher(uint8_t f
disp->frame_type = frame_type;
disp->context = context;
+ disp->trace = PN_TRACE_OFF;
disp->channel = 0;
disp->code = 0;
@@ -64,26 +66,22 @@ void pn_dispatcher_action(pn_dispatcher_
typedef enum {IN, OUT} pn_dir_t;
-static void pn_trace(pn_dispatcher_t *disp, uint16_t ch, pn_dir_t dir,
- uint8_t code, pn_list_t *args, const char *payload,
- size_t size)
-{
- pn_format(disp->scratch, SCRATCH, pn_from_list(args));
- fprintf(stderr, "[%u] %s %s %s", ch, dir == OUT ? "->" : "<-",
- disp->names[code], disp->scratch);
- if (size) {
- fprintf(stderr, " (%zu) \"", size);
- for (int i = 0; i < size; i++) {
- uint8_t c = payload[i];
- if (isprint(c)) {
- fputc(c, stderr);
- } else {
- fprintf(stderr, "\\x%.2x", c);
- }
+static void pn_do_trace(pn_dispatcher_t *disp, uint16_t ch, pn_dir_t dir,
+ uint8_t code, pn_list_t *args, const char *payload,
+ size_t size)
+{
+ if (disp->trace & PN_TRACE_FRM) {
+ pn_format(disp->scratch, SCRATCH, pn_from_list(args));
+ fprintf(stderr, "[%u] %s %s %s", ch, dir == OUT ? "->" : "<-",
+ disp->names[code], disp->scratch);
+ if (size) {
+ size_t capacity = 4*size + 1;
+ char buf[capacity];
+ pn_quote_data(buf, capacity, payload, size);
+ fprintf(stderr, " (%zu) \"%s\"\n", size, buf);
+ } else {
+ fprintf(stderr, "\n");
}
- fprintf(stderr, "\"\n");
- } else {
- fprintf(stderr, "\n");
}
}
@@ -112,7 +110,7 @@ ssize_t pn_dispatcher_input(pn_dispatche
if (disp->size)
disp->payload = frame.payload + e;
- pn_trace(disp, disp->channel, IN, code, disp->args, disp->payload, disp->size);
+ pn_do_trace(disp, disp->channel, IN, code, disp->args, disp->payload, disp->size);
pn_action_t *action = disp->actions[code];
action(disp);
@@ -159,8 +157,8 @@ void pn_post_frame(pn_dispatcher_t *disp
{
pn_tag_t tag = { .descriptor = pn_ulong(performative),
.value = pn_from_list(disp->output_args) };
- pn_trace(disp, ch, OUT, performative, disp->output_args, disp->output_payload,
- disp->output_size);
+ pn_do_trace(disp, ch, OUT, performative, disp->output_args, disp->output_payload,
+ disp->output_size);
pn_frame_t frame = {disp->frame_type};
char bytes[pn_encode_sizeof(pn_from_tag(&tag)) + disp->output_size];
size_t size = pn_encode(pn_from_tag(&tag), bytes);
@@ -181,6 +179,11 @@ void pn_post_frame(pn_dispatcher_t *disp
disp->capacity *= 2;
disp->output = realloc(disp->output, disp->capacity);
}
+ if (disp->trace & PN_TRACE_RAW) {
+ fprintf(stderr, "RAW: \"");
+ pn_fprint_data(stderr, disp->output + disp->available, n);
+ fprintf(stderr, "\"\n");
+ }
disp->available += n;
}
Modified: qpid/proton/proton-c/src/dispatcher/dispatcher.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/dispatcher/dispatcher.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/dispatcher/dispatcher.h (original)
+++ qpid/proton/proton-c/src/dispatcher/dispatcher.h Mon Mar 19 13:51:02 2012
@@ -36,6 +36,7 @@ struct pn_dispatcher_t {
pn_action_t *actions[256];
const char *names[256];
uint8_t frame_type;
+ pn_trace_t trace;
uint16_t channel;
uint8_t code;
pn_list_t *args;
Modified: qpid/proton/proton-c/src/driver.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/driver.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/driver.c (original)
+++ qpid/proton/proton-c/src/driver.c Mon Mar 19 13:51:02 2012
@@ -43,6 +43,7 @@ struct pn_driver_t {
size_t size;
int ctrl[2]; //pipe for updating selectable status
bool stopping;
+ pn_trace_t trace;
};
#define IO_BUF_SIZE (4*1024)
@@ -122,11 +123,19 @@ pn_selectable_t *pn_selectable(pn_driver
s->callback = callback;
s->context = context;
+ pn_selectable_trace(s, driver->trace);
+
pn_driver_add(driver, s);
return s;
}
+void pn_selectable_trace(pn_selectable_t *sel, pn_trace_t trace)
+{
+ pn_sasl_trace(sel->sasl, trace);
+ pn_trace(sel->transport, trace);
+}
+
pn_sasl_t *pn_selectable_sasl(pn_selectable_t *sel)
{
return sel->sasl;
@@ -172,6 +181,7 @@ static void pn_selectable_read(pn_select
printf("disconnected: %zi\n", n);
pn_selectable_close(sel);
pn_selectable_destroy(sel);
+ return;
} else {
sel->input_size += n;
}
@@ -339,10 +349,17 @@ pn_driver_t *pn_driver()
d->size = 0;
d->ctrl[0] = 0;
d->ctrl[1] = 0;
- d ->stopping = false;
+ d->stopping = false;
+ d->trace = ((pn_env_bool("PN_TRACE_RAW") ? PN_TRACE_RAW : PN_TRACE_OFF) |
+ (pn_env_bool("PN_TRACE_FRM") ? PN_TRACE_FRM : PN_TRACE_OFF));
return d;
}
+void pn_driver_trace(pn_driver_t *d, pn_trace_t trace)
+{
+ d->trace = trace;
+}
+
void pn_driver_destroy(pn_driver_t *d)
{
while (d->head)
@@ -387,11 +404,15 @@ void pn_driver_run(pn_driver_t *d)
s = d->head;
for (i = 0; i < n; i++)
{
+ // XXX: this is necessary because read or write might close the
+ // selectable, should probably fix this by making them mark it
+ // as closed and closing from this loop
+ pn_selectable_t *next = s->next;
if (fds[i].revents & POLLIN)
s->read(s);
if (fds[i].revents & POLLOUT)
s->write(s);
- s = s->next;
+ s = next;
}
if (fds[n].revents & POLLIN) {
Modified: qpid/proton/proton-c/src/engine/engine-internal.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/engine/engine-internal.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/proton-c/src/engine/engine-internal.h Mon Mar 19 13:51:02 2012
@@ -114,6 +114,8 @@ struct pn_connection_t {
pn_delivery_t *work_tail;
pn_delivery_t *tpwork_head;
pn_delivery_t *tpwork_tail;
+ wchar_t *container;
+ wchar_t *hostname;
};
struct pn_session_t {
Modified: qpid/proton/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/engine/engine.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/engine/engine.c (original)
+++ qpid/proton/proton-c/src/engine/engine.c Mon Mar 19 13:51:02 2012
@@ -31,6 +31,17 @@
#include <stdarg.h>
#include <stdio.h>
+wchar_t *wcsdup(const wchar_t *src)
+{
+ if (src) {
+ wchar_t *dest = malloc((wcslen(src)+1)*sizeof(wchar_t));
+ if (!dest) return NULL;
+ return wcscpy(dest, src);
+ } else {
+ return 0;
+ }
+}
+
// delivery buffers
void pn_delivery_buffer_init(pn_delivery_buffer_t *db, pn_sequence_t next, size_t capacity)
@@ -183,6 +194,8 @@ void pn_destroy_connection(pn_connection
while (connection->session_count)
pn_destroy_session(connection->sessions[connection->session_count - 1]);
free(connection->sessions);
+ free(connection->container);
+ free(connection->hostname);
free(connection);
}
@@ -393,10 +406,24 @@ pn_connection_t *pn_connection()
conn->work_tail = NULL;
conn->tpwork_head = NULL;
conn->tpwork_tail = NULL;
+ conn->container = NULL;
+ conn->hostname = NULL;
return conn;
}
+void pn_connection_set_container(pn_connection_t *connection, const wchar_t *container)
+{
+ if (connection->container) free(connection->container);
+ connection->container = wcsdup(container);
+}
+
+void pn_connection_set_hostname(pn_connection_t *connection, const wchar_t *hostname)
+{
+ if (connection->hostname) free(connection->hostname);
+ connection->hostname = wcsdup(hostname);
+}
+
pn_delivery_t *pn_work_head(pn_connection_t *connection)
{
return connection->work_head;
@@ -535,7 +562,6 @@ pn_endpoint_t *pn_endpoint_next(pn_endpo
pn_session_t *pn_session(pn_connection_t *conn)
{
-
pn_session_t *ssn = malloc(sizeof(pn_session_t));
if (!ssn) return NULL;
@@ -628,17 +654,6 @@ pn_transport_t *pn_transport(pn_connecti
}
}
-wchar_t *wcsdup(const wchar_t *src)
-{
- if (src) {
- wchar_t *dest = malloc((wcslen(src)+1)*sizeof(wchar_t));
- if (!dest) return NULL;
- return wcscpy(dest, src);
- } else {
- return 0;
- }
-}
-
void pn_link_init(pn_link_t *link, int type, pn_session_t *session, const wchar_t *name)
{
pn_endpoint_init(&link->endpoint, type, session->connection);
@@ -990,7 +1005,8 @@ void pn_do_disposition(pn_dispatcher_t *
pn_session_state_t *ssn_state = pn_channel_state(transport, disp->channel);
bool role = pn_to_bool(pn_list_get(args, DISPOSITION_ROLE));
pn_sequence_t first = pn_to_int32(pn_list_get(args, DISPOSITION_FIRST));
- pn_sequence_t last = pn_to_int32(pn_list_get(args, DISPOSITION_LAST));
+ pn_value_t lastv = pn_list_get(args, DISPOSITION_LAST);
+ pn_sequence_t last = lastv.type == EMPTY ? first : pn_to_int32(lastv);
//bool settled = pn_to_bool(pn_list_get(args, DISPOSITION_SETTLED));
pn_tag_t *dstate = pn_to_tag(pn_list_get(args, DISPOSITION_STATE));
uint64_t code = pn_to_uint32(pn_tag_descriptor(dstate));
@@ -1091,11 +1107,12 @@ void pn_process_conn_setup(pn_transport_
{
if (endpoint->local_state != UNINIT && !transport->open_sent)
{
+ pn_connection_t *connection = (pn_connection_t *) endpoint;
pn_init_frame(transport->disp);
- /*if (container_id)
- pn_field(eng, OPEN_CONTAINER_ID, pn_value("S", container_id));*/
- /*if (hostname)
- pn_field(eng, OPEN_HOSTNAME, pn_value("S", hostname));*/
+ if (connection->container)
+ pn_field(transport->disp, OPEN_CONTAINER_ID, pn_value("S", connection->container));
+ if (connection->hostname)
+ pn_field(transport->disp, OPEN_HOSTNAME, pn_value("S", connection->hostname));
pn_post_frame(transport->disp, 0, OPEN);
transport->open_sent = true;
}
@@ -1404,6 +1421,11 @@ ssize_t pn_output(pn_transport_t *transp
return pn_dispatcher_output(transport->disp, bytes, size);
}
+void pn_trace(pn_transport_t *transport, pn_trace_t trace)
+{
+ transport->disp->trace = trace;
+}
+
ssize_t pn_send(pn_sender_t *sender, const char *bytes, size_t n)
{
pn_delivery_t *current = pn_current(&sender->link);
Modified: qpid/proton/proton-c/src/proton.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/proton.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/proton.c (original)
+++ qpid/proton/proton-c/src/proton.c Mon Mar 19 13:51:02 2012
@@ -21,12 +21,14 @@
#define _GNU_SOURCE
-#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <proton/driver.h>
#include <proton/message.h>
#include <proton/value.h>
+#include <proton/util.h>
+#include <unistd.h>
+#include "util.h"
void print(pn_value_t value)
{
@@ -74,18 +76,6 @@ int value(int argc, char **argv)
return 0;
}
-void print_data(char *bytes, size_t size)
-{
- for (int i = 0; i < size; i++)
- {
- uint8_t c = bytes[i];
- if (isprint(c))
- printf("%c", c);
- else
- printf("\\x%.2x", c);
- }
-}
-
struct server_context {
int count;
};
@@ -178,7 +168,7 @@ void server_callback(pn_selectable_t *se
pn_disposition(delivery, PN_ACCEPTED);
break;
} else {
- print_data(msg, n);
+ pn_print_data(msg, n);
}
}
printf("\"\n");
@@ -233,6 +223,8 @@ struct client_context {
pn_driver_t *driver;
const char *username;
const char *password;
+ wchar_t hostname[1024];
+ wchar_t address[1024];
};
void client_callback(pn_selectable_t *sel)
@@ -263,13 +255,21 @@ void client_callback(pn_selectable_t *se
if (!ctx->init) {
ctx->init = true;
+ char container[1024];
+ if (gethostname(container, 1024)) pn_fatal("hostname lookup failed");
+ wchar_t wcontainer[1024];
+ mbstowcs(wcontainer, container, 1024);
+
+ pn_connection_set_container(connection, wcontainer);
+ pn_connection_set_hostname(connection, ctx->hostname);
+
pn_session_t *ssn = pn_session(connection);
pn_open((pn_endpoint_t *) connection);
pn_open((pn_endpoint_t *) ssn);
if (ctx->send_count) {
pn_sender_t *snd = pn_sender(ssn, L"sender");
- pn_set_target((pn_link_t *) snd, L"queue");
+ pn_set_target((pn_link_t *) snd, ctx->address);
pn_open((pn_endpoint_t *) snd);
char buf[16];
@@ -283,7 +283,7 @@ void client_callback(pn_selectable_t *se
if (ctx->recv_count) {
pn_receiver_t *rcv = pn_receiver(ssn, L"receiver");
- pn_set_source((pn_link_t *) rcv, L"queue");
+ pn_set_source((pn_link_t *) rcv, ctx->address);
pn_open((pn_endpoint_t *) rcv);
pn_flow(rcv, ctx->recv_count);
}
@@ -316,7 +316,7 @@ void client_callback(pn_selectable_t *se
}
break;
} else {
- print_data(msg, n);
+ pn_print_data(msg, n);
}
}
printf("\"\n");
@@ -358,26 +358,56 @@ void client_callback(pn_selectable_t *se
}
}
+#include <ctype.h>
+
int main(int argc, char **argv)
{
- if (argc > 1 && !strcmp(argv[1], "value"))
+ char *url = NULL;
+ char *address = "queue";
+
+ int opt;
+ while ((opt = getopt(argc, argv, "c:a:hX")) != -1)
{
- return value(argc, argv);
+ switch (opt) {
+ case 'c':
+ if (url) pn_fatal("multiple connect urls not allowed\n");
+ url = optarg;
+ break;
+ case 'a':
+ address = optarg;
+ break;
+ case 'X':
+ value(argc, argv);
+ exit(EXIT_SUCCESS);
+ case 'h':
+ printf("Usage: %s [-h] [-c [user[:password]@]host[:port]]\n", argv[0]);
+ printf("\n");
+ printf(" -c The connect url.\n");
+ printf(" -h Print this help.\n");
+ exit(EXIT_SUCCESS);
+ default: /* '?' */
+ pn_fatal("Usage: %s -h\n", argv[0]);
+ }
}
+ char *user = NULL;
+ char *pass = NULL;
+ char *host = "0.0.0.0";
+ char *port = "5672";
+
+ parse_url(url, &user, &pass, &host, &port);
+
pn_driver_t *drv = pn_driver();
- if (argc > 1) {
+ if (url) {
struct client_context ctx = {false, 10, 10, drv};
- ctx.username = argv[1];
- if (argc > 2) {
- ctx.password = argv[2];
- } else {
- ctx.password = "";
- }
- if (!pn_connector(drv, "0.0.0.0", "5672", client_callback, &ctx)) perror("proton");
+ ctx.username = user;
+ ctx.password = pass;
+ mbstowcs(ctx.hostname, host, 1024);
+ mbstowcs(ctx.address, address, 1024);
+ if (!pn_connector(drv, host, port, client_callback, &ctx)) perror("proton");
} else {
struct server_context ctx = {0};
- if (!pn_acceptor(drv, "0.0.0.0", "5672", server_callback, &ctx)) perror("proton");
+ if (!pn_acceptor(drv, host, port, server_callback, &ctx)) perror("proton");
}
pn_driver_run(drv);
Modified: qpid/proton/proton-c/src/sasl/sasl.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/sasl/sasl.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/sasl/sasl.c (original)
+++ qpid/proton/proton-c/src/sasl/sasl.c Mon Mar 19 13:51:02 2012
@@ -27,6 +27,7 @@
#include <proton/engine.h> // XXX: just needed for PN_EOS
#include "sasl-internal.h"
#include "../protocol.h"
+#include "../util.h"
void pn_do_init(pn_dispatcher_t *disp);
void pn_do_mechanisms(pn_dispatcher_t *disp);
@@ -92,15 +93,17 @@ pn_binary_t *pn_sasl_response(pn_sasl_t
void pn_sasl_client(pn_sasl_t *sasl, const char *username, const char *password)
{
- size_t usize = strlen(username);
- size_t psize = strlen(password);
+ const char *user = username ? username : "";
+ const char *pass = password ? password : "";
+ size_t usize = strlen(user);
+ size_t psize = strlen(pass);
size_t size = usize + psize + 2;
char iresp[size];
iresp[0] = 0;
- memmove(iresp + 1, username, usize);
+ memmove(iresp + 1, user, usize);
iresp[usize + 1] = 0;
- memmove(iresp + usize + 2, password, psize);
+ memmove(iresp + usize + 2, pass, psize);
pn_init_frame(sasl->disp);
pn_field(sasl->disp, SASL_INIT_MECHANISM, pn_from_symbol(pn_symbol("PLAIN")));
@@ -131,6 +134,11 @@ bool pn_sasl_init(pn_sasl_t *sasl)
return sasl->init;
}
+void pn_sasl_trace(pn_sasl_t *sasl, pn_trace_t trace)
+{
+ sasl->disp->trace = trace;
+}
+
void pn_sasl_destroy(pn_sasl_t *sasl)
{
pn_sasl_mechanism_set(sasl, NULL);
Modified: qpid/proton/proton-c/src/types/binary.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/types/binary.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/types/binary.c (original)
+++ qpid/proton/proton-c/src/types/binary.c Mon Mar 19 13:51:02 2012
@@ -20,11 +20,11 @@
*/
#include <proton/codec.h>
-#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "value-internal.h"
+#include "../util.h"
pn_binary_t *pn_binary(char *bytes, size_t size)
{
@@ -78,27 +78,11 @@ pn_binary_t *pn_binary_dup(pn_binary_t *
int pn_format_binary(char **pos, char *limit, pn_binary_t *binary)
{
if (!binary) return pn_fmt(pos, limit, "(null)");
-
- for (int i = 0; i < binary->size; i++)
- {
- uint8_t b = binary->bytes[i];
- if (isprint(b)) {
- if (*pos < limit) {
- **pos = b;
- *pos += 1;
- } else {
- return -1;
- }
- } else {
- if (limit - *pos > 4)
- {
- sprintf(*pos, "\\x%.2x", b);
- *pos += 4;
- } else {
- return -1;
- }
- }
+ ssize_t n = pn_quote_data(*pos, limit - *pos, binary->bytes, binary->size);
+ if (n < 0) {
+ return n;
+ } else {
+ *pos += n;
+ return 0;
}
-
- return 0;
}
Modified: qpid/proton/proton-c/src/util.c
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/util.c?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/util.c (original)
+++ qpid/proton/proton-c/src/util.c Mon Mar 19 13:51:02 2012
@@ -20,13 +20,89 @@
*/
#include <stdarg.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
+#include <strings.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <string.h>
+
+// XXX: should centralize error codes
+#define PN_OVERFLOW (-1)
+
+ssize_t pn_quote_data(char *dst, size_t capacity, const char *src, size_t size)
+{
+ int idx = 0;
+ for (int i = 0; i < size; i++)
+ {
+ uint8_t c = src[i];
+ if (isprint(c)) {
+ if (idx < capacity - 1) {
+ dst[idx++] = c;
+ } else {
+ return PN_OVERFLOW;
+ }
+ } else {
+ if (idx < capacity - 5) {
+ sprintf(dst + idx, "\\x%.2x", c);
+ idx += 4;
+ } else {
+ return PN_OVERFLOW;
+ }
+ }
+ }
+
+ dst[idx] = '\0';
+ return idx;
+}
+
+void pn_fprint_data(FILE *stream, const char *bytes, size_t size)
+{
+ size_t capacity = 4*size + 1;
+ char buf[capacity];
+ pn_quote_data(buf, capacity, bytes, size);
+ fputs(buf, stream);
+}
+
+void pn_print_data(const char *bytes, size_t size)
+{
+ pn_fprint_data(stdout, bytes, size);
+}
+
+void parse_url(char *url, char **user, char **pass, char **host, char **port)
+{
+ if (url) {
+ char *at = index(url, '@');
+ char *hp;
+ if (at) {
+ *at = '\0';
+ *user = url;
+ char *colon = index(url, ':');
+ if (colon) {
+ *colon = '\0';
+ *pass = colon + 1;
+ }
+ hp = at + 1;
+ } else {
+ hp = url;
+ }
+
+ *host = hp;
+
+ char *colon = index(hp, ':');
+ if (colon) {
+ *colon = '\0';
+ *port = colon + 1;
+ }
+ }
+}
void pn_vfatal(char *fmt, va_list ap)
{
vfprintf(stderr, fmt, ap);
- exit(-1);
+ exit(EXIT_FAILURE);
}
void pn_fatal(char *fmt, ...)
@@ -36,3 +112,10 @@ void pn_fatal(char *fmt, ...)
pn_vfatal(fmt, ap);
va_end(ap);
}
+
+bool pn_env_bool(const char *name)
+{
+ char *v = getenv(name);
+ return v && (!strcasecmp(v, "true") || !strcasecmp(v, "1") ||
+ !strcasecmp(v, "yes"));
+}
Modified: qpid/proton/proton-c/src/util.h
URL: http://svn.apache.org/viewvc/qpid/proton/proton-c/src/util.h?rev=1302438&r1=1302437&r2=1302438&view=diff
==============================================================================
--- qpid/proton/proton-c/src/util.h (original)
+++ qpid/proton/proton-c/src/util.h Mon Mar 19 13:51:02 2012
@@ -1,5 +1,5 @@
-#ifndef _PROTON_UTIL_H
-#define _PROTON_UTIL_H 1
+#ifndef _PROTON_SRC_UTIL_H
+#define _PROTON_SRC_UTIL_H 1
/*
*
@@ -27,6 +27,11 @@
#include <string.h>
#include <errno.h>
+ssize_t pn_quote_data(char *dst, size_t capacity, const char *src, size_t size);
+void pn_fprint_data(FILE *stream, const char *bytes, size_t size);
+void pn_print_data(const char *bytes, size_t size);
+bool pn_env_bool(const char *name);
+
#define DIE_IFR(EXPR, STRERR) \
do { \
int __code__ = (EXPR); \
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org