PROTON-1003: add SSL error handler callback

Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c56bcff5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c56bcff5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c56bcff5

Branch: refs/heads/proton-go
Commit: c56bcff5fc3f5f5087ed227e1dd11d7b835df819
Parents: 84e416e
Author: Gordon Sim <[email protected]>
Authored: Thu Sep 24 15:29:48 2015 -0400
Committer: Ken Giusti <[email protected]>
Committed: Thu Sep 24 15:29:48 2015 -0400

----------------------------------------------------------------------
 proton-c/src/engine/engine-internal.h |  2 +-
 proton-c/src/sasl/sasl.c              |  4 ++--
 proton-c/src/ssl/openssl.c            | 14 ++++++++++----
 proton-c/src/transport/transport.c    |  8 ++++----
 4 files changed, 17 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/engine/engine-internal.h
----------------------------------------------------------------------
diff --git a/proton-c/src/engine/engine-internal.h 
b/proton-c/src/engine/engine-internal.h
index faba488..0b052a7 100644
--- a/proton-c/src/engine/engine-internal.h
+++ b/proton-c/src/engine/engine-internal.h
@@ -100,7 +100,7 @@ typedef struct {
 typedef struct pn_io_layer_t {
   ssize_t (*process_input)(struct pn_transport_t *transport, unsigned int 
layer, const char *, size_t);
   ssize_t (*process_output)(struct pn_transport_t *transport, unsigned int 
layer, char *, size_t);
-  void (*handle_error)(struct pn_transport_t* transport);
+  void (*handle_error)(struct pn_transport_t* transport, unsigned int layer);
   pn_timestamp_t (*process_tick)(struct pn_transport_t *transport, unsigned 
int layer, pn_timestamp_t);
   size_t (*buffered_output)(struct pn_transport_t *transport);  // how much 
output is held
 } pn_io_layer_t;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index fb98894..994082c 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -49,7 +49,7 @@ static ssize_t pn_input_read_sasl_encrypt(pn_transport_t 
*transport, unsigned in
 static ssize_t pn_output_write_sasl_header(pn_transport_t* transport, unsigned 
int layer, char* bytes, size_t size);
 static ssize_t pn_output_write_sasl(pn_transport_t *transport, unsigned int 
layer, char *bytes, size_t available);
 static ssize_t pn_output_write_sasl_encrypt(pn_transport_t *transport, 
unsigned int layer, char *bytes, size_t available);
-static void pn_error_sasl(pn_transport_t* transport);
+static void pn_error_sasl(pn_transport_t* transport, unsigned int layer);
 
 const pn_io_layer_t sasl_header_layer = {
     pn_input_read_sasl_header,
@@ -253,7 +253,7 @@ static void pni_post_sasl_frame(pn_transport_t *transport)
   }
 }
 
-static void pn_error_sasl(pn_transport_t* transport)
+static void pn_error_sasl(pn_transport_t* transport, unsigned int layer)
 {
   transport->close_sent = true;
   pni_sasl_set_desired_state(transport, SASL_ERROR);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/ssl/openssl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c
index 2781a5b..8710225 100644
--- a/proton-c/src/ssl/openssl.c
+++ b/proton-c/src/ssl/openssl.c
@@ -142,6 +142,7 @@ struct pn_ssl_session_t {
 
 /* */
 static int keyfile_pw_cb(char *buf, int size, int rwflag, void *userdata);
+static void handle_error_ssl( pn_transport_t *transport, unsigned int layer);
 static ssize_t process_input_ssl( pn_transport_t *transport, unsigned int 
layer, const char *input_data, size_t len);
 static ssize_t process_output_ssl( pn_transport_t *transport, unsigned int 
layer, char *input_data, size_t len);
 static ssize_t process_input_done(pn_transport_t *transport, unsigned int 
layer, const char *input_data, size_t len);
@@ -682,7 +683,7 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t 
*domain,
 const pn_io_layer_t ssl_layer = {
     process_input_ssl,
     process_output_ssl,
-    NULL,
+    handle_error_ssl,
     NULL,
     buffered_output
 };
@@ -690,7 +691,7 @@ const pn_io_layer_t ssl_layer = {
 const pn_io_layer_t ssl_input_closed_layer = {
     process_input_done,
     process_output_ssl,
-    NULL,
+    handle_error_ssl,
     NULL,
     buffered_output
 };
@@ -698,7 +699,7 @@ const pn_io_layer_t ssl_input_closed_layer = {
 const pn_io_layer_t ssl_output_closed_layer = {
     process_input_ssl,
     process_output_done,
-    NULL,
+    handle_error_ssl,
     NULL,
     buffered_output
 };
@@ -706,7 +707,7 @@ const pn_io_layer_t ssl_output_closed_layer = {
 const pn_io_layer_t ssl_closed_layer = {
     process_input_done,
     process_output_done,
-    NULL,
+    handle_error_ssl,
     NULL,
     buffered_output
 };
@@ -1022,6 +1023,11 @@ static ssize_t process_input_ssl( pn_transport_t 
*transport, unsigned int layer,
   return consumed;
 }
 
+static void handle_error_ssl(pn_transport_t *transport, unsigned int layer)
+{
+  transport->io_layers[layer] = &ssl_closed_layer;
+}
+
 static ssize_t process_output_ssl( pn_transport_t *transport, unsigned int 
layer, char *buffer, size_t max_len)
 {
   pni_ssl_t *ssl = transport->ssl;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c 
b/proton-c/src/transport/transport.c
index 96ac2a8..8edc9b3 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -141,7 +141,7 @@ static ssize_t pn_input_read_amqp_header(pn_transport_t 
*transport, unsigned int
 static ssize_t pn_input_read_amqp(pn_transport_t *transport, unsigned int 
layer, const char *bytes, size_t available);
 static ssize_t pn_output_write_amqp_header(pn_transport_t *transport, unsigned 
int layer, char *bytes, size_t available);
 static ssize_t pn_output_write_amqp(pn_transport_t *transport, unsigned int 
layer, char *bytes, size_t available);
-static void pn_error_amqp(pn_transport_t *transport);
+static void pn_error_amqp(pn_transport_t *transport, unsigned int layer);
 static pn_timestamp_t pn_tick_amqp(pn_transport_t *transport, unsigned int 
layer, pn_timestamp_t now);
 
 static ssize_t pn_io_layer_input_autodetect(pn_transport_t *transport, 
unsigned int layer, const char *bytes, size_t available);
@@ -1100,7 +1100,7 @@ int pn_do_error(pn_transport_t *transport, const char 
*condition, const char *fm
 
   for (int i = 0; i<PN_IO_LAYER_CT; ++i) {
     if (transport->io_layers[i] && transport->io_layers[i]->handle_error)
-      transport->io_layers[i]->handle_error(transport);
+        transport->io_layers[i]->handle_error(transport, i);
   }
 
   pni_close_tail(transport);
@@ -2413,7 +2413,7 @@ static int pni_process(pn_transport_t *transport)
 
 #define AMQP_HEADER ("AMQP\x00\x01\x00\x00")
 
-static void pn_error_amqp(pn_transport_t* transport)
+static void pn_error_amqp(pn_transport_t* transport, unsigned int layer)
 {
   if (!transport->close_sent) {
     if (!transport->open_sent) {
@@ -2529,7 +2529,7 @@ static ssize_t 
pn_output_write_amqp_header(pn_transport_t* transport, unsigned i
   assert(available >= 8);
   memmove(bytes, AMQP_HEADER, 8);
   if (pn_condition_is_set(&transport->condition)) {
-    pn_error_amqp(transport);
+      pn_error_amqp(transport, layer);
     transport->io_layers[layer] = &pni_error_layer;
     return pn_dispatcher_output(transport, bytes+8, available-8) + 8;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to