From da9c2c109ad9740177adfc93e5e92cba92c56134 Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Wed, 3 Jul 2013 12:35:27 -0700 Subject: Make connection the socket object owner Improve the socket interface by making the amqp_connection_state_t object the amqp_socket_t owner, and tie its lifetime to the connection's lifetime. This prevents a class of silly errors where the socket object isn't freed, or the socket object is assigned to two different connection objects --- librabbitmq/amqp_socket.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index 52815fe..e0a1b85 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -50,6 +50,7 @@ typedef int (*amqp_socket_open_fn)(void *, const char *, int); typedef int (*amqp_socket_close_fn)(void *); typedef int (*amqp_socket_error_fn)(void *); typedef int (*amqp_socket_get_sockfd_fn)(void *); +typedef void (*amqp_socket_delete_fn)(void *); /** V-table for amqp_socket_t */ struct amqp_socket_class_t { @@ -60,6 +61,7 @@ struct amqp_socket_class_t { amqp_socket_close_fn close; amqp_socket_error_fn error; amqp_socket_get_sockfd_fn get_sockfd; + amqp_socket_delete_fn delete; }; /** Abstract base class for amqp_socket_t */ @@ -127,6 +129,30 @@ amqp_socket_send(amqp_socket_t *self, const void *buf, size_t len); ssize_t amqp_socket_recv(amqp_socket_t *self, void *buf, size_t len, int flags); +/** + * Close a socket connection and free resources. + * + * This function closes a socket connection and releases any resources used by + * the object. After calling this function the specified socket should no + * longer be referenced. + * + * \param [in,out] self A socket object. + * + * \return Zero upon success, non-zero otherwise. + */ +AMQP_PUBLIC_FUNCTION +int +AMQP_CALL +amqp_socket_close(amqp_socket_t *self); + +/** + * Destroy a socket object + * + * \param [in] self the socket object to delete + */ +void +amqp_socket_delete(amqp_socket_t *self); + AMQP_END_DECLS #endif /* AMQP_SOCKET_H */ -- cgit v1.2.1 From 533a6c4415103548ad193b28cf7419ee852e3c6e Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Wed, 3 Jul 2013 12:43:53 -0700 Subject: Get rid of amqp_socket_error interface Get rid of experimental amqp_socket_error interface. Errors are returned using the error codes from the primary function --- librabbitmq/amqp_socket.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index e0a1b85..48910ec 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -48,7 +48,6 @@ typedef ssize_t (*amqp_socket_send_fn)(void *, const void *, size_t); typedef ssize_t (*amqp_socket_recv_fn)(void *, void *, size_t, int); typedef int (*amqp_socket_open_fn)(void *, const char *, int); typedef int (*amqp_socket_close_fn)(void *); -typedef int (*amqp_socket_error_fn)(void *); typedef int (*amqp_socket_get_sockfd_fn)(void *); typedef void (*amqp_socket_delete_fn)(void *); @@ -59,7 +58,6 @@ struct amqp_socket_class_t { amqp_socket_recv_fn recv; amqp_socket_open_fn open; amqp_socket_close_fn close; - amqp_socket_error_fn error; amqp_socket_get_sockfd_fn get_sockfd; amqp_socket_delete_fn delete; }; -- cgit v1.2.1 From 45dbc34b0e150d0dca2c6c0aa676a2053622c7a2 Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Wed, 3 Jul 2013 15:17:43 -0700 Subject: FIX: remove amqp_set_socket() from public API This should've been removed in da9c2c109a --- librabbitmq/amqp_socket.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index 48910ec..fed3947 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -78,6 +78,19 @@ struct iovec { }; #endif + +/** + * Set set the socket object for a connection + * + * This assigns a socket object to the connection, closing and deleting any + * existing socket + * + * \param [in] state The connection object to add the socket to + * \param [in] socket The socket object to assign to the connection + */ +void +amqp_set_socket(amqp_connection_state_t state, amqp_socket_t *socket); + /** * Write to a socket. * -- cgit v1.2.1 From 6ad770dc62f76fa0625d277b521a120b549d9fc2 Mon Sep 17 00:00:00 2001 From: zaq178miami Date: Sun, 23 Jun 2013 19:36:10 +0300 Subject: Add nonblocking connect support --- librabbitmq/amqp_socket.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index fed3947..b0a1805 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -46,7 +46,7 @@ amqp_os_socket_close(int sockfd); typedef ssize_t (*amqp_socket_writev_fn)(void *, struct iovec *, int); typedef ssize_t (*amqp_socket_send_fn)(void *, const void *, size_t); typedef ssize_t (*amqp_socket_recv_fn)(void *, void *, size_t, int); -typedef int (*amqp_socket_open_fn)(void *, const char *, int); +typedef int (*amqp_socket_open_fn)(void *, const char *, int, struct timeval *); typedef int (*amqp_socket_close_fn)(void *); typedef int (*amqp_socket_get_sockfd_fn)(void *); typedef void (*amqp_socket_delete_fn)(void *); @@ -164,6 +164,24 @@ amqp_socket_close(amqp_socket_t *self); void amqp_socket_delete(amqp_socket_t *self); +/** + * Open a socket connection. + * + * This function opens a socket connection returned from amqp_tcp_socket_new() + * or amqp_ssl_socket_new(). This function should be called after setting + * socket options and prior to assigning the socket to an AMQP connection with + * amqp_set_socket(). + * + * \param [in] host Connect to this host. + * \param [in] port Connect on this remote port. + * \param [in] timeout Max allowed time to spent on opening. If NULL - run in blocking mode + * + * \return File descriptor upon success, non-zero negative error code otherwise. + */ +int +amqp_open_socket_noblock(char const *hostname, int portnumber, struct timeval *timeout); + + AMQP_END_DECLS #endif /* AMQP_SOCKET_H */ -- cgit v1.2.1 From 33ebeede97a81c2e82ac0c3a6d88d4db0695bf29 Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Wed, 26 Jun 2013 14:23:16 -0700 Subject: Add a high level API for consuming messages --- librabbitmq/amqp_socket.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index b0a1805..1fd20f8 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -181,6 +181,13 @@ amqp_socket_delete(amqp_socket_t *self); int amqp_open_socket_noblock(char const *hostname, int portnumber, struct timeval *timeout); +int +amqp_queue_frame(amqp_connection_state_t state, amqp_frame_t *frame); + +int +amqp_simple_wait_frame_on_channel(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_frame_t *decoded_frame); AMQP_END_DECLS -- cgit v1.2.1 From be8aa696bc636aae735ea798feb976600da785fc Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Fri, 23 Aug 2013 12:38:47 -0700 Subject: amqp_socket_close() should not be a public fn --- librabbitmq/amqp_socket.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index 1fd20f8..b7af785 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -151,9 +151,7 @@ amqp_socket_recv(amqp_socket_t *self, void *buf, size_t len, int flags); * * \return Zero upon success, non-zero otherwise. */ -AMQP_PUBLIC_FUNCTION int -AMQP_CALL amqp_socket_close(amqp_socket_t *self); /** -- cgit v1.2.1 From ce64e57df8c9f7c53dc98a265513e15960d1841a Mon Sep 17 00:00:00 2001 From: Oleg Blednov Date: Thu, 31 Oct 2013 18:16:04 +0400 Subject: Right unexpected frames requeue in amqp_consumer.c --- librabbitmq/amqp_socket.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index b7af785..f8b6f51 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -182,6 +182,9 @@ amqp_open_socket_noblock(char const *hostname, int portnumber, struct timeval *t int amqp_queue_frame(amqp_connection_state_t state, amqp_frame_t *frame); +int +amqp_put_back_frame(amqp_connection_state_t state, amqp_frame_t *frame); + int amqp_simple_wait_frame_on_channel(amqp_connection_state_t state, amqp_channel_t channel, -- cgit v1.2.1 From c2ce2cb0f356a48c409a27bc228dc3ad7218e82f Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Sun, 13 Apr 2014 13:52:02 -0700 Subject: Mingw: specify WINVER 0x0502 when unspecified. WINVER 0x0502 is WinXP SP2 --- librabbitmq/amqp_socket.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'librabbitmq/amqp_socket.h') diff --git a/librabbitmq/amqp_socket.h b/librabbitmq/amqp_socket.h index f8b6f51..bdeea63 100644 --- a/librabbitmq/amqp_socket.h +++ b/librabbitmq/amqp_socket.h @@ -28,11 +28,7 @@ #ifndef AMQP_SOCKET_H #define AMQP_SOCKET_H -#include "amqp.h" - -#ifdef _WIN32 -# include -#endif +#include "amqp_private.h" AMQP_BEGIN_DECLS -- cgit v1.2.1