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