mirror of
				https://github.com/zeromq/libzmq.git
				synced 2025-10-23 08:31:46 +02:00 
			
		
		
		
	Update mechanism API so we can check for ERROR status
This commit is contained in:
		| @@ -206,9 +206,9 @@ int zmq::curve_client_t::decode (msg_t *msg_) | |||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool zmq::curve_client_t::is_handshake_complete () const | zmq::mechanism_t::status_t zmq::curve_client_t::status () const | ||||||
| { | { | ||||||
|     return state == connected; |     return state == connected? mechanism_t::ready: mechanism_t::handshaking; | ||||||
| } | } | ||||||
|  |  | ||||||
| int zmq::curve_client_t::produce_hello (msg_t *msg_) | int zmq::curve_client_t::produce_hello (msg_t *msg_) | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ namespace zmq | |||||||
|         virtual int process_handshake_command (msg_t *msg_); |         virtual int process_handshake_command (msg_t *msg_); | ||||||
|         virtual int encode (msg_t *msg_); |         virtual int encode (msg_t *msg_); | ||||||
|         virtual int decode (msg_t *msg_); |         virtual int decode (msg_t *msg_); | ||||||
|         virtual bool is_handshake_complete () const; |         virtual status_t status () const; | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -237,9 +237,9 @@ int zmq::curve_server_t::zap_msg_available () | |||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool zmq::curve_server_t::is_handshake_complete () const | zmq::mechanism_t::status_t zmq::curve_server_t::status () const | ||||||
| { | { | ||||||
|     return state == connected; |     return state == connected? mechanism_t::ready: mechanism_t::handshaking; | ||||||
| } | } | ||||||
|  |  | ||||||
| int zmq::curve_server_t::process_hello (msg_t *msg_) | int zmq::curve_server_t::process_hello (msg_t *msg_) | ||||||
|   | |||||||
| @@ -64,7 +64,7 @@ namespace zmq | |||||||
|         virtual int encode (msg_t *msg_); |         virtual int encode (msg_t *msg_); | ||||||
|         virtual int decode (msg_t *msg_); |         virtual int decode (msg_t *msg_); | ||||||
|         virtual int zap_msg_available (); |         virtual int zap_msg_available (); | ||||||
|         virtual bool is_handshake_complete () const; |         virtual status_t status () const; | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,6 +37,12 @@ namespace zmq | |||||||
|     { |     { | ||||||
|     public: |     public: | ||||||
|  |  | ||||||
|  |         enum status_t { | ||||||
|  |             handshaking, | ||||||
|  |             ready, | ||||||
|  |             error | ||||||
|  |         }; | ||||||
|  |  | ||||||
|         mechanism_t (const options_t &options_); |         mechanism_t (const options_t &options_); | ||||||
|  |  | ||||||
|         virtual ~mechanism_t (); |         virtual ~mechanism_t (); | ||||||
| @@ -54,8 +60,8 @@ namespace zmq | |||||||
|         //  Notifies mechanism about availability of ZAP message. |         //  Notifies mechanism about availability of ZAP message. | ||||||
|         virtual int zap_msg_available () { return 0; } |         virtual int zap_msg_available () { return 0; } | ||||||
|  |  | ||||||
|         //  True iff the handshake stage is complete? |         //  Returns the status of this mechanism. | ||||||
|         virtual bool is_handshake_complete () const = 0; |         virtual status_t status () const = 0; | ||||||
|  |  | ||||||
|         void set_peer_identity (const void *id_ptr, size_t id_size); |         void set_peer_identity (const void *id_ptr, size_t id_size); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -152,9 +152,12 @@ int zmq::null_mechanism_t::zap_msg_available () | |||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool zmq::null_mechanism_t::is_handshake_complete () const | zmq::mechanism_t::status_t zmq::null_mechanism_t::status () const | ||||||
| { | { | ||||||
|     return ready_command_received && ready_command_sent; |     if (ready_command_received && ready_command_sent) | ||||||
|  |         return mechanism_t::ready; | ||||||
|  |     else | ||||||
|  |         return mechanism_t::handshaking; | ||||||
| } | } | ||||||
|  |  | ||||||
| void zmq::null_mechanism_t::send_zap_request () | void zmq::null_mechanism_t::send_zap_request () | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ namespace zmq | |||||||
|         virtual int next_handshake_command (msg_t *msg_); |         virtual int next_handshake_command (msg_t *msg_); | ||||||
|         virtual int process_handshake_command (msg_t *msg_); |         virtual int process_handshake_command (msg_t *msg_); | ||||||
|         virtual int zap_msg_available (); |         virtual int zap_msg_available (); | ||||||
|         virtual bool is_handshake_complete () const; |         virtual status_t status () const; | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -118,9 +118,9 @@ int zmq::plain_mechanism_t::process_handshake_command (msg_t *msg_) | |||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool zmq::plain_mechanism_t::is_handshake_complete () const | zmq::mechanism_t::status_t zmq::plain_mechanism_t::status () const | ||||||
| { | { | ||||||
|     return state == ready; |     return state == ready? mechanism_t::ready: mechanism_t::handshaking; | ||||||
| } | } | ||||||
|  |  | ||||||
| int zmq::plain_mechanism_t::zap_msg_available () | int zmq::plain_mechanism_t::zap_msg_available () | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ namespace zmq | |||||||
|         virtual int next_handshake_command (msg_t *msg_); |         virtual int next_handshake_command (msg_t *msg_); | ||||||
|         virtual int process_handshake_command (msg_t *msg_); |         virtual int process_handshake_command (msg_t *msg_); | ||||||
|         virtual int zap_msg_available (); |         virtual int zap_msg_available (); | ||||||
|         virtual bool is_handshake_complete () const; |         virtual status_t status () const; | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -670,17 +670,21 @@ int zmq::stream_engine_t::next_handshake_command (msg_t *msg_) | |||||||
| { | { | ||||||
|     zmq_assert (mechanism != NULL); |     zmq_assert (mechanism != NULL); | ||||||
|  |  | ||||||
|     const int rc = mechanism->next_handshake_command (msg_); |     if (mechanism->status () == mechanism_t::ready) { | ||||||
|     if (rc == 0) { |         mechanism_ready (); | ||||||
|         msg_->set_flags (msg_t::command); |         return pull_and_encode (msg_); | ||||||
|         if (mechanism->is_handshake_complete ()) |     } | ||||||
|             mechanism_ready (); |     else | ||||||
|  |     if (mechanism->status () == mechanism_t::error) { | ||||||
|  |         errno = EPROTO; | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         const int rc = mechanism->next_handshake_command (msg_); | ||||||
|  |         if (rc == 0) | ||||||
|  |             msg_->set_flags (msg_t::command); | ||||||
|  |         return rc; | ||||||
|     } |     } | ||||||
|     //  TODO: |  | ||||||
|     //  if (errno == EPROTO || errno == EACCES) |  | ||||||
|     //      return ERROR command to client |  | ||||||
|  |  | ||||||
|     return rc; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int zmq::stream_engine_t::process_handshake_command (msg_t *msg_) | int zmq::stream_engine_t::process_handshake_command (msg_t *msg_) | ||||||
| @@ -688,14 +692,16 @@ int zmq::stream_engine_t::process_handshake_command (msg_t *msg_) | |||||||
|     zmq_assert (mechanism != NULL); |     zmq_assert (mechanism != NULL); | ||||||
|     const int rc = mechanism->process_handshake_command (msg_); |     const int rc = mechanism->process_handshake_command (msg_); | ||||||
|     if (rc == 0) { |     if (rc == 0) { | ||||||
|         if (mechanism->is_handshake_complete ()) |         if (mechanism->status () == mechanism_t::ready) | ||||||
|             mechanism_ready (); |             mechanism_ready (); | ||||||
|  |         else | ||||||
|  |         if (mechanism->status () == mechanism_t::error) { | ||||||
|  |             errno = EPROTO; | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|         if (output_stopped) |         if (output_stopped) | ||||||
|             restart_output (); |             restart_output (); | ||||||
|     } |     } | ||||||
|     //  TODO: |  | ||||||
|     //  if (errno == EPROTO || errno == EACCES) |  | ||||||
|     //      return ERROR command to client |  | ||||||
|  |  | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Martin Hurton
					Martin Hurton