From de1fc43cc58ce6a02c6eeef7791328c44189aa7c Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 4 Mar 2019 16:27:39 -0800 Subject: [PATCH 01/10] added librabbitmq library for central controller --- controller/PostgreSQL.cpp | 1 + ext/librabbitmq/centos_x64/include/amqp.h | 2538 +++++++++++++++++ .../centos_x64/include/amqp_framing.h | 1144 ++++++++ .../centos_x64/include/amqp_tcp_socket.h | 68 + ext/librabbitmq/centos_x64/lib/librabbitmq.a | Bin 0 -> 134844 bytes make-linux.mk | 2 +- 6 files changed, 3752 insertions(+), 1 deletion(-) create mode 100644 ext/librabbitmq/centos_x64/include/amqp.h create mode 100644 ext/librabbitmq/centos_x64/include/amqp_framing.h create mode 100644 ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h create mode 100644 ext/librabbitmq/centos_x64/lib/librabbitmq.a diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 6165d8c49..9eb64800d 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -32,6 +32,7 @@ #include #include +#include using json = nlohmann::json; namespace { diff --git a/ext/librabbitmq/centos_x64/include/amqp.h b/ext/librabbitmq/centos_x64/include/amqp.h new file mode 100644 index 000000000..2983b1665 --- /dev/null +++ b/ext/librabbitmq/centos_x64/include/amqp.h @@ -0,0 +1,2538 @@ +/** \file */ +/* + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by Alan Antonuk are Copyright (c) 2012-2014 + * Alan Antonuk. All Rights Reserved. + * + * Portions created by VMware are Copyright (c) 2007-2012 VMware, Inc. + * All Rights Reserved. + * + * Portions created by Tony Garnock-Jones are Copyright (c) 2009-2010 + * VMware, Inc. and Tony Garnock-Jones. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ***** END LICENSE BLOCK ***** + */ + +#ifndef AMQP_H +#define AMQP_H + +/** \cond HIDE_FROM_DOXYGEN */ + +#ifdef __cplusplus +#define AMQP_BEGIN_DECLS extern "C" { +#define AMQP_END_DECLS } +#else +#define AMQP_BEGIN_DECLS +#define AMQP_END_DECLS +#endif + +/* + * \internal + * Important API decorators: + * AMQP_PUBLIC_FUNCTION - a public API function + * AMQP_PUBLIC_VARIABLE - a public API external variable + * AMQP_CALL - calling convension (used on Win32) + */ + +#if defined(_WIN32) && defined(_MSC_VER) +#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) +#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) +#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern +#else +#define AMQP_PUBLIC_FUNCTION +#if !defined(AMQP_STATIC) +#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern +#else +#define AMQP_PUBLIC_VARIABLE extern +#endif +#endif +#define AMQP_CALL __cdecl + +#elif defined(_WIN32) && defined(__BORLANDC__) +#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) +#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) +#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern +#else +#define AMQP_PUBLIC_FUNCTION +#if !defined(AMQP_STATIC) +#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern +#else +#define AMQP_PUBLIC_VARIABLE extern +#endif +#endif +#define AMQP_CALL __cdecl + +#elif defined(_WIN32) && defined(__MINGW32__) +#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) +#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) +#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) extern +#else +#define AMQP_PUBLIC_FUNCTION +#if !defined(AMQP_STATIC) +#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern +#else +#define AMQP_PUBLIC_VARIABLE extern +#endif +#endif +#define AMQP_CALL __cdecl + +#elif defined(_WIN32) && defined(__CYGWIN__) +#if defined(AMQP_BUILD) && !defined(AMQP_STATIC) +#define AMQP_PUBLIC_FUNCTION __declspec(dllexport) +#define AMQP_PUBLIC_VARIABLE __declspec(dllexport) +#else +#define AMQP_PUBLIC_FUNCTION +#if !defined(AMQP_STATIC) +#define AMQP_PUBLIC_VARIABLE __declspec(dllimport) extern +#else +#define AMQP_PUBLIC_VARIABLE extern +#endif +#endif +#define AMQP_CALL __cdecl + +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define AMQP_PUBLIC_FUNCTION __attribute__((visibility("default"))) +#define AMQP_PUBLIC_VARIABLE __attribute__((visibility("default"))) extern +#define AMQP_CALL +#else +#define AMQP_PUBLIC_FUNCTION +#define AMQP_PUBLIC_VARIABLE extern +#define AMQP_CALL +#endif + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +#define AMQP_DEPRECATED(function) function __attribute__((__deprecated__)) +#elif defined(_MSC_VER) +#define AMQP_DEPRECATED(function) __declspec(deprecated) function +#else +#define AMQP_DEPRECATED(function) +#endif + +/* Define ssize_t on Win32/64 platforms + See: http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-April/030649.html for + details + */ +#if !defined(_W64) +#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +#define _W64 __w64 +#else +#define _W64 +#endif +#endif + +#ifdef _MSC_VER +#ifdef _WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#endif + +#if defined(_WIN32) && defined(__MINGW32__) +#include +#endif + +/** \endcond */ + +#include +#include + +struct timeval; + +AMQP_BEGIN_DECLS + +/** + * \def AMQP_VERSION_MAJOR + * + * Major library version number compile-time constant + * + * The major version is incremented when backwards incompatible API changes + * are made. + * + * \sa AMQP_VERSION, AMQP_VERSION_STRING + * + * \since v0.4.0 + */ + +/** + * \def AMQP_VERSION_MINOR + * + * Minor library version number compile-time constant + * + * The minor version is incremented when new APIs are added. Existing APIs + * are left alone. + * + * \sa AMQP_VERSION, AMQP_VERSION_STRING + * + * \since v0.4.0 + */ + +/** + * \def AMQP_VERSION_PATCH + * + * Patch library version number compile-time constant + * + * The patch version is incremented when library code changes, but the API + * is not changed. + * + * \sa AMQP_VERSION, AMQP_VERSION_STRING + * + * \since v0.4.0 + */ + +/** + * \def AMQP_VERSION_IS_RELEASE + * + * Version constant set to 1 for tagged release, 0 otherwise + * + * NOTE: versions that are not tagged releases are not guaranteed to be API/ABI + * compatible with older releases, and may change commit-to-commit. + * + * \sa AMQP_VERSION, AMQP_VERSION_STRING + * + * \since v0.4.0 + */ +/* + * Developer note: when changing these, be sure to update SOVERSION constants + * in CMakeLists.txt and configure.ac + */ + +#define AMQP_VERSION_MAJOR 0 +#define AMQP_VERSION_MINOR 10 +#define AMQP_VERSION_PATCH 0 +#define AMQP_VERSION_IS_RELEASE 0 + +/** + * \def AMQP_VERSION_CODE + * + * Helper macro to geneate a packed version code suitable for + * comparison with AMQP_VERSION. + * + * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, + * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION + * + * \since v0.6.1 + */ +#define AMQP_VERSION_CODE(major, minor, patch, release) \ + ((major << 24) | (minor << 16) | (patch << 8) | (release)) + +/** + * \def AMQP_VERSION + * + * Packed version number + * + * AMQP_VERSION is a 4-byte unsigned integer with the most significant byte + * set to AMQP_VERSION_MAJOR, the second most significant byte set to + * AMQP_VERSION_MINOR, third most significant byte set to AMQP_VERSION_PATCH, + * and the lowest byte set to AMQP_VERSION_IS_RELEASE. + * + * For example version 2.3.4 which is released version would be encoded as + * 0x02030401 + * + * \sa amqp_version_number() AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, + * AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE, AMQP_VERSION_CODE + * + * \since v0.4.0 + */ +#define AMQP_VERSION \ + AMQP_VERSION_CODE(AMQP_VERSION_MAJOR, AMQP_VERSION_MINOR, \ + AMQP_VERSION_PATCH, AMQP_VERSION_IS_RELEASE) + +/** \cond HIDE_FROM_DOXYGEN */ +#define AMQ_STRINGIFY(s) AMQ_STRINGIFY_HELPER(s) +#define AMQ_STRINGIFY_HELPER(s) #s + +#define AMQ_VERSION_STRING \ + AMQ_STRINGIFY(AMQP_VERSION_MAJOR) \ + "." AMQ_STRINGIFY(AMQP_VERSION_MINOR) "." AMQ_STRINGIFY(AMQP_VERSION_PATCH) +/** \endcond */ + +/** + * \def AMQP_VERSION_STRING + * + * Version string compile-time constant + * + * Non-released versions of the library will have "-pre" appended to the + * version string + * + * \sa amqp_version() + * + * \since v0.4.0 + */ +#if AMQP_VERSION_IS_RELEASE +#define AMQP_VERSION_STRING AMQ_VERSION_STRING +#else +#define AMQP_VERSION_STRING AMQ_VERSION_STRING "-pre" +#endif + +/** + * Returns the rabbitmq-c version as a packed integer. + * + * See \ref AMQP_VERSION + * + * \return packed 32-bit integer representing version of library at runtime + * + * \sa AMQP_VERSION, amqp_version() + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +uint32_t AMQP_CALL amqp_version_number(void); + +/** + * Returns the rabbitmq-c version as a string. + * + * See \ref AMQP_VERSION_STRING + * + * \return a statically allocated string describing the version of rabbitmq-c. + * + * \sa amqp_version_number(), AMQP_VERSION_STRING, AMQP_VERSION + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +char const *AMQP_CALL amqp_version(void); + +/** + * \def AMQP_DEFAULT_FRAME_SIZE + * + * Default frame size (128Kb) + * + * \sa amqp_login(), amqp_login_with_properties() + * + * \since v0.4.0 + */ +#define AMQP_DEFAULT_FRAME_SIZE 131072 + +/** + * \def AMQP_DEFAULT_MAX_CHANNELS + * + * Default maximum number of channels (2047, RabbitMQ default limit of 2048, + * minus 1 for channel 0). RabbitMQ set a default limit of 2048 channels per + * connection in v3.7.5 to prevent broken clients from leaking too many + * channels. + * + * \sa amqp_login(), amqp_login_with_properties() + * + * \since v0.4.0 + */ +#define AMQP_DEFAULT_MAX_CHANNELS 2047 + +/** + * \def AMQP_DEFAULT_HEARTBEAT + * + * Default heartbeat interval (0, heartbeat disabled) + * + * \sa amqp_login(), amqp_login_with_properties() + * + * \since v0.4.0 + */ +#define AMQP_DEFAULT_HEARTBEAT 0 + +/** + * \def AMQP_DEFAULT_VHOST + * + * Default RabbitMQ vhost: "/" + * + * \sa amqp_login(), amqp_login_with_properties() + * + * \since v0.9.0 + */ +#define AMQP_DEFAULT_VHOST "/" + +/** + * boolean type 0 = false, true otherwise + * + * \since v0.1 + */ +typedef int amqp_boolean_t; + +/** + * Method number + * + * \since v0.1 + */ +typedef uint32_t amqp_method_number_t; + +/** + * Bitmask for flags + * + * \since v0.1 + */ +typedef uint32_t amqp_flags_t; + +/** + * Channel type + * + * \since v0.1 + */ +typedef uint16_t amqp_channel_t; + +/** + * Buffer descriptor + * + * \since v0.1 + */ +typedef struct amqp_bytes_t_ { + size_t len; /**< length of the buffer in bytes */ + void *bytes; /**< pointer to the beginning of the buffer */ +} amqp_bytes_t; + +/** + * Decimal data type + * + * \since v0.1 + */ +typedef struct amqp_decimal_t_ { + uint8_t decimals; /**< the location of the decimal point */ + uint32_t value; /**< the value before the decimal point is applied */ +} amqp_decimal_t; + +/** + * AMQP field table + * + * An AMQP field table is a set of key-value pairs. + * A key is a UTF-8 encoded string up to 128 bytes long, and are not null + * terminated. + * A value can be one of several different datatypes. \sa + * amqp_field_value_kind_t + * + * \sa amqp_table_entry_t + * + * \since v0.1 + */ +typedef struct amqp_table_t_ { + int num_entries; /**< length of entries array */ + struct amqp_table_entry_t_ *entries; /**< an array of table entries */ +} amqp_table_t; + +/** + * An AMQP Field Array + * + * A repeated set of field values, all must be of the same type + * + * \since v0.1 + */ +typedef struct amqp_array_t_ { + int num_entries; /**< Number of entries in the table */ + struct amqp_field_value_t_ *entries; /**< linked list of field values */ +} amqp_array_t; + +/* + 0-9 0-9-1 Qpid/Rabbit Type Remarks +--------------------------------------------------------------------------- + t t Boolean + b b Signed 8-bit + B Unsigned 8-bit + U s Signed 16-bit (A1) + u Unsigned 16-bit + I I I Signed 32-bit + i Unsigned 32-bit + L l Signed 64-bit (B) + l Unsigned 64-bit + f f 32-bit float + d d 64-bit float + D D D Decimal + s Short string (A2) + S S S Long string + A Nested Array + T T T Timestamp (u64) + F F F Nested Table + V V V Void + x Byte array + +Remarks: + + A1, A2: Notice how the types **CONFLICT** here. In Qpid and Rabbit, + 's' means a signed 16-bit integer; in 0-9-1, it means a + short string. + + B: Notice how the signednesses **CONFLICT** here. In Qpid and Rabbit, + 'l' means a signed 64-bit integer; in 0-9-1, it means an unsigned + 64-bit integer. + +I'm going with the Qpid/Rabbit types, where there's a conflict, and +the 0-9-1 types otherwise. 0-8 is a subset of 0-9, which is a subset +of the other two, so this will work for both 0-8 and 0-9-1 branches of +the code. +*/ + +/** + * A field table value + * + * \since v0.1 + */ +typedef struct amqp_field_value_t_ { + uint8_t kind; /**< the type of the entry /sa amqp_field_value_kind_t */ + union { + amqp_boolean_t boolean; /**< boolean type AMQP_FIELD_KIND_BOOLEAN */ + int8_t i8; /**< int8_t type AMQP_FIELD_KIND_I8 */ + uint8_t u8; /**< uint8_t type AMQP_FIELD_KIND_U8 */ + int16_t i16; /**< int16_t type AMQP_FIELD_KIND_I16 */ + uint16_t u16; /**< uint16_t type AMQP_FIELD_KIND_U16 */ + int32_t i32; /**< int32_t type AMQP_FIELD_KIND_I32 */ + uint32_t u32; /**< uint32_t type AMQP_FIELD_KIND_U32 */ + int64_t i64; /**< int64_t type AMQP_FIELD_KIND_I64 */ + uint64_t u64; /**< uint64_t type AMQP_FIELD_KIND_U64, + AMQP_FIELD_KIND_TIMESTAMP */ + float f32; /**< float type AMQP_FIELD_KIND_F32 */ + double f64; /**< double type AMQP_FIELD_KIND_F64 */ + amqp_decimal_t decimal; /**< amqp_decimal_t AMQP_FIELD_KIND_DECIMAL */ + amqp_bytes_t bytes; /**< amqp_bytes_t type AMQP_FIELD_KIND_UTF8, + AMQP_FIELD_KIND_BYTES */ + amqp_table_t table; /**< amqp_table_t type AMQP_FIELD_KIND_TABLE */ + amqp_array_t array; /**< amqp_array_t type AMQP_FIELD_KIND_ARRAY */ + } value; /**< a union of the value */ +} amqp_field_value_t; + +/** + * An entry in a field-table + * + * \sa amqp_table_encode(), amqp_table_decode(), amqp_table_clone() + * + * \since v0.1 + */ +typedef struct amqp_table_entry_t_ { + amqp_bytes_t key; /**< the table entry key. Its a null-terminated UTF-8 + * string, with a maximum size of 128 bytes */ + amqp_field_value_t value; /**< the table entry values */ +} amqp_table_entry_t; + +/** + * Field value types + * + * \since v0.1 + */ +typedef enum { + AMQP_FIELD_KIND_BOOLEAN = + 't', /**< boolean type. 0 = false, 1 = true @see amqp_boolean_t */ + AMQP_FIELD_KIND_I8 = 'b', /**< 8-bit signed integer, datatype: int8_t */ + AMQP_FIELD_KIND_U8 = 'B', /**< 8-bit unsigned integer, datatype: uint8_t */ + AMQP_FIELD_KIND_I16 = 's', /**< 16-bit signed integer, datatype: int16_t */ + AMQP_FIELD_KIND_U16 = 'u', /**< 16-bit unsigned integer, datatype: uint16_t */ + AMQP_FIELD_KIND_I32 = 'I', /**< 32-bit signed integer, datatype: int32_t */ + AMQP_FIELD_KIND_U32 = 'i', /**< 32-bit unsigned integer, datatype: uint32_t */ + AMQP_FIELD_KIND_I64 = 'l', /**< 64-bit signed integer, datatype: int64_t */ + AMQP_FIELD_KIND_U64 = 'L', /**< 64-bit unsigned integer, datatype: uint64_t */ + AMQP_FIELD_KIND_F32 = + 'f', /**< single-precision floating point value, datatype: float */ + AMQP_FIELD_KIND_F64 = + 'd', /**< double-precision floating point value, datatype: double */ + AMQP_FIELD_KIND_DECIMAL = + 'D', /**< amqp-decimal value, datatype: amqp_decimal_t */ + AMQP_FIELD_KIND_UTF8 = 'S', /**< UTF-8 null-terminated character string, + datatype: amqp_bytes_t */ + AMQP_FIELD_KIND_ARRAY = 'A', /**< field array (repeated values of another + datatype. datatype: amqp_array_t */ + AMQP_FIELD_KIND_TIMESTAMP = 'T', /**< 64-bit timestamp. datatype uint64_t */ + AMQP_FIELD_KIND_TABLE = 'F', /**< field table. encapsulates a table inside a + table entry. datatype: amqp_table_t */ + AMQP_FIELD_KIND_VOID = 'V', /**< empty entry */ + AMQP_FIELD_KIND_BYTES = + 'x' /**< unformatted byte string, datatype: amqp_bytes_t */ +} amqp_field_value_kind_t; + +/** + * A list of allocation blocks + * + * \since v0.1 + */ +typedef struct amqp_pool_blocklist_t_ { + int num_blocks; /**< Number of blocks in the block list */ + void **blocklist; /**< Array of memory blocks */ +} amqp_pool_blocklist_t; + +/** + * A memory pool + * + * \since v0.1 + */ +typedef struct amqp_pool_t_ { + size_t pagesize; /**< the size of the page in bytes. Allocations less than or + * equal to this size are allocated in the pages block list. + * Allocations greater than this are allocated in their own + * own block in the large_blocks block list */ + + amqp_pool_blocklist_t pages; /**< blocks that are the size of pagesize */ + amqp_pool_blocklist_t + large_blocks; /**< allocations larger than the pagesize */ + + int next_page; /**< an index to the next unused page block */ + char *alloc_block; /**< pointer to the current allocation block */ + size_t alloc_used; /**< number of bytes in the current allocation block that + has been used */ +} amqp_pool_t; + +/** + * An amqp method + * + * \since v0.1 + */ +typedef struct amqp_method_t_ { + amqp_method_number_t id; /**< the method id number */ + void *decoded; /**< pointer to the decoded method, + * cast to the appropriate type to use */ +} amqp_method_t; + +/** + * An AMQP frame + * + * \since v0.1 + */ +typedef struct amqp_frame_t_ { + uint8_t frame_type; /**< frame type. The types: + * - AMQP_FRAME_METHOD - use the method union member + * - AMQP_FRAME_HEADER - use the properties union member + * - AMQP_FRAME_BODY - use the body_fragment union member + */ + amqp_channel_t channel; /**< the channel the frame was received on */ + union { + amqp_method_t + method; /**< a method, use if frame_type == AMQP_FRAME_METHOD */ + struct { + uint16_t class_id; /**< the class for the properties */ + uint64_t body_size; /**< size of the body in bytes */ + void *decoded; /**< the decoded properties */ + amqp_bytes_t raw; /**< amqp-encoded properties structure */ + } properties; /**< message header, a.k.a., properties, + use if frame_type == AMQP_FRAME_HEADER */ + amqp_bytes_t body_fragment; /**< a body fragment, use if frame_type == + AMQP_FRAME_BODY */ + struct { + uint8_t transport_high; /**< @internal first byte of handshake */ + uint8_t transport_low; /**< @internal second byte of handshake */ + uint8_t protocol_version_major; /**< @internal third byte of handshake */ + uint8_t protocol_version_minor; /**< @internal fourth byte of handshake */ + } protocol_header; /**< Used only when doing the initial handshake with the + broker, don't use otherwise */ + } payload; /**< the payload of the frame */ +} amqp_frame_t; + +/** + * Response type + * + * \since v0.1 + */ +typedef enum amqp_response_type_enum_ { + AMQP_RESPONSE_NONE = 0, /**< the library got an EOF from the socket */ + AMQP_RESPONSE_NORMAL, /**< response normal, the RPC completed successfully */ + AMQP_RESPONSE_LIBRARY_EXCEPTION, /**< library error, an error occurred in the + library, examine the library_error */ + AMQP_RESPONSE_SERVER_EXCEPTION /**< server exception, the broker returned an + error, check replay */ +} amqp_response_type_enum; + +/** + * Reply from a RPC method on the broker + * + * \since v0.1 + */ +typedef struct amqp_rpc_reply_t_ { + amqp_response_type_enum reply_type; /**< the reply type: + * - AMQP_RESPONSE_NORMAL - the RPC + * completed successfully + * - AMQP_RESPONSE_SERVER_EXCEPTION - the + * broker returned + * an exception, check the reply field + * - AMQP_RESPONSE_LIBRARY_EXCEPTION - the + * library + * encountered an error, check the + * library_error field + */ + amqp_method_t reply; /**< in case of AMQP_RESPONSE_SERVER_EXCEPTION this + * field will be set to the method returned from the + * broker */ + int library_error; /**< in case of AMQP_RESPONSE_LIBRARY_EXCEPTION this + * field will be set to an error code. An error + * string can be retrieved using amqp_error_string */ +} amqp_rpc_reply_t; + +/** + * SASL method type + * + * \since v0.1 + */ +typedef enum amqp_sasl_method_enum_ { + AMQP_SASL_METHOD_UNDEFINED = -1, /**< Invalid SASL method */ + AMQP_SASL_METHOD_PLAIN = + 0, /**< the PLAIN SASL method for authentication to the broker */ + AMQP_SASL_METHOD_EXTERNAL = + 1 /**< the EXTERNAL SASL method for authentication to the broker */ +} amqp_sasl_method_enum; + +/** + * connection state object + * + * \since v0.1 + */ +typedef struct amqp_connection_state_t_ *amqp_connection_state_t; + +/** + * Socket object + * + * \since v0.4.0 + */ +typedef struct amqp_socket_t_ amqp_socket_t; + +/** + * Status codes + * + * \since v0.4.0 + */ +/* NOTE: When updating this enum, update the strings in librabbitmq/amqp_api.c + */ +typedef enum amqp_status_enum_ { + AMQP_STATUS_OK = 0x0, /**< Operation successful */ + AMQP_STATUS_NO_MEMORY = -0x0001, /**< Memory allocation + failed */ + AMQP_STATUS_BAD_AMQP_DATA = -0x0002, /**< Incorrect or corrupt + data was received from + the broker. This is a + protocol error. */ + AMQP_STATUS_UNKNOWN_CLASS = -0x0003, /**< An unknown AMQP class + was received. This is + a protocol error. */ + AMQP_STATUS_UNKNOWN_METHOD = -0x0004, /**< An unknown AMQP method + was received. This is + a protocol error. */ + AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED = -0x0005, /**< Unable to resolve the + * hostname */ + AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION = -0x0006, /**< The broker advertised + an incompaible AMQP + version */ + AMQP_STATUS_CONNECTION_CLOSED = -0x0007, /**< The connection to the + broker has been closed + */ + AMQP_STATUS_BAD_URL = -0x0008, /**< malformed AMQP URL */ + AMQP_STATUS_SOCKET_ERROR = -0x0009, /**< A socket error + occurred */ + AMQP_STATUS_INVALID_PARAMETER = -0x000A, /**< An invalid parameter + was passed into the + function */ + AMQP_STATUS_TABLE_TOO_BIG = -0x000B, /**< The amqp_table_t object + cannot be serialized + because the output + buffer is too small */ + AMQP_STATUS_WRONG_METHOD = -0x000C, /**< The wrong method was + received */ + AMQP_STATUS_TIMEOUT = -0x000D, /**< Operation timed out */ + AMQP_STATUS_TIMER_FAILURE = -0x000E, /**< The underlying system + timer facility failed */ + AMQP_STATUS_HEARTBEAT_TIMEOUT = -0x000F, /**< Timed out waiting for + heartbeat */ + AMQP_STATUS_UNEXPECTED_STATE = -0x0010, /**< Unexpected protocol + state */ + AMQP_STATUS_SOCKET_CLOSED = -0x0011, /**< Underlying socket is + closed */ + AMQP_STATUS_SOCKET_INUSE = -0x0012, /**< Underlying socket is + already open */ + AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD = -0x0013, /**< Broker does not + support the requested + SASL mechanism */ + AMQP_STATUS_UNSUPPORTED = -0x0014, /**< Parameter is unsupported + in this version */ + _AMQP_STATUS_NEXT_VALUE = -0x0015, /**< Internal value */ + + AMQP_STATUS_TCP_ERROR = -0x0100, /**< A generic TCP error + occurred */ + AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR = -0x0101, /**< An error occurred trying + to initialize the + socket library*/ + _AMQP_STATUS_TCP_NEXT_VALUE = -0x0102, /**< Internal value */ + + AMQP_STATUS_SSL_ERROR = -0x0200, /**< A generic SSL error + occurred. */ + AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED = -0x0201, /**< SSL validation of + hostname against + peer certificate + failed */ + AMQP_STATUS_SSL_PEER_VERIFY_FAILED = -0x0202, /**< SSL validation of peer + certificate failed. */ + AMQP_STATUS_SSL_CONNECTION_FAILED = -0x0203, /**< SSL handshake failed. */ + _AMQP_STATUS_SSL_NEXT_VALUE = -0x0204 /**< Internal value */ +} amqp_status_enum; + +/** + * AMQP delivery modes. + * Use these values for the #amqp_basic_properties_t::delivery_mode field. + * + * \since v0.5 + */ +typedef enum { + AMQP_DELIVERY_NONPERSISTENT = 1, /**< Non-persistent message */ + AMQP_DELIVERY_PERSISTENT = 2 /**< Persistent message */ +} amqp_delivery_mode_enum; + +AMQP_END_DECLS + +#include + +AMQP_BEGIN_DECLS + +/** + * Empty bytes structure + * + * \since v0.2 + */ +AMQP_PUBLIC_VARIABLE const amqp_bytes_t amqp_empty_bytes; + +/** + * Empty table structure + * + * \since v0.2 + */ +AMQP_PUBLIC_VARIABLE const amqp_table_t amqp_empty_table; + +/** + * Empty table array structure + * + * \since v0.2 + */ +AMQP_PUBLIC_VARIABLE const amqp_array_t amqp_empty_array; + +/* Compatibility macros for the above, to avoid the need to update + code written against earlier versions of librabbitmq. */ + +/** + * \def AMQP_EMPTY_BYTES + * + * Deprecated, use \ref amqp_empty_bytes instead + * + * \deprecated use \ref amqp_empty_bytes instead + * + * \since v0.1 + */ +#define AMQP_EMPTY_BYTES amqp_empty_bytes + +/** + * \def AMQP_EMPTY_TABLE + * + * Deprecated, use \ref amqp_empty_table instead + * + * \deprecated use \ref amqp_empty_table instead + * + * \since v0.1 + */ +#define AMQP_EMPTY_TABLE amqp_empty_table + +/** + * \def AMQP_EMPTY_ARRAY + * + * Deprecated, use \ref amqp_empty_array instead + * + * \deprecated use \ref amqp_empty_array instead + * + * \since v0.1 + */ +#define AMQP_EMPTY_ARRAY amqp_empty_array + +/** + * Initializes an amqp_pool_t memory allocation pool for use + * + * Readies an allocation pool for use. An amqp_pool_t + * must be initialized before use + * + * \param [in] pool the amqp_pool_t structure to initialize. + * Calling this function on a pool a pool that has + * already been initialized will result in undefined + * behavior + * \param [in] pagesize the unit size that the pool will allocate + * memory chunks in. Anything allocated against the pool + * with a requested size will be carved out of a block + * this size. Allocations larger than this will be + * allocated individually + * + * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), + * amqp_pool_alloc_bytes(), amqp_pool_t + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL init_amqp_pool(amqp_pool_t *pool, size_t pagesize); + +/** + * Recycles an amqp_pool_t memory allocation pool + * + * Recycles the space allocate by the pool + * + * This invalidates all allocations made against the pool before this call is + * made, any use of any allocations made before recycle_amqp_pool() is called + * will result in undefined behavior. + * + * Note: this may or may not release memory, to force memory to be released + * call empty_amqp_pool(). + * + * \param [in] pool the amqp_pool_t to recycle + * + * \sa recycle_amqp_pool(), empty_amqp_pool(), amqp_pool_alloc(), + * amqp_pool_alloc_bytes() + * + * \since v0.1 + * + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL recycle_amqp_pool(amqp_pool_t *pool); + +/** + * Empties an amqp memory pool + * + * Releases all memory associated with an allocation pool + * + * \param [in] pool the amqp_pool_t to empty + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL empty_amqp_pool(amqp_pool_t *pool); + +/** + * Allocates a block of memory from an amqp_pool_t memory pool + * + * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is + * requested, a NULL pointer will be returned. + * + * \param [in] pool the allocation pool to allocate the memory from + * \param [in] amount the size of the allocation in bytes. + * \return a pointer to the memory block, or NULL if the allocation cannot + * be satisfied. + * + * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), + * amqp_pool_alloc_bytes() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void *AMQP_CALL amqp_pool_alloc(amqp_pool_t *pool, size_t amount); + +/** + * Allocates a block of memory from an amqp_pool_t to an amqp_bytes_t + * + * Memory will be aligned on a 8-byte boundary. If a 0-length allocation is + * requested, output.bytes = NULL. + * + * \param [in] pool the allocation pool to allocate the memory from + * \param [in] amount the size of the allocation in bytes + * \param [in] output the location to store the pointer. On success + * output.bytes will be set to the beginning of the buffer + * output.len will be set to amount + * On error output.bytes will be set to NULL and output.len + * set to 0 + * + * \sa init_amqp_pool(), recycle_amqp_pool(), empty_amqp_pool(), + * amqp_pool_alloc() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_pool_alloc_bytes(amqp_pool_t *pool, size_t amount, + amqp_bytes_t *output); + +/** + * Wraps a c string in an amqp_bytes_t + * + * Takes a string, calculates its length and creates an + * amqp_bytes_t that points to it. The string is not duplicated. + * + * For a given input cstr, The amqp_bytes_t output.bytes is the + * same as cstr, output.len is the length of the string not including + * the \0 terminator + * + * This function uses strlen() internally so cstr must be properly + * terminated + * + * \param [in] cstr the c string to wrap + * \return an amqp_bytes_t that describes the string + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_bytes_t AMQP_CALL amqp_cstring_bytes(char const *cstr); + +/** + * Duplicates an amqp_bytes_t buffer. + * + * The buffer is cloned and the contents copied. + * + * The memory associated with the output is allocated + * with amqp_bytes_malloc() and should be freed with + * amqp_bytes_free() + * + * \param [in] src + * \return a clone of the src + * + * \sa amqp_bytes_free(), amqp_bytes_malloc() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_bytes_t AMQP_CALL amqp_bytes_malloc_dup(amqp_bytes_t src); + +/** + * Allocates a amqp_bytes_t buffer + * + * Creates an amqp_bytes_t buffer of the specified amount, the buffer should be + * freed using amqp_bytes_free() + * + * \param [in] amount the size of the buffer in bytes + * \returns an amqp_bytes_t with amount bytes allocated. + * output.bytes will be set to NULL on error + * + * \sa amqp_bytes_free(), amqp_bytes_malloc_dup() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_bytes_t AMQP_CALL amqp_bytes_malloc(size_t amount); + +/** + * Frees an amqp_bytes_t buffer + * + * Frees a buffer allocated with amqp_bytes_malloc() or amqp_bytes_malloc_dup() + * + * Calling amqp_bytes_free on buffers not allocated with one + * of those two functions will result in undefined behavior + * + * \param [in] bytes the buffer to free + * + * \sa amqp_bytes_malloc(), amqp_bytes_malloc_dup() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_bytes_free(amqp_bytes_t bytes); + +/** + * Allocate and initialize a new amqp_connection_state_t object + * + * amqp_connection_state_t objects created with this function + * should be freed with amqp_destroy_connection() + * + * \returns an opaque pointer on success, NULL or 0 on failure. + * + * \sa amqp_destroy_connection() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_connection_state_t AMQP_CALL amqp_new_connection(void); + +/** + * Get the underlying socket descriptor for the connection + * + * \warning Use the socket returned from this function carefully, incorrect use + * of the socket outside of the library will lead to undefined behavior. + * Additionally rabbitmq-c may use the socket differently version-to-version, + * what may work in one version, may break in the next version. Be sure to + * throughly test any applications that use the socket returned by this + * function especially when using a newer version of rabbitmq-c + * + * \param [in] state the connection object + * \returns the socket descriptor if one has been set, -1 otherwise + * + * \sa amqp_tcp_socket_new(), amqp_ssl_socket_new(), amqp_socket_open() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_get_sockfd(amqp_connection_state_t state); + +/** + * Deprecated, use amqp_tcp_socket_new() or amqp_ssl_socket_new() + * + * \deprecated Use amqp_tcp_socket_new() or amqp_ssl_socket_new() + * + * Sets the socket descriptor associated with the connection. The socket + * should be connected to a broker, and should not be read to or written from + * before calling this function. A socket descriptor can be created and opened + * using amqp_open_socket() + * + * \param [in] state the connection object + * \param [in] sockfd the socket + * + * \sa amqp_open_socket(), amqp_tcp_socket_new(), amqp_ssl_socket_new() + * + * \since v0.1 + */ +AMQP_DEPRECATED(AMQP_PUBLIC_FUNCTION void AMQP_CALL + amqp_set_sockfd(amqp_connection_state_t state, int sockfd)); + +/** + * Tune client side parameters + * + * \warning This function may call abort() if the connection is in a certain + * state. As such it should probably not be called code outside the library. + * connection parameters should be specified when calling amqp_login() or + * amqp_login_with_properties() + * + * This function changes channel_max, frame_max, and heartbeat parameters, on + * the client side only. It does not try to renegotiate these parameters with + * the broker. Using this function will lead to unexpected results. + * + * \param [in] state the connection object + * \param [in] channel_max the maximum number of channels. + * The largest this can be is 65535 + * \param [in] frame_max the maximum size of an frame. + * The smallest this can be is 4096 + * The largest this can be is 2147483647 + * Unless you know what you're doing the recommended + * size is 131072 or 128KB + * \param [in] heartbeat the number of seconds between heartbeats + * + * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. + * Possible error codes include: + * - AMQP_STATUS_NO_MEMORY memory allocation failed. + * - AMQP_STATUS_TIMER_FAILURE the underlying system timer indicated it + * failed. + * + * \sa amqp_login(), amqp_login_with_properties() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_tune_connection(amqp_connection_state_t state, + int channel_max, int frame_max, + int heartbeat); + +/** + * Get the maximum number of channels the connection can handle + * + * The maximum number of channels is set when connection negotiation takes + * place in amqp_login() or amqp_login_with_properties(). + * + * \param [in] state the connection object + * \return the maximum number of channels. 0 if there is no limit + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_get_channel_max(amqp_connection_state_t state); + +/** + * Get the maximum size of an frame the connection can handle + * + * The maximum size of an frame is set when connection negotiation takes + * place in amqp_login() or amqp_login_with_properties(). + * + * \param [in] state the connection object + * \return the maximum size of an frame. + * + * \since v0.6 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_get_frame_max(amqp_connection_state_t state); + +/** + * Get the number of seconds between heartbeats of the connection + * + * The number of seconds between heartbeats is set when connection + * negotiation takes place in amqp_login() or amqp_login_with_properties(). + * + * \param [in] state the connection object + * \return the number of seconds between heartbeats. + * + * \since v0.6 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_get_heartbeat(amqp_connection_state_t state); + +/** + * Destroys an amqp_connection_state_t object + * + * Destroys a amqp_connection_state_t object that was created with + * amqp_new_connection(). If the connection with the broker is open, it will be + * implicitly closed with a reply code of 200 (success). Any memory that + * would be freed with amqp_maybe_release_buffers() or + * amqp_maybe_release_buffers_on_channel() will be freed, and use of that + * memory will caused undefined behavior. + * + * \param [in] state the connection object + * \return AMQP_STATUS_OK on success. amqp_status_enum value failure + * + * \sa amqp_new_connection() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_destroy_connection(amqp_connection_state_t state); + +/** + * Process incoming data + * + * \warning This is a low-level function intended for those who want to + * have greater control over input and output over the socket from the + * broker. Correctly using this function requires in-depth knowledge of AMQP + * and rabbitmq-c. + * + * For a given buffer of data received from the broker, decode the first + * frame in the buffer. If more than one frame is contained in the input buffer + * the return value will be less than the received_data size, the caller should + * adjust received_data buffer descriptor to point to the beginning of the + * buffer + the return value. + * + * \param [in] state the connection object + * \param [in] received_data a buffer of data received from the broker. The + * function will return the number of bytes of the buffer it used. The + * function copies these bytes to an internal buffer: this part of the buffer + * may be reused after this function successfully completes. + * \param [in,out] decoded_frame caller should pass in a pointer to an + * amqp_frame_t struct. If there is enough data in received_data for a + * complete frame, decoded_frame->frame_type will be set to something OTHER + * than 0. decoded_frame may contain members pointing to memory owned by + * the state object. This memory can be recycled with + * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel(). + * \return number of bytes consumed from received_data or 0 if a 0-length + * buffer was passed. A negative return value indicates failure. Possible + * errors: + * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely + * in an indeterminate state making recovery unlikely. Client should note the + * error and terminate the application + * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection + * should be shutdown immediately + * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the + * broker. This is likely a protocol error and the connection should be + * shutdown immediately + * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class + * was received from the broker. This is likely a protocol error and the + * connection should be shutdown immediately + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_handle_input(amqp_connection_state_t state, + amqp_bytes_t received_data, + amqp_frame_t *decoded_frame); + +/** + * Check to see if connection memory can be released + * + * \deprecated This function is deprecated in favor of + * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() + * + * Checks the state of an amqp_connection_state_t object to see if + * amqp_release_buffers() can be called successfully. + * + * \param [in] state the connection object + * \returns TRUE if the buffers can be released FALSE otherwise + * + * \sa amqp_release_buffers() amqp_maybe_release_buffers() + * amqp_maybe_release_buffers_on_channel() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_boolean_t AMQP_CALL amqp_release_buffers_ok(amqp_connection_state_t state); + +/** + * Release amqp_connection_state_t owned memory + * + * \deprecated This function is deprecated in favor of + * amqp_maybe_release_buffers() or amqp_maybe_release_buffers_on_channel() + * + * \warning caller should ensure amqp_release_buffers_ok() returns true before + * calling this function. Failure to do so may result in abort() being called. + * + * Release memory owned by the amqp_connection_state_t for reuse by the + * library. Use of any memory returned by the library before this function is + * called will result in undefined behavior. + * + * \note internally rabbitmq-c tries to reuse memory when possible. As a result + * its possible calling this function may not have a noticeable effect on + * memory usage. + * + * \param [in] state the connection object + * + * \sa amqp_release_buffers_ok() amqp_maybe_release_buffers() + * amqp_maybe_release_buffers_on_channel() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_release_buffers(amqp_connection_state_t state); + +/** + * Release amqp_connection_state_t owned memory + * + * Release memory owned by the amqp_connection_state_t object related to any + * channel, allowing reuse by the library. Use of any memory returned by the + * library before this function is called with result in undefined behavior. + * + * \note internally rabbitmq-c tries to reuse memory when possible. As a result + * its possible calling this function may not have a noticeable effect on + * memory usage. + * + * \param [in] state the connection object + * + * \sa amqp_maybe_release_buffers_on_channel() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_maybe_release_buffers(amqp_connection_state_t state); + +/** + * Release amqp_connection_state_t owned memory related to a channel + * + * Release memory owned by the amqp_connection_state_t object related to the + * specified channel, allowing reuse by the library. Use of any memory returned + * the library for a specific channel will result in undefined behavior. + * + * \note internally rabbitmq-c tries to reuse memory when possible. As a result + * its possible calling this function may not have a noticeable effect on + * memory usage. + * + * \param [in] state the connection object + * \param [in] channel the channel specifier for which memory should be + * released. Note that the library does not care about the state of the + * channel when calling this function + * + * \sa amqp_maybe_release_buffers() + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_maybe_release_buffers_on_channel( + amqp_connection_state_t state, amqp_channel_t channel); + +/** + * Send a frame to the broker + * + * \param [in] state the connection object + * \param [in] frame the frame to send to the broker + * \return AMQP_STATUS_OK on success, an amqp_status_enum value on error. + * Possible error codes: + * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or + * properties was too large to fit in a single AMQP frame, or the + * method contains an invalid value. The frame was not sent. + * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is + * too large to fit in a single AMQP frame. Frame was not sent. + * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in + * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in + * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame + * was sent + * - AMQP_STATUS_SOCKET_ERROR + * - AMQP_STATUS_SSL_ERROR + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_send_frame(amqp_connection_state_t state, + amqp_frame_t const *frame); + +/** + * Compare two table entries + * + * Works just like strcmp(), comparing two the table keys, datatype, then values + * + * \param [in] entry1 the entry on the left + * \param [in] entry2 the entry on the right + * \return 0 if entries are equal, 0 < if left is greater, 0 > if right is + * greater + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_table_entry_cmp(void const *entry1, void const *entry2); + +/** + * Open a socket to a remote host + * + * \deprecated This function is deprecated in favor of amqp_socket_open() + * + * Looks up the hostname, then attempts to open a socket to the host using + * the specified portnumber. It also sets various options on the socket to + * improve performance and correctness. + * + * \param [in] hostname this can be a hostname or IP address. + * Both IPv4 and IPv6 are acceptable + * \param [in] portnumber the port to connect on. RabbitMQ brokers + * listen on port 5672, and 5671 for SSL + * \return a positive value indicates success and is the sockfd. A negative + * value (see amqp_status_enum)is returned on failure. Possible error codes: + * - AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR Initialization of underlying socket + * library failed. + * - AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED hostname lookup failed. + * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. errno or + * WSAGetLastError() may return more useful information. + * + * \note IPv6 support was added in v0.3 + * + * \sa amqp_socket_open() amqp_set_sockfd() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_open_socket(char const *hostname, int portnumber); + +/** + * Send initial AMQP header to the broker + * + * \warning this is a low level function intended for those who want to + * interact with the broker at a very low level. Use of this function without + * understanding what it does will result in AMQP protocol errors. + * + * This function sends the AMQP protocol header to the broker. + * + * \param [in] state the connection object + * \return AMQP_STATUS_OK on success, a negative value on failure. Possible + * error codes: + * - AMQP_STATUS_CONNECTION_CLOSED the connection to the broker was closed. + * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. It is likely the + * underlying socket has been closed. errno or WSAGetLastError() may provide + * further information. + * - AMQP_STATUS_SSL_ERROR a SSL error occurred. The connection to the broker + * was closed. + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_send_header(amqp_connection_state_t state); + +/** + * Checks to see if there are any incoming frames ready to be read + * + * Checks to see if there are any amqp_frame_t objects buffered by the + * amqp_connection_state_t object. Having one or more frames buffered means + * that amqp_simple_wait_frame() or amqp_simple_wait_frame_noblock() will + * return a frame without potentially blocking on a read() call. + * + * \param [in] state the connection object + * \return TRUE if there are frames enqueued, FALSE otherwise + * + * \sa amqp_simple_wait_frame() amqp_simple_wait_frame_noblock() + * amqp_data_in_buffer() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_boolean_t AMQP_CALL amqp_frames_enqueued(amqp_connection_state_t state); + +/** + * Read a single amqp_frame_t + * + * Waits for the next amqp_frame_t frame to be read from the broker. + * This function has the potential to block for a long time in the case of + * waiting for a basic.deliver method frame from the broker. + * + * The library may buffer frames. When an amqp_connection_state_t object + * has frames buffered calling amqp_simple_wait_frame() will return an + * amqp_frame_t without entering a blocking read(). You can test to see if + * an amqp_connection_state_t object has frames buffered by calling the + * amqp_frames_enqueued() function. + * + * The library has a socket read buffer. When there is data in an + * amqp_connection_state_t read buffer, amqp_simple_wait_frame() may return an + * amqp_frame_t without entering a blocking read(). You can test to see if an + * amqp_connection_state_t object has data in its read buffer by calling the + * amqp_data_in_buffer() function. + * + * \param [in] state the connection object + * \param [out] decoded_frame the frame + * \return AMQP_STATUS_OK on success, an amqp_status_enum value + * is returned otherwise. Possible errors include: + * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely + * in an indeterminate state making recovery unlikely. Client should note the + * error and terminate the application + * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection + * should be shutdown immediately + * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the + * broker. This is likely a protocol error and the connection should be + * shutdown immediately + * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class + * was received from the broker. This is likely a protocol error and the + * connection should be shutdown immediately + * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat + * from the broker. The connection has been closed. + * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. + * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has + * been closed + * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has + * been closed. + * + * \sa amqp_simple_wait_frame_noblock() amqp_frames_enqueued() + * amqp_data_in_buffer() + * + * \note as of v0.4.0 this function will no longer return heartbeat frames + * when enabled by specifying a non-zero heartbeat value in amqp_login(). + * Heartbeating is handled internally by the library. + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_simple_wait_frame(amqp_connection_state_t state, + amqp_frame_t *decoded_frame); + +/** + * Read a single amqp_frame_t with a timeout. + * + * Waits for the next amqp_frame_t frame to be read from the broker, up to + * a timespan specified by tv. The function will return AMQP_STATUS_TIMEOUT + * if the timeout is reached. The tv value is not modified by the function. + * + * If a 0 timeval is specified, the function behaves as if its non-blocking: it + * will test to see if a frame can be read from the broker, and return + * immediately. + * + * If NULL is passed in for tv, the function will behave like + * amqp_simple_wait_frame() and block until a frame is received from the broker + * + * The library may buffer frames. When an amqp_connection_state_t object + * has frames buffered calling amqp_simple_wait_frame_noblock() will return an + * amqp_frame_t without entering a blocking read(). You can test to see if an + * amqp_connection_state_t object has frames buffered by calling the + * amqp_frames_enqueued() function. + * + * The library has a socket read buffer. When there is data in an + * amqp_connection_state_t read buffer, amqp_simple_wait_frame_noblock() may + * return + * an amqp_frame_t without entering a blocking read(). You can test to see if an + * amqp_connection_state_t object has data in its read buffer by calling the + * amqp_data_in_buffer() function. + * + * \note This function does not return heartbeat frames. When enabled, + * heartbeating is handed internally internally by the library. + * + * \param [in,out] state the connection object + * \param [out] decoded_frame the frame + * \param [in] tv the maximum time to wait for a frame to be read. Setting + * tv->tv_sec = 0 and tv->tv_usec = 0 will do a non-blocking read. Specifying + * NULL for tv will make the function block until a frame is read. + * \return AMQP_STATUS_OK on success. An amqp_status_enum value is returned + * otherwise. Possible errors include: + * - AMQP_STATUS_TIMEOUT the timeout was reached while waiting for a frame + * from the broker. + * - AMQP_STATUS_INVALID_PARAMETER the tv parameter contains an invalid value. + * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely + * in an indeterminate state making recovery unlikely. Client should note the + * error and terminate the application + * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection + * should be shutdown immediately + * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the + * broker. This is likely a protocol error and the connection should be + * shutdown immediately + * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class + * was received from the broker. This is likely a protocol error and the + * connection should be shutdown immediately + * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat + * from the broker. The connection has been closed. + * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. + * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has + * been closed + * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has + * been closed. + * + * \sa amqp_simple_wait_frame() amqp_frames_enqueued() amqp_data_in_buffer() + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_simple_wait_frame_noblock(amqp_connection_state_t state, + amqp_frame_t *decoded_frame, + struct timeval *tv); + +/** + * Waits for a specific method from the broker + * + * \warning You probably don't want to use this function. If this function + * doesn't receive exactly the frame requested it closes the whole connection. + * + * Waits for a single method on a channel from the broker. + * If a frame is received that does not match expected_channel + * or expected_method the program will abort + * + * \param [in] state the connection object + * \param [in] expected_channel the channel that the method should be delivered + * on + * \param [in] expected_method the method to wait for + * \param [out] output the method + * \returns AMQP_STATUS_OK on success. An amqp_status_enum value is returned + * otherwise. Possible errors include: + * - AMQP_STATUS_WRONG_METHOD a frame containing the wrong method, wrong frame + * type or wrong channel was received. The connection is closed. + * - AMQP_STATUS_NO_MEMORY failure in allocating memory. The library is likely + * in an indeterminate state making recovery unlikely. Client should note the + * error and terminate the application + * - AMQP_STATUS_BAD_AMQP_DATA bad AMQP data was received. The connection + * should be shutdown immediately + * - AMQP_STATUS_UNKNOWN_METHOD: an unknown method was received from the + * broker. This is likely a protocol error and the connection should be + * shutdown immediately + * - AMQP_STATUS_UNKNOWN_CLASS: a properties frame with an unknown class + * was received from the broker. This is likely a protocol error and the + * connection should be shutdown immediately + * - AMQP_STATUS_HEARTBEAT_TIMEOUT timed out while waiting for heartbeat + * from the broker. The connection has been closed. + * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. + * - AMQP_STATUS_SOCKET_ERROR a socket error occurred. The connection has + * been closed + * - AMQP_STATUS_SSL_ERROR a SSL socket error occurred. The connection has + * been closed. + * + * \since v0.1 + */ + +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_simple_wait_method(amqp_connection_state_t state, + amqp_channel_t expected_channel, + amqp_method_number_t expected_method, + amqp_method_t *output); + +/** + * Sends a method to the broker + * + * This is a thin wrapper around amqp_send_frame(), providing a way to send + * a method to the broker on a specified channel. + * + * \param [in] state the connection object + * \param [in] channel the channel object + * \param [in] id the method number + * \param [in] decoded the method object + * \returns AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. + * Possible errors include: + * - AMQP_STATUS_BAD_AMQP_DATA the serialized form of the method or + * properties was too large to fit in a single AMQP frame, or the + * method contains an invalid value. The frame was not sent. + * - AMQP_STATUS_TABLE_TOO_BIG the serialized form of an amqp_table_t is + * too large to fit in a single AMQP frame. Frame was not sent. + * - AMQP_STATUS_UNKNOWN_METHOD an invalid method type was passed in + * - AMQP_STATUS_UNKNOWN_CLASS an invalid properties type was passed in + * - AMQP_STATUS_TIMER_FAILURE system timer indicated failure. The frame + * was sent + * - AMQP_STATUS_SOCKET_ERROR + * - AMQP_STATUS_SSL_ERROR + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_send_method(amqp_connection_state_t state, + amqp_channel_t channel, amqp_method_number_t id, + void *decoded); + +/** + * Sends a method to the broker and waits for a method response + * + * \param [in] state the connection object + * \param [in] channel the channel object + * \param [in] request_id the method number of the request + * \param [in] expected_reply_ids a 0 terminated array of expected response + * method numbers + * \param [in] decoded_request_method the method to be sent to the broker + * \return a amqp_rpc_reply_t: + * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully + * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an + * exception: + * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception + * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details + * of the exception. The client should amqp_send_method() a + * amqp_channel_close_ok_t. The channel must be re-opened before it + * can be used again. Any resources associated with the channel + * (auto-delete exchanges, auto-delete queues, consumers) are invalid + * and must be recreated before attempting to use them again. + * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception + * occurred, cast r.reply.decoded to amqp_connection_close_t* to see + * details of the exception. The client amqp_send_method() a + * amqp_connection_close_ok_t and disconnect from the broker. + * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred + * within the library. Examine r.library_error and compare it against + * amqp_status_enum values to determine the error. + * + * \sa amqp_simple_rpc_decoded() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_simple_rpc( + amqp_connection_state_t state, amqp_channel_t channel, + amqp_method_number_t request_id, amqp_method_number_t *expected_reply_ids, + void *decoded_request_method); + +/** + * Sends a method to the broker and waits for a method response + * + * \param [in] state the connection object + * \param [in] channel the channel object + * \param [in] request_id the method number of the request + * \param [in] reply_id the method number expected in response + * \param [in] decoded_request_method the request method + * \return a pointer to the method returned from the broker, or NULL on error. + * On error amqp_get_rpc_reply() will return an amqp_rpc_reply_t with + * details on the error that occurred. + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +void *AMQP_CALL amqp_simple_rpc_decoded(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_method_number_t request_id, + amqp_method_number_t reply_id, + void *decoded_request_method); + +/** + * Get the last global amqp_rpc_reply + * + * The API methods corresponding to most synchronous AMQP methods + * return a pointer to the decoded method result. Upon error, they + * return NULL, and we need some way of discovering what, if anything, + * went wrong. amqp_get_rpc_reply() returns the most recent + * amqp_rpc_reply_t instance corresponding to such an API operation + * for the given connection. + * + * Only use it for operations that do not themselves return + * amqp_rpc_reply_t; operations that do return amqp_rpc_reply_t + * generally do NOT update this per-connection-global amqp_rpc_reply_t + * instance. + * + * \param [in] state the connection object + * \return the most recent amqp_rpc_reply_t: + * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC completed successfully + * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an + * exception: + * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception + * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details + * of the exception. The client should amqp_send_method() a + * amqp_channel_close_ok_t. The channel must be re-opened before it + * can be used again. Any resources associated with the channel + * (auto-delete exchanges, auto-delete queues, consumers) are invalid + * and must be recreated before attempting to use them again. + * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception + * occurred, cast r.reply.decoded to amqp_connection_close_t* to see + * details of the exception. The client amqp_send_method() a + * amqp_connection_close_ok_t and disconnect from the broker. + * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. An exception occurred + * within the library. Examine r.library_error and compare it against + * amqp_status_enum values to determine the error. + * + * \sa amqp_simple_rpc_decoded() + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_get_rpc_reply(amqp_connection_state_t state); + +/** + * Login to the broker + * + * After using amqp_open_socket and amqp_set_sockfd, call + * amqp_login to complete connecting to the broker + * + * \param [in] state the connection object + * \param [in] vhost the virtual host to connect to on the broker. The default + * on most brokers is "/" + * \param [in] channel_max the limit for number of channels for the connection. + * 0 means no limit, and is a good default + * (AMQP_DEFAULT_MAX_CHANNELS) + * Note that the maximum number of channels the protocol supports + * is 65535 (2^16, with the 0-channel reserved). The server can + * set a lower channel_max and then the client will use the lowest + * of the two + * \param [in] frame_max the maximum size of an AMQP frame on the wire to + * request of the broker for this connection. 4096 is the minimum + * size, 2^31-1 is the maximum, a good default is 131072 (128KB), + * or AMQP_DEFAULT_FRAME_SIZE + * \param [in] heartbeat the number of seconds between heartbeat frames to + * request of the broker. A value of 0 disables heartbeats. + * Note rabbitmq-c only has partial support for heartbeats, as of + * v0.4.0 they are only serviced during amqp_basic_publish() and + * amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() + * \param [in] sasl_method the SASL method to authenticate with the broker. + * followed by the authentication information. The following SASL + * methods are implemented: + * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument + * should be followed by two arguments in this order: + * const char* username, and const char* password. + * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL + * argument should be followed one argument: + * const char* identity. + * \return amqp_rpc_reply_t indicating success or failure. + * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully + * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors + * from the broker when logging in will be represented by the broker closing + * the socket. In this case r.library_error will be set to + * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of + * error conditions including: invalid vhost, authentication failure. + * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an + * exception: + * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception + * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details + * of the exception. The client should amqp_send_method() a + * amqp_channel_close_ok_t. The channel must be re-opened before it + * can be used again. Any resources associated with the channel + * (auto-delete exchanges, auto-delete queues, consumers) are invalid + * and must be recreated before attempting to use them again. + * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception + * occurred, cast r.reply.decoded to amqp_connection_close_t* to see + * details of the exception. The client amqp_send_method() a + * amqp_connection_close_ok_t and disconnect from the broker. + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_login(amqp_connection_state_t state, + char const *vhost, int channel_max, + int frame_max, int heartbeat, + amqp_sasl_method_enum sasl_method, ...); + +/** + * Login to the broker passing a properties table + * + * This function is similar to amqp_login() and differs in that it provides a + * way to pass client properties to the broker. This is commonly used to + * negotiate newer protocol features as they are supported by the broker. + * + * \param [in] state the connection object + * \param [in] vhost the virtual host to connect to on the broker. The default + * on most brokers is "/" + * \param [in] channel_max the limit for the number of channels for the + * connection. + * 0 means no limit, and is a good default + * (AMQP_DEFAULT_MAX_CHANNELS) + * Note that the maximum number of channels the protocol supports + * is 65535 (2^16, with the 0-channel reserved). The server can + * set a lower channel_max and then the client will use the lowest + * of the two + * \param [in] frame_max the maximum size of an AMQP frame ont he wire to + * request of the broker for this connection. 4096 is the minimum + * size, 2^31-1 is the maximum, a good default is 131072 (128KB), + * or AMQP_DEFAULT_FRAME_SIZE + * \param [in] heartbeat the number of seconds between heartbeat frame to + * request of the broker. A value of 0 disables heartbeats. + * Note rabbitmq-c only has partial support for hearts, as of + * v0.4.0 heartbeats are only serviced during amqp_basic_publish(), + * and amqp_simple_wait_frame()/amqp_simple_wait_frame_noblock() + * \param [in] properties a table of properties to send the broker. + * \param [in] sasl_method the SASL method to authenticate with the broker + * followed by the authentication information. The following SASL + * methods are implemented: + * - AMQP_SASL_METHOD_PLAIN, the AMQP_SASL_METHOD_PLAIN argument + * should be followed by two arguments in this order: + * const char* username, and const char* password. + * - AMQP_SASL_METHOD_EXTERNAL, the AMQP_SASL_METHOD_EXTERNAL + * argument should be followed one argument: + * const char* identity. + * \return amqp_rpc_reply_t indicating success or failure. + * - r.reply_type == AMQP_RESPONSE_NORMAL. Login completed successfully + * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. In most cases errors + * from the broker when logging in will be represented by the broker closing + * the socket. In this case r.library_error will be set to + * AMQP_STATUS_CONNECTION_CLOSED. This error can represent a number of + * error conditions including: invalid vhost, authentication failure. + * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. The broker returned an + * exception: + * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception + * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details + * of the exception. The client should amqp_send_method() a + * amqp_channel_close_ok_t. The channel must be re-opened before it + * can be used again. Any resources associated with the channel + * (auto-delete exchanges, auto-delete queues, consumers) are invalid + * and must be recreated before attempting to use them again. + * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception + * occurred, cast r.reply.decoded to amqp_connection_close_t* to see + * details of the exception. The client amqp_send_method() a + * amqp_connection_close_ok_t and disconnect from the broker. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_login_with_properties( + amqp_connection_state_t state, char const *vhost, int channel_max, + int frame_max, int heartbeat, const amqp_table_t *properties, + amqp_sasl_method_enum sasl_method, ...); + +struct amqp_basic_properties_t_; + +/** + * Publish a message to the broker + * + * Publish a message on an exchange with a routing key. + * + * Note that at the AMQ protocol level basic.publish is an async method: + * this means error conditions that occur on the broker (such as publishing to + * a non-existent exchange) will not be reflected in the return value of this + * function. + * + * \param [in] state the connection object + * \param [in] channel the channel identifier + * \param [in] exchange the exchange on the broker to publish to + * \param [in] routing_key the routing key to use when publishing the message + * \param [in] mandatory indicate to the broker that the message MUST be routed + * to a queue. If the broker cannot do this it should respond with + * a basic.return method. + * \param [in] immediate indicate to the broker that the message MUST be + * delivered to a consumer immediately. If the broker cannot do this + * it should respond with a basic.return method. + * \param [in] properties the properties associated with the message + * \param [in] body the message body + * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. Note + * that basic.publish is an async method, the return value from this + * function only indicates that the message data was successfully + * transmitted to the broker. It does not indicate failures that occur + * on the broker, such as publishing to a non-existent exchange. + * Possible error values: + * - AMQP_STATUS_TIMER_FAILURE: system timer facility returned an error + * the message was not sent. + * - AMQP_STATUS_HEARTBEAT_TIMEOUT: connection timed out waiting for a + * heartbeat from the broker. The message was not sent. + * - AMQP_STATUS_NO_MEMORY: memory allocation failed. The message was + * not sent. + * - AMQP_STATUS_TABLE_TOO_BIG: a table in the properties was too large + * to fit in a single frame. Message was not sent. + * - AMQP_STATUS_CONNECTION_CLOSED: the connection was closed. + * - AMQP_STATUS_SSL_ERROR: a SSL error occurred. + * - AMQP_STATUS_TCP_ERROR: a TCP error occurred. errno or + * WSAGetLastError() may provide more information + * + * Note: this function does heartbeat processing as of v0.4.0 + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_basic_publish( + amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_boolean_t mandatory, + amqp_boolean_t immediate, struct amqp_basic_properties_t_ const *properties, + amqp_bytes_t body); + +/** + * Closes an channel + * + * \param [in] state the connection object + * \param [in] channel the channel identifier + * \param [in] code the reason for closing the channel, AMQP_REPLY_SUCCESS is a + * good default + * \return amqp_rpc_reply_t indicating success or failure + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_channel_close(amqp_connection_state_t state, + amqp_channel_t channel, int code); + +/** + * Closes the entire connection + * + * Implicitly closes all channels and informs the broker the connection + * is being closed, after receiving acknowledgment from the broker it closes + * the socket. + * + * \param [in] state the connection object + * \param [in] code the reason code for closing the connection. + * AMQP_REPLY_SUCCESS is a good default. + * \return amqp_rpc_reply_t indicating the result + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_connection_close(amqp_connection_state_t state, + int code); + +/** + * Acknowledges a message + * + * Does a basic.ack on a received message + * + * \param [in] state the connection object + * \param [in] channel the channel identifier + * \param [in] delivery_tag the delivery tag of the message to be ack'd + * \param [in] multiple if true, ack all messages up to this delivery tag, if + * false ack only this delivery tag + * \return 0 on success, 0 > on failing to send the ack to the broker. + * this will not indicate failure if something goes wrong on the + * broker + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_basic_ack(amqp_connection_state_t state, + amqp_channel_t channel, uint64_t delivery_tag, + amqp_boolean_t multiple); + +/** + * Do a basic.get + * + * Synchonously polls the broker for a message in a queue, and + * retrieves the message if a message is in the queue. + * + * \param [in] state the connection object + * \param [in] channel the channel identifier to use + * \param [in] queue the queue name to retrieve from + * \param [in] no_ack if true the message is automatically ack'ed + * if false amqp_basic_ack should be called once the message + * retrieved has been processed + * \return amqp_rpc_reply indicating success or failure + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_basic_get(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_bytes_t queue, + amqp_boolean_t no_ack); + +/** + * Do a basic.reject + * + * Actively reject a message that has been delivered + * + * \param [in] state the connection object + * \param [in] channel the channel identifier + * \param [in] delivery_tag the delivery tag of the message to reject + * \param [in] requeue indicate to the broker whether it should requeue the + * message or just discard it. + * \return 0 on success, 0 > on failing to send the reject method to the broker. + * This will not indicate failure if something goes wrong on the + * broker. + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_basic_reject(amqp_connection_state_t state, + amqp_channel_t channel, uint64_t delivery_tag, + amqp_boolean_t requeue); + +/** + * Do a basic.nack + * + * Actively reject a message, this has the same effect as amqp_basic_reject() + * however, amqp_basic_nack() can negatively acknowledge multiple messages with + * one call much like amqp_basic_ack() can acknowledge mutliple messages with + * one call. + * + * \param [in] state the connection object + * \param [in] channel the channel identifier + * \param [in] delivery_tag the delivery tag of the message to reject + * \param [in] multiple if set to 1 negatively acknowledge all unacknowledged + * messages on this channel. + * \param [in] requeue indicate to the broker whether it should requeue the + * message or dead-letter it. + * \return AMQP_STATUS_OK on success, an amqp_status_enum value otherwise. + * + * \since v0.5.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_basic_nack(amqp_connection_state_t state, + amqp_channel_t channel, uint64_t delivery_tag, + amqp_boolean_t multiple, amqp_boolean_t requeue); +/** + * Check to see if there is data left in the receive buffer + * + * Can be used to see if there is data still in the buffer, if so + * calling amqp_simple_wait_frame will not immediately enter a + * blocking read. + * + * \param [in] state the connection object + * \return true if there is data in the recieve buffer, false otherwise + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +amqp_boolean_t AMQP_CALL amqp_data_in_buffer(amqp_connection_state_t state); + +/** + * Get the error string for the given error code. + * + * \deprecated This function has been deprecated in favor of + * \ref amqp_error_string2() which returns statically allocated + * string which do not need to be freed by the caller. + * + * The returned string resides on the heap; the caller is responsible + * for freeing it. + * + * \param [in] err return error code + * \return the error string + * + * \since v0.1 + */ +AMQP_DEPRECATED( + AMQP_PUBLIC_FUNCTION char *AMQP_CALL amqp_error_string(int err)); + +/** + * Get the error string for the given error code. + * + * Get an error string associated with an error code. The string is statically + * allocated and does not need to be freed + * + * \param [in] err the error code + * \return the error string + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +const char *AMQP_CALL amqp_error_string2(int err); + +/** + * Deserialize an amqp_table_t from AMQP wireformat + * + * This is an internal function and is not typically used by + * client applications + * + * \param [in] encoded the buffer containing the serialized data + * \param [in] pool memory pool used to allocate the table entries from + * \param [in] output the amqp_table_t structure to fill in. Any existing + * entries will be erased + * \param [in,out] offset The offset into the encoded buffer to start + * reading the serialized table. It will be updated + * by this function to end of the table + * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure + * Possible error codes: + * - AMQP_STATUS_NO_MEMORY out of memory + * - AMQP_STATUS_BAD_AMQP_DATA invalid wireformat + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool, + amqp_table_t *output, size_t *offset); + +/** + * Serializes an amqp_table_t to the AMQP wireformat + * + * This is an internal function and is not typically used by + * client applications + * + * \param [in] encoded the buffer where to serialize the table to + * \param [in] input the amqp_table_t to serialize + * \param [in,out] offset The offset into the encoded buffer to start + * writing the serialized table. It will be updated + * by this function to where writing left off + * \return AMQP_STATUS_OK on success, an amqp_status_enum value on failure + * Possible error codes: + * - AMQP_STATUS_TABLE_TOO_BIG the serialized form is too large for the + * buffer + * - AMQP_STATUS_BAD_AMQP_DATA invalid table + * + * \since v0.1 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_encode_table(amqp_bytes_t encoded, amqp_table_t *input, + size_t *offset); + +/** + * Create a deep-copy of an amqp_table_t object + * + * Creates a deep-copy of an amqp_table_t object, using the provided pool + * object to allocate the necessary memory. This memory can be freed later by + * call recycle_amqp_pool(), or empty_amqp_pool() + * + * \param [in] original the table to copy + * \param [in,out] clone the table to copy to + * \param [in] pool the initialized memory pool to do allocations for the table + * from + * \return AMQP_STATUS_OK on success, amqp_status_enum value on failure. + * Possible error values: + * - AMQP_STATUS_NO_MEMORY - memory allocation failure. + * - AMQP_STATUS_INVALID_PARAMETER - invalid table (e.g., no key name) + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_table_clone(const amqp_table_t *original, + amqp_table_t *clone, amqp_pool_t *pool); + +/** + * A message object + * + * \since v0.4.0 + */ +typedef struct amqp_message_t_ { + amqp_basic_properties_t properties; /**< message properties */ + amqp_bytes_t body; /**< message body */ + amqp_pool_t pool; /**< pool used to allocate properties */ +} amqp_message_t; + +/** + * Reads the next message on a channel + * + * Reads a complete message (header + body) on a specified channel. This + * function is intended to be used with amqp_basic_get() or when an + * AMQP_BASIC_DELIVERY_METHOD method is received. + * + * \param [in,out] state the connection object + * \param [in] channel the channel on which to read the message from + * \param [in,out] message a pointer to a amqp_message_t object. Caller should + * call amqp_message_destroy() when it is done using the + * fields in the message object. The caller is responsible for + * allocating/destroying the amqp_message_t object itself. + * \param [in] flags pass in 0. Currently unused. + * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL on + * success. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_read_message(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_message_t *message, + int flags); + +/** + * Frees memory associated with a amqp_message_t allocated in amqp_read_message + * + * \param [in] message + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_destroy_message(amqp_message_t *message); + +/** + * Envelope object + * + * \since v0.4.0 + */ +typedef struct amqp_envelope_t_ { + amqp_channel_t channel; /**< channel message was delivered on */ + amqp_bytes_t + consumer_tag; /**< the consumer tag the message was delivered to */ + uint64_t delivery_tag; /**< the messages delivery tag */ + amqp_boolean_t redelivered; /**< flag indicating whether this message is being + redelivered */ + amqp_bytes_t exchange; /**< exchange this message was published to */ + amqp_bytes_t + routing_key; /**< the routing key this message was published with */ + amqp_message_t message; /**< the message */ +} amqp_envelope_t; + +/** + * Wait for and consume a message + * + * Waits for a basic.deliver method on any channel, upon receipt of + * basic.deliver it reads that message, and returns. If any other method is + * received before basic.deliver, this function will return an amqp_rpc_reply_t + * with ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, and + * ret.library_error == AMQP_STATUS_UNEXPECTED_STATE. The caller should then + * call amqp_simple_wait_frame() to read this frame and take appropriate action. + * + * This function should be used after starting a consumer with the + * amqp_basic_consume() function + * + * \param [in,out] state the connection object + * \param [in,out] envelope a pointer to a amqp_envelope_t object. Caller + * should call #amqp_destroy_envelope() when it is done using + * the fields in the envelope object. The caller is responsible + * for allocating/destroying the amqp_envelope_t object itself. + * \param [in] timeout a timeout to wait for a message delivery. Passing in + * NULL will result in blocking behavior. + * \param [in] flags pass in 0. Currently unused. + * \returns a amqp_rpc_reply_t object. ret.reply_type == AMQP_RESPONSE_NORMAL + * on success. If ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION, + * and ret.library_error == AMQP_STATUS_UNEXPECTED_STATE, a frame other + * than AMQP_BASIC_DELIVER_METHOD was received, the caller should call + * amqp_simple_wait_frame() to read this frame and take appropriate + * action. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_rpc_reply_t AMQP_CALL amqp_consume_message(amqp_connection_state_t state, + amqp_envelope_t *envelope, + struct timeval *timeout, + int flags); + +/** + * Frees memory associated with a amqp_envelope_t allocated in + * amqp_consume_message() + * + * \param [in] envelope + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_destroy_envelope(amqp_envelope_t *envelope); + +/** + * Parameters used to connect to the RabbitMQ broker + * + * \since v0.2 + */ +struct amqp_connection_info { + char *user; /**< the username to authenticate with the broker, default on most + broker is 'guest' */ + char *password; /**< the password to authenticate with the broker, default on + most brokers is 'guest' */ + char *host; /**< the hostname of the broker */ + char *vhost; /**< the virtual host on the broker to connect to, a good default + is "/" */ + int port; /**< the port that the broker is listening on, default on most + brokers is 5672 */ + amqp_boolean_t ssl; +}; + +/** + * Initialze an amqp_connection_info to default values + * + * The default values are: + * - user: "guest" + * - password: "guest" + * - host: "localhost" + * - vhost: "/" + * - port: 5672 + * + * \param [out] parsed the connection info to set defaults on + * + * \since v0.2 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL + amqp_default_connection_info(struct amqp_connection_info *parsed); + +/** + * Parse a connection URL + * + * An amqp connection url takes the form: + * + * amqp://[$USERNAME[:$PASSWORD]\@]$HOST[:$PORT]/[$VHOST] + * + * Examples: + * amqp://guest:guest\@localhost:5672// + * amqp://guest:guest\@localhost/myvhost + * + * Any missing parts of the URL will be set to the defaults specified in + * amqp_default_connection_info. For amqps: URLs the default port will be set + * to 5671 instead of 5672 for non-SSL URLs. + * + * \note This function modifies url parameter. + * + * \param [in] url URI to parse, note that this parameter is modified by the + * function. + * \param [out] parsed the connection info gleaned from the URI. The char* + * members will point to parts of the url input parameter. + * Memory management will depend on how the url is allocated. + * \returns AMQP_STATUS_OK on success, AMQP_STATUS_BAD_URL on failure + * + * \since v0.2 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_parse_url(char *url, struct amqp_connection_info *parsed); + +/* socket API */ + +/** + * 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,out] self A socket object. + * \param [in] host Connect to this host. + * \param [in] port Connect on this remote port. + * + * \return AMQP_STATUS_OK on success, an amqp_status_enum on failure + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_socket_open(amqp_socket_t *self, const char *host, int port); + +/** + * 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,out] self A socket object. + * \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 AMQP_STATUS_OK on success, an amqp_status_enum on failure. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_socket_open_noblock(amqp_socket_t *self, const char *host, + int port, struct timeval *timeout); + +/** + * Get the socket descriptor in use by a socket object. + * + * Retrieve the underlying socket descriptor. This function can be used to + * perform low-level socket operations that aren't supported by the socket + * interface. Use with caution! + * + * \param [in,out] self A socket object. + * + * \return The underlying socket descriptor, or -1 if there is no socket + * descriptor associated with + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_socket_get_sockfd(amqp_socket_t *self); + +/** + * Get the socket object associated with a amqp_connection_state_t + * + * \param [in] state the connection object to get the socket from + * \return a pointer to the socket object, or NULL if one has not been assigned + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_socket_t *AMQP_CALL amqp_get_socket(amqp_connection_state_t state); + +/** + * Get the broker properties table + * + * \param [in] state the connection object + * \return a pointer to an amqp_table_t containing the properties advertised + * by the broker on connection. The connection object owns the table, it + * should not be modified. + * + * \since v0.5.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_table_t *AMQP_CALL + amqp_get_server_properties(amqp_connection_state_t state); + +/** + * Get the client properties table + * + * Get the properties that were passed to the broker on connection. + * + * \param [in] state the connection object + * \return a pointer to an amqp_table_t containing the properties advertised + * by the client on connection. The connection object owns the table, it + * should not be modified. + * + * \since v0.7.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_table_t *AMQP_CALL + amqp_get_client_properties(amqp_connection_state_t state); + +/** + * Get the login handshake timeout. + * + * amqp_login and amqp_login_with_properties perform the login handshake with + * the broker. This function returns the timeout associated with completing + * this operation from the client side. This value can be set by using the + * amqp_set_handshake_timeout. + * + * Note that the RabbitMQ broker has configurable timeout for completing the + * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 + * seconds. + * + * \param [in] state the connection object + * \return a struct timeval representing the current login timeout for the state + * object. A NULL value represents an infinite timeout. The memory returned is + * owned by the connection object. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +struct timeval *AMQP_CALL + amqp_get_handshake_timeout(amqp_connection_state_t state); + +/** + * Set the login handshake timeout. + * + * amqp_login and amqp_login_with_properties perform the login handshake with + * the broker. This function sets the timeout associated with completing this + * operation from the client side. + * + * The timeout must be set before amqp_login or amqp_login_with_properties is + * called to change from the default timeout. + * + * Note that the RabbitMQ broker has a configurable timeout for completing the + * login handshake, the default is 10 seconds. rabbitmq-c has a default of 12 + * seconds. + * + * \param [in] state the connection object + * \param [in] timeout a struct timeval* representing new login timeout for the + * state object. NULL represents an infinite timeout. The value of timeout is + * copied internally, the caller is responsible for ownership of the passed in + * pointer, it does not need to remain valid after this function is called. + * \return AMQP_STATUS_OK on success. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_set_handshake_timeout(amqp_connection_state_t state, + struct timeval *timeout); + +/** + * Get the RPC timeout + * + * Gets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). + * This timeout may be changed at any time by calling \amqp_set_rpc_timeout + * function with a new timeout. The timeout applies individually to each RPC + * that is made. + * + * The default value is NULL, or an infinite timeout. + * + * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, + * and the connection will be closed. + * + *\warning RPC-timeouts are an advanced feature intended to be used to detect + * dead connections quickly when the rabbitmq-c implementation of heartbeats + * does not work. Do not use RPC timeouts unless you understand the implications + * of doing so. + * + * \param [in] state the connection object + * \return a struct timeval representing the current RPC timeout for the state + * object. A NULL value represents an infinite timeout. The memory returned is + * owned by the connection object. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +struct timeval *AMQP_CALL amqp_get_rpc_timeout(amqp_connection_state_t state); + +/** + * Set the RPC timeout + * + * Sets the timeout for any RPC-style AMQP command (e.g., amqp_queue_declare). + * This timeout may be changed at any time by calling this function with a new + * timeout. The timeout applies individually to each RPC that is made. + * + * The default value is NULL, or an infinite timeout. + * + * When an RPC times out, the function will return an error AMQP_STATUS_TIMEOUT, + * and the connection will be closed. + * + *\warning RPC-timeouts are an advanced feature intended to be used to detect + * dead connections quickly when the rabbitmq-c implementation of heartbeats + * does not work. Do not use RPC timeouts unless you understand the implications + * of doing so. + * + * \param [in] state the connection object + * \param [in] timeout a struct timeval* representing new RPC timeout for the + * state object. NULL represents an infinite timeout. The value of timeout is + * copied internally, the caller is responsible for ownership of the passed + * pointer, it does not need to remain valid after this function is called. + * \return AMQP_STATUS_SUCCESS on success. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_set_rpc_timeout(amqp_connection_state_t state, + struct timeval *timeout); + +AMQP_END_DECLS + +#endif /* AMQP_H */ diff --git a/ext/librabbitmq/centos_x64/include/amqp_framing.h b/ext/librabbitmq/centos_x64/include/amqp_framing.h new file mode 100644 index 000000000..fb20acc1f --- /dev/null +++ b/ext/librabbitmq/centos_x64/include/amqp_framing.h @@ -0,0 +1,1144 @@ +/* Generated code. Do not edit. Edit and re-run codegen.py instead. + * + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by Alan Antonuk are Copyright (c) 2012-2013 + * Alan Antonuk. All Rights Reserved. + * + * Portions created by VMware are Copyright (c) 2007-2012 VMware, Inc. + * All Rights Reserved. + * + * Portions created by Tony Garnock-Jones are Copyright (c) 2009-2010 + * VMware, Inc. and Tony Garnock-Jones. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ***** END LICENSE BLOCK ***** + */ + +/** @file amqp_framing.h */ +#ifndef AMQP_FRAMING_H +#define AMQP_FRAMING_H + +#include + +AMQP_BEGIN_DECLS + +#define AMQP_PROTOCOL_VERSION_MAJOR 0 /**< AMQP protocol version major */ +#define AMQP_PROTOCOL_VERSION_MINOR 9 /**< AMQP protocol version minor */ +#define AMQP_PROTOCOL_VERSION_REVISION \ + 1 /**< AMQP protocol version revision \ + */ +#define AMQP_PROTOCOL_PORT 5672 /**< Default AMQP Port */ +#define AMQP_FRAME_METHOD 1 /**< Constant: FRAME-METHOD */ +#define AMQP_FRAME_HEADER 2 /**< Constant: FRAME-HEADER */ +#define AMQP_FRAME_BODY 3 /**< Constant: FRAME-BODY */ +#define AMQP_FRAME_HEARTBEAT 8 /**< Constant: FRAME-HEARTBEAT */ +#define AMQP_FRAME_MIN_SIZE 4096 /**< Constant: FRAME-MIN-SIZE */ +#define AMQP_FRAME_END 206 /**< Constant: FRAME-END */ +#define AMQP_REPLY_SUCCESS 200 /**< Constant: REPLY-SUCCESS */ +#define AMQP_CONTENT_TOO_LARGE 311 /**< Constant: CONTENT-TOO-LARGE */ +#define AMQP_NO_ROUTE 312 /**< Constant: NO-ROUTE */ +#define AMQP_NO_CONSUMERS 313 /**< Constant: NO-CONSUMERS */ +#define AMQP_ACCESS_REFUSED 403 /**< Constant: ACCESS-REFUSED */ +#define AMQP_NOT_FOUND 404 /**< Constant: NOT-FOUND */ +#define AMQP_RESOURCE_LOCKED 405 /**< Constant: RESOURCE-LOCKED */ +#define AMQP_PRECONDITION_FAILED 406 /**< Constant: PRECONDITION-FAILED */ +#define AMQP_CONNECTION_FORCED 320 /**< Constant: CONNECTION-FORCED */ +#define AMQP_INVALID_PATH 402 /**< Constant: INVALID-PATH */ +#define AMQP_FRAME_ERROR 501 /**< Constant: FRAME-ERROR */ +#define AMQP_SYNTAX_ERROR 502 /**< Constant: SYNTAX-ERROR */ +#define AMQP_COMMAND_INVALID 503 /**< Constant: COMMAND-INVALID */ +#define AMQP_CHANNEL_ERROR 504 /**< Constant: CHANNEL-ERROR */ +#define AMQP_UNEXPECTED_FRAME 505 /**< Constant: UNEXPECTED-FRAME */ +#define AMQP_RESOURCE_ERROR 506 /**< Constant: RESOURCE-ERROR */ +#define AMQP_NOT_ALLOWED 530 /**< Constant: NOT-ALLOWED */ +#define AMQP_NOT_IMPLEMENTED 540 /**< Constant: NOT-IMPLEMENTED */ +#define AMQP_INTERNAL_ERROR 541 /**< Constant: INTERNAL-ERROR */ + +/* Function prototypes. */ + +/** + * Get constant name string from constant + * + * @param [in] constantNumber constant to get the name of + * @returns string describing the constant. String is managed by + * the library and should not be free()'d by the program + */ +AMQP_PUBLIC_FUNCTION +char const *AMQP_CALL amqp_constant_name(int constantNumber); + +/** + * Checks to see if a constant is a hard error + * + * A hard error occurs when something severe enough + * happens that the connection must be closed. + * + * @param [in] constantNumber the error constant + * @returns true if its a hard error, false otherwise + */ +AMQP_PUBLIC_FUNCTION +amqp_boolean_t AMQP_CALL amqp_constant_is_hard_error(int constantNumber); + +/** + * Get method name string from method number + * + * @param [in] methodNumber the method number + * @returns method name string. String is managed by the library + * and should not be freed()'d by the program + */ +AMQP_PUBLIC_FUNCTION +char const *AMQP_CALL amqp_method_name(amqp_method_number_t methodNumber); + +/** + * Check whether a method has content + * + * A method that has content will receive the method frame + * a properties frame, then 1 to N body frames + * + * @param [in] methodNumber the method number + * @returns true if method has content, false otherwise + */ +AMQP_PUBLIC_FUNCTION +amqp_boolean_t AMQP_CALL + amqp_method_has_content(amqp_method_number_t methodNumber); + +/** + * Decodes a method from AMQP wireformat + * + * @param [in] methodNumber the method number for the decoded parameter + * @param [in] pool the memory pool to allocate the decoded method from + * @param [in] encoded the encoded byte string buffer + * @param [out] decoded pointer to the decoded method struct + * @returns 0 on success, an error code otherwise + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_decode_method(amqp_method_number_t methodNumber, + amqp_pool_t *pool, amqp_bytes_t encoded, + void **decoded); + +/** + * Decodes a header frame properties structure from AMQP wireformat + * + * @param [in] class_id the class id for the decoded parameter + * @param [in] pool the memory pool to allocate the decoded properties from + * @param [in] encoded the encoded byte string buffer + * @param [out] decoded pointer to the decoded properties struct + * @returns 0 on success, an error code otherwise + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_decode_properties(uint16_t class_id, amqp_pool_t *pool, + amqp_bytes_t encoded, void **decoded); + +/** + * Encodes a method structure in AMQP wireformat + * + * @param [in] methodNumber the method number for the decoded parameter + * @param [in] decoded the method structure (e.g., amqp_connection_start_t) + * @param [in] encoded an allocated byte buffer for the encoded method + * structure to be written to. If the buffer isn't large enough + * to hold the encoded method, an error code will be returned. + * @returns 0 on success, an error code otherwise. + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_encode_method(amqp_method_number_t methodNumber, + void *decoded, amqp_bytes_t encoded); + +/** + * Encodes a properties structure in AMQP wireformat + * + * @param [in] class_id the class id for the decoded parameter + * @param [in] decoded the properties structure (e.g., amqp_basic_properties_t) + * @param [in] encoded an allocated byte buffer for the encoded properties to + * written to. + * If the buffer isn't large enough to hold the encoded method, an + * an error code will be returned + * @returns 0 on success, an error code otherwise. + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_encode_properties(uint16_t class_id, void *decoded, + amqp_bytes_t encoded); + +/* Method field records. */ + +#define AMQP_CONNECTION_START_METHOD \ + ((amqp_method_number_t)0x000A000A) /**< connection.start method id \ + @internal 10, 10; 655370 */ +/** connection.start method fields */ +typedef struct amqp_connection_start_t_ { + uint8_t version_major; /**< version-major */ + uint8_t version_minor; /**< version-minor */ + amqp_table_t server_properties; /**< server-properties */ + amqp_bytes_t mechanisms; /**< mechanisms */ + amqp_bytes_t locales; /**< locales */ +} amqp_connection_start_t; + +#define AMQP_CONNECTION_START_OK_METHOD \ + ((amqp_method_number_t)0x000A000B) /**< connection.start-ok method id \ + @internal 10, 11; 655371 */ +/** connection.start-ok method fields */ +typedef struct amqp_connection_start_ok_t_ { + amqp_table_t client_properties; /**< client-properties */ + amqp_bytes_t mechanism; /**< mechanism */ + amqp_bytes_t response; /**< response */ + amqp_bytes_t locale; /**< locale */ +} amqp_connection_start_ok_t; + +#define AMQP_CONNECTION_SECURE_METHOD \ + ((amqp_method_number_t)0x000A0014) /**< connection.secure method id \ + @internal 10, 20; 655380 */ +/** connection.secure method fields */ +typedef struct amqp_connection_secure_t_ { + amqp_bytes_t challenge; /**< challenge */ +} amqp_connection_secure_t; + +#define AMQP_CONNECTION_SECURE_OK_METHOD \ + ((amqp_method_number_t)0x000A0015) /**< connection.secure-ok method id \ + @internal 10, 21; 655381 */ +/** connection.secure-ok method fields */ +typedef struct amqp_connection_secure_ok_t_ { + amqp_bytes_t response; /**< response */ +} amqp_connection_secure_ok_t; + +#define AMQP_CONNECTION_TUNE_METHOD \ + ((amqp_method_number_t)0x000A001E) /**< connection.tune method id \ + @internal 10, 30; 655390 */ +/** connection.tune method fields */ +typedef struct amqp_connection_tune_t_ { + uint16_t channel_max; /**< channel-max */ + uint32_t frame_max; /**< frame-max */ + uint16_t heartbeat; /**< heartbeat */ +} amqp_connection_tune_t; + +#define AMQP_CONNECTION_TUNE_OK_METHOD \ + ((amqp_method_number_t)0x000A001F) /**< connection.tune-ok method id \ + @internal 10, 31; 655391 */ +/** connection.tune-ok method fields */ +typedef struct amqp_connection_tune_ok_t_ { + uint16_t channel_max; /**< channel-max */ + uint32_t frame_max; /**< frame-max */ + uint16_t heartbeat; /**< heartbeat */ +} amqp_connection_tune_ok_t; + +#define AMQP_CONNECTION_OPEN_METHOD \ + ((amqp_method_number_t)0x000A0028) /**< connection.open method id \ + @internal 10, 40; 655400 */ +/** connection.open method fields */ +typedef struct amqp_connection_open_t_ { + amqp_bytes_t virtual_host; /**< virtual-host */ + amqp_bytes_t capabilities; /**< capabilities */ + amqp_boolean_t insist; /**< insist */ +} amqp_connection_open_t; + +#define AMQP_CONNECTION_OPEN_OK_METHOD \ + ((amqp_method_number_t)0x000A0029) /**< connection.open-ok method id \ + @internal 10, 41; 655401 */ +/** connection.open-ok method fields */ +typedef struct amqp_connection_open_ok_t_ { + amqp_bytes_t known_hosts; /**< known-hosts */ +} amqp_connection_open_ok_t; + +#define AMQP_CONNECTION_CLOSE_METHOD \ + ((amqp_method_number_t)0x000A0032) /**< connection.close method id \ + @internal 10, 50; 655410 */ +/** connection.close method fields */ +typedef struct amqp_connection_close_t_ { + uint16_t reply_code; /**< reply-code */ + amqp_bytes_t reply_text; /**< reply-text */ + uint16_t class_id; /**< class-id */ + uint16_t method_id; /**< method-id */ +} amqp_connection_close_t; + +#define AMQP_CONNECTION_CLOSE_OK_METHOD \ + ((amqp_method_number_t)0x000A0033) /**< connection.close-ok method id \ + @internal 10, 51; 655411 */ +/** connection.close-ok method fields */ +typedef struct amqp_connection_close_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_connection_close_ok_t; + +#define AMQP_CONNECTION_BLOCKED_METHOD \ + ((amqp_method_number_t)0x000A003C) /**< connection.blocked method id \ + @internal 10, 60; 655420 */ +/** connection.blocked method fields */ +typedef struct amqp_connection_blocked_t_ { + amqp_bytes_t reason; /**< reason */ +} amqp_connection_blocked_t; + +#define AMQP_CONNECTION_UNBLOCKED_METHOD \ + ((amqp_method_number_t)0x000A003D) /**< connection.unblocked method id \ + @internal 10, 61; 655421 */ +/** connection.unblocked method fields */ +typedef struct amqp_connection_unblocked_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_connection_unblocked_t; + +#define AMQP_CHANNEL_OPEN_METHOD \ + ((amqp_method_number_t)0x0014000A) /**< channel.open method id @internal \ + 20, 10; 1310730 */ +/** channel.open method fields */ +typedef struct amqp_channel_open_t_ { + amqp_bytes_t out_of_band; /**< out-of-band */ +} amqp_channel_open_t; + +#define AMQP_CHANNEL_OPEN_OK_METHOD \ + ((amqp_method_number_t)0x0014000B) /**< channel.open-ok method id \ + @internal 20, 11; 1310731 */ +/** channel.open-ok method fields */ +typedef struct amqp_channel_open_ok_t_ { + amqp_bytes_t channel_id; /**< channel-id */ +} amqp_channel_open_ok_t; + +#define AMQP_CHANNEL_FLOW_METHOD \ + ((amqp_method_number_t)0x00140014) /**< channel.flow method id @internal \ + 20, 20; 1310740 */ +/** channel.flow method fields */ +typedef struct amqp_channel_flow_t_ { + amqp_boolean_t active; /**< active */ +} amqp_channel_flow_t; + +#define AMQP_CHANNEL_FLOW_OK_METHOD \ + ((amqp_method_number_t)0x00140015) /**< channel.flow-ok method id \ + @internal 20, 21; 1310741 */ +/** channel.flow-ok method fields */ +typedef struct amqp_channel_flow_ok_t_ { + amqp_boolean_t active; /**< active */ +} amqp_channel_flow_ok_t; + +#define AMQP_CHANNEL_CLOSE_METHOD \ + ((amqp_method_number_t)0x00140028) /**< channel.close method id @internal \ + 20, 40; 1310760 */ +/** channel.close method fields */ +typedef struct amqp_channel_close_t_ { + uint16_t reply_code; /**< reply-code */ + amqp_bytes_t reply_text; /**< reply-text */ + uint16_t class_id; /**< class-id */ + uint16_t method_id; /**< method-id */ +} amqp_channel_close_t; + +#define AMQP_CHANNEL_CLOSE_OK_METHOD \ + ((amqp_method_number_t)0x00140029) /**< channel.close-ok method id \ + @internal 20, 41; 1310761 */ +/** channel.close-ok method fields */ +typedef struct amqp_channel_close_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_channel_close_ok_t; + +#define AMQP_ACCESS_REQUEST_METHOD \ + ((amqp_method_number_t)0x001E000A) /**< access.request method id @internal \ + 30, 10; 1966090 */ +/** access.request method fields */ +typedef struct amqp_access_request_t_ { + amqp_bytes_t realm; /**< realm */ + amqp_boolean_t exclusive; /**< exclusive */ + amqp_boolean_t passive; /**< passive */ + amqp_boolean_t active; /**< active */ + amqp_boolean_t write; /**< write */ + amqp_boolean_t read; /**< read */ +} amqp_access_request_t; + +#define AMQP_ACCESS_REQUEST_OK_METHOD \ + ((amqp_method_number_t)0x001E000B) /**< access.request-ok method id \ + @internal 30, 11; 1966091 */ +/** access.request-ok method fields */ +typedef struct amqp_access_request_ok_t_ { + uint16_t ticket; /**< ticket */ +} amqp_access_request_ok_t; + +#define AMQP_EXCHANGE_DECLARE_METHOD \ + ((amqp_method_number_t)0x0028000A) /**< exchange.declare method id \ + @internal 40, 10; 2621450 */ +/** exchange.declare method fields */ +typedef struct amqp_exchange_declare_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t type; /**< type */ + amqp_boolean_t passive; /**< passive */ + amqp_boolean_t durable; /**< durable */ + amqp_boolean_t auto_delete; /**< auto-delete */ + amqp_boolean_t internal; /**< internal */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_exchange_declare_t; + +#define AMQP_EXCHANGE_DECLARE_OK_METHOD \ + ((amqp_method_number_t)0x0028000B) /**< exchange.declare-ok method id \ + @internal 40, 11; 2621451 */ +/** exchange.declare-ok method fields */ +typedef struct amqp_exchange_declare_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_exchange_declare_ok_t; + +#define AMQP_EXCHANGE_DELETE_METHOD \ + ((amqp_method_number_t)0x00280014) /**< exchange.delete method id \ + @internal 40, 20; 2621460 */ +/** exchange.delete method fields */ +typedef struct amqp_exchange_delete_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t exchange; /**< exchange */ + amqp_boolean_t if_unused; /**< if-unused */ + amqp_boolean_t nowait; /**< nowait */ +} amqp_exchange_delete_t; + +#define AMQP_EXCHANGE_DELETE_OK_METHOD \ + ((amqp_method_number_t)0x00280015) /**< exchange.delete-ok method id \ + @internal 40, 21; 2621461 */ +/** exchange.delete-ok method fields */ +typedef struct amqp_exchange_delete_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_exchange_delete_ok_t; + +#define AMQP_EXCHANGE_BIND_METHOD \ + ((amqp_method_number_t)0x0028001E) /**< exchange.bind method id @internal \ + 40, 30; 2621470 */ +/** exchange.bind method fields */ +typedef struct amqp_exchange_bind_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t destination; /**< destination */ + amqp_bytes_t source; /**< source */ + amqp_bytes_t routing_key; /**< routing-key */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_exchange_bind_t; + +#define AMQP_EXCHANGE_BIND_OK_METHOD \ + ((amqp_method_number_t)0x0028001F) /**< exchange.bind-ok method id \ + @internal 40, 31; 2621471 */ +/** exchange.bind-ok method fields */ +typedef struct amqp_exchange_bind_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_exchange_bind_ok_t; + +#define AMQP_EXCHANGE_UNBIND_METHOD \ + ((amqp_method_number_t)0x00280028) /**< exchange.unbind method id \ + @internal 40, 40; 2621480 */ +/** exchange.unbind method fields */ +typedef struct amqp_exchange_unbind_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t destination; /**< destination */ + amqp_bytes_t source; /**< source */ + amqp_bytes_t routing_key; /**< routing-key */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_exchange_unbind_t; + +#define AMQP_EXCHANGE_UNBIND_OK_METHOD \ + ((amqp_method_number_t)0x00280033) /**< exchange.unbind-ok method id \ + @internal 40, 51; 2621491 */ +/** exchange.unbind-ok method fields */ +typedef struct amqp_exchange_unbind_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_exchange_unbind_ok_t; + +#define AMQP_QUEUE_DECLARE_METHOD \ + ((amqp_method_number_t)0x0032000A) /**< queue.declare method id @internal \ + 50, 10; 3276810 */ +/** queue.declare method fields */ +typedef struct amqp_queue_declare_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_boolean_t passive; /**< passive */ + amqp_boolean_t durable; /**< durable */ + amqp_boolean_t exclusive; /**< exclusive */ + amqp_boolean_t auto_delete; /**< auto-delete */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_queue_declare_t; + +#define AMQP_QUEUE_DECLARE_OK_METHOD \ + ((amqp_method_number_t)0x0032000B) /**< queue.declare-ok method id \ + @internal 50, 11; 3276811 */ +/** queue.declare-ok method fields */ +typedef struct amqp_queue_declare_ok_t_ { + amqp_bytes_t queue; /**< queue */ + uint32_t message_count; /**< message-count */ + uint32_t consumer_count; /**< consumer-count */ +} amqp_queue_declare_ok_t; + +#define AMQP_QUEUE_BIND_METHOD \ + ((amqp_method_number_t)0x00320014) /**< queue.bind method id @internal 50, \ + 20; 3276820 */ +/** queue.bind method fields */ +typedef struct amqp_queue_bind_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_queue_bind_t; + +#define AMQP_QUEUE_BIND_OK_METHOD \ + ((amqp_method_number_t)0x00320015) /**< queue.bind-ok method id @internal \ + 50, 21; 3276821 */ +/** queue.bind-ok method fields */ +typedef struct amqp_queue_bind_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_queue_bind_ok_t; + +#define AMQP_QUEUE_PURGE_METHOD \ + ((amqp_method_number_t)0x0032001E) /**< queue.purge method id @internal \ + 50, 30; 3276830 */ +/** queue.purge method fields */ +typedef struct amqp_queue_purge_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_boolean_t nowait; /**< nowait */ +} amqp_queue_purge_t; + +#define AMQP_QUEUE_PURGE_OK_METHOD \ + ((amqp_method_number_t)0x0032001F) /**< queue.purge-ok method id @internal \ + 50, 31; 3276831 */ +/** queue.purge-ok method fields */ +typedef struct amqp_queue_purge_ok_t_ { + uint32_t message_count; /**< message-count */ +} amqp_queue_purge_ok_t; + +#define AMQP_QUEUE_DELETE_METHOD \ + ((amqp_method_number_t)0x00320028) /**< queue.delete method id @internal \ + 50, 40; 3276840 */ +/** queue.delete method fields */ +typedef struct amqp_queue_delete_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_boolean_t if_unused; /**< if-unused */ + amqp_boolean_t if_empty; /**< if-empty */ + amqp_boolean_t nowait; /**< nowait */ +} amqp_queue_delete_t; + +#define AMQP_QUEUE_DELETE_OK_METHOD \ + ((amqp_method_number_t)0x00320029) /**< queue.delete-ok method id \ + @internal 50, 41; 3276841 */ +/** queue.delete-ok method fields */ +typedef struct amqp_queue_delete_ok_t_ { + uint32_t message_count; /**< message-count */ +} amqp_queue_delete_ok_t; + +#define AMQP_QUEUE_UNBIND_METHOD \ + ((amqp_method_number_t)0x00320032) /**< queue.unbind method id @internal \ + 50, 50; 3276850 */ +/** queue.unbind method fields */ +typedef struct amqp_queue_unbind_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ + amqp_table_t arguments; /**< arguments */ +} amqp_queue_unbind_t; + +#define AMQP_QUEUE_UNBIND_OK_METHOD \ + ((amqp_method_number_t)0x00320033) /**< queue.unbind-ok method id \ + @internal 50, 51; 3276851 */ +/** queue.unbind-ok method fields */ +typedef struct amqp_queue_unbind_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_queue_unbind_ok_t; + +#define AMQP_BASIC_QOS_METHOD \ + ((amqp_method_number_t)0x003C000A) /**< basic.qos method id @internal 60, \ + 10; 3932170 */ +/** basic.qos method fields */ +typedef struct amqp_basic_qos_t_ { + uint32_t prefetch_size; /**< prefetch-size */ + uint16_t prefetch_count; /**< prefetch-count */ + amqp_boolean_t global; /**< global */ +} amqp_basic_qos_t; + +#define AMQP_BASIC_QOS_OK_METHOD \ + ((amqp_method_number_t)0x003C000B) /**< basic.qos-ok method id @internal \ + 60, 11; 3932171 */ +/** basic.qos-ok method fields */ +typedef struct amqp_basic_qos_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_basic_qos_ok_t; + +#define AMQP_BASIC_CONSUME_METHOD \ + ((amqp_method_number_t)0x003C0014) /**< basic.consume method id @internal \ + 60, 20; 3932180 */ +/** basic.consume method fields */ +typedef struct amqp_basic_consume_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_bytes_t consumer_tag; /**< consumer-tag */ + amqp_boolean_t no_local; /**< no-local */ + amqp_boolean_t no_ack; /**< no-ack */ + amqp_boolean_t exclusive; /**< exclusive */ + amqp_boolean_t nowait; /**< nowait */ + amqp_table_t arguments; /**< arguments */ +} amqp_basic_consume_t; + +#define AMQP_BASIC_CONSUME_OK_METHOD \ + ((amqp_method_number_t)0x003C0015) /**< basic.consume-ok method id \ + @internal 60, 21; 3932181 */ +/** basic.consume-ok method fields */ +typedef struct amqp_basic_consume_ok_t_ { + amqp_bytes_t consumer_tag; /**< consumer-tag */ +} amqp_basic_consume_ok_t; + +#define AMQP_BASIC_CANCEL_METHOD \ + ((amqp_method_number_t)0x003C001E) /**< basic.cancel method id @internal \ + 60, 30; 3932190 */ +/** basic.cancel method fields */ +typedef struct amqp_basic_cancel_t_ { + amqp_bytes_t consumer_tag; /**< consumer-tag */ + amqp_boolean_t nowait; /**< nowait */ +} amqp_basic_cancel_t; + +#define AMQP_BASIC_CANCEL_OK_METHOD \ + ((amqp_method_number_t)0x003C001F) /**< basic.cancel-ok method id \ + @internal 60, 31; 3932191 */ +/** basic.cancel-ok method fields */ +typedef struct amqp_basic_cancel_ok_t_ { + amqp_bytes_t consumer_tag; /**< consumer-tag */ +} amqp_basic_cancel_ok_t; + +#define AMQP_BASIC_PUBLISH_METHOD \ + ((amqp_method_number_t)0x003C0028) /**< basic.publish method id @internal \ + 60, 40; 3932200 */ +/** basic.publish method fields */ +typedef struct amqp_basic_publish_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ + amqp_boolean_t mandatory; /**< mandatory */ + amqp_boolean_t immediate; /**< immediate */ +} amqp_basic_publish_t; + +#define AMQP_BASIC_RETURN_METHOD \ + ((amqp_method_number_t)0x003C0032) /**< basic.return method id @internal \ + 60, 50; 3932210 */ +/** basic.return method fields */ +typedef struct amqp_basic_return_t_ { + uint16_t reply_code; /**< reply-code */ + amqp_bytes_t reply_text; /**< reply-text */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ +} amqp_basic_return_t; + +#define AMQP_BASIC_DELIVER_METHOD \ + ((amqp_method_number_t)0x003C003C) /**< basic.deliver method id @internal \ + 60, 60; 3932220 */ +/** basic.deliver method fields */ +typedef struct amqp_basic_deliver_t_ { + amqp_bytes_t consumer_tag; /**< consumer-tag */ + uint64_t delivery_tag; /**< delivery-tag */ + amqp_boolean_t redelivered; /**< redelivered */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ +} amqp_basic_deliver_t; + +#define AMQP_BASIC_GET_METHOD \ + ((amqp_method_number_t)0x003C0046) /**< basic.get method id @internal 60, \ + 70; 3932230 */ +/** basic.get method fields */ +typedef struct amqp_basic_get_t_ { + uint16_t ticket; /**< ticket */ + amqp_bytes_t queue; /**< queue */ + amqp_boolean_t no_ack; /**< no-ack */ +} amqp_basic_get_t; + +#define AMQP_BASIC_GET_OK_METHOD \ + ((amqp_method_number_t)0x003C0047) /**< basic.get-ok method id @internal \ + 60, 71; 3932231 */ +/** basic.get-ok method fields */ +typedef struct amqp_basic_get_ok_t_ { + uint64_t delivery_tag; /**< delivery-tag */ + amqp_boolean_t redelivered; /**< redelivered */ + amqp_bytes_t exchange; /**< exchange */ + amqp_bytes_t routing_key; /**< routing-key */ + uint32_t message_count; /**< message-count */ +} amqp_basic_get_ok_t; + +#define AMQP_BASIC_GET_EMPTY_METHOD \ + ((amqp_method_number_t)0x003C0048) /**< basic.get-empty method id \ + @internal 60, 72; 3932232 */ +/** basic.get-empty method fields */ +typedef struct amqp_basic_get_empty_t_ { + amqp_bytes_t cluster_id; /**< cluster-id */ +} amqp_basic_get_empty_t; + +#define AMQP_BASIC_ACK_METHOD \ + ((amqp_method_number_t)0x003C0050) /**< basic.ack method id @internal 60, \ + 80; 3932240 */ +/** basic.ack method fields */ +typedef struct amqp_basic_ack_t_ { + uint64_t delivery_tag; /**< delivery-tag */ + amqp_boolean_t multiple; /**< multiple */ +} amqp_basic_ack_t; + +#define AMQP_BASIC_REJECT_METHOD \ + ((amqp_method_number_t)0x003C005A) /**< basic.reject method id @internal \ + 60, 90; 3932250 */ +/** basic.reject method fields */ +typedef struct amqp_basic_reject_t_ { + uint64_t delivery_tag; /**< delivery-tag */ + amqp_boolean_t requeue; /**< requeue */ +} amqp_basic_reject_t; + +#define AMQP_BASIC_RECOVER_ASYNC_METHOD \ + ((amqp_method_number_t)0x003C0064) /**< basic.recover-async method id \ + @internal 60, 100; 3932260 */ +/** basic.recover-async method fields */ +typedef struct amqp_basic_recover_async_t_ { + amqp_boolean_t requeue; /**< requeue */ +} amqp_basic_recover_async_t; + +#define AMQP_BASIC_RECOVER_METHOD \ + ((amqp_method_number_t)0x003C006E) /**< basic.recover method id @internal \ + 60, 110; 3932270 */ +/** basic.recover method fields */ +typedef struct amqp_basic_recover_t_ { + amqp_boolean_t requeue; /**< requeue */ +} amqp_basic_recover_t; + +#define AMQP_BASIC_RECOVER_OK_METHOD \ + ((amqp_method_number_t)0x003C006F) /**< basic.recover-ok method id \ + @internal 60, 111; 3932271 */ +/** basic.recover-ok method fields */ +typedef struct amqp_basic_recover_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_basic_recover_ok_t; + +#define AMQP_BASIC_NACK_METHOD \ + ((amqp_method_number_t)0x003C0078) /**< basic.nack method id @internal 60, \ + 120; 3932280 */ +/** basic.nack method fields */ +typedef struct amqp_basic_nack_t_ { + uint64_t delivery_tag; /**< delivery-tag */ + amqp_boolean_t multiple; /**< multiple */ + amqp_boolean_t requeue; /**< requeue */ +} amqp_basic_nack_t; + +#define AMQP_TX_SELECT_METHOD \ + ((amqp_method_number_t)0x005A000A) /**< tx.select method id @internal 90, \ + 10; 5898250 */ +/** tx.select method fields */ +typedef struct amqp_tx_select_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_select_t; + +#define AMQP_TX_SELECT_OK_METHOD \ + ((amqp_method_number_t)0x005A000B) /**< tx.select-ok method id @internal \ + 90, 11; 5898251 */ +/** tx.select-ok method fields */ +typedef struct amqp_tx_select_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_select_ok_t; + +#define AMQP_TX_COMMIT_METHOD \ + ((amqp_method_number_t)0x005A0014) /**< tx.commit method id @internal 90, \ + 20; 5898260 */ +/** tx.commit method fields */ +typedef struct amqp_tx_commit_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_commit_t; + +#define AMQP_TX_COMMIT_OK_METHOD \ + ((amqp_method_number_t)0x005A0015) /**< tx.commit-ok method id @internal \ + 90, 21; 5898261 */ +/** tx.commit-ok method fields */ +typedef struct amqp_tx_commit_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_commit_ok_t; + +#define AMQP_TX_ROLLBACK_METHOD \ + ((amqp_method_number_t)0x005A001E) /**< tx.rollback method id @internal \ + 90, 30; 5898270 */ +/** tx.rollback method fields */ +typedef struct amqp_tx_rollback_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_rollback_t; + +#define AMQP_TX_ROLLBACK_OK_METHOD \ + ((amqp_method_number_t)0x005A001F) /**< tx.rollback-ok method id @internal \ + 90, 31; 5898271 */ +/** tx.rollback-ok method fields */ +typedef struct amqp_tx_rollback_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_rollback_ok_t; + +#define AMQP_CONFIRM_SELECT_METHOD \ + ((amqp_method_number_t)0x0055000A) /**< confirm.select method id @internal \ + 85, 10; 5570570 */ +/** confirm.select method fields */ +typedef struct amqp_confirm_select_t_ { + amqp_boolean_t nowait; /**< nowait */ +} amqp_confirm_select_t; + +#define AMQP_CONFIRM_SELECT_OK_METHOD \ + ((amqp_method_number_t)0x0055000B) /**< confirm.select-ok method id \ + @internal 85, 11; 5570571 */ +/** confirm.select-ok method fields */ +typedef struct amqp_confirm_select_ok_t_ { + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_confirm_select_ok_t; + +/* Class property records. */ +#define AMQP_CONNECTION_CLASS \ + (0x000A) /**< connection class id @internal 10 \ + */ +/** connection class properties */ +typedef struct amqp_connection_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_connection_properties_t; + +#define AMQP_CHANNEL_CLASS (0x0014) /**< channel class id @internal 20 */ +/** channel class properties */ +typedef struct amqp_channel_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_channel_properties_t; + +#define AMQP_ACCESS_CLASS (0x001E) /**< access class id @internal 30 */ +/** access class properties */ +typedef struct amqp_access_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_access_properties_t; + +#define AMQP_EXCHANGE_CLASS (0x0028) /**< exchange class id @internal 40 */ +/** exchange class properties */ +typedef struct amqp_exchange_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_exchange_properties_t; + +#define AMQP_QUEUE_CLASS (0x0032) /**< queue class id @internal 50 */ +/** queue class properties */ +typedef struct amqp_queue_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_queue_properties_t; + +#define AMQP_BASIC_CLASS (0x003C) /**< basic class id @internal 60 */ +#define AMQP_BASIC_CONTENT_TYPE_FLAG (1 << 15) +#define AMQP_BASIC_CONTENT_ENCODING_FLAG (1 << 14) +#define AMQP_BASIC_HEADERS_FLAG (1 << 13) +#define AMQP_BASIC_DELIVERY_MODE_FLAG (1 << 12) +#define AMQP_BASIC_PRIORITY_FLAG (1 << 11) +#define AMQP_BASIC_CORRELATION_ID_FLAG (1 << 10) +#define AMQP_BASIC_REPLY_TO_FLAG (1 << 9) +#define AMQP_BASIC_EXPIRATION_FLAG (1 << 8) +#define AMQP_BASIC_MESSAGE_ID_FLAG (1 << 7) +#define AMQP_BASIC_TIMESTAMP_FLAG (1 << 6) +#define AMQP_BASIC_TYPE_FLAG (1 << 5) +#define AMQP_BASIC_USER_ID_FLAG (1 << 4) +#define AMQP_BASIC_APP_ID_FLAG (1 << 3) +#define AMQP_BASIC_CLUSTER_ID_FLAG (1 << 2) +/** basic class properties */ +typedef struct amqp_basic_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + amqp_bytes_t content_type; /**< content-type */ + amqp_bytes_t content_encoding; /**< content-encoding */ + amqp_table_t headers; /**< headers */ + uint8_t delivery_mode; /**< delivery-mode */ + uint8_t priority; /**< priority */ + amqp_bytes_t correlation_id; /**< correlation-id */ + amqp_bytes_t reply_to; /**< reply-to */ + amqp_bytes_t expiration; /**< expiration */ + amqp_bytes_t message_id; /**< message-id */ + uint64_t timestamp; /**< timestamp */ + amqp_bytes_t type; /**< type */ + amqp_bytes_t user_id; /**< user-id */ + amqp_bytes_t app_id; /**< app-id */ + amqp_bytes_t cluster_id; /**< cluster-id */ +} amqp_basic_properties_t; + +#define AMQP_TX_CLASS (0x005A) /**< tx class id @internal 90 */ +/** tx class properties */ +typedef struct amqp_tx_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_tx_properties_t; + +#define AMQP_CONFIRM_CLASS (0x0055) /**< confirm class id @internal 85 */ +/** confirm class properties */ +typedef struct amqp_confirm_properties_t_ { + amqp_flags_t _flags; /**< bit-mask of set fields */ + char dummy; /**< Dummy field to avoid empty struct */ +} amqp_confirm_properties_t; + +/* API functions for methods */ + +/** + * amqp_channel_open + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @returns amqp_channel_open_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_channel_open_ok_t *AMQP_CALL + amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel); +/** + * amqp_channel_flow + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] active active + * @returns amqp_channel_flow_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_channel_flow_ok_t *AMQP_CALL + amqp_channel_flow(amqp_connection_state_t state, amqp_channel_t channel, + amqp_boolean_t active); +/** + * amqp_exchange_declare + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] exchange exchange + * @param [in] type type + * @param [in] passive passive + * @param [in] durable durable + * @param [in] auto_delete auto_delete + * @param [in] internal internal + * @param [in] arguments arguments + * @returns amqp_exchange_declare_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_exchange_declare_ok_t *AMQP_CALL amqp_exchange_declare( + amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive, + amqp_boolean_t durable, amqp_boolean_t auto_delete, amqp_boolean_t internal, + amqp_table_t arguments); +/** + * amqp_exchange_delete + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] exchange exchange + * @param [in] if_unused if_unused + * @returns amqp_exchange_delete_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_exchange_delete_ok_t *AMQP_CALL + amqp_exchange_delete(amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t exchange, amqp_boolean_t if_unused); +/** + * amqp_exchange_bind + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] destination destination + * @param [in] source source + * @param [in] routing_key routing_key + * @param [in] arguments arguments + * @returns amqp_exchange_bind_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_exchange_bind_ok_t *AMQP_CALL + amqp_exchange_bind(amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t destination, amqp_bytes_t source, + amqp_bytes_t routing_key, amqp_table_t arguments); +/** + * amqp_exchange_unbind + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] destination destination + * @param [in] source source + * @param [in] routing_key routing_key + * @param [in] arguments arguments + * @returns amqp_exchange_unbind_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_exchange_unbind_ok_t *AMQP_CALL + amqp_exchange_unbind(amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t destination, amqp_bytes_t source, + amqp_bytes_t routing_key, amqp_table_t arguments); +/** + * amqp_queue_declare + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @param [in] passive passive + * @param [in] durable durable + * @param [in] exclusive exclusive + * @param [in] auto_delete auto_delete + * @param [in] arguments arguments + * @returns amqp_queue_declare_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_queue_declare_ok_t *AMQP_CALL amqp_queue_declare( + amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, + amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, + amqp_boolean_t auto_delete, amqp_table_t arguments); +/** + * amqp_queue_bind + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @param [in] exchange exchange + * @param [in] routing_key routing_key + * @param [in] arguments arguments + * @returns amqp_queue_bind_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_queue_bind_ok_t *AMQP_CALL amqp_queue_bind( + amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, + amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments); +/** + * amqp_queue_purge + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @returns amqp_queue_purge_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_queue_purge_ok_t *AMQP_CALL amqp_queue_purge(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_bytes_t queue); +/** + * amqp_queue_delete + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @param [in] if_unused if_unused + * @param [in] if_empty if_empty + * @returns amqp_queue_delete_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_queue_delete_ok_t *AMQP_CALL amqp_queue_delete( + amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, + amqp_boolean_t if_unused, amqp_boolean_t if_empty); +/** + * amqp_queue_unbind + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @param [in] exchange exchange + * @param [in] routing_key routing_key + * @param [in] arguments arguments + * @returns amqp_queue_unbind_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_queue_unbind_ok_t *AMQP_CALL amqp_queue_unbind( + amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, + amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_table_t arguments); +/** + * amqp_basic_qos + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] prefetch_size prefetch_size + * @param [in] prefetch_count prefetch_count + * @param [in] global global + * @returns amqp_basic_qos_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_basic_qos_ok_t *AMQP_CALL amqp_basic_qos(amqp_connection_state_t state, + amqp_channel_t channel, + uint32_t prefetch_size, + uint16_t prefetch_count, + amqp_boolean_t global); +/** + * amqp_basic_consume + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] queue queue + * @param [in] consumer_tag consumer_tag + * @param [in] no_local no_local + * @param [in] no_ack no_ack + * @param [in] exclusive exclusive + * @param [in] arguments arguments + * @returns amqp_basic_consume_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_basic_consume_ok_t *AMQP_CALL amqp_basic_consume( + amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, + amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, + amqp_boolean_t exclusive, amqp_table_t arguments); +/** + * amqp_basic_cancel + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] consumer_tag consumer_tag + * @returns amqp_basic_cancel_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_basic_cancel_ok_t *AMQP_CALL + amqp_basic_cancel(amqp_connection_state_t state, amqp_channel_t channel, + amqp_bytes_t consumer_tag); +/** + * amqp_basic_recover + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @param [in] requeue requeue + * @returns amqp_basic_recover_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_basic_recover_ok_t *AMQP_CALL + amqp_basic_recover(amqp_connection_state_t state, amqp_channel_t channel, + amqp_boolean_t requeue); +/** + * amqp_tx_select + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @returns amqp_tx_select_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_tx_select_ok_t *AMQP_CALL amqp_tx_select(amqp_connection_state_t state, + amqp_channel_t channel); +/** + * amqp_tx_commit + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @returns amqp_tx_commit_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_tx_commit_ok_t *AMQP_CALL amqp_tx_commit(amqp_connection_state_t state, + amqp_channel_t channel); +/** + * amqp_tx_rollback + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @returns amqp_tx_rollback_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_tx_rollback_ok_t *AMQP_CALL amqp_tx_rollback(amqp_connection_state_t state, + amqp_channel_t channel); +/** + * amqp_confirm_select + * + * @param [in] state connection state + * @param [in] channel the channel to do the RPC on + * @returns amqp_confirm_select_ok_t + */ +AMQP_PUBLIC_FUNCTION +amqp_confirm_select_ok_t *AMQP_CALL + amqp_confirm_select(amqp_connection_state_t state, amqp_channel_t channel); + +AMQP_END_DECLS + +#endif /* AMQP_FRAMING_H */ diff --git a/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h b/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h new file mode 100644 index 000000000..3e9d82f54 --- /dev/null +++ b/ext/librabbitmq/centos_x64/include/amqp_tcp_socket.h @@ -0,0 +1,68 @@ +/** \file */ +/* + * Portions created by Alan Antonuk are Copyright (c) 2013-2014 Alan Antonuk. + * All Rights Reserved. + * + * Portions created by Michael Steinert are Copyright (c) 2012-2013 Michael + * Steinert. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * A TCP socket connection. + */ + +#ifndef AMQP_TCP_SOCKET_H +#define AMQP_TCP_SOCKET_H + +#include + +AMQP_BEGIN_DECLS + +/** + * Create a new TCP socket. + * + * Call amqp_connection_close() to release socket resources. + * + * \return A new socket object or NULL if an error occurred. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_socket_t *AMQP_CALL amqp_tcp_socket_new(amqp_connection_state_t state); + +/** + * Assign an open file descriptor to a socket object. + * + * This function must not be used in conjunction with amqp_socket_open(), i.e. + * the socket connection should already be open(2) when this function is + * called. + * + * \param [in,out] self A TCP socket object. + * \param [in] sockfd An open socket descriptor. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_tcp_socket_set_sockfd(amqp_socket_t *self, int sockfd); + +AMQP_END_DECLS + +#endif /* AMQP_TCP_SOCKET_H */ diff --git a/ext/librabbitmq/centos_x64/lib/librabbitmq.a b/ext/librabbitmq/centos_x64/lib/librabbitmq.a new file mode 100644 index 0000000000000000000000000000000000000000..8fc39d06b33e0639e84b1a89e789a952da66ae35 GIT binary patch literal 134844 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

J+58?aPUQ^( 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 X?B${;f(Xu~_Z`y#BmW Date: Mon, 4 Mar 2019 17:01:16 -0800 Subject: [PATCH 02/10] added struct for rabbitmq config --- controller/PostgreSQL.cpp | 53 +++++++++++++++++++++++++++++---------- controller/PostgreSQL.hpp | 18 ++++++++++++- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 29d61a39c..8dc56c9cc 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -74,13 +74,14 @@ std::string join(const std::vector &elements, const char * const se using namespace ZeroTier; -PostgreSQL::PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort) +PostgreSQL::PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, mq_config *mqc) : DB(nc, myId, path) , _ready(0) , _connected(1) , _run(1) , _waitNoticePrinted(false) , _listenPort(listenPort) + , _mqc(mqc) { _connString = std::string(path) + " application_name=controller_" +_myAddressStr; @@ -601,6 +602,21 @@ void PostgreSQL::membersDbWatcher() PQclear(res); res = NULL; + if (this->_mqc != NULL) { + _membersWatcher_RabbitMQ(); + } else { + _membersWatcher_Postgres(conn); + PQfinish(conn); + conn = NULL; + } + + if (_run == 1) { + fprintf(stderr, "ERROR: %s membersDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); + exit(9); + } +} + +void PostgreSQL::_membersWatcher_Postgres(PGconn *conn) { while(_run == 1) { if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "ERROR: Member Watcher lost connection to Postgres."); @@ -627,12 +643,10 @@ void PostgreSQL::membersDbWatcher() } std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - PQfinish(conn); - conn = NULL; - if (_run == 1) { - fprintf(stderr, "ERROR: %s membersDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); - exit(9); - } +} + +void PostgreSQL::_membersWatcher_RabbitMQ() { + } void PostgreSQL::networksDbWatcher() @@ -658,6 +672,21 @@ void PostgreSQL::networksDbWatcher() PQclear(res); res = NULL; + if (this->_mqc != NULL) { + _networksWatcher_RabbitMQ(); + } else { + _networksWatcher_Postgres(conn); + PQfinish(conn); + conn = NULL; + } + + if (_run == 1) { + fprintf(stderr, "ERROR: %s networksDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); + exit(8); + } +} + +void PostgreSQL::_networksWatcher_Postgres(PGconn *conn) { while(_run == 1) { if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "ERROR: Network Watcher lost connection to Postgres."); @@ -682,12 +711,10 @@ void PostgreSQL::networksDbWatcher() } std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - PQfinish(conn); - conn = NULL; - if (_run == 1) { - fprintf(stderr, "ERROR: %s networksDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); - exit(8); - } +} + +void PostgreSQL::_networksWatcher_RabbitMQ() { + } void PostgreSQL::commitThread() diff --git a/controller/PostgreSQL.hpp b/controller/PostgreSQL.hpp index 7932317b9..e0dcdf06f 100644 --- a/controller/PostgreSQL.hpp +++ b/controller/PostgreSQL.hpp @@ -40,6 +40,14 @@ extern "C" { namespace ZeroTier { +struct mq_config +{ + const char *host; + int port; + const char *username; + const char *password; +}; + /** * A controller database driver that talks to PostgreSQL * @@ -49,7 +57,7 @@ namespace ZeroTier class PostgreSQL : public DB { public: - PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort); + PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, mq_config *mqc = NULL); virtual ~PostgreSQL(); virtual bool waitForReady(); @@ -70,7 +78,13 @@ private: void initializeMembers(PGconn *conn); void heartbeat(); void membersDbWatcher(); + void _membersWatcher_Postgres(PGconn *conn); + void _membersWatcher_RabbitMQ(); void networksDbWatcher(); + void _networksWatcher_Postgres(PGconn *conn); + void _networksWatcher_RabbitMQ(); + + void commitThread(); void onlineNotificationThread(); @@ -100,6 +114,8 @@ private: mutable volatile bool _waitNoticePrinted; int _listenPort; + + mq_config *_mqc; }; } From fcb4221f97a7545ac741b184c53c10c3ac2c06b3 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 5 Mar 2019 15:11:50 -0800 Subject: [PATCH 03/10] rabbitMQ implementation --- controller/EmbeddedNetworkController.cpp | 7 +- controller/EmbeddedNetworkController.hpp | 6 +- controller/PostgreSQL.cpp | 57 +++++++++++- controller/PostgreSQL.hpp | 12 +-- controller/RabbitMQ.cpp | 91 +++++++++++++++++++ controller/RabbitMQ.hpp | 75 +++++++++++++++ ext/librabbitmq/centos_x64/lib/librabbitmq.a | Bin 134844 -> 137332 bytes objects.mk | 1 + service/OneService.cpp | 17 +++- 9 files changed, 249 insertions(+), 17 deletions(-) create mode 100644 controller/RabbitMQ.cpp create mode 100644 controller/RabbitMQ.hpp diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp index 8b3f1517f..5ddcaa4b4 100644 --- a/controller/EmbeddedNetworkController.cpp +++ b/controller/EmbeddedNetworkController.cpp @@ -464,12 +464,13 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule) } // anonymous namespace -EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *dbPath, int listenPort) : +EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *dbPath, int listenPort, MQConfig *mqc) : _startTime(OSUtils::now()), _listenPort(listenPort), _node(node), _path(dbPath), - _sender((NetworkController::Sender *)0) + _sender((NetworkController::Sender *)0), + _mqc(mqc) { } @@ -489,7 +490,7 @@ void EmbeddedNetworkController::init(const Identity &signingId,Sender *sender) _signingIdAddressString = signingId.address().toString(tmp); #ifdef ZT_CONTROLLER_USE_LIBPQ if ((_path.length() > 9)&&(_path.substr(0,9) == "postgres:")) - _db.reset(new PostgreSQL(this,_signingId,_path.substr(9).c_str(), _listenPort)); + _db.reset(new PostgreSQL(this,_signingId,_path.substr(9).c_str(), _listenPort, _mqc)); else // else use FileDB after endif #endif _db.reset(new FileDB(this,_signingId,_path.c_str())); diff --git a/controller/EmbeddedNetworkController.hpp b/controller/EmbeddedNetworkController.hpp index 718c97ffd..269442a87 100644 --- a/controller/EmbeddedNetworkController.hpp +++ b/controller/EmbeddedNetworkController.hpp @@ -60,6 +60,8 @@ namespace ZeroTier { class Node; +struct MQConfig; + class EmbeddedNetworkController : public NetworkController { public: @@ -67,7 +69,7 @@ public: * @param node Parent node * @param dbPath Database path (file path or database credentials) */ - EmbeddedNetworkController(Node *node,const char *dbPath, int listenPort); + EmbeddedNetworkController(Node *node,const char *dbPath, int listenPort, MQConfig *mqc = NULL); virtual ~EmbeddedNetworkController(); virtual void init(const Identity &signingId,Sender *sender); @@ -164,6 +166,8 @@ private: std::unordered_map< _MemberStatusKey,_MemberStatus,_MemberStatusHash > _memberStatus; std::mutex _memberStatus_l; + + MQConfig *_mqc; }; } // namespace ZeroTier diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 8dc56c9cc..5192dad5d 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -28,6 +28,7 @@ #include "PostgreSQL.hpp" #include "EmbeddedNetworkController.hpp" +#include "RabbitMQ.hpp" #include "../version.h" #include @@ -74,7 +75,7 @@ std::string join(const std::vector &elements, const char * const se using namespace ZeroTier; -PostgreSQL::PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, mq_config *mqc) +PostgreSQL::PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, MQConfig *mqc) : DB(nc, myId, path) , _ready(0) , _connected(1) @@ -646,7 +647,32 @@ void PostgreSQL::_membersWatcher_Postgres(PGconn *conn) { } void PostgreSQL::_membersWatcher_RabbitMQ() { - + char buf[11] = {0}; + std::string qname = "member_"+ std::string(_myAddress.toString(buf)); + RabbitMQ rmq(_mqc, qname.c_str()); + try { + rmq.init(); + } catch (std::runtime_error &e) { + fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); + exit(11); + } + while (_run == 1) { + try { + std::string msg = rmq.consume(); + json tmp(json::parse(msg)); + json &ov = tmp["old_val"]; + json &nv = tmp["new_val"]; + json oldConfig, newConfig; + if (ov.is_object()) oldConfig = ov; + if (nv.is_object()) newConfig = nv; + if (oldConfig.is_object() || newConfig.is_object()) { + _memberChanged(oldConfig,newConfig,(this->_ready>=2)); + } + } catch (std::runtime_error &e) { + fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); + break; + } catch(...) {} + } } void PostgreSQL::networksDbWatcher() @@ -714,7 +740,32 @@ void PostgreSQL::_networksWatcher_Postgres(PGconn *conn) { } void PostgreSQL::_networksWatcher_RabbitMQ() { - + char buf[11] = {0}; + std::string qname = "network_"+ std::string(_myAddress.toString(buf)); + RabbitMQ rmq(_mqc, qname.c_str()); + try { + rmq.init(); + } catch (std::runtime_error &e) { + fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); + exit(11); + } + while (_run == 1) { + try { + std::string msg = rmq.consume(); + json tmp(json::parse(msg)); + json &ov = tmp["old_val"]; + json &nv = tmp["new_val"]; + json oldConfig, newConfig; + if (ov.is_object()) oldConfig = ov; + if (nv.is_object()) newConfig = nv; + if (oldConfig.is_object()||newConfig.is_object()) { + _networkChanged(oldConfig,newConfig,(this->_ready >= 2)); + } + } catch (std::runtime_error &e) { + fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); + break; + } catch(...) {} + } } void PostgreSQL::commitThread() diff --git a/controller/PostgreSQL.hpp b/controller/PostgreSQL.hpp index e0dcdf06f..779d47bd5 100644 --- a/controller/PostgreSQL.hpp +++ b/controller/PostgreSQL.hpp @@ -40,13 +40,7 @@ extern "C" { namespace ZeroTier { -struct mq_config -{ - const char *host; - int port; - const char *username; - const char *password; -}; +struct MQConfig; /** * A controller database driver that talks to PostgreSQL @@ -57,7 +51,7 @@ struct mq_config class PostgreSQL : public DB { public: - PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, mq_config *mqc = NULL); + PostgreSQL(EmbeddedNetworkController *const nc, const Identity &myId, const char *path, int listenPort, MQConfig *mqc = NULL); virtual ~PostgreSQL(); virtual bool waitForReady(); @@ -115,7 +109,7 @@ private: int _listenPort; - mq_config *_mqc; + MQConfig *_mqc; }; } diff --git a/controller/RabbitMQ.cpp b/controller/RabbitMQ.cpp new file mode 100644 index 000000000..34efcde40 --- /dev/null +++ b/controller/RabbitMQ.cpp @@ -0,0 +1,91 @@ +#include "RabbitMQ.hpp" + +#include +#include +#include +#include + +namespace ZeroTier +{ + +RabbitMQ::RabbitMQ(MQConfig *cfg, const char *queueName) + : _mqc(cfg) + , _qName(queueName) + , _socket(NULL) + , _status(0) +{ +} + +RabbitMQ::~RabbitMQ() +{ + amqp_channel_close(_conn, _channel, AMQP_REPLY_SUCCESS); + amqp_connection_close(_conn, AMQP_REPLY_SUCCESS); + amqp_destroy_connection(_conn); +} + +void RabbitMQ::init() +{ + struct timeval tval; + memset(&tval, 0, sizeof(struct timeval)); + tval.tv_sec = 5; + + fprintf(stderr, "Initializing RabbitMQ %s\n", _qName); + _conn = amqp_new_connection(); + _socket = amqp_tcp_socket_new(_conn); + if (!_socket) { + throw std::runtime_error("Can't create socket for RabbitMQ"); + } + + _status = amqp_socket_open_noblock(_socket, _mqc->host, _mqc->port, &tval); + if (_status) { + throw std::runtime_error("Can't connect to RabbitMQ"); + } + + amqp_rpc_reply_t r = amqp_login(_conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, + _mqc->username, _mqc->password); + if (r.reply_type != AMQP_RESPONSE_NORMAL) { + throw std::runtime_error("RabbitMQ Login Error"); + } + + static int chan = 0; + amqp_channel_open(_conn, ++chan); + r = amqp_get_rpc_reply(_conn); + if(r.reply_type != AMQP_RESPONSE_NORMAL) { + throw std::runtime_error("Error opening communication channel"); + } + _channel = chan; + + _q = amqp_queue_declare(_conn, _channel, amqp_cstring_bytes(_qName), 0, 0, 0, 0, amqp_empty_table); + r = amqp_get_rpc_reply(_conn); + if (r.reply_type != AMQP_RESPONSE_NORMAL) { + throw std::runtime_error("Error declaring queue"); + } + + amqp_basic_consume(_conn, _channel, amqp_cstring_bytes(_qName), amqp_empty_bytes, 0, 1, 0, amqp_empty_table); + r = amqp_get_rpc_reply(_conn); + if (r.reply_type != AMQP_RESPONSE_NORMAL) { + throw std::runtime_error("Error conuming"); + } + fprintf(stderr, "RabbitMQ Init OK %s\n", _qName); +} + +std::string RabbitMQ::consume() +{ + amqp_rpc_reply_t res; + amqp_envelope_t envelope; + amqp_maybe_release_buffers(_conn); + + res = amqp_consume_message(_conn, &envelope, NULL, 0); + if (res.reply_type != AMQP_RESPONSE_NORMAL) { + throw std::runtime_error("Error getting message"); + } + + std::string msg( + (const char*)envelope.message.body.bytes, + envelope.message.body.len + ); + amqp_destroy_envelope(&envelope); + return msg; +} + +} \ No newline at end of file diff --git a/controller/RabbitMQ.hpp b/controller/RabbitMQ.hpp new file mode 100644 index 000000000..74023b124 --- /dev/null +++ b/controller/RabbitMQ.hpp @@ -0,0 +1,75 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. + */ +#ifndef ZT_CONTROLLER_RABBITMQ_HPP +#define ZT_CONTROLLER_RABBITMQ_HPP + +namespace ZeroTier +{ +struct MQConfig { + const char *host; + int port; + const char *username; + const char *password; +}; +} + + +#ifdef ZT_CONTROLLER_USE_LIBPQ + +#include +#include +#include + +namespace ZeroTier +{ + +class RabbitMQ { +public: + RabbitMQ(MQConfig *cfg, const char *queueName); + ~RabbitMQ(); + + void init(); + + std::string consume(); + +private: + MQConfig *_mqc; + const char *_qName; + + amqp_socket_t *_socket; + amqp_connection_state_t _conn; + amqp_queue_declare_ok_t *_q; + int _status; + + int _channel; +}; + +} + +#endif // ZT_CONTROLLER_USE_LIBPQ + +#endif // ZT_CONTROLLER_RABBITMQ_HPP + diff --git a/ext/librabbitmq/centos_x64/lib/librabbitmq.a b/ext/librabbitmq/centos_x64/lib/librabbitmq.a index 8fc39d06b33e0639e84b1a89e789a952da66ae35..9495fa7b8c3cf0d2c934519bbc536e31048cc028 100644 GIT binary patch literal 137332 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

uIXxJn7^yLOh_b|s<89+3%jn)R{xVW0$)R#M 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

J+58?aPUQ^( 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 *)_controller); // Join existing networks in networks.d @@ -1073,6 +1078,16 @@ public: if (cdbp.length() > 0) _controllerDbPath = cdbp; + json &rmq = settings["rabbitmq"]; + if (rmq.is_object() && _mqc == NULL) { + fprintf(stderr, "Reading RabbitMQ Config\n"); + _mqc = new MQConfig; + _mqc->port = rmq["port"]; + _mqc->host = OSUtils::jsonString(rmq["host"], "").c_str(); + _mqc->username = OSUtils::jsonString(rmq["username"], "").c_str(); + _mqc->password = OSUtils::jsonString(rmq["password"], "").c_str(); + } + // Bind to wildcard instead of to specific interfaces (disables full tunnel capability) json &bind = settings["bind"]; if (bind.is_array()) { From 9a3cc93d74a5974d006dcb17bdfa8ed135c11421 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 5 Mar 2019 15:47:04 -0800 Subject: [PATCH 04/10] update dockerfile to generate rabbitmq config settings when necessary --- docker/main.sh | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docker/main.sh b/docker/main.sh index efb3fe845..eaad951cc 100644 --- a/docker/main.sh +++ b/docker/main.sh @@ -25,6 +25,32 @@ if [ -z "$ZT_DB_PASSWORD" ]; then exit 1 fi +RMQ="" +if [ "$ZT_USE_RABBITMQ" == "true" ]; then + if [ -z "$RABBITMQ_HOST" ]; then + echo '*** FAILED: RABBITMQ_HOST environment variable not defined' + exit 1 + fi + if [ -z "$RABBITMQ_PORT" ]; then + echo '*** FAILED: RABBITMQ_PORT environment variable not defined' + exit 1 + fi + if [ -z "$RABBITMQ_USERNAME" ]; then + echo '*** FAILED: RABBITMQ_USERNAME environment variable not defined' + exit 1 + fi + if [ -z "$RABBITMQ_PASSWORD" ]; then + echo '*** FAILED: RABBITMQ_PASSWORD environment variable not defined' + exit 1 + fi + RMQ=", \"rabbitmq\": { + \"host\": \"${RABBITMQ_HOST}\", + \"port\": ${RABBITMQ_PORT}, + \"username\": \"${RABBITMQ_USERNAME}\", + \"password\": \"${RABBITMQ_PASSWORD}\" + }" +fi + mkdir -p /var/lib/zerotier-one pushd /var/lib/zerotier-one @@ -43,6 +69,7 @@ echo "{ \"nat64\" ], \"controllerDbPath\": \"postgres:host=${ZT_DB_HOST} port=${ZT_DB_PORT} dbname=${ZT_DB_NAME} user=${ZT_DB_USER} password=${ZT_DB_PASSWORD} sslmode=prefer sslcert=${DB_CLIENT_CERT} sslkey=${DB_CLIENT_KEY} sslrootcert=${DB_SERVER_CA}\" + ${RMQ} } } " > /var/lib/zerotier-one/local.conf From 814104356085198fb6aa09f6f5e6f39406d2fc06 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 6 Mar 2019 16:16:49 -0800 Subject: [PATCH 05/10] finish up rabbitmq integration --- controller/PostgreSQL.cpp | 69 ++++++++++++++++++++++----------------- controller/RabbitMQ.cpp | 4 +-- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 5192dad5d..9df0f440f 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -542,7 +542,8 @@ void PostgreSQL::heartbeat() std::string build = std::to_string(ZEROTIER_ONE_VERSION_BUILD); std::string now = std::to_string(OSUtils::now()); std::string host_port = std::to_string(_listenPort); - const char *values[9] = { + std::string use_rabbitmq = (_mqc != NULL) ? "true" : "false"; + const char *values[10] = { controllerId, hostname, now.c_str(), @@ -551,16 +552,18 @@ void PostgreSQL::heartbeat() minor.c_str(), rev.c_str(), build.c_str(), - host_port.c_str() + host_port.c_str(), + use_rabbitmq.c_str() }; PGresult *res = PQexecParams(conn, - "INSERT INTO ztc_controller (id, cluster_host, last_alive, public_identity, v_major, v_minor, v_rev, v_build, host_port) " - "VALUES ($1, $2, TO_TIMESTAMP($3::double precision/1000), $4, $5, $6, $7, $8, $9) " + "INSERT INTO ztc_controller (id, cluster_host, last_alive, public_identity, v_major, v_minor, v_rev, v_build, host_port, use_rabbitmq) " + "VALUES ($1, $2, TO_TIMESTAMP($3::double precision/1000), $4, $5, $6, $7, $8, $9, $10) " "ON CONFLICT (id) DO UPDATE SET cluster_host = EXCLUDED.cluster_host, last_alive = EXCLUDED.last_alive, " "public_identity = EXCLUDED.public_identity, v_major = EXCLUDED.v_major, v_minor = EXCLUDED.v_minor, " - "v_rev = EXCLUDED.v_rev, v_build = EXCLUDED.v_rev, host_port = EXCLUDED.host_port", - 9, // number of parameters + "v_rev = EXCLUDED.v_rev, v_build = EXCLUDED.v_rev, host_port = EXCLUDED.host_port, " + "use_rabbitmq = EXCLUDED.use_rabbitmq", + 10, // number of parameters NULL, // oid field. ignore values, // values for substitution NULL, // lengths in bytes of each value @@ -591,19 +594,9 @@ void PostgreSQL::membersDbWatcher() initializeMembers(conn); - char buf[11] = {0}; - std::string cmd = "LISTEN member_" + std::string(_myAddress.toString(buf)); - PGresult *res = PQexec(conn, cmd.c_str()); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "LISTEN command failed: %s\n", PQresultErrorMessage(res)); - PQclear(res); - PQfinish(conn); - exit(1); - } - - PQclear(res); res = NULL; - if (this->_mqc != NULL) { + PQfinish(conn); + conn = NULL; _membersWatcher_RabbitMQ(); } else { _membersWatcher_Postgres(conn); @@ -618,6 +611,18 @@ void PostgreSQL::membersDbWatcher() } void PostgreSQL::_membersWatcher_Postgres(PGconn *conn) { + char buf[11] = {0}; + std::string cmd = "LISTEN member_" + std::string(_myAddress.toString(buf)); + PGresult *res = PQexec(conn, cmd.c_str()); + if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { + fprintf(stderr, "LISTEN command failed: %s\n", PQresultErrorMessage(res)); + PQclear(res); + PQfinish(conn); + exit(1); + } + + PQclear(res); res = NULL; + while(_run == 1) { if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "ERROR: Member Watcher lost connection to Postgres."); @@ -659,6 +664,7 @@ void PostgreSQL::_membersWatcher_RabbitMQ() { while (_run == 1) { try { std::string msg = rmq.consume(); + // fprintf(stderr, "Got Member Update: %s\n", msg.c_str()); json tmp(json::parse(msg)); json &ov = tmp["old_val"]; json &nv = tmp["new_val"]; @@ -686,19 +692,9 @@ void PostgreSQL::networksDbWatcher() initializeNetworks(conn); - char buf[11] = {0}; - std::string cmd = "LISTEN network_" + std::string(_myAddress.toString(buf)); - PGresult *res = PQexec(conn, cmd.c_str()); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "LISTEN command failed: %s\n", PQresultErrorMessage(res)); - PQclear(res); - PQfinish(conn); - exit(1); - } - - PQclear(res); res = NULL; - if (this->_mqc != NULL) { + PQfinish(conn); + conn = NULL; _networksWatcher_RabbitMQ(); } else { _networksWatcher_Postgres(conn); @@ -713,6 +709,18 @@ void PostgreSQL::networksDbWatcher() } void PostgreSQL::_networksWatcher_Postgres(PGconn *conn) { + char buf[11] = {0}; + std::string cmd = "LISTEN network_" + std::string(_myAddress.toString(buf)); + PGresult *res = PQexec(conn, cmd.c_str()); + if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { + fprintf(stderr, "LISTEN command failed: %s\n", PQresultErrorMessage(res)); + PQclear(res); + PQfinish(conn); + exit(1); + } + + PQclear(res); res = NULL; + while(_run == 1) { if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "ERROR: Network Watcher lost connection to Postgres."); @@ -752,6 +760,7 @@ void PostgreSQL::_networksWatcher_RabbitMQ() { while (_run == 1) { try { std::string msg = rmq.consume(); + // fprintf(stderr, "Got network update: %s\n", msg.c_str()); json tmp(json::parse(msg)); json &ov = tmp["old_val"]; json &nv = tmp["new_val"]; diff --git a/controller/RabbitMQ.cpp b/controller/RabbitMQ.cpp index 34efcde40..e6b8c819c 100644 --- a/controller/RabbitMQ.cpp +++ b/controller/RabbitMQ.cpp @@ -58,13 +58,13 @@ void RabbitMQ::init() _q = amqp_queue_declare(_conn, _channel, amqp_cstring_bytes(_qName), 0, 0, 0, 0, amqp_empty_table); r = amqp_get_rpc_reply(_conn); if (r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("Error declaring queue"); + throw std::runtime_error("Error declaring queue " + std::string(_qName)); } amqp_basic_consume(_conn, _channel, amqp_cstring_bytes(_qName), amqp_empty_bytes, 0, 1, 0, amqp_empty_table); r = amqp_get_rpc_reply(_conn); if (r.reply_type != AMQP_RESPONSE_NORMAL) { - throw std::runtime_error("Error conuming"); + throw std::runtime_error("Error consuming queue " + std::string(_qName)); } fprintf(stderr, "RabbitMQ Init OK %s\n", _qName); } From 171cc3e01add8d25d221f4a29d6961b8a1a9d32e Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 8 Mar 2019 10:20:19 -0800 Subject: [PATCH 06/10] reorder a couple of things --- controller/RabbitMQ.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controller/RabbitMQ.cpp b/controller/RabbitMQ.cpp index e6b8c819c..096d3f539 100644 --- a/controller/RabbitMQ.cpp +++ b/controller/RabbitMQ.cpp @@ -48,13 +48,13 @@ void RabbitMQ::init() } static int chan = 0; - amqp_channel_open(_conn, ++chan); + _channel = ++chan; + amqp_channel_open(_conn, _channel); r = amqp_get_rpc_reply(_conn); if(r.reply_type != AMQP_RESPONSE_NORMAL) { throw std::runtime_error("Error opening communication channel"); } - _channel = chan; - + _q = amqp_queue_declare(_conn, _channel, amqp_cstring_bytes(_qName), 0, 0, 0, 0, amqp_empty_table); r = amqp_get_rpc_reply(_conn); if (r.reply_type != AMQP_RESPONSE_NORMAL) { From 293d2064c40ea1f9c7bb374cd1298d8dbd45a5c7 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 8 Mar 2019 10:20:53 -0800 Subject: [PATCH 07/10] librabbitmq built with same clang version as zt --- ext/librabbitmq/centos_x64/lib/librabbitmq.a | Bin 137332 -> 140388 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ext/librabbitmq/centos_x64/lib/librabbitmq.a b/ext/librabbitmq/centos_x64/lib/librabbitmq.a index 9495fa7b8c3cf0d2c934519bbc536e31048cc028..e98b8609e82d9849a00c719e17455d87acc94d3f 100644 GIT binary patch literal 140388 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 literal 137332 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

uIXxJn7^yLOh_b|s<89+3%jn)R{xVW0$)R#M zhFdgK)=BytK9 z!#UWCKVi!7_`_6${=Uy3ImaJHNta@$=lLAGD~_FTV)XGxy2EjQ?1D(*PTXG~_xF*r zeJ^1i?s$n>6c64jz8OU}wcz+8AtPsQ(fi2x{s=h~->V2>(sRC)Z7e4{L6B7G^7G7ri^#~;ZxaXIbOll5r~G|Oskf?nzIUIM+)Y1;<#go5^Mf_z$0I!t5%hJ;NPY*Iz_dd(da&sa zdH%j{n0!qSRzwE!&yHNZoJ9T0Z#6N*5MQFozTaVcNKSq*lCyJK<^4u%*{u{f{-Wu$ z&mN{o`i5fbq?b^qjU-Iuk;MI!A|v7+&e@4uhRx@g9?|XtujG8WCm?q!`J{cP+7wP?;9jb58%N@yA?%~xW9?|bv>!>NPbXiX zSFEW-BLg?vQjH{*7Lj-ucA+SeU`ok9j>tu}gtadXkn9H_8-T2(B>M_vw@{KLrBs{A z5K<``>}3bBd8FY;q;<|UW6LzhH zr4JKOHFS)yDG>_$f)nq0oR@evO4$2sSUN`7ln8}=8eysMX}FR+g*WS~VET8Uy3?1h zLUZ}@_kGtig6x;DBz>C^M%#}JEY11BuH-Vjlf*p-GiB6s`a!s>y_h=(JuTS^f^QA+ zUJ~9x`bj-ffqCAi@Q#%kvc!Ln;X)@&ycsV9ki_)pfQAWWLMmv--!}%v&0g#N1DZ@X z?mLFPKQmr9Gu@A6v_PM`gzzn(yq^V&GYJs}5CIJna23aa7tf>LQV;Ke(M}n5%qXD( zJ2Xn@#GEI;3T5nJH*9N8?4wXBpBaiy{8rGl{>ZdX^qBU6SzrQ*- zDUw)%%IheYgRzOJU=L%HNTLRvZ%F_rkct_YW34F(Cu&OKH34n}OUiH#>8YXfWj0{X zk^&gi8qgUqy*0Q7)5Ll2%gCG8v!oPOzov}Ye^^#QEW~UlmG%8IFru2~(MXF*iQf?; zyJn{JF{CLaD_7KWB8P@2C@XwVNu-4KD*V0lj)mAqFR=tA+7YtJODsXq4o)jxA;UqD zIg?yw%vZ>lHrFX@{Xv|9k+=4DxV@$ip{)Jii3e!jz>=KM=DOs5P`C6^_@|N!@ee`j z4fIWDfWMc0_SLT^$03IQrn%G-sF%6aAolHC;OETyT6E4dXZ&8CI@e~-c{rX<4BPku z{DV2kd+1%Pm3fm!2L|%J(WNU+3y&^ac6xYpMb8=0(Q9*Zci5b;KGjWcyG#KbM8Sl7;7^f-~tk7o76Dmf9pX)1L47Y;m2LXKZi7$0=rS_TpGG&2q}?MWU*C{+-ROc-P2E zEog3NN@+LY7S5g5-r8KZs9|o*I_s#z_cDzw4fuA3HMe)f>Sn{Khdu41=}{fIO_520 zZ(j4f#`eWL4cagpx-m~XpX0Zwoael~L^-H4$8|QmNfj5&pG)en_oiIkbxj?%<&846 zG;&T=-ZRX{d8$fW&&@W)k*Cft{H83N+yKx`%0K9ESN=(dyYfkgyYiRGUBsNtXi9Zl#VaTH zG9rgrpSir-@Y$ZZNcjKkGnf0{W%{!{bJ@b-52SKxcclCTUxyuP>mdRB+et Date: Fri, 8 Mar 2019 10:29:19 -0800 Subject: [PATCH 08/10] now with more -fPIC --- ext/librabbitmq/centos_x64/lib/librabbitmq.a | Bin 140388 -> 139468 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ext/librabbitmq/centos_x64/lib/librabbitmq.a b/ext/librabbitmq/centos_x64/lib/librabbitmq.a index e98b8609e82d9849a00c719e17455d87acc94d3f..d5c3e8b42777f42e6ce8ffde1f6810f43361c8aa 100644 GIT binary patch literal 139468 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 literal 140388 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 From cda07b20a26c0ac774445da1334234aab342ce63 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 8 Mar 2019 10:29:36 -0800 Subject: [PATCH 09/10] add mutex to channel numbering --- controller/RabbitMQ.cpp | 7 +++++-- controller/RabbitMQ.hpp | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/controller/RabbitMQ.cpp b/controller/RabbitMQ.cpp index 096d3f539..f5a5c1d60 100644 --- a/controller/RabbitMQ.cpp +++ b/controller/RabbitMQ.cpp @@ -48,7 +48,10 @@ void RabbitMQ::init() } static int chan = 0; - _channel = ++chan; + { + Mutex::Lock l(_chan_m); + _channel = ++chan; + } amqp_channel_open(_conn, _channel); r = amqp_get_rpc_reply(_conn); if(r.reply_type != AMQP_RESPONSE_NORMAL) { @@ -88,4 +91,4 @@ std::string RabbitMQ::consume() return msg; } -} \ No newline at end of file +} diff --git a/controller/RabbitMQ.hpp b/controller/RabbitMQ.hpp index 74023b124..d341681be 100644 --- a/controller/RabbitMQ.hpp +++ b/controller/RabbitMQ.hpp @@ -36,9 +36,10 @@ struct MQConfig { }; } - #ifdef ZT_CONTROLLER_USE_LIBPQ +#include "../node/Mutex.hpp" + #include #include #include @@ -65,6 +66,9 @@ private: int _status; int _channel; + + Mutex _chan_m; + }; } From 993d850f697dbedd5c8967f7fab482af923df926 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 8 Mar 2019 10:50:33 -0800 Subject: [PATCH 10/10] more logs --- controller/PostgreSQL.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 9df0f440f..a856e4afa 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -608,6 +608,7 @@ void PostgreSQL::membersDbWatcher() fprintf(stderr, "ERROR: %s membersDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); exit(9); } + fprintf(stderr, "Exited membersDbWatcher\n"); } void PostgreSQL::_membersWatcher_Postgres(PGconn *conn) { @@ -675,9 +676,13 @@ void PostgreSQL::_membersWatcher_RabbitMQ() { _memberChanged(oldConfig,newConfig,(this->_ready>=2)); } } catch (std::runtime_error &e) { - fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); + fprintf(stderr, "RABBITMQ ERROR member change: %s\n", e.what()); break; - } catch(...) {} + } catch(std::exception &e ) { + fprintf(stderr, "RABBITMQ ERROR member change: %s\n", e.what()); + } catch(...) { + fprintf(stderr, "RABBITMQ ERROR member change: unknown error\n"); + } } } @@ -706,6 +711,7 @@ void PostgreSQL::networksDbWatcher() fprintf(stderr, "ERROR: %s networksDbWatcher should still be running! Exiting Controller.\n", _myAddressStr.c_str()); exit(8); } + fprintf(stderr, "Exited membersDbWatcher\n"); } void PostgreSQL::_networksWatcher_Postgres(PGconn *conn) { @@ -773,7 +779,11 @@ void PostgreSQL::_networksWatcher_RabbitMQ() { } catch (std::runtime_error &e) { fprintf(stderr, "RABBITMQ ERROR: %s\n", e.what()); break; - } catch(...) {} + } catch (std::exception &e) { + fprintf(stderr, "RABBITMQ ERROR network watcher: %s\n", e.what()); + } catch(...) { + fprintf(stderr, "RABBITMQ ERROR network watcher: unknown error\n"); + } } }