From a92ee6fbacc1b9b5f5cc92a7e41eecac69aba5ed Mon Sep 17 00:00:00 2001 From: leebj Date: Fri, 28 Nov 2025 09:11:18 +0900 Subject: [PATCH] no message --- .../CMakeDirectoryInformation.cmake | 16 + .../librabbitmq/CMakeFiles/progress.marks | 1 + .../rabbitmq-static.dir/C.includecache | 372 +++ .../rabbitmq-static.dir/DependInfo.cmake | 43 + .../CMakeFiles/rabbitmq-static.dir/build.make | 444 +++ .../rabbitmq-static.dir/cmake_clean.cmake | 23 + .../cmake_clean_target.cmake | 3 + .../rabbitmq-static.dir/depend.internal | 113 + .../rabbitmq-static.dir/depend.make | 113 + .../CMakeFiles/rabbitmq-static.dir/flags.make | 8 + .../CMakeFiles/rabbitmq-static.dir/link.txt | 2 + .../rabbitmq-static.dir/progress.make | 15 + .../CMakeFiles/rabbitmq.dir/C.includecache | 372 +++ .../CMakeFiles/rabbitmq.dir/DependInfo.cmake | 49 + .../CMakeFiles/rabbitmq.dir/build.make | 450 +++ .../CMakeFiles/rabbitmq.dir/cmake_clean.cmake | 25 + .../CMakeFiles/rabbitmq.dir/depend.internal | 113 + .../CMakeFiles/rabbitmq.dir/depend.make | 113 + .../CMakeFiles/rabbitmq.dir/flags.make | 8 + .../CMakeFiles/rabbitmq.dir/link.txt | 1 + .../CMakeFiles/rabbitmq.dir/progress.make | 15 + librab/build/librabbitmq/CMakeLists.txt | 186 ++ librab/build/librabbitmq/amqp.h | 2538 +++++++++++++++ librab/build/librabbitmq/amqp_api.c | 394 +++ librab/build/librabbitmq/amqp_connection.c | 595 ++++ librab/build/librabbitmq/amqp_consumer.c | 307 ++ librab/build/librabbitmq/amqp_framing.c | 2876 +++++++++++++++++ librab/build/librabbitmq/amqp_framing.h | 1144 +++++++ librab/build/librabbitmq/amqp_hostcheck.c | 195 ++ librab/build/librabbitmq/amqp_hostcheck.h | 48 + librab/build/librabbitmq/amqp_mem.c | 242 ++ librab/build/librabbitmq/amqp_openssl.c | 705 ++++ librab/build/librabbitmq/amqp_openssl_bio.c | 193 ++ librab/build/librabbitmq/amqp_openssl_bio.h | 44 + .../amqp_openssl_hostname_validation.c | 179 + .../amqp_openssl_hostname_validation.h | 58 + librab/build/librabbitmq/amqp_private.h | 374 +++ librab/build/librabbitmq/amqp_socket.c | 1492 +++++++++ librab/build/librabbitmq/amqp_socket.h | 188 ++ librab/build/librabbitmq/amqp_ssl_socket.h | 239 ++ librab/build/librabbitmq/amqp_table.c | 668 ++++ librab/build/librabbitmq/amqp_table.h | 81 + librab/build/librabbitmq/amqp_tcp_socket.c | 238 ++ librab/build/librabbitmq/amqp_tcp_socket.h | 68 + librab/build/librabbitmq/amqp_time.c | 265 ++ librab/build/librabbitmq/amqp_time.h | 130 + librab/build/librabbitmq/amqp_url.c | 220 ++ librab/build/librabbitmq/cmake_install.cmake | 79 + librab/build/librabbitmq/codegen.py | 785 +++++ librab/build/librabbitmq/config.h | 14 + librab/build/librabbitmq/librabbitmq.a | Bin 0 -> 169644 bytes librab/build/librabbitmq/librabbitmq.so | Bin 0 -> 117632 bytes librab/build/librabbitmq/librabbitmq.so.4 | Bin 0 -> 117632 bytes librab/build/librabbitmq/librabbitmq.so.4.3.1 | Bin 0 -> 117632 bytes librab/build/librabbitmq/unix/threads.h | 28 + .../librabbitmq/win32/msinttypes/stdint.h | 245 ++ librab/build/librabbitmq/win32/threads.c | 56 + librab/build/librabbitmq/win32/threads.h | 52 + 58 files changed, 17225 insertions(+) create mode 100644 librab/build/librabbitmq/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/progress.marks create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/C.includecache create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/DependInfo.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean_target.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.internal create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/link.txt create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/progress.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/C.includecache create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/DependInfo.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/build.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/cmake_clean.cmake create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.internal create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/flags.make create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/link.txt create mode 100644 librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/progress.make create mode 100644 librab/build/librabbitmq/CMakeLists.txt create mode 100644 librab/build/librabbitmq/amqp.h create mode 100644 librab/build/librabbitmq/amqp_api.c create mode 100644 librab/build/librabbitmq/amqp_connection.c create mode 100644 librab/build/librabbitmq/amqp_consumer.c create mode 100644 librab/build/librabbitmq/amqp_framing.c create mode 100644 librab/build/librabbitmq/amqp_framing.h create mode 100644 librab/build/librabbitmq/amqp_hostcheck.c create mode 100644 librab/build/librabbitmq/amqp_hostcheck.h create mode 100644 librab/build/librabbitmq/amqp_mem.c create mode 100644 librab/build/librabbitmq/amqp_openssl.c create mode 100644 librab/build/librabbitmq/amqp_openssl_bio.c create mode 100644 librab/build/librabbitmq/amqp_openssl_bio.h create mode 100644 librab/build/librabbitmq/amqp_openssl_hostname_validation.c create mode 100644 librab/build/librabbitmq/amqp_openssl_hostname_validation.h create mode 100644 librab/build/librabbitmq/amqp_private.h create mode 100644 librab/build/librabbitmq/amqp_socket.c create mode 100644 librab/build/librabbitmq/amqp_socket.h create mode 100644 librab/build/librabbitmq/amqp_ssl_socket.h create mode 100644 librab/build/librabbitmq/amqp_table.c create mode 100644 librab/build/librabbitmq/amqp_table.h create mode 100644 librab/build/librabbitmq/amqp_tcp_socket.c create mode 100644 librab/build/librabbitmq/amqp_tcp_socket.h create mode 100644 librab/build/librabbitmq/amqp_time.c create mode 100644 librab/build/librabbitmq/amqp_time.h create mode 100644 librab/build/librabbitmq/amqp_url.c create mode 100644 librab/build/librabbitmq/cmake_install.cmake create mode 100644 librab/build/librabbitmq/codegen.py create mode 100644 librab/build/librabbitmq/config.h create mode 100644 librab/build/librabbitmq/librabbitmq.a create mode 100644 librab/build/librabbitmq/librabbitmq.so create mode 100644 librab/build/librabbitmq/librabbitmq.so.4 create mode 100644 librab/build/librabbitmq/librabbitmq.so.4.3.1 create mode 100644 librab/build/librabbitmq/unix/threads.h create mode 100644 librab/build/librabbitmq/win32/msinttypes/stdint.h create mode 100644 librab/build/librabbitmq/win32/threads.c create mode 100644 librab/build/librabbitmq/win32/threads.h diff --git a/librab/build/librabbitmq/CMakeFiles/CMakeDirectoryInformation.cmake b/librab/build/librabbitmq/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..44e562e --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Relative path conversion top directories. +SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home2/tcs/librab/build") +SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home2/tcs/librab/build") + +# Force unix paths in dependencies. +SET(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/librab/build/librabbitmq/CMakeFiles/progress.marks b/librab/build/librabbitmq/CMakeFiles/progress.marks new file mode 100644 index 0000000..9902f17 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/progress.marks @@ -0,0 +1 @@ +28 diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/C.includecache b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/C.includecache new file mode 100644 index 0000000..4be308d --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/C.includecache @@ -0,0 +1,372 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/home2/tcs/librab/build/librabbitmq/amqp.h +sys/types.h +- +stddef.h +- +stdint.h +- +amqp_framing.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_api.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +stdarg.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_connection.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_tcp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +errno.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_consumer.c +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_framing.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_framing.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c +amqp_hostcheck.h +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h + +/home2/tcs/librab/build/librabbitmq/amqp_mem.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +assert.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- +sys/types.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_openssl_hostname_validation.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_ssl_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +threads.h +/home2/tcs/librab/build/librabbitmq/threads.h +ctype.h +- +limits.h +- +openssl/bio.h +- +openssl/conf.h +- +openssl/engine.h +- +openssl/err.h +- +openssl/ssl.h +- +openssl/x509v3.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +assert.h +- +errno.h +- +winsock2.h +- +sys/socket.h +- +sys/types.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +openssl/bio.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c +openssl/ssl.h +- +openssl/x509v3.h +- +amqp_hostcheck.h +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_openssl_hostname_validation.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +openssl/x509v3.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_private.h +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_framing.h +/home2/tcs/librab/build/librabbitmq/amqp_framing.h +string.h +- +winsock2.h +- +arpa/inet.h +- +sys/uio.h +- +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h + +/home2/tcs/librab/build/librabbitmq/amqp_socket.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_table.h +/home2/tcs/librab/build/librabbitmq/amqp_table.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +assert.h +- +limits.h +- +stdarg.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- +errno.h +- +winsock2.h +- +ws2tcpip.h +- +sys/types.h +- +netinet/in.h +- +netinet/tcp.h +- +sys/select.h +- +fcntl.h +- +netdb.h +- +sys/socket.h +- +sys/uio.h +- +poll.h +- +unistd.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h + +/home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_table.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_table.h +/home2/tcs/librab/build/librabbitmq/amqp_table.h +assert.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_table.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h + +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_tcp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +errno.h +- +winsock2.h +- +netinet/in.h +- +netinet/tcp.h +- +sys/socket.h +- +stdio.h +- +stdlib.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_time.c +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +assert.h +- +limits.h +- +string.h +- +windows.h +- +mach/mach_time.h +- +time.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_time.h +stdint.h +- +winsock2.h +- +sys/time.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_url.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +limits.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/config.h + +librabbitmq/amqp_framing.h +amqp.h +- + +librabbitmq/unix/threads.h +pthread.h +- + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/DependInfo.cmake b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/DependInfo.cmake new file mode 100644 index 0000000..60debe5 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/DependInfo.cmake @@ -0,0 +1,43 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home2/tcs/librab/build/librabbitmq/amqp_api.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_connection.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_consumer.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_framing.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_mem.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_socket.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_table.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_time.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_url.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +SET(CMAKE_TARGET_DEFINITIONS + "AMQP_BUILD" + "AMQP_STATIC" + "HAVE_CONFIG_H" + "WITH_SSL=1" + ) + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "librabbitmq" + "librabbitmq/unix" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make new file mode 100644 index 0000000..4ecedc9 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make @@ -0,0 +1,444 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home2/tcs/librab/build + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home2/tcs/librab/build + +# Include any dependencies generated for this target. +include librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.make + +# Include the progress variables for this target. +include librabbitmq/CMakeFiles/rabbitmq-static.dir/progress.make + +# Include the compile flags for this target's objects. +include librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_framing.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_framing.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_framing.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_framing.c > CMakeFiles/rabbitmq-static.dir/amqp_framing.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_framing.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_framing.c -o CMakeFiles/rabbitmq-static.dir/amqp_framing.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_api.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_2) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_api.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_api.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_api.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_api.c > CMakeFiles/rabbitmq-static.dir/amqp_api.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_api.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_api.c -o CMakeFiles/rabbitmq-static.dir/amqp_api.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_connection.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_3) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_connection.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_connection.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_connection.c > CMakeFiles/rabbitmq-static.dir/amqp_connection.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_connection.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_connection.c -o CMakeFiles/rabbitmq-static.dir/amqp_connection.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_mem.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_4) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_mem.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_mem.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_mem.c > CMakeFiles/rabbitmq-static.dir/amqp_mem.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_mem.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_mem.c -o CMakeFiles/rabbitmq-static.dir/amqp_mem.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_socket.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_5) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_socket.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_socket.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_socket.c > CMakeFiles/rabbitmq-static.dir/amqp_socket.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_socket.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_socket.c -o CMakeFiles/rabbitmq-static.dir/amqp_socket.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_table.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_6) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_table.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_table.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_table.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_table.c > CMakeFiles/rabbitmq-static.dir/amqp_table.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_table.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_table.c -o CMakeFiles/rabbitmq-static.dir/amqp_table.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_url.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_7) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_url.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_url.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_url.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_url.c > CMakeFiles/rabbitmq-static.dir/amqp_url.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_url.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_url.c -o CMakeFiles/rabbitmq-static.dir/amqp_url.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_8) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c > CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c -o CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/amqp_time.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_9) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_time.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_time.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_time.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_time.c > CMakeFiles/rabbitmq-static.dir/amqp_time.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_time.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_time.c -o CMakeFiles/rabbitmq-static.dir/amqp_time.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_consumer.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_10) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_consumer.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_consumer.c > CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_consumer.c -o CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_11) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl.c > CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl.c -o CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_12) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c > CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c -o CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_13) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c > CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c -o CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_14) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c > CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.i + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c -o CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.s + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.provides: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o + +# Object files for target rabbitmq-static +rabbitmq__static_OBJECTS = \ +"CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_api.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_table.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_url.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_time.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o" \ +"CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o" + +# External object files for target rabbitmq-static +rabbitmq__static_EXTERNAL_OBJECTS = + +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/build.make +librabbitmq/librabbitmq.a: librabbitmq/CMakeFiles/rabbitmq-static.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C static library librabbitmq.a" + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -P CMakeFiles/rabbitmq-static.dir/cmake_clean_target.cmake + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rabbitmq-static.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +librabbitmq/CMakeFiles/rabbitmq-static.dir/build: librabbitmq/librabbitmq.a +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/build + +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o.requires +librabbitmq/CMakeFiles/rabbitmq-static.dir/requires: librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o.requires +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/requires + +librabbitmq/CMakeFiles/rabbitmq-static.dir/clean: + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -P CMakeFiles/rabbitmq-static.dir/cmake_clean.cmake +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/clean + +librabbitmq/CMakeFiles/rabbitmq-static.dir/depend: + cd /home2/tcs/librab/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home2/tcs/librab/build /home2/tcs/librab/build/librabbitmq /home2/tcs/librab/build /home2/tcs/librab/build/librabbitmq /home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : librabbitmq/CMakeFiles/rabbitmq-static.dir/depend + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean.cmake b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean.cmake new file mode 100644 index 0000000..48c5944 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean.cmake @@ -0,0 +1,23 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_api.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_table.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_url.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_time.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o" + "CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o" + "librabbitmq.pdb" + "librabbitmq.a" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rabbitmq-static.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean_target.cmake b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..4d06d03 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +FILE(REMOVE_RECURSE + "librabbitmq.a" +) diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.internal b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.internal new file mode 100644 index 0000000..11c535a --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.internal @@ -0,0 +1,113 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_api.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_connection.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_consumer.c + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h + librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_mem.c + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h + librabbitmq/unix/threads.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.c + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_table.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_table.c + /home2/tcs/librab/build/librabbitmq/amqp_table.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_time.c + /home2/tcs/librab/build/librabbitmq/amqp_time.h + librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/amqp_url.c + /home2/tcs/librab/build/librabbitmq/config.h diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.make new file mode 100644 index 0000000..ca75284 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/depend.make @@ -0,0 +1,113 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_api.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_connection.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_tcp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_consumer.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o: librabbitmq/amqp_framing.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_framing.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_mem.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl_hostname_validation.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_ssl_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o: librabbitmq/unix/threads.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_hostcheck.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_socket.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_table.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_table.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_table.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/amqp_time.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o: librabbitmq/amqp_framing.h + +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/amqp_url.c +librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o: librabbitmq/config.h + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make new file mode 100644 index 0000000..60c85c9 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /bin/cc +C_FLAGS = -Wall -Wextra -Wstrict-prototypes -Wno-unused-function -fno-common -fvisibility=hidden -std=gnu90 -O3 -DNDEBUG -I/home2/tcs/librab/build/librabbitmq -I/home2/tcs/librab/build/librabbitmq/unix + +C_DEFINES = -DAMQP_BUILD -DAMQP_STATIC -DHAVE_CONFIG_H -DWITH_SSL=1 + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/link.txt b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/link.txt new file mode 100644 index 0000000..dd84e78 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/link.txt @@ -0,0 +1,2 @@ +/bin/ar cr librabbitmq.a CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o CMakeFiles/rabbitmq-static.dir/amqp_api.c.o CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o CMakeFiles/rabbitmq-static.dir/amqp_table.c.o CMakeFiles/rabbitmq-static.dir/amqp_url.c.o CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o CMakeFiles/rabbitmq-static.dir/amqp_time.c.o CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o +/bin/ranlib librabbitmq.a diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/progress.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/progress.make new file mode 100644 index 0000000..008abf9 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq-static.dir/progress.make @@ -0,0 +1,15 @@ +CMAKE_PROGRESS_1 = 48 +CMAKE_PROGRESS_2 = 49 +CMAKE_PROGRESS_3 = 50 +CMAKE_PROGRESS_4 = 51 +CMAKE_PROGRESS_5 = 52 +CMAKE_PROGRESS_6 = 53 +CMAKE_PROGRESS_7 = 54 +CMAKE_PROGRESS_8 = 55 +CMAKE_PROGRESS_9 = 56 +CMAKE_PROGRESS_10 = 57 +CMAKE_PROGRESS_11 = 58 +CMAKE_PROGRESS_12 = 59 +CMAKE_PROGRESS_13 = 60 +CMAKE_PROGRESS_14 = 61 + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/C.includecache b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/C.includecache new file mode 100644 index 0000000..4be308d --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/C.includecache @@ -0,0 +1,372 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/home2/tcs/librab/build/librabbitmq/amqp.h +sys/types.h +- +stddef.h +- +stdint.h +- +amqp_framing.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_api.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +stdarg.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_connection.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_tcp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +errno.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_consumer.c +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_framing.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_framing.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c +amqp_hostcheck.h +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h + +/home2/tcs/librab/build/librabbitmq/amqp_mem.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +assert.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- +sys/types.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_openssl_hostname_validation.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_ssl_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +threads.h +/home2/tcs/librab/build/librabbitmq/threads.h +ctype.h +- +limits.h +- +openssl/bio.h +- +openssl/conf.h +- +openssl/engine.h +- +openssl/err.h +- +openssl/ssl.h +- +openssl/x509v3.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +assert.h +- +errno.h +- +winsock2.h +- +sys/socket.h +- +sys/types.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +openssl/bio.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c +openssl/ssl.h +- +openssl/x509v3.h +- +amqp_hostcheck.h +/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +amqp_openssl_bio.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h +amqp_openssl_hostname_validation.h +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +openssl/x509v3.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_private.h +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_framing.h +/home2/tcs/librab/build/librabbitmq/amqp_framing.h +string.h +- +winsock2.h +- +arpa/inet.h +- +sys/uio.h +- +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h + +/home2/tcs/librab/build/librabbitmq/amqp_socket.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_table.h +/home2/tcs/librab/build/librabbitmq/amqp_table.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +assert.h +- +limits.h +- +stdarg.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- +errno.h +- +winsock2.h +- +ws2tcpip.h +- +sys/types.h +- +netinet/in.h +- +netinet/tcp.h +- +sys/select.h +- +fcntl.h +- +netdb.h +- +sys/socket.h +- +sys/uio.h +- +poll.h +- +unistd.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_socket.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h + +/home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_table.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_table.h +/home2/tcs/librab/build/librabbitmq/amqp_table.h +assert.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_table.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h + +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +amqp_tcp_socket.h +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +errno.h +- +winsock2.h +- +netinet/in.h +- +netinet/tcp.h +- +sys/socket.h +- +stdio.h +- +stdlib.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h +amqp.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_time.c +amqp_time.h +/home2/tcs/librab/build/librabbitmq/amqp_time.h +amqp.h +/home2/tcs/librab/build/librabbitmq/amqp.h +assert.h +- +limits.h +- +string.h +- +windows.h +- +mach/mach_time.h +- +time.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_time.h +stdint.h +- +winsock2.h +- +sys/time.h +- + +/home2/tcs/librab/build/librabbitmq/amqp_url.c +config.h +/home2/tcs/librab/build/librabbitmq/config.h +amqp_private.h +/home2/tcs/librab/build/librabbitmq/amqp_private.h +limits.h +- +stdint.h +- +stdio.h +- +stdlib.h +- +string.h +- + +/home2/tcs/librab/build/librabbitmq/config.h + +librabbitmq/amqp_framing.h +amqp.h +- + +librabbitmq/unix/threads.h +pthread.h +- + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/DependInfo.cmake b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/DependInfo.cmake new file mode 100644 index 0000000..0715c5d --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/DependInfo.cmake @@ -0,0 +1,49 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home2/tcs/librab/build/librabbitmq/amqp_api.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_connection.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_consumer.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_framing.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_mem.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_socket.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_table.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_time.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o" + "/home2/tcs/librab/build/librabbitmq/amqp_url.c" "/home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +SET(CMAKE_TARGET_DEFINITIONS + "AMQP_BUILD" + "HAVE_CONFIG_H" + "WITH_SSL=1" + ) + +# Pairs of files generated by the same build rule. +SET(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home2/tcs/librab/build/librabbitmq/librabbitmq.so" "/home2/tcs/librab/build/librabbitmq/librabbitmq.so.4.3.1" + "/home2/tcs/librab/build/librabbitmq/librabbitmq.so.4" "/home2/tcs/librab/build/librabbitmq/librabbitmq.so.4.3.1" + ) + + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "librabbitmq" + "librabbitmq/unix" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/build.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/build.make new file mode 100644 index 0000000..03e7f3e --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/build.make @@ -0,0 +1,450 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home2/tcs/librab/build + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home2/tcs/librab/build + +# Include any dependencies generated for this target. +include librabbitmq/CMakeFiles/rabbitmq.dir/depend.make + +# Include the progress variables for this target. +include librabbitmq/CMakeFiles/rabbitmq.dir/progress.make + +# Include the compile flags for this target's objects. +include librabbitmq/CMakeFiles/rabbitmq.dir/flags.make + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_framing.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_framing.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_framing.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_framing.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_framing.c > CMakeFiles/rabbitmq.dir/amqp_framing.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_framing.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_framing.c -o CMakeFiles/rabbitmq.dir/amqp_framing.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_api.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_2) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_api.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_api.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_api.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_api.c > CMakeFiles/rabbitmq.dir/amqp_api.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_api.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_api.c -o CMakeFiles/rabbitmq.dir/amqp_api.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_connection.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_3) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_connection.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_connection.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_connection.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_connection.c > CMakeFiles/rabbitmq.dir/amqp_connection.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_connection.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_connection.c -o CMakeFiles/rabbitmq.dir/amqp_connection.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_mem.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_4) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_mem.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_mem.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_mem.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_mem.c > CMakeFiles/rabbitmq.dir/amqp_mem.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_mem.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_mem.c -o CMakeFiles/rabbitmq.dir/amqp_mem.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_socket.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_5) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_socket.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_socket.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_socket.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_socket.c > CMakeFiles/rabbitmq.dir/amqp_socket.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_socket.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_socket.c -o CMakeFiles/rabbitmq.dir/amqp_socket.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_table.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_6) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_table.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_table.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_table.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_table.c > CMakeFiles/rabbitmq.dir/amqp_table.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_table.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_table.c -o CMakeFiles/rabbitmq.dir/amqp_table.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_url.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_7) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_url.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_url.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_url.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_url.c > CMakeFiles/rabbitmq.dir/amqp_url.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_url.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_url.c -o CMakeFiles/rabbitmq.dir/amqp_url.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_8) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c > CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c -o CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/amqp_time.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_9) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_time.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_time.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_time.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_time.c > CMakeFiles/rabbitmq.dir/amqp_time.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_time.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_time.c -o CMakeFiles/rabbitmq.dir/amqp_time.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_consumer.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_10) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_consumer.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_consumer.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_consumer.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_consumer.c > CMakeFiles/rabbitmq.dir/amqp_consumer.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_consumer.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_consumer.c -o CMakeFiles/rabbitmq.dir/amqp_consumer.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_11) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_openssl.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_openssl.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl.c > CMakeFiles/rabbitmq.dir/amqp_openssl.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_openssl.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl.c -o CMakeFiles/rabbitmq.dir/amqp_openssl.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_12) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c > CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c -o CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_13) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c > CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c -o CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/CMakeFiles/rabbitmq.dir/flags.make +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.c + $(CMAKE_COMMAND) -E cmake_progress_report /home2/tcs/librab/build/CMakeFiles $(CMAKE_PROGRESS_14) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o -c /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.i" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -E /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c > CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.i + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.s" + cd /home2/tcs/librab/build/librabbitmq && /bin/cc $(C_DEFINES) $(C_FLAGS) -S /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c -o CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.s + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.requires: +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.requires + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.provides: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.requires + $(MAKE) -f librabbitmq/CMakeFiles/rabbitmq.dir/build.make librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.provides.build +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.provides + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.provides.build: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o + +# Object files for target rabbitmq +rabbitmq_OBJECTS = \ +"CMakeFiles/rabbitmq.dir/amqp_framing.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_api.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_connection.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_mem.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_socket.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_table.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_url.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_time.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_consumer.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_openssl.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o" \ +"CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o" + +# External object files for target rabbitmq +rabbitmq_EXTERNAL_OBJECTS = + +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/build.make +librabbitmq/librabbitmq.so.4.3.1: /usr/lib64/libssl.so +librabbitmq/librabbitmq.so.4.3.1: /usr/lib64/libcrypto.so +librabbitmq/librabbitmq.so.4.3.1: librabbitmq/CMakeFiles/rabbitmq.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C shared library librabbitmq.so" + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rabbitmq.dir/link.txt --verbose=$(VERBOSE) + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -E cmake_symlink_library librabbitmq.so.4.3.1 librabbitmq.so.4 librabbitmq.so + +librabbitmq/librabbitmq.so.4: librabbitmq/librabbitmq.so.4.3.1 + +librabbitmq/librabbitmq.so: librabbitmq/librabbitmq.so.4.3.1 + +# Rule to build all files generated by this target. +librabbitmq/CMakeFiles/rabbitmq.dir/build: librabbitmq/librabbitmq.so +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/build + +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o.requires +librabbitmq/CMakeFiles/rabbitmq.dir/requires: librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o.requires +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/requires + +librabbitmq/CMakeFiles/rabbitmq.dir/clean: + cd /home2/tcs/librab/build/librabbitmq && $(CMAKE_COMMAND) -P CMakeFiles/rabbitmq.dir/cmake_clean.cmake +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/clean + +librabbitmq/CMakeFiles/rabbitmq.dir/depend: + cd /home2/tcs/librab/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home2/tcs/librab/build /home2/tcs/librab/build/librabbitmq /home2/tcs/librab/build /home2/tcs/librab/build/librabbitmq /home2/tcs/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : librabbitmq/CMakeFiles/rabbitmq.dir/depend + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/cmake_clean.cmake b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/cmake_clean.cmake new file mode 100644 index 0000000..dfe39ee --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/cmake_clean.cmake @@ -0,0 +1,25 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rabbitmq.dir/amqp_framing.c.o" + "CMakeFiles/rabbitmq.dir/amqp_api.c.o" + "CMakeFiles/rabbitmq.dir/amqp_connection.c.o" + "CMakeFiles/rabbitmq.dir/amqp_mem.c.o" + "CMakeFiles/rabbitmq.dir/amqp_socket.c.o" + "CMakeFiles/rabbitmq.dir/amqp_table.c.o" + "CMakeFiles/rabbitmq.dir/amqp_url.c.o" + "CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o" + "CMakeFiles/rabbitmq.dir/amqp_time.c.o" + "CMakeFiles/rabbitmq.dir/amqp_consumer.c.o" + "CMakeFiles/rabbitmq.dir/amqp_openssl.c.o" + "CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o" + "CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o" + "CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o" + "librabbitmq.pdb" + "librabbitmq.so" + "librabbitmq.so.4.3.1" + "librabbitmq.so.4" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rabbitmq.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.internal b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.internal new file mode 100644 index 0000000..84f1833 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.internal @@ -0,0 +1,113 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_api.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_connection.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_consumer.c + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h + librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.c + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.c + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_mem.c + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h + librabbitmq/unix/threads.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o + /home2/tcs/librab/build/librabbitmq/amqp_hostcheck.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_bio.h + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.c + /home2/tcs/librab/build/librabbitmq/amqp_openssl_hostname_validation.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.c + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_table.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_table.c + /home2/tcs/librab/build/librabbitmq/amqp_table.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.c + /home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_time.c + /home2/tcs/librab/build/librabbitmq/amqp_time.h + librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o + /home2/tcs/librab/build/librabbitmq/amqp.h + /home2/tcs/librab/build/librabbitmq/amqp_framing.h + /home2/tcs/librab/build/librabbitmq/amqp_private.h + /home2/tcs/librab/build/librabbitmq/amqp_socket.h + /home2/tcs/librab/build/librabbitmq/amqp_time.h + /home2/tcs/librab/build/librabbitmq/amqp_url.c + /home2/tcs/librab/build/librabbitmq/config.h diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.make new file mode 100644 index 0000000..df99a8c --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/depend.make @@ -0,0 +1,113 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_api.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_api.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_connection.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_tcp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_connection.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_consumer.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_consumer.c.o: librabbitmq/amqp_framing.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_framing.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_framing.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o: librabbitmq/amqp_hostcheck.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_mem.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_mem.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_openssl_hostname_validation.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_ssl_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/config.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl.c.o: librabbitmq/unix/threads.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_hostcheck.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_bio.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o: librabbitmq/amqp_openssl_hostname_validation.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_socket.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_table.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_socket.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_table.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_table.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_table.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_tcp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o: librabbitmq/config.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/amqp_time.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_time.c.o: librabbitmq/amqp_framing.h + +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_framing.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_private.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_socket.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_time.h +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/amqp_url.c +librabbitmq/CMakeFiles/rabbitmq.dir/amqp_url.c.o: librabbitmq/config.h + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/flags.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/flags.make new file mode 100644 index 0000000..ef39111 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /bin/cc +C_FLAGS = -Wall -Wextra -Wstrict-prototypes -Wno-unused-function -fno-common -fvisibility=hidden -std=gnu90 -O3 -DNDEBUG -fPIC -I/home2/tcs/librab/build/librabbitmq -I/home2/tcs/librab/build/librabbitmq/unix + +C_DEFINES = -DAMQP_BUILD -DHAVE_CONFIG_H -DWITH_SSL=1 -Drabbitmq_EXPORTS + diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/link.txt b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/link.txt new file mode 100644 index 0000000..778f0e2 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/link.txt @@ -0,0 +1 @@ +/bin/cc -fPIC -Wall -Wextra -Wstrict-prototypes -Wno-unused-function -fno-common -fvisibility=hidden -std=gnu90 -O3 -DNDEBUG -shared -Wl,-soname,librabbitmq.so.4 -o librabbitmq.so.4.3.1 CMakeFiles/rabbitmq.dir/amqp_framing.c.o CMakeFiles/rabbitmq.dir/amqp_api.c.o CMakeFiles/rabbitmq.dir/amqp_connection.c.o CMakeFiles/rabbitmq.dir/amqp_mem.c.o CMakeFiles/rabbitmq.dir/amqp_socket.c.o CMakeFiles/rabbitmq.dir/amqp_table.c.o CMakeFiles/rabbitmq.dir/amqp_url.c.o CMakeFiles/rabbitmq.dir/amqp_tcp_socket.c.o CMakeFiles/rabbitmq.dir/amqp_time.c.o CMakeFiles/rabbitmq.dir/amqp_consumer.c.o CMakeFiles/rabbitmq.dir/amqp_openssl.c.o CMakeFiles/rabbitmq.dir/amqp_openssl_hostname_validation.c.o CMakeFiles/rabbitmq.dir/amqp_hostcheck.c.o CMakeFiles/rabbitmq.dir/amqp_openssl_bio.c.o -lssl -lcrypto -lrt -lpthread diff --git a/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/progress.make b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/progress.make new file mode 100644 index 0000000..65c9570 --- /dev/null +++ b/librab/build/librabbitmq/CMakeFiles/rabbitmq.dir/progress.make @@ -0,0 +1,15 @@ +CMAKE_PROGRESS_1 = 34 +CMAKE_PROGRESS_2 = 35 +CMAKE_PROGRESS_3 = 36 +CMAKE_PROGRESS_4 = 37 +CMAKE_PROGRESS_5 = 38 +CMAKE_PROGRESS_6 = 39 +CMAKE_PROGRESS_7 = 40 +CMAKE_PROGRESS_8 = 41 +CMAKE_PROGRESS_9 = 42 +CMAKE_PROGRESS_10 = 43 +CMAKE_PROGRESS_11 = 44 +CMAKE_PROGRESS_12 = 45 +CMAKE_PROGRESS_13 = 46 +CMAKE_PROGRESS_14 = 47 + diff --git a/librab/build/librabbitmq/CMakeLists.txt b/librab/build/librabbitmq/CMakeLists.txt new file mode 100644 index 0000000..bd5369a --- /dev/null +++ b/librab/build/librabbitmq/CMakeLists.txt @@ -0,0 +1,186 @@ +project(librabbitmq "C") + +if (REGENERATE_AMQP_FRAMING) + set(AMQP_CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/amqp_codegen.py") + set(CODEGEN_PY "${CMAKE_CURRENT_BINARY_DIR}/codegen.py") + set(AMQP_SPEC_JSON_PATH "${AMQP_CODEGEN_DIR}/amqp-rabbitmq-0.9.1.json") + set(AMQP_FRAMING_H_PATH ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.h) + set(AMQP_FRAMING_C_PATH ${CMAKE_CURRENT_BINARY_DIR}/amqp_framing.c) + + if (PYTHON_VERSION_MAJOR GREATER 2) + set(CONVERT_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${CODEGEN_PY} > codegen_2to3.out) + set(CONVERT_AMQP_CODEGEN ${PYTHON_2TO3_EXECUTABLE} -w ${AMQP_CODEGEN_PY} > amqp_codegen_2to3.out) + else () + set(CONVERT_CODEGEN "") + set(CONVERT_AMQP_CODEGEN "") + endif () + + add_custom_command( + OUTPUT ${CODEGEN_PY} + COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py ${CODEGEN_PY} + COMMAND ${CONVERT_CODEGEN} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/codegen.py + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_CODEGEN_PY} + COMMAND ${CMAKE_COMMAND} ARGS -E copy ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_PY} + COMMAND ${CONVERT_AMQP_CODEGEN} + DEPENDS ${AMQP_CODEGEN_DIR}/amqp_codegen.py ${AMQP_CODEGEN_TARGET} + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_FRAMING_H_PATH} + COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} header ${AMQP_SPEC_JSON_PATH} ${AMQP_FRAMING_H_PATH} + DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} + VERBATIM) + + add_custom_command( + OUTPUT ${AMQP_FRAMING_C_PATH} + COMMAND ${PYTHON_EXECUTABLE} ARGS ${CODEGEN_PY} body ${AMQP_SPEC_JSON_PATH} ${AMQP_FRAMING_C_PATH} + DEPENDS ${AMQP_SPEC_JSON_PATH} ${CODEGEN_PY} ${AMQP_CODEGEN_PY} + VERBATIM) +else (REGENERATE_AMQP_FRAMING) + set(AMQP_FRAMING_H_PATH ${CMAKE_CURRENT_SOURCE_DIR}/amqp_framing.h) + set(AMQP_FRAMING_C_PATH ${CMAKE_CURRENT_SOURCE_DIR}/amqp_framing.c) +endif (REGENERATE_AMQP_FRAMING) + +if(WIN32) + set(SOCKET_IMPL "win32") +else(WIN32) + set(SOCKET_IMPL "unix") +endif(WIN32) + +if(MSVC) + if(MSVC_VERSION LESS 1600) + set(MSINTTYPES_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/win32/msinttypes") + set(STDINT_H_INSTALL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/win32/msinttypes/stdint.h") + endif(MSVC_VERSION LESS 1600) +endif(MSVC) + +# NOTE: order is important here: if we generate amqp_framing.h/.c it'll be in the +# binary directory, and should shadow whats in the source directory +set(LIBRABBITMQ_INCLUDE_DIRS + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${SOCKET_IMPL} + ${MSINTTYPES_INCLUDE} + ) + +include_directories(${LIBRABBITMQ_INCLUDE_DIRS}) + +set(LIBRABBITMQ_INCLUDE_DIRS + ${LIBRABBITMQ_INCLUDE_DIRS} + PARENT_SCOPE) + +add_definitions(-DHAVE_CONFIG_H) + +if (ENABLE_SSL_SUPPORT) + add_definitions(-DWITH_SSL=1) + set(AMQP_SSL_SOCKET_H_PATH amqp_ssl_socket.h) + + set(AMQP_SSL_SRCS ${AMQP_SSL_SOCKET_H_PATH} + amqp_openssl.c + amqp_openssl_hostname_validation.c + amqp_openssl_hostname_validation.h + amqp_hostcheck.c + amqp_hostcheck.h + amqp_openssl_bio.c + amqp_openssl_bio.h + ) + include_directories(${OPENSSL_INCLUDE_DIR}) + set(AMQP_SSL_LIBS ${OPENSSL_LIBRARIES}) + if (APPLE) + # Apple has deprecated OpenSSL in 10.7+. This disables that warning. + set_source_files_properties(${AMQP_SSL_SRCS} + PROPERTIES COMPILE_FLAGS -Wno-deprecated-declarations) + endif() + + if (WIN32) + set(AMQP_SSL_SRCS ${AMQP_SSL_SRCS} win32/threads.h win32/threads.c) + else() + set(AMQP_SSL_SRCS ${AMQP_SSL_SRCS} unix/threads.h) + endif() +endif() + +set(RABBITMQ_SOURCES + ${AMQP_FRAMING_H_PATH} + ${AMQP_FRAMING_C_PATH} + amqp_api.c amqp.h amqp_connection.c amqp_mem.c amqp_private.h amqp_socket.c + amqp_table.c amqp_url.c amqp_socket.h amqp_tcp_socket.c amqp_tcp_socket.h + amqp_time.c amqp_time.h + amqp_consumer.c + ${AMQP_SSL_SRCS} +) + +add_definitions(-DAMQP_BUILD) + +set(RMQ_LIBRARIES ${AMQP_SSL_LIBS} ${SOCKET_LIBRARIES} ${LIBRT} ${CMAKE_THREAD_LIBS_INIT}) + +if (BUILD_SHARED_LIBS) + add_library(rabbitmq SHARED ${RABBITMQ_SOURCES}) + if (THREADS_HAVE_PTHREAD_ARG) + target_compile_options(rabbitmq PUBLIC "-pthread") + endif() + + target_link_libraries(rabbitmq ${RMQ_LIBRARIES}) + + if (WIN32) + set_target_properties(rabbitmq PROPERTIES VERSION ${RMQ_VERSION} OUTPUT_NAME rabbitmq.${RMQ_SOVERSION}) + else (WIN32) + set_target_properties(rabbitmq PROPERTIES VERSION ${RMQ_VERSION} SOVERSION ${RMQ_SOVERSION}) + endif (WIN32) + + install(TARGETS rabbitmq + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + + set(RMQ_LIBRARY_TARGET rabbitmq) +endif (BUILD_SHARED_LIBS) + +if (BUILD_STATIC_LIBS) + add_library(rabbitmq-static STATIC ${RABBITMQ_SOURCES}) + if (THREADS_HAVE_PTHREAD_ARG) + target_compile_options(rabbitmq-static PUBLIC "-pthread") + endif() + + target_link_libraries(rabbitmq-static ${RMQ_LIBRARIES}) + + set_target_properties(rabbitmq-static PROPERTIES COMPILE_DEFINITIONS AMQP_STATIC) + if (WIN32) + set_target_properties(rabbitmq-static PROPERTIES + VERSION ${RMQ_VERSION} + OUTPUT_NAME librabbitmq.${RMQ_SOVERSION}) + + if(MSVC) + set_target_properties(rabbitmq-static PROPERTIES + # Embed debugging info in the library itself instead of generating + # a .pdb file. + COMPILE_OPTIONS "/Z7") + endif(MSVC) + + else (WIN32) + set_target_properties(rabbitmq-static PROPERTIES VERSION ${RMQ_VERSION} SOVERSION ${RMQ_SOVERSION} OUTPUT_NAME rabbitmq) + endif (WIN32) + + install(TARGETS rabbitmq-static + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + + if (NOT DEFINED RMQ_LIBRARY_TARGET) + set(RMQ_LIBRARY_TARGET rabbitmq-static) + endif () +endif (BUILD_STATIC_LIBS) + +install(FILES + amqp.h + ${AMQP_FRAMING_H_PATH} + amqp_tcp_socket.h + ${AMQP_SSL_SOCKET_H_PATH} + ${STDINT_H_INSTALL_FILE} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + +set(RMQ_LIBRARY_TARGET ${RMQ_LIBRARY_TARGET} PARENT_SCOPE) diff --git a/librab/build/librabbitmq/amqp.h b/librab/build/librabbitmq/amqp.h new file mode 100644 index 0000000..2983b16 --- /dev/null +++ b/librab/build/librabbitmq/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/librab/build/librabbitmq/amqp_api.c b/librab/build/librabbitmq/amqp_api.c new file mode 100644 index 0000000..28b2384 --- /dev/null +++ b/librab/build/librabbitmq/amqp_api.c @@ -0,0 +1,394 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _MSC_VER +/* MSVC complains about sprintf being deprecated in favor of sprintf_s */ +#define _CRT_SECURE_NO_WARNINGS +/* MSVC complains about strdup being deprecated in favor of _strdup */ +#define _CRT_NONSTDC_NO_DEPRECATE +#endif + +#include "amqp_private.h" +#include "amqp_time.h" +#include +#include +#include +#include +#include + +#define ERROR_MASK (0x00FF) +#define ERROR_CATEGORY_MASK (0xFF00) + +enum error_category_enum_ { EC_base = 0, EC_tcp = 1, EC_ssl = 2 }; + +static const char *base_error_strings[] = { + /* AMQP_STATUS_OK 0x0 */ + "operation completed successfully", + /* AMQP_STATUS_NO_MEMORY -0x0001 */ + "could not allocate memory", + /* AMQP_STATUS_BAD_AQMP_DATA -0x0002 */ + "invalid AMQP data", + /* AMQP_STATUS_UNKNOWN_CLASS -0x0003 */ + "unknown AMQP class id", + /* AMQP_STATUS_UNKNOWN_METHOD -0x0004 */ + "unknown AMQP method id", + /* AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED -0x0005 */ + "hostname lookup failed", + /* AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION -0x0006 */ + "incompatible AMQP version", + /* AMQP_STATUS_CONNECTION_CLOSED -0x0007 */ + "connection closed unexpectedly", + /* AMQP_STATUS_BAD_AMQP_URL -0x0008 */ + "could not parse AMQP URL", + /* AMQP_STATUS_SOCKET_ERROR -0x0009 */ + "a socket error occurred", + /* AMQP_STATUS_INVALID_PARAMETER -0x000A */ + "invalid parameter", + /* AMQP_STATUS_TABLE_TOO_BIG -0x000B */ + "table too large for buffer", + /* AMQP_STATUS_WRONG_METHOD -0x000C */ + "unexpected method received", + /* AMQP_STATUS_TIMEOUT -0x000D */ + "request timed out", + /* AMQP_STATUS_TIMER_FAILED -0x000E */ + "system timer has failed", + /* AMQP_STATUS_HEARTBEAT_TIMEOUT -0x000F */ + "heartbeat timeout, connection closed", + /* AMQP_STATUS_UNEXPECTED STATE -0x0010 */ + "unexpected protocol state", + /* AMQP_STATUS_SOCKET_CLOSED -0x0011 */ + "socket is closed", + /* AMQP_STATUS_SOCKET_INUSE -0x0012 */ + "socket already open", + /* AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD -0x00013 */ + "unsupported sasl method requested", + /* AMQP_STATUS_UNSUPPORTED -0x0014 */ + "parameter value is unsupported"}; + +static const char *tcp_error_strings[] = { + /* AMQP_STATUS_TCP_ERROR -0x0100 */ + "a socket error occurred", + /* AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR -0x0101 */ + "socket library initialization failed"}; + +static const char *ssl_error_strings[] = { + /* AMQP_STATUS_SSL_ERRO R -0x0200 */ + "a SSL error occurred", + /* AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED -0x0201 */ + "SSL hostname verification failed", + /* AMQP_STATUS_SSL_PEER_VERIFY_FAILED -0x0202 */ + "SSL peer cert verification failed", + /* AMQP_STATUS_SSL_CONNECTION_FAILED -0x0203 */ + "SSL handshake failed"}; + +static const char *unknown_error_string = "(unknown error)"; + +const char *amqp_error_string2(int code) { + const char *error_string; + size_t category = (((-code) & ERROR_CATEGORY_MASK) >> 8); + size_t error = (-code) & ERROR_MASK; + + switch (category) { + case EC_base: + if (error < (sizeof(base_error_strings) / sizeof(char *))) { + error_string = base_error_strings[error]; + } else { + error_string = unknown_error_string; + } + break; + + case EC_tcp: + if (error < (sizeof(tcp_error_strings) / sizeof(char *))) { + error_string = tcp_error_strings[error]; + } else { + error_string = unknown_error_string; + } + break; + + case EC_ssl: + if (error < (sizeof(ssl_error_strings) / sizeof(char *))) { + error_string = ssl_error_strings[error]; + } else { + error_string = unknown_error_string; + } + + break; + + default: + error_string = unknown_error_string; + break; + } + + return error_string; +} + +char *amqp_error_string(int code) { + /* Previously sometimes clients had to flip the sign on a return value from a + * function to get the correct error code. Now, all error codes are negative. + * To keep people's legacy code running correctly, we map all error codes to + * negative values. + * + * This is only done with this deprecated function. + */ + if (code > 0) { + code = -code; + } + return strdup(amqp_error_string2(code)); +} + +void amqp_abort(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); + abort(); +} + +const amqp_bytes_t amqp_empty_bytes = {0, NULL}; +const amqp_table_t amqp_empty_table = {0, NULL}; +const amqp_array_t amqp_empty_array = {0, NULL}; + +int 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, + amqp_basic_properties_t const *properties, + amqp_bytes_t body) { + amqp_frame_t f; + size_t body_offset; + size_t usable_body_payload_size = + state->frame_max - (HEADER_SIZE + FOOTER_SIZE); + int res; + int flagz; + + amqp_basic_publish_t m; + amqp_basic_properties_t default_properties; + + m.exchange = exchange; + m.routing_key = routing_key; + m.mandatory = mandatory; + m.immediate = immediate; + m.ticket = 0; + + /* TODO(alanxz): this heartbeat check is happening in the wrong place, it + * should really be done in amqp_try_send/writev */ + res = amqp_time_has_past(state->next_recv_heartbeat); + if (AMQP_STATUS_TIMER_FAILURE == res) { + return res; + } else if (AMQP_STATUS_TIMEOUT == res) { + res = amqp_try_recv(state); + if (AMQP_STATUS_TIMEOUT == res) { + return AMQP_STATUS_HEARTBEAT_TIMEOUT; + } else if (AMQP_STATUS_OK != res) { + return res; + } + } + + res = amqp_send_method_inner(state, channel, AMQP_BASIC_PUBLISH_METHOD, &m, + AMQP_SF_MORE, amqp_time_infinite()); + if (res < 0) { + return res; + } + + if (properties == NULL) { + memset(&default_properties, 0, sizeof(default_properties)); + properties = &default_properties; + } + + f.frame_type = AMQP_FRAME_HEADER; + f.channel = channel; + f.payload.properties.class_id = AMQP_BASIC_CLASS; + f.payload.properties.body_size = body.len; + f.payload.properties.decoded = (void *)properties; + + if (body.len > 0) { + flagz = AMQP_SF_MORE; + } else { + flagz = AMQP_SF_NONE; + } + res = amqp_send_frame_inner(state, &f, flagz, amqp_time_infinite()); + if (res < 0) { + return res; + } + + body_offset = 0; + while (body_offset < body.len) { + size_t remaining = body.len - body_offset; + + if (remaining == 0) { + break; + } + + f.frame_type = AMQP_FRAME_BODY; + f.channel = channel; + f.payload.body_fragment.bytes = amqp_offset(body.bytes, body_offset); + if (remaining >= usable_body_payload_size) { + f.payload.body_fragment.len = usable_body_payload_size; + flagz = AMQP_SF_MORE; + } else { + f.payload.body_fragment.len = remaining; + flagz = AMQP_SF_NONE; + } + + body_offset += f.payload.body_fragment.len; + res = amqp_send_frame_inner(state, &f, flagz, amqp_time_infinite()); + if (res < 0) { + return res; + } + } + + return AMQP_STATUS_OK; +} + +amqp_rpc_reply_t amqp_channel_close(amqp_connection_state_t state, + amqp_channel_t channel, int code) { + char codestr[13]; + amqp_method_number_t replies[2] = {AMQP_CHANNEL_CLOSE_OK_METHOD, 0}; + amqp_channel_close_t req; + + if (code < 0 || code > UINT16_MAX) { + return amqp_rpc_reply_error(AMQP_STATUS_INVALID_PARAMETER); + } + + req.reply_code = (uint16_t)code; + req.reply_text.bytes = codestr; + req.reply_text.len = sprintf(codestr, "%d", code); + req.class_id = 0; + req.method_id = 0; + + return amqp_simple_rpc(state, channel, AMQP_CHANNEL_CLOSE_METHOD, replies, + &req); +} + +amqp_rpc_reply_t amqp_connection_close(amqp_connection_state_t state, + int code) { + char codestr[13]; + amqp_method_number_t replies[2] = {AMQP_CONNECTION_CLOSE_OK_METHOD, 0}; + amqp_channel_close_t req; + + if (code < 0 || code > UINT16_MAX) { + return amqp_rpc_reply_error(AMQP_STATUS_INVALID_PARAMETER); + } + + req.reply_code = (uint16_t)code; + req.reply_text.bytes = codestr; + req.reply_text.len = sprintf(codestr, "%d", code); + req.class_id = 0; + req.method_id = 0; + + return amqp_simple_rpc(state, 0, AMQP_CONNECTION_CLOSE_METHOD, replies, &req); +} + +int amqp_basic_ack(amqp_connection_state_t state, amqp_channel_t channel, + uint64_t delivery_tag, amqp_boolean_t multiple) { + amqp_basic_ack_t m; + m.delivery_tag = delivery_tag; + m.multiple = multiple; + return amqp_send_method(state, channel, AMQP_BASIC_ACK_METHOD, &m); +} + +amqp_rpc_reply_t amqp_basic_get(amqp_connection_state_t state, + amqp_channel_t channel, amqp_bytes_t queue, + amqp_boolean_t no_ack) { + amqp_method_number_t replies[] = {AMQP_BASIC_GET_OK_METHOD, + AMQP_BASIC_GET_EMPTY_METHOD, 0}; + amqp_basic_get_t req; + req.ticket = 0; + req.queue = queue; + req.no_ack = no_ack; + + state->most_recent_api_result = + amqp_simple_rpc(state, channel, AMQP_BASIC_GET_METHOD, replies, &req); + return state->most_recent_api_result; +} + +int amqp_basic_reject(amqp_connection_state_t state, amqp_channel_t channel, + uint64_t delivery_tag, amqp_boolean_t requeue) { + amqp_basic_reject_t req; + req.delivery_tag = delivery_tag; + req.requeue = requeue; + return amqp_send_method(state, channel, AMQP_BASIC_REJECT_METHOD, &req); +} + +int amqp_basic_nack(amqp_connection_state_t state, amqp_channel_t channel, + uint64_t delivery_tag, amqp_boolean_t multiple, + amqp_boolean_t requeue) { + amqp_basic_nack_t req; + req.delivery_tag = delivery_tag; + req.multiple = multiple; + req.requeue = requeue; + return amqp_send_method(state, channel, AMQP_BASIC_NACK_METHOD, &req); +} + +struct timeval *amqp_get_handshake_timeout(amqp_connection_state_t state) { + return state->handshake_timeout; +} + +int amqp_set_handshake_timeout(amqp_connection_state_t state, + struct timeval *timeout) { + if (timeout) { + if (timeout->tv_sec < 0 || timeout->tv_usec < 0) { + return AMQP_STATUS_INVALID_PARAMETER; + } + state->internal_handshake_timeout = *timeout; + state->handshake_timeout = &state->internal_handshake_timeout; + } else { + state->handshake_timeout = NULL; + } + + return AMQP_STATUS_OK; +} + +struct timeval *amqp_get_rpc_timeout(amqp_connection_state_t state) { + return state->rpc_timeout; +} + +int amqp_set_rpc_timeout(amqp_connection_state_t state, + struct timeval *timeout) { + if (timeout) { + if (timeout->tv_sec < 0 || timeout->tv_usec < 0) { + return AMQP_STATUS_INVALID_PARAMETER; + } + state->rpc_timeout = &state->internal_rpc_timeout; + *state->rpc_timeout = *timeout; + } else { + state->rpc_timeout = NULL; + } + return AMQP_STATUS_OK; +} diff --git a/librab/build/librabbitmq/amqp_connection.c b/librab/build/librabbitmq/amqp_connection.c new file mode 100644 index 0000000..034b2e9 --- /dev/null +++ b/librab/build/librabbitmq/amqp_connection.c @@ -0,0 +1,595 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "amqp_private.h" +#include "amqp_tcp_socket.h" +#include "amqp_time.h" +#include +#include +#include +#include +#include + +#ifndef AMQP_INITIAL_FRAME_POOL_PAGE_SIZE +#define AMQP_INITIAL_FRAME_POOL_PAGE_SIZE 65536 +#endif + +#ifndef AMQP_INITIAL_INBOUND_SOCK_BUFFER_SIZE +#define AMQP_INITIAL_INBOUND_SOCK_BUFFER_SIZE 131072 +#endif + +#ifndef AMQP_DEFAULT_LOGIN_TIMEOUT_SEC +#define AMQP_DEFAULT_LOGIN_TIMEOUT_SEC 12 +#endif + +#define ENFORCE_STATE(statevec, statenum) \ + { \ + amqp_connection_state_t _check_state = (statevec); \ + amqp_connection_state_enum _wanted_state = (statenum); \ + if (_check_state->state != _wanted_state) \ + amqp_abort( \ + "Programming error: invalid AMQP connection state: expected %d, " \ + "got %d", \ + _wanted_state, _check_state->state); \ + } + +amqp_connection_state_t amqp_new_connection(void) { + int res; + amqp_connection_state_t state = (amqp_connection_state_t)calloc( + 1, sizeof(struct amqp_connection_state_t_)); + + if (state == NULL) { + return NULL; + } + + res = amqp_tune_connection(state, 0, AMQP_INITIAL_FRAME_POOL_PAGE_SIZE, 0); + if (0 != res) { + goto out_nomem; + } + + state->inbound_buffer.bytes = state->header_buffer; + state->inbound_buffer.len = sizeof(state->header_buffer); + + state->state = CONNECTION_STATE_INITIAL; + /* the server protocol version response is 8 bytes, which conveniently + is also the minimum frame size */ + state->target_size = 8; + + state->sock_inbound_buffer.len = AMQP_INITIAL_INBOUND_SOCK_BUFFER_SIZE; + state->sock_inbound_buffer.bytes = + malloc(AMQP_INITIAL_INBOUND_SOCK_BUFFER_SIZE); + if (state->sock_inbound_buffer.bytes == NULL) { + goto out_nomem; + } + + init_amqp_pool(&state->properties_pool, 512); + + /* Use address of the internal_handshake_timeout object by default. */ + state->internal_handshake_timeout.tv_sec = AMQP_DEFAULT_LOGIN_TIMEOUT_SEC; + state->internal_handshake_timeout.tv_usec = 0; + state->handshake_timeout = &state->internal_handshake_timeout; + + return state; + +out_nomem: + free(state->sock_inbound_buffer.bytes); + free(state); + return NULL; +} + +int amqp_get_sockfd(amqp_connection_state_t state) { + return state->socket ? amqp_socket_get_sockfd(state->socket) : -1; +} + +void amqp_set_sockfd(amqp_connection_state_t state, int sockfd) { + amqp_socket_t *socket = amqp_tcp_socket_new(state); + if (!socket) { + amqp_abort("%s", strerror(errno)); + } + amqp_tcp_socket_set_sockfd(socket, sockfd); +} + +void amqp_set_socket(amqp_connection_state_t state, amqp_socket_t *socket) { + amqp_socket_delete(state->socket); + state->socket = socket; +} + +amqp_socket_t *amqp_get_socket(amqp_connection_state_t state) { + return state->socket; +} + +int amqp_tune_connection(amqp_connection_state_t state, int channel_max, + int frame_max, int heartbeat) { + void *newbuf; + int res; + + ENFORCE_STATE(state, CONNECTION_STATE_IDLE); + + state->channel_max = channel_max; + state->frame_max = frame_max; + + state->heartbeat = heartbeat; + if (0 > state->heartbeat) { + state->heartbeat = 0; + } + + res = amqp_time_s_from_now(&state->next_send_heartbeat, + amqp_heartbeat_send(state)); + if (AMQP_STATUS_OK != res) { + return res; + } + res = amqp_time_s_from_now(&state->next_recv_heartbeat, + amqp_heartbeat_recv(state)); + if (AMQP_STATUS_OK != res) { + return res; + } + + state->outbound_buffer.len = frame_max; + newbuf = realloc(state->outbound_buffer.bytes, frame_max); + if (newbuf == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + state->outbound_buffer.bytes = newbuf; + + return AMQP_STATUS_OK; +} + +int amqp_get_channel_max(amqp_connection_state_t state) { + return state->channel_max; +} + +int amqp_get_frame_max(amqp_connection_state_t state) { + return state->frame_max; +} + +int amqp_get_heartbeat(amqp_connection_state_t state) { + return state->heartbeat; +} + +int amqp_destroy_connection(amqp_connection_state_t state) { + int status = AMQP_STATUS_OK; + if (state) { + int i; + for (i = 0; i < POOL_TABLE_SIZE; ++i) { + amqp_pool_table_entry_t *entry = state->pool_table[i]; + while (NULL != entry) { + amqp_pool_table_entry_t *todelete = entry; + empty_amqp_pool(&entry->pool); + entry = entry->next; + free(todelete); + } + } + + free(state->outbound_buffer.bytes); + free(state->sock_inbound_buffer.bytes); + amqp_socket_delete(state->socket); + empty_amqp_pool(&state->properties_pool); + free(state); + } + return status; +} + +static void return_to_idle(amqp_connection_state_t state) { + state->inbound_buffer.len = sizeof(state->header_buffer); + state->inbound_buffer.bytes = state->header_buffer; + state->inbound_offset = 0; + state->target_size = HEADER_SIZE; + state->state = CONNECTION_STATE_IDLE; +} + +static size_t consume_data(amqp_connection_state_t state, + amqp_bytes_t *received_data) { + /* how much data is available and will fit? */ + size_t bytes_consumed = state->target_size - state->inbound_offset; + if (received_data->len < bytes_consumed) { + bytes_consumed = received_data->len; + } + + memcpy(amqp_offset(state->inbound_buffer.bytes, state->inbound_offset), + received_data->bytes, bytes_consumed); + state->inbound_offset += bytes_consumed; + received_data->bytes = amqp_offset(received_data->bytes, bytes_consumed); + received_data->len -= bytes_consumed; + + return bytes_consumed; +} + +int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data, + amqp_frame_t *decoded_frame) { + size_t bytes_consumed; + void *raw_frame; + + /* Returning frame_type of zero indicates either insufficient input, + or a complete, ignored frame was read. */ + decoded_frame->frame_type = 0; + + if (received_data.len == 0) { + return AMQP_STATUS_OK; + } + + if (state->state == CONNECTION_STATE_IDLE) { + state->state = CONNECTION_STATE_HEADER; + } + + bytes_consumed = consume_data(state, &received_data); + + /* do we have target_size data yet? if not, return with the + expectation that more will arrive */ + if (state->inbound_offset < state->target_size) { + return (int)bytes_consumed; + } + + raw_frame = state->inbound_buffer.bytes; + + switch (state->state) { + case CONNECTION_STATE_INITIAL: + /* check for a protocol header from the server */ + if (memcmp(raw_frame, "AMQP", 4) == 0) { + decoded_frame->frame_type = AMQP_PSEUDOFRAME_PROTOCOL_HEADER; + decoded_frame->channel = 0; + + decoded_frame->payload.protocol_header.transport_high = + amqp_d8(amqp_offset(raw_frame, 4)); + decoded_frame->payload.protocol_header.transport_low = + amqp_d8(amqp_offset(raw_frame, 5)); + decoded_frame->payload.protocol_header.protocol_version_major = + amqp_d8(amqp_offset(raw_frame, 6)); + decoded_frame->payload.protocol_header.protocol_version_minor = + amqp_d8(amqp_offset(raw_frame, 7)); + + return_to_idle(state); + return (int)bytes_consumed; + } + + /* it's not a protocol header; fall through to process it as a + regular frame header */ + + case CONNECTION_STATE_HEADER: { + amqp_channel_t channel; + amqp_pool_t *channel_pool; + /* frame length is 3 bytes in */ + channel = amqp_d16(amqp_offset(raw_frame, 1)); + + state->target_size = + amqp_d32(amqp_offset(raw_frame, 3)) + HEADER_SIZE + FOOTER_SIZE; + + if ((size_t)state->frame_max < state->target_size) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + channel_pool = amqp_get_or_create_channel_pool(state, channel); + if (NULL == channel_pool) { + return AMQP_STATUS_NO_MEMORY; + } + + amqp_pool_alloc_bytes(channel_pool, state->target_size, + &state->inbound_buffer); + if (NULL == state->inbound_buffer.bytes) { + return AMQP_STATUS_NO_MEMORY; + } + memcpy(state->inbound_buffer.bytes, state->header_buffer, HEADER_SIZE); + raw_frame = state->inbound_buffer.bytes; + + state->state = CONNECTION_STATE_BODY; + + bytes_consumed += consume_data(state, &received_data); + + /* do we have target_size data yet? if not, return with the + expectation that more will arrive */ + if (state->inbound_offset < state->target_size) { + return (int)bytes_consumed; + } + } + /* fall through to process body */ + + case CONNECTION_STATE_BODY: { + amqp_bytes_t encoded; + int res; + amqp_pool_t *channel_pool; + + /* Check frame end marker (footer) */ + if (amqp_d8(amqp_offset(raw_frame, state->target_size - 1)) != + AMQP_FRAME_END) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + decoded_frame->frame_type = amqp_d8(amqp_offset(raw_frame, 0)); + decoded_frame->channel = amqp_d16(amqp_offset(raw_frame, 1)); + + channel_pool = + amqp_get_or_create_channel_pool(state, decoded_frame->channel); + if (NULL == channel_pool) { + return AMQP_STATUS_NO_MEMORY; + } + + switch (decoded_frame->frame_type) { + case AMQP_FRAME_METHOD: + decoded_frame->payload.method.id = + amqp_d32(amqp_offset(raw_frame, HEADER_SIZE)); + encoded.bytes = amqp_offset(raw_frame, HEADER_SIZE + 4); + encoded.len = state->target_size - HEADER_SIZE - 4 - FOOTER_SIZE; + + res = amqp_decode_method(decoded_frame->payload.method.id, + channel_pool, encoded, + &decoded_frame->payload.method.decoded); + if (res < 0) { + return res; + } + + break; + + case AMQP_FRAME_HEADER: + decoded_frame->payload.properties.class_id = + amqp_d16(amqp_offset(raw_frame, HEADER_SIZE)); + /* unused 2-byte weight field goes here */ + decoded_frame->payload.properties.body_size = + amqp_d64(amqp_offset(raw_frame, HEADER_SIZE + 4)); + encoded.bytes = amqp_offset(raw_frame, HEADER_SIZE + 12); + encoded.len = state->target_size - HEADER_SIZE - 12 - FOOTER_SIZE; + decoded_frame->payload.properties.raw = encoded; + + res = amqp_decode_properties( + decoded_frame->payload.properties.class_id, channel_pool, encoded, + &decoded_frame->payload.properties.decoded); + if (res < 0) { + return res; + } + + break; + + case AMQP_FRAME_BODY: + decoded_frame->payload.body_fragment.len = + state->target_size - HEADER_SIZE - FOOTER_SIZE; + decoded_frame->payload.body_fragment.bytes = + amqp_offset(raw_frame, HEADER_SIZE); + break; + + case AMQP_FRAME_HEARTBEAT: + break; + + default: + /* Ignore the frame */ + decoded_frame->frame_type = 0; + break; + } + + return_to_idle(state); + return (int)bytes_consumed; + } + + default: + amqp_abort("Internal error: invalid amqp_connection_state_t->state %d", + state->state); + } +} + +amqp_boolean_t amqp_release_buffers_ok(amqp_connection_state_t state) { + return (state->state == CONNECTION_STATE_IDLE); +} + +void amqp_release_buffers(amqp_connection_state_t state) { + int i; + ENFORCE_STATE(state, CONNECTION_STATE_IDLE); + + for (i = 0; i < POOL_TABLE_SIZE; ++i) { + amqp_pool_table_entry_t *entry = state->pool_table[i]; + + for (; NULL != entry; entry = entry->next) { + amqp_maybe_release_buffers_on_channel(state, entry->channel); + } + } +} + +void amqp_maybe_release_buffers(amqp_connection_state_t state) { + if (amqp_release_buffers_ok(state)) { + amqp_release_buffers(state); + } +} + +void amqp_maybe_release_buffers_on_channel(amqp_connection_state_t state, + amqp_channel_t channel) { + amqp_link_t *queued_link; + amqp_pool_t *pool; + if (CONNECTION_STATE_IDLE != state->state) { + return; + } + + queued_link = state->first_queued_frame; + + while (NULL != queued_link) { + amqp_frame_t *frame = queued_link->data; + if (channel == frame->channel) { + return; + } + + queued_link = queued_link->next; + } + + pool = amqp_get_channel_pool(state, channel); + + if (pool != NULL) { + recycle_amqp_pool(pool); + } +} + +static int amqp_frame_to_bytes(const amqp_frame_t *frame, amqp_bytes_t buffer, + amqp_bytes_t *encoded) { + void *out_frame = buffer.bytes; + size_t out_frame_len; + int res; + + amqp_e8(frame->frame_type, amqp_offset(out_frame, 0)); + amqp_e16(frame->channel, amqp_offset(out_frame, 1)); + + switch (frame->frame_type) { + case AMQP_FRAME_BODY: { + const amqp_bytes_t *body = &frame->payload.body_fragment; + + memcpy(amqp_offset(out_frame, HEADER_SIZE), body->bytes, body->len); + + out_frame_len = body->len; + break; + } + case AMQP_FRAME_METHOD: { + amqp_bytes_t method_encoded; + + amqp_e32(frame->payload.method.id, amqp_offset(out_frame, HEADER_SIZE)); + + method_encoded.bytes = amqp_offset(out_frame, HEADER_SIZE + 4); + method_encoded.len = buffer.len - HEADER_SIZE - 4 - FOOTER_SIZE; + + res = amqp_encode_method(frame->payload.method.id, + frame->payload.method.decoded, method_encoded); + if (res < 0) { + return res; + } + + out_frame_len = res + 4; + break; + } + + case AMQP_FRAME_HEADER: { + amqp_bytes_t properties_encoded; + + amqp_e16(frame->payload.properties.class_id, + amqp_offset(out_frame, HEADER_SIZE)); + amqp_e16(0, amqp_offset(out_frame, HEADER_SIZE + 2)); /* "weight" */ + amqp_e64(frame->payload.properties.body_size, + amqp_offset(out_frame, HEADER_SIZE + 4)); + + properties_encoded.bytes = amqp_offset(out_frame, HEADER_SIZE + 12); + properties_encoded.len = buffer.len - HEADER_SIZE - 12 - FOOTER_SIZE; + + res = amqp_encode_properties(frame->payload.properties.class_id, + frame->payload.properties.decoded, + properties_encoded); + if (res < 0) { + return res; + } + + out_frame_len = res + 12; + break; + } + + case AMQP_FRAME_HEARTBEAT: + out_frame_len = 0; + break; + + default: + return AMQP_STATUS_INVALID_PARAMETER; + } + + amqp_e32((uint32_t)out_frame_len, amqp_offset(out_frame, 3)); + amqp_e8(AMQP_FRAME_END, amqp_offset(out_frame, HEADER_SIZE + out_frame_len)); + + encoded->bytes = out_frame; + encoded->len = out_frame_len + HEADER_SIZE + FOOTER_SIZE; + + return AMQP_STATUS_OK; +} + +int amqp_send_frame(amqp_connection_state_t state, const amqp_frame_t *frame) { + return amqp_send_frame_inner(state, frame, AMQP_SF_NONE, + amqp_time_infinite()); +} + +int amqp_send_frame_inner(amqp_connection_state_t state, + const amqp_frame_t *frame, int flags, + amqp_time_t deadline) { + int res; + ssize_t sent; + amqp_bytes_t encoded; + amqp_time_t next_timeout; + + /* TODO: if the AMQP_SF_MORE socket optimization can be shown to work + * correctly, then this could be un-done so that body-frames are sent as 3 + * send calls, getting rid of the copy of the body content, some testing + * would need to be done to see if this would actually a win for performance. + * */ + res = amqp_frame_to_bytes(frame, state->outbound_buffer, &encoded); + if (AMQP_STATUS_OK != res) { + return res; + } + +start_send: + + next_timeout = amqp_time_first(deadline, state->next_recv_heartbeat); + + sent = amqp_try_send(state, encoded.bytes, encoded.len, next_timeout, flags); + if (0 > sent) { + return (int)sent; + } + + /* A partial send has occurred, because of a heartbeat timeout (so try recv + * something) or common timeout (so return AMQP_STATUS_TIMEOUT) */ + if ((ssize_t)encoded.len != sent) { + if (amqp_time_equal(next_timeout, deadline)) { + /* timeout of method was received, so return from method*/ + return AMQP_STATUS_TIMEOUT; + } + + res = amqp_try_recv(state); + + if (AMQP_STATUS_TIMEOUT == res) { + return AMQP_STATUS_HEARTBEAT_TIMEOUT; + } else if (AMQP_STATUS_OK != res) { + return res; + } + + encoded.bytes = (uint8_t *)encoded.bytes + sent; + encoded.len -= sent; + goto start_send; + } + + res = amqp_time_s_from_now(&state->next_send_heartbeat, + amqp_heartbeat_send(state)); + return res; +} + +amqp_table_t *amqp_get_server_properties(amqp_connection_state_t state) { + return &state->server_properties; +} + +amqp_table_t *amqp_get_client_properties(amqp_connection_state_t state) { + return &state->client_properties; +} diff --git a/librab/build/librabbitmq/amqp_consumer.c b/librab/build/librabbitmq/amqp_consumer.c new file mode 100644 index 0000000..bb9095f --- /dev/null +++ b/librab/build/librabbitmq/amqp_consumer.c @@ -0,0 +1,307 @@ +/* + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by Alan Antonuk are Copyright (c) 2013-2014 + * Alan Antonuk. 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 ***** + */ +#include "amqp.h" +#include "amqp_private.h" +#include "amqp_socket.h" + +#include +#include + +static int amqp_basic_properties_clone(amqp_basic_properties_t *original, + amqp_basic_properties_t *clone, + amqp_pool_t *pool) { + memset(clone, 0, sizeof(*clone)); + clone->_flags = original->_flags; + +#define CLONE_BYTES_POOL(original, clone, pool) \ + if (0 == original.len) { \ + clone = amqp_empty_bytes; \ + } else { \ + amqp_pool_alloc_bytes(pool, original.len, &clone); \ + if (NULL == clone.bytes) { \ + return AMQP_STATUS_NO_MEMORY; \ + } \ + memcpy(clone.bytes, original.bytes, clone.len); \ + } + + if (clone->_flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { + CLONE_BYTES_POOL(original->content_type, clone->content_type, pool) + } + + if (clone->_flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { + CLONE_BYTES_POOL(original->content_encoding, clone->content_encoding, pool) + } + + if (clone->_flags & AMQP_BASIC_HEADERS_FLAG) { + int res = amqp_table_clone(&original->headers, &clone->headers, pool); + if (AMQP_STATUS_OK != res) { + return res; + } + } + + if (clone->_flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { + clone->delivery_mode = original->delivery_mode; + } + + if (clone->_flags & AMQP_BASIC_PRIORITY_FLAG) { + clone->priority = original->priority; + } + + if (clone->_flags & AMQP_BASIC_CORRELATION_ID_FLAG) { + CLONE_BYTES_POOL(original->correlation_id, clone->correlation_id, pool) + } + + if (clone->_flags & AMQP_BASIC_REPLY_TO_FLAG) { + CLONE_BYTES_POOL(original->reply_to, clone->reply_to, pool) + } + + if (clone->_flags & AMQP_BASIC_EXPIRATION_FLAG) { + CLONE_BYTES_POOL(original->expiration, clone->expiration, pool) + } + + if (clone->_flags & AMQP_BASIC_MESSAGE_ID_FLAG) { + CLONE_BYTES_POOL(original->message_id, clone->message_id, pool) + } + + if (clone->_flags & AMQP_BASIC_TIMESTAMP_FLAG) { + clone->timestamp = original->timestamp; + } + + if (clone->_flags & AMQP_BASIC_TYPE_FLAG) { + CLONE_BYTES_POOL(original->type, clone->type, pool) + } + + if (clone->_flags & AMQP_BASIC_USER_ID_FLAG) { + CLONE_BYTES_POOL(original->user_id, clone->user_id, pool) + } + + if (clone->_flags & AMQP_BASIC_APP_ID_FLAG) { + CLONE_BYTES_POOL(original->app_id, clone->app_id, pool) + } + + if (clone->_flags & AMQP_BASIC_CLUSTER_ID_FLAG) { + CLONE_BYTES_POOL(original->cluster_id, clone->cluster_id, pool) + } + + return AMQP_STATUS_OK; +#undef CLONE_BYTES_POOL +} + +void amqp_destroy_message(amqp_message_t *message) { + empty_amqp_pool(&message->pool); + amqp_bytes_free(message->body); +} + +void amqp_destroy_envelope(amqp_envelope_t *envelope) { + amqp_destroy_message(&envelope->message); + amqp_bytes_free(envelope->routing_key); + amqp_bytes_free(envelope->exchange); + amqp_bytes_free(envelope->consumer_tag); +} + +static int amqp_bytes_malloc_dup_failed(amqp_bytes_t bytes) { + if (bytes.len != 0 && bytes.bytes == NULL) { + return 1; + } + return 0; +} + +amqp_rpc_reply_t amqp_consume_message(amqp_connection_state_t state, + amqp_envelope_t *envelope, + struct timeval *timeout, + AMQP_UNUSED int flags) { + int res; + amqp_frame_t frame; + amqp_basic_deliver_t *delivery_method; + amqp_rpc_reply_t ret; + + memset(&ret, 0, sizeof(ret)); + memset(envelope, 0, sizeof(*envelope)); + + res = amqp_simple_wait_frame_noblock(state, &frame, timeout); + if (AMQP_STATUS_OK != res) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = res; + goto error_out1; + } + + if (AMQP_FRAME_METHOD != frame.frame_type || + AMQP_BASIC_DELIVER_METHOD != frame.payload.method.id) { + amqp_put_back_frame(state, &frame); + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_UNEXPECTED_STATE; + goto error_out1; + } + + delivery_method = frame.payload.method.decoded; + + envelope->channel = frame.channel; + envelope->consumer_tag = amqp_bytes_malloc_dup(delivery_method->consumer_tag); + envelope->delivery_tag = delivery_method->delivery_tag; + envelope->redelivered = delivery_method->redelivered; + envelope->exchange = amqp_bytes_malloc_dup(delivery_method->exchange); + envelope->routing_key = amqp_bytes_malloc_dup(delivery_method->routing_key); + + if (amqp_bytes_malloc_dup_failed(envelope->consumer_tag) || + amqp_bytes_malloc_dup_failed(envelope->exchange) || + amqp_bytes_malloc_dup_failed(envelope->routing_key)) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_NO_MEMORY; + goto error_out2; + } + + ret = amqp_read_message(state, envelope->channel, &envelope->message, 0); + if (AMQP_RESPONSE_NORMAL != ret.reply_type) { + goto error_out2; + } + + ret.reply_type = AMQP_RESPONSE_NORMAL; + return ret; + +error_out2: + amqp_bytes_free(envelope->routing_key); + amqp_bytes_free(envelope->exchange); + amqp_bytes_free(envelope->consumer_tag); +error_out1: + return ret; +} + +amqp_rpc_reply_t amqp_read_message(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_message_t *message, + AMQP_UNUSED int flags) { + amqp_frame_t frame; + amqp_rpc_reply_t ret; + + size_t body_read; + char *body_read_ptr; + int res; + + memset(&ret, 0, sizeof(ret)); + memset(message, 0, sizeof(*message)); + + res = amqp_simple_wait_frame_on_channel(state, channel, &frame); + if (AMQP_STATUS_OK != res) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = res; + + goto error_out1; + } + + if (AMQP_FRAME_HEADER != frame.frame_type) { + if (AMQP_FRAME_METHOD == frame.frame_type && + (AMQP_CHANNEL_CLOSE_METHOD == frame.payload.method.id || + AMQP_CONNECTION_CLOSE_METHOD == frame.payload.method.id)) { + + ret.reply_type = AMQP_RESPONSE_SERVER_EXCEPTION; + ret.reply = frame.payload.method; + + } else { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_UNEXPECTED_STATE; + + amqp_put_back_frame(state, &frame); + } + goto error_out1; + } + + init_amqp_pool(&message->pool, 4096); + res = amqp_basic_properties_clone(frame.payload.properties.decoded, + &message->properties, &message->pool); + + if (AMQP_STATUS_OK != res) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = res; + goto error_out3; + } + + if (0 == frame.payload.properties.body_size) { + message->body = amqp_empty_bytes; + } else { + if (SIZE_MAX < frame.payload.properties.body_size) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_NO_MEMORY; + goto error_out1; + } + message->body = + amqp_bytes_malloc((size_t)frame.payload.properties.body_size); + if (NULL == message->body.bytes) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_NO_MEMORY; + goto error_out1; + } + } + + body_read = 0; + body_read_ptr = message->body.bytes; + + while (body_read < message->body.len) { + res = amqp_simple_wait_frame_on_channel(state, channel, &frame); + if (AMQP_STATUS_OK != res) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = res; + goto error_out2; + } + if (AMQP_FRAME_BODY != frame.frame_type) { + if (AMQP_FRAME_METHOD == frame.frame_type && + (AMQP_CHANNEL_CLOSE_METHOD == frame.payload.method.id || + AMQP_CONNECTION_CLOSE_METHOD == frame.payload.method.id)) { + + ret.reply_type = AMQP_RESPONSE_SERVER_EXCEPTION; + ret.reply = frame.payload.method; + } else { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_BAD_AMQP_DATA; + } + goto error_out2; + } + + if (body_read + frame.payload.body_fragment.len > message->body.len) { + ret.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + ret.library_error = AMQP_STATUS_BAD_AMQP_DATA; + goto error_out2; + } + + memcpy(body_read_ptr, frame.payload.body_fragment.bytes, + frame.payload.body_fragment.len); + + body_read += frame.payload.body_fragment.len; + body_read_ptr += frame.payload.body_fragment.len; + } + + ret.reply_type = AMQP_RESPONSE_NORMAL; + return ret; + +error_out2: + amqp_bytes_free(message->body); +error_out3: + empty_amqp_pool(&message->pool); +error_out1: + return ret; +} diff --git a/librab/build/librabbitmq/amqp_framing.c b/librab/build/librabbitmq/amqp_framing.c new file mode 100644 index 0000000..bdeb01c --- /dev/null +++ b/librab/build/librabbitmq/amqp_framing.c @@ -0,0 +1,2876 @@ +/* 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include +#include +#include +#include + +char const *amqp_constant_name(int constantNumber) { + switch (constantNumber) { + case AMQP_FRAME_METHOD: + return "AMQP_FRAME_METHOD"; + case AMQP_FRAME_HEADER: + return "AMQP_FRAME_HEADER"; + case AMQP_FRAME_BODY: + return "AMQP_FRAME_BODY"; + case AMQP_FRAME_HEARTBEAT: + return "AMQP_FRAME_HEARTBEAT"; + case AMQP_FRAME_MIN_SIZE: + return "AMQP_FRAME_MIN_SIZE"; + case AMQP_FRAME_END: + return "AMQP_FRAME_END"; + case AMQP_REPLY_SUCCESS: + return "AMQP_REPLY_SUCCESS"; + case AMQP_CONTENT_TOO_LARGE: + return "AMQP_CONTENT_TOO_LARGE"; + case AMQP_NO_ROUTE: + return "AMQP_NO_ROUTE"; + case AMQP_NO_CONSUMERS: + return "AMQP_NO_CONSUMERS"; + case AMQP_ACCESS_REFUSED: + return "AMQP_ACCESS_REFUSED"; + case AMQP_NOT_FOUND: + return "AMQP_NOT_FOUND"; + case AMQP_RESOURCE_LOCKED: + return "AMQP_RESOURCE_LOCKED"; + case AMQP_PRECONDITION_FAILED: + return "AMQP_PRECONDITION_FAILED"; + case AMQP_CONNECTION_FORCED: + return "AMQP_CONNECTION_FORCED"; + case AMQP_INVALID_PATH: + return "AMQP_INVALID_PATH"; + case AMQP_FRAME_ERROR: + return "AMQP_FRAME_ERROR"; + case AMQP_SYNTAX_ERROR: + return "AMQP_SYNTAX_ERROR"; + case AMQP_COMMAND_INVALID: + return "AMQP_COMMAND_INVALID"; + case AMQP_CHANNEL_ERROR: + return "AMQP_CHANNEL_ERROR"; + case AMQP_UNEXPECTED_FRAME: + return "AMQP_UNEXPECTED_FRAME"; + case AMQP_RESOURCE_ERROR: + return "AMQP_RESOURCE_ERROR"; + case AMQP_NOT_ALLOWED: + return "AMQP_NOT_ALLOWED"; + case AMQP_NOT_IMPLEMENTED: + return "AMQP_NOT_IMPLEMENTED"; + case AMQP_INTERNAL_ERROR: + return "AMQP_INTERNAL_ERROR"; + default: + return "(unknown)"; + } +} + +amqp_boolean_t amqp_constant_is_hard_error(int constantNumber) { + switch (constantNumber) { + case AMQP_CONNECTION_FORCED: + return 1; + case AMQP_INVALID_PATH: + return 1; + case AMQP_FRAME_ERROR: + return 1; + case AMQP_SYNTAX_ERROR: + return 1; + case AMQP_COMMAND_INVALID: + return 1; + case AMQP_CHANNEL_ERROR: + return 1; + case AMQP_UNEXPECTED_FRAME: + return 1; + case AMQP_RESOURCE_ERROR: + return 1; + case AMQP_NOT_ALLOWED: + return 1; + case AMQP_NOT_IMPLEMENTED: + return 1; + case AMQP_INTERNAL_ERROR: + return 1; + default: + return 0; + } +} + +char const *amqp_method_name(amqp_method_number_t methodNumber) { + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: + return "AMQP_CONNECTION_START_METHOD"; + case AMQP_CONNECTION_START_OK_METHOD: + return "AMQP_CONNECTION_START_OK_METHOD"; + case AMQP_CONNECTION_SECURE_METHOD: + return "AMQP_CONNECTION_SECURE_METHOD"; + case AMQP_CONNECTION_SECURE_OK_METHOD: + return "AMQP_CONNECTION_SECURE_OK_METHOD"; + case AMQP_CONNECTION_TUNE_METHOD: + return "AMQP_CONNECTION_TUNE_METHOD"; + case AMQP_CONNECTION_TUNE_OK_METHOD: + return "AMQP_CONNECTION_TUNE_OK_METHOD"; + case AMQP_CONNECTION_OPEN_METHOD: + return "AMQP_CONNECTION_OPEN_METHOD"; + case AMQP_CONNECTION_OPEN_OK_METHOD: + return "AMQP_CONNECTION_OPEN_OK_METHOD"; + case AMQP_CONNECTION_CLOSE_METHOD: + return "AMQP_CONNECTION_CLOSE_METHOD"; + case AMQP_CONNECTION_CLOSE_OK_METHOD: + return "AMQP_CONNECTION_CLOSE_OK_METHOD"; + case AMQP_CONNECTION_BLOCKED_METHOD: + return "AMQP_CONNECTION_BLOCKED_METHOD"; + case AMQP_CONNECTION_UNBLOCKED_METHOD: + return "AMQP_CONNECTION_UNBLOCKED_METHOD"; + case AMQP_CHANNEL_OPEN_METHOD: + return "AMQP_CHANNEL_OPEN_METHOD"; + case AMQP_CHANNEL_OPEN_OK_METHOD: + return "AMQP_CHANNEL_OPEN_OK_METHOD"; + case AMQP_CHANNEL_FLOW_METHOD: + return "AMQP_CHANNEL_FLOW_METHOD"; + case AMQP_CHANNEL_FLOW_OK_METHOD: + return "AMQP_CHANNEL_FLOW_OK_METHOD"; + case AMQP_CHANNEL_CLOSE_METHOD: + return "AMQP_CHANNEL_CLOSE_METHOD"; + case AMQP_CHANNEL_CLOSE_OK_METHOD: + return "AMQP_CHANNEL_CLOSE_OK_METHOD"; + case AMQP_ACCESS_REQUEST_METHOD: + return "AMQP_ACCESS_REQUEST_METHOD"; + case AMQP_ACCESS_REQUEST_OK_METHOD: + return "AMQP_ACCESS_REQUEST_OK_METHOD"; + case AMQP_EXCHANGE_DECLARE_METHOD: + return "AMQP_EXCHANGE_DECLARE_METHOD"; + case AMQP_EXCHANGE_DECLARE_OK_METHOD: + return "AMQP_EXCHANGE_DECLARE_OK_METHOD"; + case AMQP_EXCHANGE_DELETE_METHOD: + return "AMQP_EXCHANGE_DELETE_METHOD"; + case AMQP_EXCHANGE_DELETE_OK_METHOD: + return "AMQP_EXCHANGE_DELETE_OK_METHOD"; + case AMQP_EXCHANGE_BIND_METHOD: + return "AMQP_EXCHANGE_BIND_METHOD"; + case AMQP_EXCHANGE_BIND_OK_METHOD: + return "AMQP_EXCHANGE_BIND_OK_METHOD"; + case AMQP_EXCHANGE_UNBIND_METHOD: + return "AMQP_EXCHANGE_UNBIND_METHOD"; + case AMQP_EXCHANGE_UNBIND_OK_METHOD: + return "AMQP_EXCHANGE_UNBIND_OK_METHOD"; + case AMQP_QUEUE_DECLARE_METHOD: + return "AMQP_QUEUE_DECLARE_METHOD"; + case AMQP_QUEUE_DECLARE_OK_METHOD: + return "AMQP_QUEUE_DECLARE_OK_METHOD"; + case AMQP_QUEUE_BIND_METHOD: + return "AMQP_QUEUE_BIND_METHOD"; + case AMQP_QUEUE_BIND_OK_METHOD: + return "AMQP_QUEUE_BIND_OK_METHOD"; + case AMQP_QUEUE_PURGE_METHOD: + return "AMQP_QUEUE_PURGE_METHOD"; + case AMQP_QUEUE_PURGE_OK_METHOD: + return "AMQP_QUEUE_PURGE_OK_METHOD"; + case AMQP_QUEUE_DELETE_METHOD: + return "AMQP_QUEUE_DELETE_METHOD"; + case AMQP_QUEUE_DELETE_OK_METHOD: + return "AMQP_QUEUE_DELETE_OK_METHOD"; + case AMQP_QUEUE_UNBIND_METHOD: + return "AMQP_QUEUE_UNBIND_METHOD"; + case AMQP_QUEUE_UNBIND_OK_METHOD: + return "AMQP_QUEUE_UNBIND_OK_METHOD"; + case AMQP_BASIC_QOS_METHOD: + return "AMQP_BASIC_QOS_METHOD"; + case AMQP_BASIC_QOS_OK_METHOD: + return "AMQP_BASIC_QOS_OK_METHOD"; + case AMQP_BASIC_CONSUME_METHOD: + return "AMQP_BASIC_CONSUME_METHOD"; + case AMQP_BASIC_CONSUME_OK_METHOD: + return "AMQP_BASIC_CONSUME_OK_METHOD"; + case AMQP_BASIC_CANCEL_METHOD: + return "AMQP_BASIC_CANCEL_METHOD"; + case AMQP_BASIC_CANCEL_OK_METHOD: + return "AMQP_BASIC_CANCEL_OK_METHOD"; + case AMQP_BASIC_PUBLISH_METHOD: + return "AMQP_BASIC_PUBLISH_METHOD"; + case AMQP_BASIC_RETURN_METHOD: + return "AMQP_BASIC_RETURN_METHOD"; + case AMQP_BASIC_DELIVER_METHOD: + return "AMQP_BASIC_DELIVER_METHOD"; + case AMQP_BASIC_GET_METHOD: + return "AMQP_BASIC_GET_METHOD"; + case AMQP_BASIC_GET_OK_METHOD: + return "AMQP_BASIC_GET_OK_METHOD"; + case AMQP_BASIC_GET_EMPTY_METHOD: + return "AMQP_BASIC_GET_EMPTY_METHOD"; + case AMQP_BASIC_ACK_METHOD: + return "AMQP_BASIC_ACK_METHOD"; + case AMQP_BASIC_REJECT_METHOD: + return "AMQP_BASIC_REJECT_METHOD"; + case AMQP_BASIC_RECOVER_ASYNC_METHOD: + return "AMQP_BASIC_RECOVER_ASYNC_METHOD"; + case AMQP_BASIC_RECOVER_METHOD: + return "AMQP_BASIC_RECOVER_METHOD"; + case AMQP_BASIC_RECOVER_OK_METHOD: + return "AMQP_BASIC_RECOVER_OK_METHOD"; + case AMQP_BASIC_NACK_METHOD: + return "AMQP_BASIC_NACK_METHOD"; + case AMQP_TX_SELECT_METHOD: + return "AMQP_TX_SELECT_METHOD"; + case AMQP_TX_SELECT_OK_METHOD: + return "AMQP_TX_SELECT_OK_METHOD"; + case AMQP_TX_COMMIT_METHOD: + return "AMQP_TX_COMMIT_METHOD"; + case AMQP_TX_COMMIT_OK_METHOD: + return "AMQP_TX_COMMIT_OK_METHOD"; + case AMQP_TX_ROLLBACK_METHOD: + return "AMQP_TX_ROLLBACK_METHOD"; + case AMQP_TX_ROLLBACK_OK_METHOD: + return "AMQP_TX_ROLLBACK_OK_METHOD"; + case AMQP_CONFIRM_SELECT_METHOD: + return "AMQP_CONFIRM_SELECT_METHOD"; + case AMQP_CONFIRM_SELECT_OK_METHOD: + return "AMQP_CONFIRM_SELECT_OK_METHOD"; + default: + return NULL; + } +} + +amqp_boolean_t amqp_method_has_content(amqp_method_number_t methodNumber) { + switch (methodNumber) { + case AMQP_BASIC_PUBLISH_METHOD: + return 1; + case AMQP_BASIC_RETURN_METHOD: + return 1; + case AMQP_BASIC_DELIVER_METHOD: + return 1; + case AMQP_BASIC_GET_OK_METHOD: + return 1; + default: + return 0; + } +} + +int amqp_decode_method(amqp_method_number_t methodNumber, amqp_pool_t *pool, + amqp_bytes_t encoded, void **decoded) { + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: { + amqp_connection_start_t *m = (amqp_connection_start_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_start_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &m->version_major)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &m->version_minor)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = + amqp_decode_table(encoded, pool, &(m->server_properties), &offset); + if (res < 0) return res; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->mechanisms, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->locales, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_START_OK_METHOD: { + amqp_connection_start_ok_t *m = + (amqp_connection_start_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_start_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + int res = + amqp_decode_table(encoded, pool, &(m->client_properties), &offset); + if (res < 0) return res; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->mechanism, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->response, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->locale, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_SECURE_METHOD: { + amqp_connection_secure_t *m = (amqp_connection_secure_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_secure_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->challenge, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_SECURE_OK_METHOD: { + amqp_connection_secure_ok_t *m = + (amqp_connection_secure_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_secure_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->response, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_TUNE_METHOD: { + amqp_connection_tune_t *m = (amqp_connection_tune_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_tune_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->channel_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->frame_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->heartbeat)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_TUNE_OK_METHOD: { + amqp_connection_tune_ok_t *m = + (amqp_connection_tune_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_tune_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->channel_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->frame_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->heartbeat)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_OPEN_METHOD: { + amqp_connection_open_t *m = (amqp_connection_open_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_open_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->virtual_host, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->capabilities, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->insist = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_OPEN_OK_METHOD: { + amqp_connection_open_ok_t *m = + (amqp_connection_open_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_open_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->known_hosts, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_CLOSE_METHOD: { + amqp_connection_close_t *m = (amqp_connection_close_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_close_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_16(encoded, &offset, &m->class_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->method_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CONNECTION_CLOSE_OK_METHOD: { + amqp_connection_close_ok_t *m = + (amqp_connection_close_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_close_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_BLOCKED_METHOD: { + amqp_connection_blocked_t *m = + (amqp_connection_blocked_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_blocked_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->reason, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CONNECTION_UNBLOCKED_METHOD: { + amqp_connection_unblocked_t *m = + (amqp_connection_unblocked_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_unblocked_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_CHANNEL_OPEN_METHOD: { + amqp_channel_open_t *m = (amqp_channel_open_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_open_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->out_of_band, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CHANNEL_OPEN_OK_METHOD: { + amqp_channel_open_ok_t *m = (amqp_channel_open_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_open_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint32_t len; + if (!amqp_decode_32(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->channel_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_CHANNEL_FLOW_METHOD: { + amqp_channel_flow_t *m = (amqp_channel_flow_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_flow_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->active = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_FLOW_OK_METHOD: { + amqp_channel_flow_ok_t *m = (amqp_channel_flow_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_flow_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->active = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_CLOSE_METHOD: { + amqp_channel_close_t *m = (amqp_channel_close_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_close_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_16(encoded, &offset, &m->class_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->method_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_CHANNEL_CLOSE_OK_METHOD: { + amqp_channel_close_ok_t *m = (amqp_channel_close_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_close_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_ACCESS_REQUEST_METHOD: { + amqp_access_request_t *m = (amqp_access_request_t *)amqp_pool_alloc( + pool, sizeof(amqp_access_request_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->realm, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->exclusive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->passive = (bit_buffer & (1 << 1)) ? 1 : 0; + m->active = (bit_buffer & (1 << 2)) ? 1 : 0; + m->write = (bit_buffer & (1 << 3)) ? 1 : 0; + m->read = (bit_buffer & (1 << 4)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_ACCESS_REQUEST_OK_METHOD: { + amqp_access_request_ok_t *m = (amqp_access_request_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_access_request_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DECLARE_METHOD: { + amqp_exchange_declare_t *m = (amqp_exchange_declare_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_declare_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->type, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->passive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->durable = (bit_buffer & (1 << 1)) ? 1 : 0; + m->auto_delete = (bit_buffer & (1 << 2)) ? 1 : 0; + m->internal = (bit_buffer & (1 << 3)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 4)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DECLARE_OK_METHOD: { + amqp_exchange_declare_ok_t *m = + (amqp_exchange_declare_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_declare_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DELETE_METHOD: { + amqp_exchange_delete_t *m = (amqp_exchange_delete_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_delete_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->if_unused = (bit_buffer & (1 << 0)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_DELETE_OK_METHOD: { + amqp_exchange_delete_ok_t *m = + (amqp_exchange_delete_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_delete_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_BIND_METHOD: { + amqp_exchange_bind_t *m = (amqp_exchange_bind_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_bind_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->destination, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->source, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_BIND_OK_METHOD: { + amqp_exchange_bind_ok_t *m = (amqp_exchange_bind_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_bind_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_UNBIND_METHOD: { + amqp_exchange_unbind_t *m = (amqp_exchange_unbind_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_unbind_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->destination, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->source, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_EXCHANGE_UNBIND_OK_METHOD: { + amqp_exchange_unbind_ok_t *m = + (amqp_exchange_unbind_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_unbind_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_DECLARE_METHOD: { + amqp_queue_declare_t *m = (amqp_queue_declare_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_declare_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->passive = (bit_buffer & (1 << 0)) ? 1 : 0; + m->durable = (bit_buffer & (1 << 1)) ? 1 : 0; + m->exclusive = (bit_buffer & (1 << 2)) ? 1 : 0; + m->auto_delete = (bit_buffer & (1 << 3)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 4)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_DECLARE_OK_METHOD: { + amqp_queue_declare_ok_t *m = (amqp_queue_declare_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_declare_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_32(encoded, &offset, &m->consumer_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_BIND_METHOD: { + amqp_queue_bind_t *m = + (amqp_queue_bind_t *)amqp_pool_alloc(pool, sizeof(amqp_queue_bind_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_BIND_OK_METHOD: { + amqp_queue_bind_ok_t *m = (amqp_queue_bind_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_bind_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_PURGE_METHOD: { + amqp_queue_purge_t *m = (amqp_queue_purge_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_purge_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_QUEUE_PURGE_OK_METHOD: { + amqp_queue_purge_ok_t *m = (amqp_queue_purge_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_purge_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_DELETE_METHOD: { + amqp_queue_delete_t *m = (amqp_queue_delete_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_delete_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->if_unused = (bit_buffer & (1 << 0)) ? 1 : 0; + m->if_empty = (bit_buffer & (1 << 1)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 2)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_QUEUE_DELETE_OK_METHOD: { + amqp_queue_delete_ok_t *m = (amqp_queue_delete_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_delete_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_QUEUE_UNBIND_METHOD: { + amqp_queue_unbind_t *m = (amqp_queue_unbind_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_unbind_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_QUEUE_UNBIND_OK_METHOD: { + amqp_queue_unbind_ok_t *m = (amqp_queue_unbind_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_unbind_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_QOS_METHOD: { + amqp_basic_qos_t *m = + (amqp_basic_qos_t *)amqp_pool_alloc(pool, sizeof(amqp_basic_qos_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_32(encoded, &offset, &m->prefetch_size)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_16(encoded, &offset, &m->prefetch_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->global = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_QOS_OK_METHOD: { + amqp_basic_qos_ok_t *m = (amqp_basic_qos_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_qos_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_CONSUME_METHOD: { + amqp_basic_consume_t *m = (amqp_basic_consume_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_consume_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->no_local = (bit_buffer & (1 << 0)) ? 1 : 0; + m->no_ack = (bit_buffer & (1 << 1)) ? 1 : 0; + m->exclusive = (bit_buffer & (1 << 2)) ? 1 : 0; + m->nowait = (bit_buffer & (1 << 3)) ? 1 : 0; + { + int res = amqp_decode_table(encoded, pool, &(m->arguments), &offset); + if (res < 0) return res; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_CONSUME_OK_METHOD: { + amqp_basic_consume_ok_t *m = (amqp_basic_consume_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_consume_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_CANCEL_METHOD: { + amqp_basic_cancel_t *m = (amqp_basic_cancel_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_cancel_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_CANCEL_OK_METHOD: { + amqp_basic_cancel_ok_t *m = (amqp_basic_cancel_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_cancel_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_PUBLISH_METHOD: { + amqp_basic_publish_t *m = (amqp_basic_publish_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_publish_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->mandatory = (bit_buffer & (1 << 0)) ? 1 : 0; + m->immediate = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RETURN_METHOD: { + amqp_basic_return_t *m = (amqp_basic_return_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_return_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->reply_text, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_DELIVER_METHOD: { + amqp_basic_deliver_t *m = (amqp_basic_deliver_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_deliver_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->consumer_tag, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->redelivered = (bit_buffer & (1 << 0)) ? 1 : 0; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_METHOD: { + amqp_basic_get_t *m = + (amqp_basic_get_t *)amqp_pool_alloc(pool, sizeof(amqp_basic_get_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_16(encoded, &offset, &m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->queue, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->no_ack = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_OK_METHOD: { + amqp_basic_get_ok_t *m = (amqp_basic_get_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_get_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->redelivered = (bit_buffer & (1 << 0)) ? 1 : 0; + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->exchange, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->routing_key, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (!amqp_decode_32(encoded, &offset, &m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + *decoded = m; + return 0; + } + case AMQP_BASIC_GET_EMPTY_METHOD: { + amqp_basic_get_empty_t *m = (amqp_basic_get_empty_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_get_empty_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &m->cluster_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_ACK_METHOD: { + amqp_basic_ack_t *m = + (amqp_basic_ack_t *)amqp_pool_alloc(pool, sizeof(amqp_basic_ack_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->multiple = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_REJECT_METHOD: { + amqp_basic_reject_t *m = (amqp_basic_reject_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_reject_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_ASYNC_METHOD: { + amqp_basic_recover_async_t *m = + (amqp_basic_recover_async_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_recover_async_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_METHOD: { + amqp_basic_recover_t *m = (amqp_basic_recover_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_recover_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->requeue = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_BASIC_RECOVER_OK_METHOD: { + amqp_basic_recover_ok_t *m = (amqp_basic_recover_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_recover_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_BASIC_NACK_METHOD: { + amqp_basic_nack_t *m = + (amqp_basic_nack_t *)amqp_pool_alloc(pool, sizeof(amqp_basic_nack_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_64(encoded, &offset, &m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->multiple = (bit_buffer & (1 << 0)) ? 1 : 0; + m->requeue = (bit_buffer & (1 << 1)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_TX_SELECT_METHOD: { + amqp_tx_select_t *m = + (amqp_tx_select_t *)amqp_pool_alloc(pool, sizeof(amqp_tx_select_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_TX_SELECT_OK_METHOD: { + amqp_tx_select_ok_t *m = (amqp_tx_select_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_tx_select_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_TX_COMMIT_METHOD: { + amqp_tx_commit_t *m = + (amqp_tx_commit_t *)amqp_pool_alloc(pool, sizeof(amqp_tx_commit_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_TX_COMMIT_OK_METHOD: { + amqp_tx_commit_ok_t *m = (amqp_tx_commit_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_tx_commit_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_TX_ROLLBACK_METHOD: { + amqp_tx_rollback_t *m = (amqp_tx_rollback_t *)amqp_pool_alloc( + pool, sizeof(amqp_tx_rollback_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_TX_ROLLBACK_OK_METHOD: { + amqp_tx_rollback_ok_t *m = (amqp_tx_rollback_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_tx_rollback_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + case AMQP_CONFIRM_SELECT_METHOD: { + amqp_confirm_select_t *m = (amqp_confirm_select_t *)amqp_pool_alloc( + pool, sizeof(amqp_confirm_select_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + if (!amqp_decode_8(encoded, &offset, &bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + m->nowait = (bit_buffer & (1 << 0)) ? 1 : 0; + *decoded = m; + return 0; + } + case AMQP_CONFIRM_SELECT_OK_METHOD: { + amqp_confirm_select_ok_t *m = (amqp_confirm_select_ok_t *)amqp_pool_alloc( + pool, sizeof(amqp_confirm_select_ok_t)); + if (m == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + *decoded = m; + return 0; + } + default: + return AMQP_STATUS_UNKNOWN_METHOD; + } +} + +int amqp_decode_properties(uint16_t class_id, amqp_pool_t *pool, + amqp_bytes_t encoded, void **decoded) { + size_t offset = 0; + + amqp_flags_t flags = 0; + int flagword_index = 0; + uint16_t partial_flags; + + do { + if (!amqp_decode_16(encoded, &offset, &partial_flags)) + return AMQP_STATUS_BAD_AMQP_DATA; + flags |= (partial_flags << (flagword_index * 16)); + flagword_index++; + } while (partial_flags & 1); + + switch (class_id) { + case 10: { + amqp_connection_properties_t *p = + (amqp_connection_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_connection_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 20: { + amqp_channel_properties_t *p = + (amqp_channel_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_channel_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 30: { + amqp_access_properties_t *p = (amqp_access_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_access_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 40: { + amqp_exchange_properties_t *p = + (amqp_exchange_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_exchange_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 50: { + amqp_queue_properties_t *p = (amqp_queue_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_queue_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 60: { + amqp_basic_properties_t *p = (amqp_basic_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_basic_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + if (flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->content_type, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->content_encoding, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_HEADERS_FLAG) { + { + int res = amqp_decode_table(encoded, pool, &(p->headers), &offset); + if (res < 0) return res; + } + } + if (flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { + if (!amqp_decode_8(encoded, &offset, &p->delivery_mode)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_PRIORITY_FLAG) { + if (!amqp_decode_8(encoded, &offset, &p->priority)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CORRELATION_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->correlation_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_REPLY_TO_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->reply_to, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_EXPIRATION_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->expiration, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_MESSAGE_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->message_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_TIMESTAMP_FLAG) { + if (!amqp_decode_64(encoded, &offset, &p->timestamp)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TYPE_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->type, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_USER_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->user_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_APP_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->app_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + if (flags & AMQP_BASIC_CLUSTER_ID_FLAG) { + { + uint8_t len; + if (!amqp_decode_8(encoded, &offset, &len) || + !amqp_decode_bytes(encoded, &offset, &p->cluster_id, len)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + } + *decoded = p; + return 0; + } + case 90: { + amqp_tx_properties_t *p = (amqp_tx_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_tx_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + case 85: { + amqp_confirm_properties_t *p = + (amqp_confirm_properties_t *)amqp_pool_alloc( + pool, sizeof(amqp_confirm_properties_t)); + if (p == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + p->_flags = flags; + *decoded = p; + return 0; + } + default: + return AMQP_STATUS_UNKNOWN_CLASS; + } +} + +int amqp_encode_method(amqp_method_number_t methodNumber, void *decoded, + amqp_bytes_t encoded) { + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) { + case AMQP_CONNECTION_START_METHOD: { + amqp_connection_start_t *m = (amqp_connection_start_t *)decoded; + if (!amqp_encode_8(encoded, &offset, m->version_major)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_8(encoded, &offset, m->version_minor)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->server_properties), &offset); + if (res < 0) return res; + } + if (UINT32_MAX < m->mechanisms.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->mechanisms.len) || + !amqp_encode_bytes(encoded, &offset, m->mechanisms)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT32_MAX < m->locales.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->locales.len) || + !amqp_encode_bytes(encoded, &offset, m->locales)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_START_OK_METHOD: { + amqp_connection_start_ok_t *m = (amqp_connection_start_ok_t *)decoded; + { + int res = amqp_encode_table(encoded, &(m->client_properties), &offset); + if (res < 0) return res; + } + if (UINT8_MAX < m->mechanism.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->mechanism.len) || + !amqp_encode_bytes(encoded, &offset, m->mechanism)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT32_MAX < m->response.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->response.len) || + !amqp_encode_bytes(encoded, &offset, m->response)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->locale.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->locale.len) || + !amqp_encode_bytes(encoded, &offset, m->locale)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_SECURE_METHOD: { + amqp_connection_secure_t *m = (amqp_connection_secure_t *)decoded; + if (UINT32_MAX < m->challenge.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->challenge.len) || + !amqp_encode_bytes(encoded, &offset, m->challenge)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_SECURE_OK_METHOD: { + amqp_connection_secure_ok_t *m = (amqp_connection_secure_ok_t *)decoded; + if (UINT32_MAX < m->response.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->response.len) || + !amqp_encode_bytes(encoded, &offset, m->response)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_TUNE_METHOD: { + amqp_connection_tune_t *m = (amqp_connection_tune_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->channel_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->frame_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->heartbeat)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_TUNE_OK_METHOD: { + amqp_connection_tune_ok_t *m = (amqp_connection_tune_ok_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->channel_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->frame_max)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->heartbeat)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_OPEN_METHOD: { + amqp_connection_open_t *m = (amqp_connection_open_t *)decoded; + if (UINT8_MAX < m->virtual_host.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->virtual_host.len) || + !amqp_encode_bytes(encoded, &offset, m->virtual_host)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->capabilities.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->capabilities.len) || + !amqp_encode_bytes(encoded, &offset, m->capabilities)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->insist) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_OPEN_OK_METHOD: { + amqp_connection_open_ok_t *m = (amqp_connection_open_ok_t *)decoded; + if (UINT8_MAX < m->known_hosts.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->known_hosts.len) || + !amqp_encode_bytes(encoded, &offset, m->known_hosts)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_CLOSE_METHOD: { + amqp_connection_close_t *m = (amqp_connection_close_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->reply_text.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->reply_text.len) || + !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->class_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->method_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_CLOSE_OK_METHOD: { + return (int)offset; + } + case AMQP_CONNECTION_BLOCKED_METHOD: { + amqp_connection_blocked_t *m = (amqp_connection_blocked_t *)decoded; + if (UINT8_MAX < m->reason.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->reason.len) || + !amqp_encode_bytes(encoded, &offset, m->reason)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONNECTION_UNBLOCKED_METHOD: { + return (int)offset; + } + case AMQP_CHANNEL_OPEN_METHOD: { + amqp_channel_open_t *m = (amqp_channel_open_t *)decoded; + if (UINT8_MAX < m->out_of_band.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->out_of_band.len) || + !amqp_encode_bytes(encoded, &offset, m->out_of_band)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CHANNEL_OPEN_OK_METHOD: { + amqp_channel_open_ok_t *m = (amqp_channel_open_ok_t *)decoded; + if (UINT32_MAX < m->channel_id.len || + !amqp_encode_32(encoded, &offset, (uint32_t)m->channel_id.len) || + !amqp_encode_bytes(encoded, &offset, m->channel_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CHANNEL_FLOW_METHOD: { + amqp_channel_flow_t *m = (amqp_channel_flow_t *)decoded; + bit_buffer = 0; + if (m->active) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CHANNEL_FLOW_OK_METHOD: { + amqp_channel_flow_ok_t *m = (amqp_channel_flow_ok_t *)decoded; + bit_buffer = 0; + if (m->active) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CHANNEL_CLOSE_METHOD: { + amqp_channel_close_t *m = (amqp_channel_close_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->reply_text.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->reply_text.len) || + !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->class_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->method_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CHANNEL_CLOSE_OK_METHOD: { + return (int)offset; + } + case AMQP_ACCESS_REQUEST_METHOD: { + amqp_access_request_t *m = (amqp_access_request_t *)decoded; + if (UINT8_MAX < m->realm.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->realm.len) || + !amqp_encode_bytes(encoded, &offset, m->realm)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->exclusive) bit_buffer |= (1 << 0); + if (m->passive) bit_buffer |= (1 << 1); + if (m->active) bit_buffer |= (1 << 2); + if (m->write) bit_buffer |= (1 << 3); + if (m->read) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_ACCESS_REQUEST_OK_METHOD: { + amqp_access_request_ok_t *m = (amqp_access_request_ok_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_EXCHANGE_DECLARE_METHOD: { + amqp_exchange_declare_t *m = (amqp_exchange_declare_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->type.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->type.len) || + !amqp_encode_bytes(encoded, &offset, m->type)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->passive) bit_buffer |= (1 << 0); + if (m->durable) bit_buffer |= (1 << 1); + if (m->auto_delete) bit_buffer |= (1 << 2); + if (m->internal) bit_buffer |= (1 << 3); + if (m->nowait) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_EXCHANGE_DECLARE_OK_METHOD: { + return (int)offset; + } + case AMQP_EXCHANGE_DELETE_METHOD: { + amqp_exchange_delete_t *m = (amqp_exchange_delete_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->if_unused) bit_buffer |= (1 << 0); + if (m->nowait) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_EXCHANGE_DELETE_OK_METHOD: { + return (int)offset; + } + case AMQP_EXCHANGE_BIND_METHOD: { + amqp_exchange_bind_t *m = (amqp_exchange_bind_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->destination.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->destination.len) || + !amqp_encode_bytes(encoded, &offset, m->destination)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->source.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->source.len) || + !amqp_encode_bytes(encoded, &offset, m->source)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_EXCHANGE_BIND_OK_METHOD: { + return (int)offset; + } + case AMQP_EXCHANGE_UNBIND_METHOD: { + amqp_exchange_unbind_t *m = (amqp_exchange_unbind_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->destination.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->destination.len) || + !amqp_encode_bytes(encoded, &offset, m->destination)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->source.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->source.len) || + !amqp_encode_bytes(encoded, &offset, m->source)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_EXCHANGE_UNBIND_OK_METHOD: { + return (int)offset; + } + case AMQP_QUEUE_DECLARE_METHOD: { + amqp_queue_declare_t *m = (amqp_queue_declare_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->passive) bit_buffer |= (1 << 0); + if (m->durable) bit_buffer |= (1 << 1); + if (m->exclusive) bit_buffer |= (1 << 2); + if (m->auto_delete) bit_buffer |= (1 << 3); + if (m->nowait) bit_buffer |= (1 << 4); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_QUEUE_DECLARE_OK_METHOD: { + amqp_queue_declare_ok_t *m = (amqp_queue_declare_ok_t *)decoded; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->consumer_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_QUEUE_BIND_METHOD: { + amqp_queue_bind_t *m = (amqp_queue_bind_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_QUEUE_BIND_OK_METHOD: { + return (int)offset; + } + case AMQP_QUEUE_PURGE_METHOD: { + amqp_queue_purge_t *m = (amqp_queue_purge_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_QUEUE_PURGE_OK_METHOD: { + amqp_queue_purge_ok_t *m = (amqp_queue_purge_ok_t *)decoded; + if (!amqp_encode_32(encoded, &offset, m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_QUEUE_DELETE_METHOD: { + amqp_queue_delete_t *m = (amqp_queue_delete_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->if_unused) bit_buffer |= (1 << 0); + if (m->if_empty) bit_buffer |= (1 << 1); + if (m->nowait) bit_buffer |= (1 << 2); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_QUEUE_DELETE_OK_METHOD: { + amqp_queue_delete_ok_t *m = (amqp_queue_delete_ok_t *)decoded; + if (!amqp_encode_32(encoded, &offset, m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_QUEUE_UNBIND_METHOD: { + amqp_queue_unbind_t *m = (amqp_queue_unbind_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_QUEUE_UNBIND_OK_METHOD: { + return (int)offset; + } + case AMQP_BASIC_QOS_METHOD: { + amqp_basic_qos_t *m = (amqp_basic_qos_t *)decoded; + if (!amqp_encode_32(encoded, &offset, m->prefetch_size)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_16(encoded, &offset, m->prefetch_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->global) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_QOS_OK_METHOD: { + return (int)offset; + } + case AMQP_BASIC_CONSUME_METHOD: { + amqp_basic_consume_t *m = (amqp_basic_consume_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->consumer_tag.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->consumer_tag.len) || + !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->no_local) bit_buffer |= (1 << 0); + if (m->no_ack) bit_buffer |= (1 << 1); + if (m->exclusive) bit_buffer |= (1 << 2); + if (m->nowait) bit_buffer |= (1 << 3); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + { + int res = amqp_encode_table(encoded, &(m->arguments), &offset); + if (res < 0) return res; + } + return (int)offset; + } + case AMQP_BASIC_CONSUME_OK_METHOD: { + amqp_basic_consume_ok_t *m = (amqp_basic_consume_ok_t *)decoded; + if (UINT8_MAX < m->consumer_tag.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->consumer_tag.len) || + !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_CANCEL_METHOD: { + amqp_basic_cancel_t *m = (amqp_basic_cancel_t *)decoded; + if (UINT8_MAX < m->consumer_tag.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->consumer_tag.len) || + !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_CANCEL_OK_METHOD: { + amqp_basic_cancel_ok_t *m = (amqp_basic_cancel_ok_t *)decoded; + if (UINT8_MAX < m->consumer_tag.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->consumer_tag.len) || + !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_PUBLISH_METHOD: { + amqp_basic_publish_t *m = (amqp_basic_publish_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->mandatory) bit_buffer |= (1 << 0); + if (m->immediate) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_RETURN_METHOD: { + amqp_basic_return_t *m = (amqp_basic_return_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->reply_code)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->reply_text.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->reply_text.len) || + !amqp_encode_bytes(encoded, &offset, m->reply_text)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_DELIVER_METHOD: { + amqp_basic_deliver_t *m = (amqp_basic_deliver_t *)decoded; + if (UINT8_MAX < m->consumer_tag.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->consumer_tag.len) || + !amqp_encode_bytes(encoded, &offset, m->consumer_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->redelivered) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_GET_METHOD: { + amqp_basic_get_t *m = (amqp_basic_get_t *)decoded; + if (!amqp_encode_16(encoded, &offset, m->ticket)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->queue.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->queue.len) || + !amqp_encode_bytes(encoded, &offset, m->queue)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->no_ack) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_GET_OK_METHOD: { + amqp_basic_get_ok_t *m = (amqp_basic_get_ok_t *)decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->redelivered) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->exchange.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->exchange.len) || + !amqp_encode_bytes(encoded, &offset, m->exchange)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (UINT8_MAX < m->routing_key.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->routing_key.len) || + !amqp_encode_bytes(encoded, &offset, m->routing_key)) + return AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_encode_32(encoded, &offset, m->message_count)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_GET_EMPTY_METHOD: { + amqp_basic_get_empty_t *m = (amqp_basic_get_empty_t *)decoded; + if (UINT8_MAX < m->cluster_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)m->cluster_id.len) || + !amqp_encode_bytes(encoded, &offset, m->cluster_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_ACK_METHOD: { + amqp_basic_ack_t *m = (amqp_basic_ack_t *)decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->multiple) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_REJECT_METHOD: { + amqp_basic_reject_t *m = (amqp_basic_reject_t *)decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_RECOVER_ASYNC_METHOD: { + amqp_basic_recover_async_t *m = (amqp_basic_recover_async_t *)decoded; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_RECOVER_METHOD: { + amqp_basic_recover_t *m = (amqp_basic_recover_t *)decoded; + bit_buffer = 0; + if (m->requeue) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_BASIC_RECOVER_OK_METHOD: { + return (int)offset; + } + case AMQP_BASIC_NACK_METHOD: { + amqp_basic_nack_t *m = (amqp_basic_nack_t *)decoded; + if (!amqp_encode_64(encoded, &offset, m->delivery_tag)) + return AMQP_STATUS_BAD_AMQP_DATA; + bit_buffer = 0; + if (m->multiple) bit_buffer |= (1 << 0); + if (m->requeue) bit_buffer |= (1 << 1); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_TX_SELECT_METHOD: { + return (int)offset; + } + case AMQP_TX_SELECT_OK_METHOD: { + return (int)offset; + } + case AMQP_TX_COMMIT_METHOD: { + return (int)offset; + } + case AMQP_TX_COMMIT_OK_METHOD: { + return (int)offset; + } + case AMQP_TX_ROLLBACK_METHOD: { + return (int)offset; + } + case AMQP_TX_ROLLBACK_OK_METHOD: { + return (int)offset; + } + case AMQP_CONFIRM_SELECT_METHOD: { + amqp_confirm_select_t *m = (amqp_confirm_select_t *)decoded; + bit_buffer = 0; + if (m->nowait) bit_buffer |= (1 << 0); + if (!amqp_encode_8(encoded, &offset, bit_buffer)) + return AMQP_STATUS_BAD_AMQP_DATA; + return (int)offset; + } + case AMQP_CONFIRM_SELECT_OK_METHOD: { + return (int)offset; + } + default: + return AMQP_STATUS_UNKNOWN_METHOD; + } +} + +int amqp_encode_properties(uint16_t class_id, void *decoded, + amqp_bytes_t encoded) { + size_t offset = 0; + + /* Cheat, and get the flags out generically, relying on the + similarity of structure between classes */ + amqp_flags_t flags = *(amqp_flags_t *)decoded; /* cheating! */ + + { + /* We take a copy of flags to avoid destroying it, as it is used + in the autogenerated code below. */ + amqp_flags_t remaining_flags = flags; + do { + amqp_flags_t remainder = remaining_flags >> 16; + uint16_t partial_flags = remaining_flags & 0xFFFE; + if (remainder != 0) { + partial_flags |= 1; + } + if (!amqp_encode_16(encoded, &offset, partial_flags)) + return AMQP_STATUS_BAD_AMQP_DATA; + remaining_flags = remainder; + } while (remaining_flags != 0); + } + + switch (class_id) { + case 10: { + return (int)offset; + } + case 20: { + return (int)offset; + } + case 30: { + return (int)offset; + } + case 40: { + return (int)offset; + } + case 50: { + return (int)offset; + } + case 60: { + amqp_basic_properties_t *p = (amqp_basic_properties_t *)decoded; + if (flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { + if (UINT8_MAX < p->content_type.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->content_type.len) || + !amqp_encode_bytes(encoded, &offset, p->content_type)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { + if (UINT8_MAX < p->content_encoding.len || + !amqp_encode_8(encoded, &offset, + (uint8_t)p->content_encoding.len) || + !amqp_encode_bytes(encoded, &offset, p->content_encoding)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_HEADERS_FLAG) { + { + int res = amqp_encode_table(encoded, &(p->headers), &offset); + if (res < 0) return res; + } + } + if (flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->delivery_mode)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_PRIORITY_FLAG) { + if (!amqp_encode_8(encoded, &offset, p->priority)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CORRELATION_ID_FLAG) { + if (UINT8_MAX < p->correlation_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->correlation_id.len) || + !amqp_encode_bytes(encoded, &offset, p->correlation_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_REPLY_TO_FLAG) { + if (UINT8_MAX < p->reply_to.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->reply_to.len) || + !amqp_encode_bytes(encoded, &offset, p->reply_to)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_EXPIRATION_FLAG) { + if (UINT8_MAX < p->expiration.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->expiration.len) || + !amqp_encode_bytes(encoded, &offset, p->expiration)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_MESSAGE_ID_FLAG) { + if (UINT8_MAX < p->message_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->message_id.len) || + !amqp_encode_bytes(encoded, &offset, p->message_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TIMESTAMP_FLAG) { + if (!amqp_encode_64(encoded, &offset, p->timestamp)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_TYPE_FLAG) { + if (UINT8_MAX < p->type.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->type.len) || + !amqp_encode_bytes(encoded, &offset, p->type)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_USER_ID_FLAG) { + if (UINT8_MAX < p->user_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->user_id.len) || + !amqp_encode_bytes(encoded, &offset, p->user_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_APP_ID_FLAG) { + if (UINT8_MAX < p->app_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->app_id.len) || + !amqp_encode_bytes(encoded, &offset, p->app_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + if (flags & AMQP_BASIC_CLUSTER_ID_FLAG) { + if (UINT8_MAX < p->cluster_id.len || + !amqp_encode_8(encoded, &offset, (uint8_t)p->cluster_id.len) || + !amqp_encode_bytes(encoded, &offset, p->cluster_id)) + return AMQP_STATUS_BAD_AMQP_DATA; + } + return (int)offset; + } + case 90: { + return (int)offset; + } + case 85: { + return (int)offset; + } + default: + return AMQP_STATUS_UNKNOWN_CLASS; + } +} + +/** + * 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_open_t req; + req.out_of_band = amqp_empty_bytes; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CHANNEL_OPEN_METHOD, + AMQP_CHANNEL_OPEN_OK_METHOD, &req); +} + +/** + * 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_channel_flow_t req; + req.active = active; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CHANNEL_FLOW_METHOD, + AMQP_CHANNEL_FLOW_OK_METHOD, &req); +} + +/** + * 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_declare_t req; + req.ticket = 0; + req.exchange = exchange; + req.type = type; + req.passive = passive; + req.durable = durable; + req.auto_delete = auto_delete; + req.internal = internal; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_DECLARE_METHOD, + AMQP_EXCHANGE_DECLARE_OK_METHOD, &req); +} + +/** + * 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_delete_t req; + req.ticket = 0; + req.exchange = exchange; + req.if_unused = if_unused; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_DELETE_METHOD, + AMQP_EXCHANGE_DELETE_OK_METHOD, &req); +} + +/** + * 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_bind_t req; + req.ticket = 0; + req.destination = destination; + req.source = source; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_BIND_METHOD, + AMQP_EXCHANGE_BIND_OK_METHOD, &req); +} + +/** + * 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_exchange_unbind_t req; + req.ticket = 0; + req.destination = destination; + req.source = source; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_EXCHANGE_UNBIND_METHOD, + AMQP_EXCHANGE_UNBIND_OK_METHOD, &req); +} + +/** + * 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_declare_t req; + req.ticket = 0; + req.queue = queue; + req.passive = passive; + req.durable = durable; + req.exclusive = exclusive; + req.auto_delete = auto_delete; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_DECLARE_METHOD, + AMQP_QUEUE_DECLARE_OK_METHOD, &req); +} + +/** + * 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_bind_t req; + req.ticket = 0; + req.queue = queue; + req.exchange = exchange; + req.routing_key = routing_key; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_BIND_METHOD, + AMQP_QUEUE_BIND_OK_METHOD, &req); +} + +/** + * 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_purge_t req; + req.ticket = 0; + req.queue = queue; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_PURGE_METHOD, + AMQP_QUEUE_PURGE_OK_METHOD, &req); +} + +/** + * 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_delete_t req; + req.ticket = 0; + req.queue = queue; + req.if_unused = if_unused; + req.if_empty = if_empty; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_DELETE_METHOD, + AMQP_QUEUE_DELETE_OK_METHOD, &req); +} + +/** + * 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_queue_unbind_t req; + req.ticket = 0; + req.queue = queue; + req.exchange = exchange; + req.routing_key = routing_key; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_QUEUE_UNBIND_METHOD, + AMQP_QUEUE_UNBIND_OK_METHOD, &req); +} + +/** + * 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_qos_t req; + req.prefetch_size = prefetch_size; + req.prefetch_count = prefetch_count; + req.global = global; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_QOS_METHOD, + AMQP_BASIC_QOS_OK_METHOD, &req); +} + +/** + * 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_consume_t req; + req.ticket = 0; + req.queue = queue; + req.consumer_tag = consumer_tag; + req.no_local = no_local; + req.no_ack = no_ack; + req.exclusive = exclusive; + req.nowait = 0; + req.arguments = arguments; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_CONSUME_METHOD, + AMQP_BASIC_CONSUME_OK_METHOD, &req); +} + +/** + * 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_cancel_t req; + req.consumer_tag = consumer_tag; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_CANCEL_METHOD, + AMQP_BASIC_CANCEL_OK_METHOD, &req); +} + +/** + * 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_basic_recover_t req; + req.requeue = requeue; + + return amqp_simple_rpc_decoded(state, channel, AMQP_BASIC_RECOVER_METHOD, + AMQP_BASIC_RECOVER_OK_METHOD, &req); +} + +/** + * 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_select_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_SELECT_METHOD, + AMQP_TX_SELECT_OK_METHOD, &req); +} + +/** + * 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_commit_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_COMMIT_METHOD, + AMQP_TX_COMMIT_OK_METHOD, &req); +} + +/** + * 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_tx_rollback_t req; + + return amqp_simple_rpc_decoded(state, channel, AMQP_TX_ROLLBACK_METHOD, + AMQP_TX_ROLLBACK_OK_METHOD, &req); +} + +/** + * 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_confirm_select_t req; + req.nowait = 0; + + return amqp_simple_rpc_decoded(state, channel, AMQP_CONFIRM_SELECT_METHOD, + AMQP_CONFIRM_SELECT_OK_METHOD, &req); +} diff --git a/librab/build/librabbitmq/amqp_framing.h b/librab/build/librabbitmq/amqp_framing.h new file mode 100644 index 0000000..fb20acc --- /dev/null +++ b/librab/build/librabbitmq/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/librab/build/librabbitmq/amqp_hostcheck.c b/librab/build/librabbitmq/amqp_hostcheck.c new file mode 100644 index 0000000..5a4f733 --- /dev/null +++ b/librab/build/librabbitmq/amqp_hostcheck.c @@ -0,0 +1,195 @@ +/* + * Copyright 1996-2014 Daniel Stenberg . + * Copyright 2014 Michael Steinert + * + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * 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 OF THIRD PARTY RIGHTS. + * 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. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in this Software without prior written authorization of the + * copyright holder. + */ + +#include "amqp_hostcheck.h" + +#include + +/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() + * because its behavior is altered by the current locale. + */ + +static char amqp_raw_toupper(char in) { + switch (in) { + case 'a': + return 'A'; + case 'b': + return 'B'; + case 'c': + return 'C'; + case 'd': + return 'D'; + case 'e': + return 'E'; + case 'f': + return 'F'; + case 'g': + return 'G'; + case 'h': + return 'H'; + case 'i': + return 'I'; + case 'j': + return 'J'; + case 'k': + return 'K'; + case 'l': + return 'L'; + case 'm': + return 'M'; + case 'n': + return 'N'; + case 'o': + return 'O'; + case 'p': + return 'P'; + case 'q': + return 'Q'; + case 'r': + return 'R'; + case 's': + return 'S'; + case 't': + return 'T'; + case 'u': + return 'U'; + case 'v': + return 'V'; + case 'w': + return 'W'; + case 'x': + return 'X'; + case 'y': + return 'Y'; + case 'z': + return 'Z'; + } + return in; +} + +/* + * amqp_raw_equal() is for doing "raw" case insensitive strings. This is meant + * to be locale independent and only compare strings we know are safe for + * this. See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for + * some further explanation to why this function is necessary. + * + * The function is capable of comparing a-z case insensitively even for + * non-ascii. + */ + +static int amqp_raw_equal(const char *first, const char *second) { + while (*first && *second) { + if (amqp_raw_toupper(*first) != amqp_raw_toupper(*second)) { + /* get out of the loop as soon as they don't match */ + break; + } + first++; + second++; + } + /* we do the comparison here (possibly again), just to make sure that if + * the loop above is skipped because one of the strings reached zero, we + * must not return this as a successful match + */ + return (amqp_raw_toupper(*first) == amqp_raw_toupper(*second)); +} + +static int amqp_raw_nequal(const char *first, const char *second, size_t max) { + while (*first && *second && max) { + if (amqp_raw_toupper(*first) != amqp_raw_toupper(*second)) { + break; + } + max--; + first++; + second++; + } + if (0 == max) { + return 1; /* they are equal this far */ + } + return amqp_raw_toupper(*first) == amqp_raw_toupper(*second); +} + +/* + * Match a hostname against a wildcard pattern. + * E.g. + * "foo.host.com" matches "*.host.com". + * + * We use the matching rule described in RFC6125, section 6.4.3. + * http://tools.ietf.org/html/rfc6125#section-6.4.3 + */ + +static amqp_hostcheck_result amqp_hostmatch(const char *hostname, + const char *pattern) { + const char *pattern_label_end, *pattern_wildcard, *hostname_label_end; + int wildcard_enabled; + size_t prefixlen, suffixlen; + pattern_wildcard = strchr(pattern, '*'); + if (pattern_wildcard == NULL) { + return amqp_raw_equal(pattern, hostname) ? AMQP_HCR_MATCH + : AMQP_HCR_NO_MATCH; + } + /* We require at least 2 dots in pattern to avoid too wide wildcard match. */ + wildcard_enabled = 1; + pattern_label_end = strchr(pattern, '.'); + if (pattern_label_end == NULL || strchr(pattern_label_end + 1, '.') == NULL || + pattern_wildcard > pattern_label_end || + amqp_raw_nequal(pattern, "xn--", 4)) { + wildcard_enabled = 0; + } + if (!wildcard_enabled) { + return amqp_raw_equal(pattern, hostname) ? AMQP_HCR_MATCH + : AMQP_HCR_NO_MATCH; + } + hostname_label_end = strchr(hostname, '.'); + if (hostname_label_end == NULL || + !amqp_raw_equal(pattern_label_end, hostname_label_end)) { + return AMQP_HCR_NO_MATCH; + } + /* The wildcard must match at least one character, so the left-most + * label of the hostname is at least as large as the left-most label + * of the pattern. + */ + if (hostname_label_end - hostname < pattern_label_end - pattern) { + return AMQP_HCR_NO_MATCH; + } + prefixlen = pattern_wildcard - pattern; + suffixlen = pattern_label_end - (pattern_wildcard + 1); + return amqp_raw_nequal(pattern, hostname, prefixlen) && + amqp_raw_nequal(pattern_wildcard + 1, + hostname_label_end - suffixlen, suffixlen) + ? AMQP_HCR_MATCH + : AMQP_HCR_NO_MATCH; +} + +amqp_hostcheck_result amqp_hostcheck(const char *match_pattern, + const char *hostname) { + /* sanity check */ + if (!match_pattern || !*match_pattern || !hostname || !*hostname) { + return AMQP_HCR_NO_MATCH; + } + /* trivial case */ + if (amqp_raw_equal(hostname, match_pattern)) { + return AMQP_HCR_MATCH; + } + return amqp_hostmatch(hostname, match_pattern); +} diff --git a/librab/build/librabbitmq/amqp_hostcheck.h b/librab/build/librabbitmq/amqp_hostcheck.h new file mode 100644 index 0000000..7ab5c26 --- /dev/null +++ b/librab/build/librabbitmq/amqp_hostcheck.h @@ -0,0 +1,48 @@ +#ifndef librabbitmq_amqp_hostcheck_h +#define librabbitmq_amqp_hostcheck_h + +/* + * Copyright 1996-2014 Daniel Stenberg . + * Copyright 2014 Michael Steinert + * + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * 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 OF THIRD PARTY RIGHTS. + * 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. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in this Software without prior written authorization of the + * copyright holder. + */ + +typedef enum { + AMQP_HCR_NO_MATCH = 0, + AMQP_HCR_MATCH = 1 +} amqp_hostcheck_result; + +/** + * Determine whether hostname matches match_pattern. + * + * match_pattern may include wildcards. + * + * Match is performed based on the rules set forth in RFC6125 section 6.4.3. + * http://tools.ietf.org/html/rfc6125#section-6.4.3 + * + * \param match_pattern RFC6125 compliant pattern + * \param hostname to match against + * \returns AMQP_HCR_MATCH if its a match, AMQP_HCR_NO_MATCH otherwise. + */ +amqp_hostcheck_result amqp_hostcheck(const char *match_pattern, + const char *hostname); + +#endif diff --git a/librab/build/librabbitmq/amqp_mem.c b/librab/build/librabbitmq/amqp_mem.c new file mode 100644 index 0000000..f0d47cc --- /dev/null +++ b/librab/build/librabbitmq/amqp_mem.c @@ -0,0 +1,242 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include +#include +#include +#include +#include +#include + +char const *amqp_version(void) { return AMQP_VERSION_STRING; } + +uint32_t amqp_version_number(void) { return AMQP_VERSION; } + +void init_amqp_pool(amqp_pool_t *pool, size_t pagesize) { + pool->pagesize = pagesize ? pagesize : 4096; + + pool->pages.num_blocks = 0; + pool->pages.blocklist = NULL; + + pool->large_blocks.num_blocks = 0; + pool->large_blocks.blocklist = NULL; + + pool->next_page = 0; + pool->alloc_block = NULL; + pool->alloc_used = 0; +} + +static void empty_blocklist(amqp_pool_blocklist_t *x) { + int i; + + if (x->blocklist != NULL) { + for (i = 0; i < x->num_blocks; i++) { + free(x->blocklist[i]); + } + free(x->blocklist); + } + x->num_blocks = 0; + x->blocklist = NULL; +} + +void recycle_amqp_pool(amqp_pool_t *pool) { + empty_blocklist(&pool->large_blocks); + pool->next_page = 0; + pool->alloc_block = NULL; + pool->alloc_used = 0; +} + +void empty_amqp_pool(amqp_pool_t *pool) { + recycle_amqp_pool(pool); + empty_blocklist(&pool->pages); +} + +/* Returns 1 on success, 0 on failure */ +static int record_pool_block(amqp_pool_blocklist_t *x, void *block) { + size_t blocklistlength = sizeof(void *) * (x->num_blocks + 1); + + if (x->blocklist == NULL) { + x->blocklist = malloc(blocklistlength); + if (x->blocklist == NULL) { + return 0; + } + } else { + void *newbl = realloc(x->blocklist, blocklistlength); + if (newbl == NULL) { + return 0; + } + x->blocklist = newbl; + } + + x->blocklist[x->num_blocks] = block; + x->num_blocks++; + return 1; +} + +void *amqp_pool_alloc(amqp_pool_t *pool, size_t amount) { + if (amount == 0) { + return NULL; + } + + amount = (amount + 7) & (~7); /* round up to nearest 8-byte boundary */ + + if (amount > pool->pagesize) { + void *result = calloc(1, amount); + if (result == NULL) { + return NULL; + } + if (!record_pool_block(&pool->large_blocks, result)) { + free(result); + return NULL; + } + return result; + } + + if (pool->alloc_block != NULL) { + assert(pool->alloc_used <= pool->pagesize); + + if (pool->alloc_used + amount <= pool->pagesize) { + void *result = pool->alloc_block + pool->alloc_used; + pool->alloc_used += amount; + return result; + } + } + + if (pool->next_page >= pool->pages.num_blocks) { + pool->alloc_block = calloc(1, pool->pagesize); + if (pool->alloc_block == NULL) { + return NULL; + } + if (!record_pool_block(&pool->pages, pool->alloc_block)) { + return NULL; + } + pool->next_page = pool->pages.num_blocks; + } else { + pool->alloc_block = pool->pages.blocklist[pool->next_page]; + pool->next_page++; + } + + pool->alloc_used = amount; + + return pool->alloc_block; +} + +void amqp_pool_alloc_bytes(amqp_pool_t *pool, size_t amount, + amqp_bytes_t *output) { + output->len = amount; + output->bytes = amqp_pool_alloc(pool, amount); +} + +amqp_bytes_t amqp_cstring_bytes(char const *cstr) { + amqp_bytes_t result; + result.len = strlen(cstr); + result.bytes = (void *)cstr; + return result; +} + +amqp_bytes_t amqp_bytes_malloc_dup(amqp_bytes_t src) { + amqp_bytes_t result; + result.len = src.len; + result.bytes = malloc(src.len); + if (result.bytes != NULL) { + memcpy(result.bytes, src.bytes, src.len); + } + return result; +} + +amqp_bytes_t amqp_bytes_malloc(size_t amount) { + amqp_bytes_t result; + result.len = amount; + result.bytes = malloc(amount); /* will return NULL if it fails */ + return result; +} + +void amqp_bytes_free(amqp_bytes_t bytes) { free(bytes.bytes); } + +amqp_pool_t *amqp_get_or_create_channel_pool(amqp_connection_state_t state, + amqp_channel_t channel) { + amqp_pool_table_entry_t *entry; + size_t index = channel % POOL_TABLE_SIZE; + + entry = state->pool_table[index]; + + for (; NULL != entry; entry = entry->next) { + if (channel == entry->channel) { + return &entry->pool; + } + } + + entry = malloc(sizeof(amqp_pool_table_entry_t)); + if (NULL == entry) { + return NULL; + } + + entry->channel = channel; + entry->next = state->pool_table[index]; + state->pool_table[index] = entry; + + init_amqp_pool(&entry->pool, state->frame_max); + + return &entry->pool; +} + +amqp_pool_t *amqp_get_channel_pool(amqp_connection_state_t state, + amqp_channel_t channel) { + amqp_pool_table_entry_t *entry; + size_t index = channel % POOL_TABLE_SIZE; + + entry = state->pool_table[index]; + + for (; NULL != entry; entry = entry->next) { + if (channel == entry->channel) { + return &entry->pool; + } + } + + return NULL; +} + +int amqp_bytes_equal(amqp_bytes_t r, amqp_bytes_t l) { + if (r.len == l.len && + (r.bytes == l.bytes || 0 == memcmp(r.bytes, l.bytes, r.len))) { + return 1; + } + return 0; +} diff --git a/librab/build/librabbitmq/amqp_openssl.c b/librab/build/librabbitmq/amqp_openssl.c new file mode 100644 index 0000000..1fac25d --- /dev/null +++ b/librab/build/librabbitmq/amqp_openssl.c @@ -0,0 +1,705 @@ +/* + * Portions created by Alan Antonuk are Copyright (c) 2012-2014 Alan Antonuk. + * All Rights Reserved. + * + * Portions created by Michael Steinert are Copyright (c) 2012-2014 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_openssl_bio.h" +#include "amqp_openssl_hostname_validation.h" +#include "amqp_private.h" +#include "amqp_socket.h" +#include "amqp_ssl_socket.h" +#include "amqp_time.h" +#include "threads.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int initialize_ssl_and_increment_connections(void); +static int decrement_ssl_connections(void); + +static unsigned long ssl_threadid_callback(void); +static void ssl_locking_callback(int mode, int n, const char *file, int line); +static pthread_mutex_t *amqp_openssl_lockarray = NULL; + +static pthread_mutex_t openssl_init_mutex = PTHREAD_MUTEX_INITIALIZER; +static amqp_boolean_t do_initialize_openssl = 1; +static amqp_boolean_t openssl_initialized = 0; +static amqp_boolean_t openssl_bio_initialized = 0; +static int openssl_connections = 0; + +#define CHECK_SUCCESS(condition) \ + do { \ + int check_success_ret = (condition); \ + if (check_success_ret) { \ + amqp_abort("Check %s failed <%d>: %s", #condition, check_success_ret, \ + strerror(check_success_ret)); \ + } \ + } while (0) + +struct amqp_ssl_socket_t { + const struct amqp_socket_class_t *klass; + SSL_CTX *ctx; + int sockfd; + SSL *ssl; + amqp_boolean_t verify_peer; + amqp_boolean_t verify_hostname; + int internal_error; +}; + +static ssize_t amqp_ssl_socket_send(void *base, const void *buf, size_t len, + AMQP_UNUSED int flags) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + int res; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + + /* SSL_write takes an int for length of buffer, protect against len being + * larger than larger than what SSL_write can take */ + if (len > INT_MAX) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + ERR_clear_error(); + self->internal_error = 0; + + /* This will only return on error, or once the whole buffer has been + * written to the SSL stream. See SSL_MODE_ENABLE_PARTIAL_WRITE */ + res = SSL_write(self->ssl, buf, (int)len); + if (0 >= res) { + self->internal_error = SSL_get_error(self->ssl, res); + /* TODO: Close connection if it isn't already? */ + /* TODO: Possibly be more intelligent in reporting WHAT went wrong */ + switch (self->internal_error) { + case SSL_ERROR_WANT_READ: + res = AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD; + break; + case SSL_ERROR_WANT_WRITE: + res = AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE; + break; + case SSL_ERROR_ZERO_RETURN: + res = AMQP_STATUS_CONNECTION_CLOSED; + break; + default: + res = AMQP_STATUS_SSL_ERROR; + break; + } + } else { + self->internal_error = 0; + } + + return (ssize_t)res; +} + +static ssize_t amqp_ssl_socket_recv(void *base, void *buf, size_t len, + AMQP_UNUSED int flags) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + int received; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + + /* SSL_read takes an int for length of buffer, protect against len being + * larger than larger than what SSL_read can take */ + if (len > INT_MAX) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + ERR_clear_error(); + self->internal_error = 0; + + received = SSL_read(self->ssl, buf, (int)len); + if (0 >= received) { + self->internal_error = SSL_get_error(self->ssl, received); + switch (self->internal_error) { + case SSL_ERROR_WANT_READ: + received = AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD; + break; + case SSL_ERROR_WANT_WRITE: + received = AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE; + break; + case SSL_ERROR_ZERO_RETURN: + received = AMQP_STATUS_CONNECTION_CLOSED; + break; + default: + received = AMQP_STATUS_SSL_ERROR; + break; + } + } + + return (ssize_t)received; +} + +static int amqp_ssl_socket_open(void *base, const char *host, int port, + struct timeval *timeout) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + long result; + int status; + amqp_time_t deadline; + X509 *cert; + BIO *bio; + if (-1 != self->sockfd) { + return AMQP_STATUS_SOCKET_INUSE; + } + ERR_clear_error(); + + self->ssl = SSL_new(self->ctx); + if (!self->ssl) { + self->internal_error = ERR_peek_error(); + status = AMQP_STATUS_SSL_ERROR; + goto exit; + } + + status = amqp_time_from_now(&deadline, timeout); + if (AMQP_STATUS_OK != status) { + return status; + } + + self->sockfd = amqp_open_socket_inner(host, port, deadline); + if (0 > self->sockfd) { + status = self->sockfd; + self->internal_error = amqp_os_socket_error(); + self->sockfd = -1; + goto error_out1; + } + + bio = BIO_new(amqp_openssl_bio()); + if (!bio) { + status = AMQP_STATUS_NO_MEMORY; + goto error_out2; + } + + BIO_set_fd(bio, self->sockfd, BIO_NOCLOSE); + SSL_set_bio(self->ssl, bio, bio); + + status = SSL_set_tlsext_host_name(self->ssl, host); + if (!status) { + self->internal_error = SSL_get_error(self->ssl, status); + status = AMQP_STATUS_SSL_ERROR; + goto error_out2; + } + +start_connect: + status = SSL_connect(self->ssl); + if (status != 1) { + self->internal_error = SSL_get_error(self->ssl, status); + switch (self->internal_error) { + case SSL_ERROR_WANT_READ: + status = amqp_poll(self->sockfd, AMQP_SF_POLLIN, deadline); + break; + case SSL_ERROR_WANT_WRITE: + status = amqp_poll(self->sockfd, AMQP_SF_POLLOUT, deadline); + break; + default: + status = AMQP_STATUS_SSL_CONNECTION_FAILED; + } + if (AMQP_STATUS_OK == status) { + goto start_connect; + } + goto error_out2; + } + + cert = SSL_get_peer_certificate(self->ssl); + + if (self->verify_peer) { + if (!cert) { + self->internal_error = 0; + status = AMQP_STATUS_SSL_PEER_VERIFY_FAILED; + goto error_out3; + } + + result = SSL_get_verify_result(self->ssl); + if (X509_V_OK != result) { + self->internal_error = result; + status = AMQP_STATUS_SSL_PEER_VERIFY_FAILED; + goto error_out4; + } + } + if (self->verify_hostname) { + if (!cert) { + self->internal_error = 0; + status = AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED; + goto error_out3; + } + + if (AMQP_HVR_MATCH_FOUND != amqp_ssl_validate_hostname(host, cert)) { + self->internal_error = 0; + status = AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED; + goto error_out4; + } + } + + X509_free(cert); + self->internal_error = 0; + status = AMQP_STATUS_OK; + +exit: + return status; + +error_out4: + X509_free(cert); +error_out3: + SSL_shutdown(self->ssl); +error_out2: + amqp_os_socket_close(self->sockfd); + self->sockfd = -1; +error_out1: + SSL_free(self->ssl); + self->ssl = NULL; + goto exit; +} + +static int amqp_ssl_socket_close(void *base, amqp_socket_close_enum force) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + + if (AMQP_SC_NONE == force) { + /* don't try too hard to shutdown the connection */ + SSL_shutdown(self->ssl); + } + + SSL_free(self->ssl); + self->ssl = NULL; + + if (amqp_os_socket_close(self->sockfd)) { + return AMQP_STATUS_SOCKET_ERROR; + } + self->sockfd = -1; + + return AMQP_STATUS_OK; +} + +static int amqp_ssl_socket_get_sockfd(void *base) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + return self->sockfd; +} + +static void amqp_ssl_socket_delete(void *base) { + struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; + + if (self) { + amqp_ssl_socket_close(self, AMQP_SC_NONE); + + SSL_CTX_free(self->ctx); + free(self); + } + decrement_ssl_connections(); +} + +static const struct amqp_socket_class_t amqp_ssl_socket_class = { + amqp_ssl_socket_send, /* send */ + amqp_ssl_socket_recv, /* recv */ + amqp_ssl_socket_open, /* open */ + amqp_ssl_socket_close, /* close */ + amqp_ssl_socket_get_sockfd, /* get_sockfd */ + amqp_ssl_socket_delete /* delete */ +}; + +amqp_socket_t *amqp_ssl_socket_new(amqp_connection_state_t state) { + struct amqp_ssl_socket_t *self = calloc(1, sizeof(*self)); + int status; + if (!self) { + return NULL; + } + + self->sockfd = -1; + self->klass = &amqp_ssl_socket_class; + self->verify_peer = 1; + self->verify_hostname = 1; + + status = initialize_ssl_and_increment_connections(); + if (status) { + goto error; + } + + self->ctx = SSL_CTX_new(SSLv23_client_method()); + if (!self->ctx) { + goto error; + } + /* Disable SSLv2 and SSLv3 */ + SSL_CTX_set_options(self->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); + + amqp_set_socket(state, (amqp_socket_t *)self); + + return (amqp_socket_t *)self; +error: + amqp_ssl_socket_delete((amqp_socket_t *)self); + return NULL; +} + +int amqp_ssl_socket_set_cacert(amqp_socket_t *base, const char *cacert) { + int status; + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + status = SSL_CTX_load_verify_locations(self->ctx, cacert, NULL); + if (1 != status) { + return AMQP_STATUS_SSL_ERROR; + } + return AMQP_STATUS_OK; +} + +int amqp_ssl_socket_set_key(amqp_socket_t *base, const char *cert, + const char *key) { + int status; + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + status = SSL_CTX_use_certificate_chain_file(self->ctx, cert); + if (1 != status) { + return AMQP_STATUS_SSL_ERROR; + } + status = SSL_CTX_use_PrivateKey_file(self->ctx, key, SSL_FILETYPE_PEM); + if (1 != status) { + return AMQP_STATUS_SSL_ERROR; + } + return AMQP_STATUS_OK; +} + +static int password_cb(AMQP_UNUSED char *buffer, AMQP_UNUSED int length, + AMQP_UNUSED int rwflag, AMQP_UNUSED void *user_data) { + amqp_abort("rabbitmq-c does not support password protected keys"); +} + +int amqp_ssl_socket_set_key_buffer(amqp_socket_t *base, const char *cert, + const void *key, size_t n) { + int status = AMQP_STATUS_OK; + BIO *buf = NULL; + RSA *rsa = NULL; + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + if (n > INT_MAX) { + return AMQP_STATUS_INVALID_PARAMETER; + } + self = (struct amqp_ssl_socket_t *)base; + status = SSL_CTX_use_certificate_chain_file(self->ctx, cert); + if (1 != status) { + return AMQP_STATUS_SSL_ERROR; + } + buf = BIO_new_mem_buf((void *)key, (int)n); + if (!buf) { + goto error; + } + rsa = PEM_read_bio_RSAPrivateKey(buf, NULL, password_cb, NULL); + if (!rsa) { + goto error; + } + status = SSL_CTX_use_RSAPrivateKey(self->ctx, rsa); + if (1 != status) { + goto error; + } +exit: + BIO_vfree(buf); + RSA_free(rsa); + return status; +error: + status = AMQP_STATUS_SSL_ERROR; + goto exit; +} + +int amqp_ssl_socket_set_cert(amqp_socket_t *base, const char *cert) { + int status; + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + status = SSL_CTX_use_certificate_chain_file(self->ctx, cert); + if (1 != status) { + return AMQP_STATUS_SSL_ERROR; + } + return AMQP_STATUS_OK; +} + +void amqp_ssl_socket_set_verify(amqp_socket_t *base, amqp_boolean_t verify) { + amqp_ssl_socket_set_verify_peer(base, verify); + amqp_ssl_socket_set_verify_hostname(base, verify); +} + +void amqp_ssl_socket_set_verify_peer(amqp_socket_t *base, + amqp_boolean_t verify) { + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + self->verify_peer = verify; +} + +void amqp_ssl_socket_set_verify_hostname(amqp_socket_t *base, + amqp_boolean_t verify) { + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + self->verify_hostname = verify; +} + +int amqp_ssl_socket_set_ssl_versions(amqp_socket_t *base, + amqp_tls_version_t min, + amqp_tls_version_t max) { + struct amqp_ssl_socket_t *self; + if (base->klass != &amqp_ssl_socket_class) { + amqp_abort("<%p> is not of type amqp_ssl_socket_t", base); + } + self = (struct amqp_ssl_socket_t *)base; + + { + long clear_options; + long set_options = 0; +#if defined(SSL_OP_NO_TLSv1_2) + amqp_tls_version_t max_supported = AMQP_TLSv1_2; + clear_options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2; +#elif defined(SSL_OP_NO_TLSv1_1) + amqp_tls_version_t max_supported = AMQP_TLSv1_1; + clear_options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; +#elif defined(SSL_OP_NO_TLSv1) + amqp_tls_version_t max_supported = AMQP_TLSv1; + clear_options = SSL_OP_NO_TLSv1; +#else +#error "Need a version of OpenSSL that can support TLSv1 or greater." +#endif + + if (AMQP_TLSvLATEST == max) { + max = max_supported; + } + if (AMQP_TLSvLATEST == min) { + min = max_supported; + } + + if (min > max) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + if (max > max_supported || min > max_supported) { + return AMQP_STATUS_UNSUPPORTED; + } + + if (min > AMQP_TLSv1) { + set_options |= SSL_OP_NO_TLSv1; + } +#ifdef SSL_OP_NO_TLSv1_1 + if (min > AMQP_TLSv1_1 || max < AMQP_TLSv1_1) { + set_options |= SSL_OP_NO_TLSv1_1; + } +#endif +#ifdef SSL_OP_NO_TLSv1_2 + if (max < AMQP_TLSv1_2) { + set_options |= SSL_OP_NO_TLSv1_2; + } +#endif + SSL_CTX_clear_options(self->ctx, clear_options); + SSL_CTX_set_options(self->ctx, set_options); + } + + return AMQP_STATUS_OK; +} + +void amqp_set_initialize_ssl_library(amqp_boolean_t do_initialize) { + CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex)); + + if (openssl_connections == 0 && !openssl_initialized) { + do_initialize_openssl = do_initialize; + } + CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex)); +} + +static unsigned long ssl_threadid_callback(void) { + return (unsigned long)pthread_self(); +} + +static void ssl_locking_callback(int mode, int n, AMQP_UNUSED const char *file, + AMQP_UNUSED int line) { + if (mode & CRYPTO_LOCK) { + CHECK_SUCCESS(pthread_mutex_lock(&amqp_openssl_lockarray[n])); + } else { + CHECK_SUCCESS(pthread_mutex_unlock(&amqp_openssl_lockarray[n])); + } +} + +static int setup_openssl(void) { + int status; + + int i; + amqp_openssl_lockarray = calloc(CRYPTO_num_locks(), sizeof(pthread_mutex_t)); + if (!amqp_openssl_lockarray) { + status = AMQP_STATUS_NO_MEMORY; + goto out; + } + for (i = 0; i < CRYPTO_num_locks(); i++) { + if (pthread_mutex_init(&amqp_openssl_lockarray[i], NULL)) { + int j; + for (j = 0; j < i; j++) { + pthread_mutex_destroy(&amqp_openssl_lockarray[j]); + } + free(amqp_openssl_lockarray); + status = AMQP_STATUS_SSL_ERROR; + goto out; + } + } + CRYPTO_set_id_callback(ssl_threadid_callback); + CRYPTO_set_locking_callback(ssl_locking_callback); + +#ifdef AMQP_OPENSSL_V110 + if (CONF_modules_load_file( + NULL, "rabbitmq-c", + CONF_MFLAGS_DEFAULT_SECTION | CONF_MFLAGS_IGNORE_MISSING_FILE) <= 0) { + status = AMQP_STATUS_SSL_ERROR; + goto out; + } +#else + OPENSSL_config(NULL); +#endif + SSL_library_init(); + SSL_load_error_strings(); + + status = AMQP_STATUS_OK; +out: + return status; +} + +int amqp_initialize_ssl_library(void) { + int status; + CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex)); + + if (!openssl_initialized) { + status = setup_openssl(); + if (status) { + goto out; + } + openssl_initialized = 1; + } + + status = AMQP_STATUS_OK; +out: + CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex)); + return status; +} + +static int initialize_ssl_and_increment_connections() { + int status; + CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex)); + + if (do_initialize_openssl && !openssl_initialized) { + status = setup_openssl(); + if (status) { + goto exit; + } + openssl_initialized = 1; + } + + if (!openssl_bio_initialized) { + status = amqp_openssl_bio_init(); + if (status) { + goto exit; + } + openssl_bio_initialized = 1; + } + + openssl_connections += 1; + status = AMQP_STATUS_OK; +exit: + CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex)); + return status; +} + +static int decrement_ssl_connections(void) { + CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex)); + + if (openssl_connections > 0) { + openssl_connections--; + } + + CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex)); + return AMQP_STATUS_OK; +} + +int amqp_uninitialize_ssl_library(void) { + int status; + CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex)); + + if (openssl_connections > 0) { + status = AMQP_STATUS_SOCKET_INUSE; + goto out; + } + + amqp_openssl_bio_destroy(); + openssl_bio_initialized = 0; + +#ifndef AMQP_OPENSSL_V110 + ERR_remove_state(0); +#endif + +#ifndef LIBRESSL_VERSION_NUMBER + FIPS_mode_set(0); +#endif + + CRYPTO_set_locking_callback(NULL); + CRYPTO_set_id_callback(NULL); + { + int i; + for (i = 0; i < CRYPTO_num_locks(); i++) { + pthread_mutex_destroy(&amqp_openssl_lockarray[i]); + } + free(amqp_openssl_lockarray); + } + + ENGINE_cleanup(); + CONF_modules_free(); + EVP_cleanup(); + CRYPTO_cleanup_all_ex_data(); + ERR_free_strings(); +#if (OPENSSL_VERSION_NUMBER >= 0x10002003L) && !defined(LIBRESSL_VERSION_NUMBER) + SSL_COMP_free_compression_methods(); +#endif + + openssl_initialized = 0; + + status = AMQP_STATUS_OK; +out: + CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex)); + return status; +} diff --git a/librab/build/librabbitmq/amqp_openssl_bio.c b/librab/build/librabbitmq/amqp_openssl_bio.c new file mode 100644 index 0000000..3556d6f --- /dev/null +++ b/librab/build/librabbitmq/amqp_openssl_bio.c @@ -0,0 +1,193 @@ +/* + * Portions created by Alan Antonuk are Copyright (c) 2017 Alan Antonuk. + * 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. + */ + +#include "amqp_openssl_bio.h" +#include "amqp_socket.h" + +#include +#include +#if ((defined(_WIN32)) || (defined(__MINGW32__)) || (defined(__MINGW64__))) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#include +#endif + +#ifdef MSG_NOSIGNAL +#define AMQP_USE_AMQP_BIO +#endif + +static int amqp_ssl_bio_initialized = 0; + +#ifdef AMQP_USE_AMQP_BIO + +static BIO_METHOD *amqp_bio_method; + +static int amqp_openssl_bio_should_retry(int res) { + if (res == -1) { + int err = amqp_os_socket_error(); + if ( +#ifdef EWOULDBLOCK + err == EWOULDBLOCK || +#endif +#ifdef WSAEWOULDBLOCK + err == WSAEWOULDBLOCK || +#endif +#ifdef ENOTCONN + err == ENOTCONN || +#endif +#ifdef EINTR + err == EINTR || +#endif +#ifdef EAGAIN + err == EAGAIN || +#endif +#ifdef EPROTO + err == EPROTO || +#endif +#ifdef EINPROGRESS + err == EINPROGRESS || +#endif +#ifdef EALREADY + err == EALREADY || +#endif + 0) { + return 1; + } + } + return 0; +} + +static int amqp_openssl_bio_write(BIO *b, const char *in, int inl) { + int flags = 0; + int fd; + int res; + +#ifdef MSG_NOSIGNAL + flags |= MSG_NOSIGNAL; +#endif + + BIO_get_fd(b, &fd); + res = send(fd, in, inl, flags); + + BIO_clear_retry_flags(b); + if (res <= 0 && amqp_openssl_bio_should_retry(res)) { + BIO_set_retry_write(b); + } + + return res; +} + +static int amqp_openssl_bio_read(BIO *b, char *out, int outl) { + int flags = 0; + int fd; + int res; + +#ifdef MSG_NOSIGNAL + flags |= MSG_NOSIGNAL; +#endif + + BIO_get_fd(b, &fd); + res = recv(fd, out, outl, flags); + + BIO_clear_retry_flags(b); + if (res <= 0 && amqp_openssl_bio_should_retry(res)) { + BIO_set_retry_read(b); + } + + return res; +} + +#ifndef AMQP_OPENSSL_V110 +static int BIO_meth_set_write(BIO_METHOD *biom, + int (*wfn)(BIO *, const char *, int)) { + biom->bwrite = wfn; + return 0; +} + +static int BIO_meth_set_read(BIO_METHOD *biom, int (*rfn)(BIO *, char *, int)) { + biom->bread = rfn; + return 0; +} +#endif /* AQP_OPENSSL_V110 */ +#endif /* AMQP_USE_AMQP_BIO */ + +int amqp_openssl_bio_init(void) { + assert(!amqp_ssl_bio_initialized); +#ifdef AMQP_USE_AMQP_BIO +#ifdef AMQP_OPENSSL_V110 + if (!(amqp_bio_method = BIO_meth_new(BIO_TYPE_SOCKET, "amqp_bio_method"))) { + return AMQP_STATUS_NO_MEMORY; + } + + // casting away const is necessary until + // https://github.com/openssl/openssl/pull/2181/, which is targeted for + // openssl 1.1.1 + BIO_METHOD *meth = (BIO_METHOD *)BIO_s_socket(); + BIO_meth_set_create(amqp_bio_method, BIO_meth_get_create(meth)); + BIO_meth_set_destroy(amqp_bio_method, BIO_meth_get_destroy(meth)); + BIO_meth_set_ctrl(amqp_bio_method, BIO_meth_get_ctrl(meth)); + BIO_meth_set_callback_ctrl(amqp_bio_method, BIO_meth_get_callback_ctrl(meth)); + BIO_meth_set_read(amqp_bio_method, BIO_meth_get_read(meth)); + BIO_meth_set_write(amqp_bio_method, BIO_meth_get_write(meth)); + BIO_meth_set_gets(amqp_bio_method, BIO_meth_get_gets(meth)); + BIO_meth_set_puts(amqp_bio_method, BIO_meth_get_puts(meth)); +#else + if (!(amqp_bio_method = OPENSSL_malloc(sizeof(BIO_METHOD)))) { + return AMQP_STATUS_NO_MEMORY; + } + + memcpy(amqp_bio_method, BIO_s_socket(), sizeof(BIO_METHOD)); +#endif + BIO_meth_set_write(amqp_bio_method, amqp_openssl_bio_write); + BIO_meth_set_read(amqp_bio_method, amqp_openssl_bio_read); +#endif + + amqp_ssl_bio_initialized = 1; + return AMQP_STATUS_OK; +} + +void amqp_openssl_bio_destroy(void) { + assert(amqp_ssl_bio_initialized); +#ifdef AMQP_USE_AMQP_BIO +#ifdef AMQP_OPENSSL_V110 + BIO_meth_free(amqp_bio_method); +#else + OPENSSL_free(amqp_bio_method); +#endif + amqp_bio_method = NULL; +#endif + amqp_ssl_bio_initialized = 0; +} + +BIO_METHOD_PTR amqp_openssl_bio(void) { + assert(amqp_ssl_bio_initialized); +#ifdef AMQP_USE_AMQP_BIO + return amqp_bio_method; +#else + return BIO_s_socket(); +#endif +} diff --git a/librab/build/librabbitmq/amqp_openssl_bio.h b/librab/build/librabbitmq/amqp_openssl_bio.h new file mode 100644 index 0000000..ec09c5e --- /dev/null +++ b/librab/build/librabbitmq/amqp_openssl_bio.h @@ -0,0 +1,44 @@ +/* + * Portions created by Alan Antonuk are Copyright (c) 2017 Alan Antonuk. + * 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. + */ +#ifndef AMQP_OPENSSL_BIO +#define AMQP_OPENSSL_BIO + +#include + +int amqp_openssl_bio_init(void); + +void amqp_openssl_bio_destroy(void); + +#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) +#define AMQP_OPENSSL_V110 +#endif + +#ifdef AMQP_OPENSSL_V110 +typedef const BIO_METHOD *BIO_METHOD_PTR; +#else +typedef BIO_METHOD *BIO_METHOD_PTR; +#endif + +BIO_METHOD_PTR amqp_openssl_bio(void); + +#endif /* ifndef AMQP_OPENSSL_BIO */ diff --git a/librab/build/librabbitmq/amqp_openssl_hostname_validation.c b/librab/build/librabbitmq/amqp_openssl_hostname_validation.c new file mode 100644 index 0000000..133d73c --- /dev/null +++ b/librab/build/librabbitmq/amqp_openssl_hostname_validation.c @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2012, iSEC Partners. + * Copyright (C) 2015 Alan Antonuk. + * + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * 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 OF THIRD PARTY RIGHTS. + * 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. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in this Software without prior written authorization of the + * copyright holder. + */ + +/* Originally from: + * https://github.com/iSECPartners/ssl-conservatory + * https://wiki.openssl.org/index.php/Hostname_validation + */ + +#include +#include + +#include "amqp_hostcheck.h" +#include "amqp_openssl_bio.h" +#include "amqp_openssl_hostname_validation.h" + +#include + +#define HOSTNAME_MAX_SIZE 255 + +/** + * Tries to find a match for hostname in the certificate's Common Name field. + * + * Returns AMQP_HVR_MATCH_FOUND if a match was found. + * Returns AMQP_HVR_MATCH_NOT_FOUND if no matches were found. + * Returns AMQP_HVR_MALFORMED_CERTIFICATE if the Common Name had a NUL character + * embedded in it. + * Returns AMQP_HVR_ERROR if the Common Name could not be extracted. + */ +static amqp_hostname_validation_result amqp_matches_common_name( + const char *hostname, const X509 *server_cert) { + int common_name_loc = -1; + X509_NAME_ENTRY *common_name_entry = NULL; + ASN1_STRING *common_name_asn1 = NULL; + const char *common_name_str = NULL; + + // Find the position of the CN field in the Subject field of the certificate + common_name_loc = X509_NAME_get_index_by_NID( + X509_get_subject_name((X509 *)server_cert), NID_commonName, -1); + if (common_name_loc < 0) { + return AMQP_HVR_ERROR; + } + + // Extract the CN field + common_name_entry = X509_NAME_get_entry( + X509_get_subject_name((X509 *)server_cert), common_name_loc); + if (common_name_entry == NULL) { + return AMQP_HVR_ERROR; + } + + // Convert the CN field to a C string + common_name_asn1 = X509_NAME_ENTRY_get_data(common_name_entry); + if (common_name_asn1 == NULL) { + return AMQP_HVR_ERROR; + } + +#ifdef AMQP_OPENSSL_V110 + common_name_str = (const char *)ASN1_STRING_get0_data(common_name_asn1); +#else + common_name_str = (char *)ASN1_STRING_data(common_name_asn1); +#endif + + // Make sure there isn't an embedded NUL character in the CN + if ((size_t)ASN1_STRING_length(common_name_asn1) != strlen(common_name_str)) { + return AMQP_HVR_MALFORMED_CERTIFICATE; + } + + // Compare expected hostname with the CN + if (amqp_hostcheck(common_name_str, hostname) == AMQP_HCR_MATCH) { + return AMQP_HVR_MATCH_FOUND; + } else { + return AMQP_HVR_MATCH_NOT_FOUND; + } +} + +/** + * Tries to find a match for hostname in the certificate's Subject Alternative + * Name extension. + * + * Returns AMQP_HVR_MATCH_FOUND if a match was found. + * Returns AMQP_HVR_MATCH_NOT_FOUND if no matches were found. + * Returns AMQP_HVR_MALFORMED_CERTIFICATE if any of the hostnames had a NUL + * character embedded in it. + * Returns AMQP_HVR_NO_SAN_PRESENT if the SAN extension was not present in the + * certificate. + */ +static amqp_hostname_validation_result amqp_matches_subject_alternative_name( + const char *hostname, const X509 *server_cert) { + amqp_hostname_validation_result result = AMQP_HVR_MATCH_NOT_FOUND; + int i; + int san_names_nb = -1; + STACK_OF(GENERAL_NAME) *san_names = NULL; + + // Try to extract the names within the SAN extension from the certificate + san_names = + X509_get_ext_d2i((X509 *)server_cert, NID_subject_alt_name, NULL, NULL); + if (san_names == NULL) { + return AMQP_HVR_NO_SAN_PRESENT; + } + san_names_nb = sk_GENERAL_NAME_num(san_names); + + // Check each name within the extension + for (i = 0; i < san_names_nb; i++) { + const GENERAL_NAME *current_name = sk_GENERAL_NAME_value(san_names, i); + + if (current_name->type == GEN_DNS) { + // Current name is a DNS name, let's check it + const char *dns_name = (const char *) +#ifdef AMQP_OPENSSL_V110 + ASN1_STRING_get0_data(current_name->d.dNSName); +#else + ASN1_STRING_data(current_name->d.dNSName); +#endif + + // Make sure there isn't an embedded NUL character in the DNS name + if ((size_t)ASN1_STRING_length(current_name->d.dNSName) != + strlen(dns_name)) { + result = AMQP_HVR_MALFORMED_CERTIFICATE; + break; + } else { // Compare expected hostname with the DNS name + if (amqp_hostcheck(dns_name, hostname) == AMQP_HCR_MATCH) { + result = AMQP_HVR_MATCH_FOUND; + break; + } + } + } + } + sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free); + + return result; +} + +/** + * Validates the server's identity by looking for the expected hostname in the + * server's certificate. As described in RFC 6125, it first tries to find a + * match in the Subject Alternative Name extension. If the extension is not + * present in the certificate, it checks the Common Name instead. + * + * Returns AMQP_HVR_MATCH_FOUND if a match was found. + * Returns AMQP_HVR_MATCH_NOT_FOUND if no matches were found. + * Returns AMQP_HVR_MALFORMED_CERTIFICATE if any of the hostnames had a NUL + * character embedded in it. + * Returns AMQP_HVR_ERROR if there was an error. + */ +amqp_hostname_validation_result amqp_ssl_validate_hostname( + const char *hostname, const X509 *server_cert) { + amqp_hostname_validation_result result; + + if ((hostname == NULL) || (server_cert == NULL)) return AMQP_HVR_ERROR; + + // First try the Subject Alternative Names extension + result = amqp_matches_subject_alternative_name(hostname, server_cert); + if (result == AMQP_HVR_NO_SAN_PRESENT) { + // Extension was not found: try the Common Name + result = amqp_matches_common_name(hostname, server_cert); + } + + return result; +} diff --git a/librab/build/librabbitmq/amqp_openssl_hostname_validation.h b/librab/build/librabbitmq/amqp_openssl_hostname_validation.h new file mode 100644 index 0000000..c994871 --- /dev/null +++ b/librab/build/librabbitmq/amqp_openssl_hostname_validation.h @@ -0,0 +1,58 @@ +#ifndef librabbitmq_amqp_openssl_hostname_validation_h +#define librabbitmq_amqp_openssl_hostname_validation_h + +/* + * Copyright (C) 2012, iSEC Partners. + * Copyright (C) 2015 Alan Antonuk. + * + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * 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 OF THIRD PARTY RIGHTS. + * 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. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in this Software without prior written authorization of the + * copyright holder. + */ + +/* Originally from: + * https://github.com/iSECPartners/ssl-conservatory + * https://wiki.openssl.org/index.php/Hostname_validation + */ + +#include + +typedef enum { + AMQP_HVR_MATCH_FOUND, + AMQP_HVR_MATCH_NOT_FOUND, + AMQP_HVR_NO_SAN_PRESENT, + AMQP_HVR_MALFORMED_CERTIFICATE, + AMQP_HVR_ERROR +} amqp_hostname_validation_result; + +/** +* Validates the server's identity by looking for the expected hostname in the +* server's certificate. As described in RFC 6125, it first tries to find a match +* in the Subject Alternative Name extension. If the extension is not present in +* the certificate, it checks the Common Name instead. +* +* Returns AMQP_HVR_MATCH_FOUND if a match was found. +* Returns AMQP_HVR_MATCH_NOT_FOUND if no matches were found. +* Returns AMQP_HVR_MALFORMED_CERTIFICATE if any of the hostnames had a NUL +* character embedded in it. +* Returns AMQP_HVR_ERROR if there was an error. +*/ +amqp_hostname_validation_result amqp_ssl_validate_hostname( + const char *hostname, const X509 *server_cert); + +#endif diff --git a/librab/build/librabbitmq/amqp_private.h b/librab/build/librabbitmq/amqp_private.h new file mode 100644 index 0000000..e73776c --- /dev/null +++ b/librab/build/librabbitmq/amqp_private.h @@ -0,0 +1,374 @@ +#ifndef librabbitmq_amqp_private_h +#define librabbitmq_amqp_private_h + +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define AMQ_COPYRIGHT \ + "Copyright (c) 2007-2014 VMWare Inc, Tony Garnock-Jones," \ + " and Alan Antonuk." + +#include "amqp.h" +#include "amqp_framing.h" +#include + +#if ((defined(_WIN32)) || (defined(__MINGW32__)) || (defined(__MINGW64__))) +#ifndef WINVER +/* WINVER 0x0502 is WinXP SP2+, Windows Server 2003 SP1+ + * See: + * http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx#macros_for_conditional_declarations + */ +#define WINVER 0x0502 +#endif +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#include +#endif + +/* GCC attributes */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define AMQP_NORETURN __attribute__((__noreturn__)) +#define AMQP_UNUSED __attribute__((__unused__)) +#elif defined(_MSC_VER) +#define AMQP_NORETURN __declspec(noreturn) +#define AMQP_UNUSED +#else +#define AMQP_NORETURN +#define AMQP_UNUSED +#endif + +#if __GNUC__ >= 4 +#define AMQP_PRIVATE __attribute__((visibility("hidden"))) +#else +#define AMQP_PRIVATE +#endif + +char *amqp_os_error_string(int err); + +#ifdef WITH_SSL +char *amqp_ssl_error_string(int err); +#endif + +#include "amqp_socket.h" +#include "amqp_time.h" + +/* + * Connection states: XXX FIX THIS + * + * - CONNECTION_STATE_INITIAL: The initial state, when we cannot be + * sure if the next thing we will get is the first AMQP frame, or a + * protocol header from the server. + * + * - CONNECTION_STATE_IDLE: The normal state between + * frames. Connections may only be reconfigured, and the + * connection's pools recycled, when in this state. Whenever we're + * in this state, the inbound_buffer's bytes pointer must be NULL; + * any other state, and it must point to a block of memory allocated + * from the frame_pool. + * + * - CONNECTION_STATE_HEADER: Some bytes of an incoming frame have + * been seen, but not a complete frame header's worth. + * + * - CONNECTION_STATE_BODY: A complete frame header has been seen, but + * the frame is not yet complete. When it is completed, it will be + * returned, and the connection will return to IDLE state. + * + */ +typedef enum amqp_connection_state_enum_ { + CONNECTION_STATE_IDLE = 0, + CONNECTION_STATE_INITIAL, + CONNECTION_STATE_HEADER, + CONNECTION_STATE_BODY +} amqp_connection_state_enum; + +typedef enum amqp_status_private_enum_ { + /* 0x00xx -> AMQP_STATUS_*/ + /* 0x01xx -> AMQP_STATUS_TCP_* */ + /* 0x02xx -> AMQP_STATUS_SSL_* */ + AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD = -0x1301, + AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE = -0x1302 +} amqp_status_private_enum; + +/* 7 bytes up front, then payload, then 1 byte footer */ +#define HEADER_SIZE 7 +#define FOOTER_SIZE 1 + +#define AMQP_PSEUDOFRAME_PROTOCOL_HEADER 'A' + +typedef struct amqp_link_t_ { + struct amqp_link_t_ *next; + void *data; +} amqp_link_t; + +#define POOL_TABLE_SIZE 16 + +typedef struct amqp_pool_table_entry_t_ { + struct amqp_pool_table_entry_t_ *next; + amqp_pool_t pool; + amqp_channel_t channel; +} amqp_pool_table_entry_t; + +struct amqp_connection_state_t_ { + amqp_pool_table_entry_t *pool_table[POOL_TABLE_SIZE]; + + amqp_connection_state_enum state; + + int channel_max; + int frame_max; + + /* Heartbeat interval in seconds. If this is <= 0, then heartbeats are not + * enabled, and next_recv_heartbeat and next_send_heartbeat are set to + * infinite */ + int heartbeat; + amqp_time_t next_recv_heartbeat; + amqp_time_t next_send_heartbeat; + + /* buffer for holding frame headers. Allows us to delay allocating + * the raw frame buffer until the type, channel, and size are all known + */ + char header_buffer[HEADER_SIZE + 1]; + amqp_bytes_t inbound_buffer; + + size_t inbound_offset; + size_t target_size; + + amqp_bytes_t outbound_buffer; + + amqp_socket_t *socket; + + amqp_bytes_t sock_inbound_buffer; + size_t sock_inbound_offset; + size_t sock_inbound_limit; + + amqp_link_t *first_queued_frame; + amqp_link_t *last_queued_frame; + + amqp_rpc_reply_t most_recent_api_result; + + amqp_table_t server_properties; + amqp_table_t client_properties; + amqp_pool_t properties_pool; + + struct timeval *handshake_timeout; + struct timeval internal_handshake_timeout; + struct timeval *rpc_timeout; + struct timeval internal_rpc_timeout; +}; + +amqp_pool_t *amqp_get_or_create_channel_pool(amqp_connection_state_t connection, + amqp_channel_t channel); +amqp_pool_t *amqp_get_channel_pool(amqp_connection_state_t state, + amqp_channel_t channel); + +static inline int amqp_heartbeat_send(amqp_connection_state_t state) { + return state->heartbeat; +} + +static inline int amqp_heartbeat_recv(amqp_connection_state_t state) { + return 2 * state->heartbeat; +} + +int amqp_try_recv(amqp_connection_state_t state); + +static inline void *amqp_offset(void *data, size_t offset) { + return (char *)data + offset; +} + +/* This macro defines the encoding and decoding functions associated with a + simple type. */ + +#define DECLARE_CODEC_BASE_TYPE(bits) \ + \ + static inline int amqp_encode_##bits(amqp_bytes_t encoded, size_t *offset, \ + uint##bits##_t input) { \ + size_t o = *offset; \ + if ((*offset = o + bits / 8) <= encoded.len) { \ + amqp_e##bits(input, amqp_offset(encoded.bytes, o)); \ + return 1; \ + } \ + return 0; \ + } \ + \ + static inline int amqp_decode_##bits(amqp_bytes_t encoded, size_t *offset, \ + uint##bits##_t *output) { \ + size_t o = *offset; \ + if ((*offset = o + bits / 8) <= encoded.len) { \ + *output = amqp_d##bits(amqp_offset(encoded.bytes, o)); \ + return 1; \ + } \ + return 0; \ + } + +static inline int is_bigendian(void) { + union { + uint32_t i; + char c[4]; + } bint = {0x01020304}; + return bint.c[0] == 1; +} + +static inline void amqp_e8(uint8_t val, void *data) { + memcpy(data, &val, sizeof(val)); +} + +static inline uint8_t amqp_d8(void *data) { + uint8_t val; + memcpy(&val, data, sizeof(val)); + return val; +} + +static inline void amqp_e16(uint16_t val, void *data) { + if (!is_bigendian()) { + val = ((val & 0xFF00u) >> 8u) | ((val & 0x00FFu) << 8u); + } + memcpy(data, &val, sizeof(val)); +} + +static inline uint16_t amqp_d16(void *data) { + uint16_t val; + memcpy(&val, data, sizeof(val)); + if (!is_bigendian()) { + val = ((val & 0xFF00u) >> 8u) | ((val & 0x00FFu) << 8u); + } + return val; +} + +static inline void amqp_e32(uint32_t val, void *data) { + if (!is_bigendian()) { + val = ((val & 0xFF000000u) >> 24u) | ((val & 0x00FF0000u) >> 8u) | + ((val & 0x0000FF00u) << 8u) | ((val & 0x000000FFu) << 24u); + } + memcpy(data, &val, sizeof(val)); +} + +static inline uint32_t amqp_d32(void *data) { + uint32_t val; + memcpy(&val, data, sizeof(val)); + if (!is_bigendian()) { + val = ((val & 0xFF000000u) >> 24u) | ((val & 0x00FF0000u) >> 8u) | + ((val & 0x0000FF00u) << 8u) | ((val & 0x000000FFu) << 24u); + } + return val; +} + +static inline void amqp_e64(uint64_t val, void *data) { + if (!is_bigendian()) { + val = ((val & 0xFF00000000000000u) >> 56u) | + ((val & 0x00FF000000000000u) >> 40u) | + ((val & 0x0000FF0000000000u) >> 24u) | + ((val & 0x000000FF00000000u) >> 8u) | + ((val & 0x00000000FF000000u) << 8u) | + ((val & 0x0000000000FF0000u) << 24u) | + ((val & 0x000000000000FF00u) << 40u) | + ((val & 0x00000000000000FFu) << 56u); + } + memcpy(data, &val, sizeof(val)); +} + +static inline uint64_t amqp_d64(void *data) { + uint64_t val; + memcpy(&val, data, sizeof(val)); + if (!is_bigendian()) { + val = ((val & 0xFF00000000000000u) >> 56u) | + ((val & 0x00FF000000000000u) >> 40u) | + ((val & 0x0000FF0000000000u) >> 24u) | + ((val & 0x000000FF00000000u) >> 8u) | + ((val & 0x00000000FF000000u) << 8u) | + ((val & 0x0000000000FF0000u) << 24u) | + ((val & 0x000000000000FF00u) << 40u) | + ((val & 0x00000000000000FFu) << 56u); + } + return val; +} + +DECLARE_CODEC_BASE_TYPE(8) +DECLARE_CODEC_BASE_TYPE(16) +DECLARE_CODEC_BASE_TYPE(32) +DECLARE_CODEC_BASE_TYPE(64) + +static inline int amqp_encode_bytes(amqp_bytes_t encoded, size_t *offset, + amqp_bytes_t input) { + size_t o = *offset; + /* The memcpy below has undefined behavior if the input is NULL. It is valid + * for a 0-length amqp_bytes_t to have .bytes == NULL. Thus we should check + * before encoding. + */ + if (input.len == 0) { + return 1; + } + if ((*offset = o + input.len) <= encoded.len) { + memcpy(amqp_offset(encoded.bytes, o), input.bytes, input.len); + return 1; + } else { + return 0; + } +} + +static inline int amqp_decode_bytes(amqp_bytes_t encoded, size_t *offset, + amqp_bytes_t *output, size_t len) { + size_t o = *offset; + if ((*offset = o + len) <= encoded.len) { + output->bytes = amqp_offset(encoded.bytes, o); + output->len = len; + return 1; + } else { + return 0; + } +} + +AMQP_NORETURN +void amqp_abort(const char *fmt, ...); + +int amqp_bytes_equal(amqp_bytes_t r, amqp_bytes_t l); + +static inline amqp_rpc_reply_t amqp_rpc_reply_error(amqp_status_enum status) { + amqp_rpc_reply_t reply; + reply.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; + reply.library_error = status; + return reply; +} + +int amqp_send_frame_inner(amqp_connection_state_t state, + const amqp_frame_t *frame, int flags, + amqp_time_t deadline); +#endif diff --git a/librab/build/librabbitmq/amqp_socket.c b/librab/build/librabbitmq/amqp_socket.c new file mode 100644 index 0000000..061192e --- /dev/null +++ b/librab/build/librabbitmq/amqp_socket.c @@ -0,0 +1,1492 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "amqp_private.h" +#include "amqp_socket.h" +#include "amqp_table.h" +#include "amqp_time.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#if ((defined(_WIN32)) || (defined(__MINGW32__)) || (defined(__MINGW64__))) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include +#else +#include +/* On older BSD types.h must come before net includes */ +#include +#include +#ifdef HAVE_SELECT +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_POLL +#include +#endif +#include +#endif + +static int amqp_id_in_reply_list(amqp_method_number_t expected, + amqp_method_number_t *list); + +static int amqp_os_socket_init(void) { +#ifdef _WIN32 + static int called_wsastartup = 0; + if (!called_wsastartup) { + WSADATA data; + int res = WSAStartup(0x0202, &data); + if (res) { + return AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR; + } + + called_wsastartup = 1; + } + return AMQP_STATUS_OK; + +#else + return AMQP_STATUS_OK; +#endif +} + +int amqp_os_socket_error(void) { +#ifdef _WIN32 + return WSAGetLastError(); +#else + return errno; +#endif +} + +int amqp_os_socket_close(int sockfd) { +#ifdef _WIN32 + return closesocket(sockfd); +#else + return close(sockfd); +#endif +} + +ssize_t amqp_socket_send(amqp_socket_t *self, const void *buf, size_t len, + int flags) { + assert(self); + assert(self->klass->send); + return self->klass->send(self, buf, len, flags); +} + +ssize_t amqp_socket_recv(amqp_socket_t *self, void *buf, size_t len, + int flags) { + assert(self); + assert(self->klass->recv); + return self->klass->recv(self, buf, len, flags); +} + +int amqp_socket_open(amqp_socket_t *self, const char *host, int port) { + assert(self); + assert(self->klass->open); + return self->klass->open(self, host, port, NULL); +} + +int amqp_socket_open_noblock(amqp_socket_t *self, const char *host, int port, + struct timeval *timeout) { + assert(self); + assert(self->klass->open); + return self->klass->open(self, host, port, timeout); +} + +int amqp_socket_close(amqp_socket_t *self, amqp_socket_close_enum force) { + assert(self); + assert(self->klass->close); + return self->klass->close(self, force); +} + +void amqp_socket_delete(amqp_socket_t *self) { + if (self) { + assert(self->klass->delete); + self->klass->delete (self); + } +} + +int amqp_socket_get_sockfd(amqp_socket_t *self) { + assert(self); + assert(self->klass->get_sockfd); + return self->klass->get_sockfd(self); +} + +int amqp_poll(int fd, int event, amqp_time_t deadline) { +#ifdef HAVE_POLL + struct pollfd pfd; + int res; + int timeout_ms; + + /* Function should only ever be called with one of these two */ + assert(event == AMQP_SF_POLLIN || event == AMQP_SF_POLLOUT); + +start_poll: + pfd.fd = fd; + switch (event) { + case AMQP_SF_POLLIN: + pfd.events = POLLIN; + break; + case AMQP_SF_POLLOUT: + pfd.events = POLLOUT; + break; + } + + timeout_ms = amqp_time_ms_until(deadline); + if (-1 > timeout_ms) { + return timeout_ms; + } + + res = poll(&pfd, 1, timeout_ms); + + if (0 < res) { + /* TODO: optimize this a bit by returning the AMQP_STATUS_SOCKET_ERROR or + * equivalent when pdf.revent is POLLHUP or POLLERR, so an extra syscall + * doesn't need to be made. */ + return AMQP_STATUS_OK; + } else if (0 == res) { + return AMQP_STATUS_TIMEOUT; + } else { + switch (amqp_os_socket_error()) { + case EINTR: + goto start_poll; + default: + return AMQP_STATUS_SOCKET_ERROR; + } + } + return AMQP_STATUS_OK; +#elif defined(HAVE_SELECT) + fd_set fds; + fd_set exceptfds; + fd_set *exceptfdsp; + int res; + struct timeval tv; + struct timeval *tvp; + + assert((0 != (event & AMQP_SF_POLLIN)) || (0 != (event & AMQP_SF_POLLOUT))); +#ifndef _WIN32 + /* On Win32 connect() failure is indicated through the exceptfds, it does not + * make any sense to allow POLLERR on any other platform or condition */ + assert(0 == (event & AMQP_SF_POLLERR)); +#endif + +start_select: + FD_ZERO(&fds); + FD_SET(fd, &fds); + + if (event & AMQP_SF_POLLERR) { + FD_ZERO(&exceptfds); + FD_SET(fd, &exceptfds); + exceptfdsp = &exceptfds; + } else { + exceptfdsp = NULL; + } + + res = amqp_time_tv_until(deadline, &tv, &tvp); + if (res != AMQP_STATUS_OK) { + return res; + } + + if (event & AMQP_SF_POLLIN) { + res = select(fd + 1, &fds, NULL, exceptfdsp, tvp); + } else if (event & AMQP_SF_POLLOUT) { + res = select(fd + 1, NULL, &fds, exceptfdsp, tvp); + } + + if (0 < res) { + return AMQP_STATUS_OK; + } else if (0 == res) { + return AMQP_STATUS_TIMEOUT; + } else { + switch (amqp_os_socket_error()) { + case EINTR: + goto start_select; + default: + return AMQP_STATUS_SOCKET_ERROR; + } + } +#else +#error "poll() or select() is needed to compile rabbitmq-c" +#endif +} + +static ssize_t do_poll(amqp_connection_state_t state, ssize_t res, + amqp_time_t deadline) { + int fd = amqp_get_sockfd(state); + if (-1 == fd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + switch (res) { + case AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD: + res = amqp_poll(fd, AMQP_SF_POLLIN, deadline); + break; + case AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE: + res = amqp_poll(fd, AMQP_SF_POLLOUT, deadline); + break; + } + return res; +} + +ssize_t amqp_try_send(amqp_connection_state_t state, const void *buf, + size_t len, amqp_time_t deadline, int flags) { + ssize_t res; + void *buf_left = (void *)buf; + /* Assume that len is not going to be larger than ssize_t can hold. */ + ssize_t len_left = (size_t)len; + +start_send: + res = amqp_socket_send(state->socket, buf_left, len_left, flags); + + if (res > 0) { + len_left -= res; + buf_left = (char *)buf_left + res; + if (0 == len_left) { + return (ssize_t)len; + } + goto start_send; + } + res = do_poll(state, res, deadline); + if (AMQP_STATUS_OK == res) { + goto start_send; + } + if (AMQP_STATUS_TIMEOUT == res) { + return (ssize_t)len - len_left; + } + return res; +} + +int amqp_open_socket(char const *hostname, int portnumber) { + return amqp_open_socket_inner(hostname, portnumber, amqp_time_infinite()); +} + +int amqp_open_socket_noblock(char const *hostname, int portnumber, + struct timeval *timeout) { + amqp_time_t deadline; + int res = amqp_time_from_now(&deadline, timeout); + if (AMQP_STATUS_OK != res) { + return res; + } + return amqp_open_socket_inner(hostname, portnumber, deadline); +} + +#ifdef _WIN32 +static int connect_socket(struct addrinfo *addr, amqp_time_t deadline) { + int one = 1; + SOCKET sockfd; + int last_error; + + /* + * This cast is to squash warnings on Win64, see: + * http://stackoverflow.com/questions/1953639/is-it-safe-to-cast-socket-to-int-under-win64 + */ + + sockfd = (int)socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + if (INVALID_SOCKET == sockfd) { + return AMQP_STATUS_SOCKET_ERROR; + } + + /* Set the socket to be non-blocking */ + if (SOCKET_ERROR == ioctlsocket(sockfd, FIONBIO, &one)) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + /* Disable nagle */ + if (SOCKET_ERROR == setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, + (const char *)&one, sizeof(one))) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + /* Enable TCP keepalives */ + if (SOCKET_ERROR == setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, + (const char *)&one, sizeof(one))) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + if (SOCKET_ERROR != connect(sockfd, addr->ai_addr, (int)addr->ai_addrlen)) { + return (int)sockfd; + } + + if (WSAEWOULDBLOCK != WSAGetLastError()) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + last_error = + amqp_poll((int)sockfd, AMQP_SF_POLLOUT | AMQP_SF_POLLERR, deadline); + if (AMQP_STATUS_OK != last_error) { + goto err; + } + + { + int result; + int result_len = sizeof(result); + + if (SOCKET_ERROR == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, + (char *)&result, &result_len) || + result != 0) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + } + + return (int)sockfd; + +err: + closesocket(sockfd); + return last_error; +} +#else +static int connect_socket(struct addrinfo *addr, amqp_time_t deadline) { + int one = 1; + int sockfd; + int flags; + int last_error; + + sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + if (-1 == sockfd) { + return AMQP_STATUS_SOCKET_ERROR; + } + + /* Enable CLOEXEC on socket */ + flags = fcntl(sockfd, F_GETFD); + if (flags == -1 || fcntl(sockfd, F_SETFD, (long)(flags | FD_CLOEXEC)) == -1) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + /* Set the socket as non-blocking */ + flags = fcntl(sockfd, F_GETFL); + if (flags == -1 || fcntl(sockfd, F_SETFL, (long)(flags | O_NONBLOCK)) == -1) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + +#ifdef SO_NOSIGPIPE + /* Turn off SIGPIPE on platforms that support it, BSD, MacOSX */ + if (0 != setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &one, sizeof(one))) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } +#endif /* SO_NOSIGPIPE */ + + /* Disable nagle */ + if (0 != setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one))) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + /* Enable TCP keepalives */ + if (0 != setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one))) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + if (0 == connect(sockfd, addr->ai_addr, addr->ai_addrlen)) { + return sockfd; + } + + if (EINPROGRESS != errno) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + + last_error = amqp_poll(sockfd, AMQP_SF_POLLOUT, deadline); + if (AMQP_STATUS_OK != last_error) { + goto err; + } + + { + int result; + socklen_t result_len = sizeof(result); + + if (-1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &result, &result_len) || + result != 0) { + last_error = AMQP_STATUS_SOCKET_ERROR; + goto err; + } + } + + return sockfd; + +err: + close(sockfd); + return last_error; +} +#endif + +int amqp_open_socket_inner(char const *hostname, int portnumber, + amqp_time_t deadline) { + struct addrinfo hint; + struct addrinfo *address_list; + struct addrinfo *addr; + char portnumber_string[33]; + int sockfd = -1; + int last_error; + + last_error = amqp_os_socket_init(); + if (AMQP_STATUS_OK != last_error) { + return last_error; + } + + memset(&hint, 0, sizeof(hint)); + hint.ai_family = PF_UNSPEC; /* PF_INET or PF_INET6 */ + hint.ai_socktype = SOCK_STREAM; + hint.ai_protocol = IPPROTO_TCP; + + (void)sprintf(portnumber_string, "%d", portnumber); + + last_error = getaddrinfo(hostname, portnumber_string, &hint, &address_list); + if (0 != last_error) { + return AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED; + } + + for (addr = address_list; addr; addr = addr->ai_next) { + sockfd = connect_socket(addr, deadline); + + if (sockfd >= 0) { + last_error = AMQP_STATUS_OK; + break; + } else if (sockfd == AMQP_STATUS_TIMEOUT) { + last_error = sockfd; + break; + } + } + + freeaddrinfo(address_list); + if (last_error != AMQP_STATUS_OK || sockfd == -1) { + return last_error; + } + return sockfd; +} + +static int send_header_inner(amqp_connection_state_t state, + amqp_time_t deadline) { + ssize_t res; + static const uint8_t header[8] = {'A', + 'M', + 'Q', + 'P', + 0, + AMQP_PROTOCOL_VERSION_MAJOR, + AMQP_PROTOCOL_VERSION_MINOR, + AMQP_PROTOCOL_VERSION_REVISION}; + res = amqp_try_send(state, header, sizeof(header), deadline, AMQP_SF_NONE); + if (sizeof(header) == res) { + return AMQP_STATUS_OK; + } + return (int)res; +} + +int amqp_send_header(amqp_connection_state_t state) { + return send_header_inner(state, amqp_time_infinite()); +} + +static amqp_bytes_t sasl_method_name(amqp_sasl_method_enum method) { + amqp_bytes_t res; + + switch (method) { + case AMQP_SASL_METHOD_PLAIN: + res = amqp_cstring_bytes("PLAIN"); + break; + case AMQP_SASL_METHOD_EXTERNAL: + res = amqp_cstring_bytes("EXTERNAL"); + break; + + default: + amqp_abort("Invalid SASL method: %d", (int)method); + } + + return res; +} + +static int bytes_equal(amqp_bytes_t l, amqp_bytes_t r) { + if (l.len == r.len) { + if (l.bytes && r.bytes) { + if (0 == memcmp(l.bytes, r.bytes, l.len)) { + return 1; + } + } + } + return 0; +} + +int sasl_mechanism_in_list(amqp_bytes_t mechanisms, + amqp_sasl_method_enum method) { + amqp_bytes_t mechanism; + amqp_bytes_t supported_mechanism; + uint8_t *start; + uint8_t *end; + uint8_t *current; + + assert(NULL != mechanisms.bytes); + + mechanism = sasl_method_name(method); + + start = (uint8_t *)mechanisms.bytes; + current = start; + end = start + mechanisms.len; + + for (; current != end; start = current + 1) { + /* HACK: SASL states that we should be parsing this string as a UTF-8 + * string, which we're plainly not doing here. At this point its not worth + * dragging an entire UTF-8 parser for this one case, and this should work + * most of the time */ + current = memchr(start, ' ', end - start); + if (NULL == current) { + current = end; + } + supported_mechanism.bytes = start; + supported_mechanism.len = current - start; + if (bytes_equal(mechanism, supported_mechanism)) { + return 1; + } + } + + return 0; +} + +static amqp_bytes_t sasl_response(amqp_pool_t *pool, + amqp_sasl_method_enum method, va_list args) { + amqp_bytes_t response; + + switch (method) { + case AMQP_SASL_METHOD_PLAIN: { + char *username = va_arg(args, char *); + size_t username_len = strlen(username); + char *password = va_arg(args, char *); + size_t password_len = strlen(password); + char *response_buf; + + amqp_pool_alloc_bytes(pool, strlen(username) + strlen(password) + 2, + &response); + if (response.bytes == NULL) + /* We never request a zero-length block, because of the +2 + above, so a NULL here really is ENOMEM. */ + { + return response; + } + + response_buf = response.bytes; + response_buf[0] = 0; + memcpy(response_buf + 1, username, username_len); + response_buf[username_len + 1] = 0; + memcpy(response_buf + username_len + 2, password, password_len); + break; + } + case AMQP_SASL_METHOD_EXTERNAL: { + char *identity = va_arg(args, char *); + size_t identity_len = strlen(identity); + + amqp_pool_alloc_bytes(pool, identity_len, &response); + if (response.bytes == NULL) { + return response; + } + + memcpy(response.bytes, identity, identity_len); + break; + } + default: + amqp_abort("Invalid SASL method: %d", (int)method); + } + + return response; +} + +amqp_boolean_t amqp_frames_enqueued(amqp_connection_state_t state) { + return (state->first_queued_frame != NULL); +} + +/* + * Check to see if we have data in our buffer. If this returns 1, we + * will avoid an immediate blocking read in amqp_simple_wait_frame. + */ +amqp_boolean_t amqp_data_in_buffer(amqp_connection_state_t state) { + return (state->sock_inbound_offset < state->sock_inbound_limit); +} + +static int consume_one_frame(amqp_connection_state_t state, + amqp_frame_t *decoded_frame) { + int res; + + amqp_bytes_t buffer; + buffer.len = state->sock_inbound_limit - state->sock_inbound_offset; + buffer.bytes = + ((char *)state->sock_inbound_buffer.bytes) + state->sock_inbound_offset; + + res = amqp_handle_input(state, buffer, decoded_frame); + if (res < 0) { + return res; + } + + state->sock_inbound_offset += res; + + return AMQP_STATUS_OK; +} + +static int recv_with_timeout(amqp_connection_state_t state, + amqp_time_t timeout) { + ssize_t res; + int fd; + +start_recv: + res = amqp_socket_recv(state->socket, state->sock_inbound_buffer.bytes, + state->sock_inbound_buffer.len, 0); + + if (res < 0) { + fd = amqp_get_sockfd(state); + if (-1 == fd) { + return AMQP_STATUS_CONNECTION_CLOSED; + } + switch (res) { + default: + return (int)res; + case AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD: + res = amqp_poll(fd, AMQP_SF_POLLIN, timeout); + break; + case AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE: + res = amqp_poll(fd, AMQP_SF_POLLOUT, timeout); + break; + } + if (AMQP_STATUS_OK == res) { + goto start_recv; + } + return (int)res; + } + + state->sock_inbound_limit = res; + state->sock_inbound_offset = 0; + + res = amqp_time_s_from_now(&state->next_recv_heartbeat, + amqp_heartbeat_recv(state)); + if (AMQP_STATUS_OK != res) { + return (int)res; + } + return AMQP_STATUS_OK; +} + +int amqp_try_recv(amqp_connection_state_t state) { + amqp_time_t timeout; + + while (amqp_data_in_buffer(state)) { + amqp_frame_t frame; + int res = consume_one_frame(state, &frame); + + if (AMQP_STATUS_OK != res) { + return res; + } + + if (frame.frame_type != 0) { + amqp_pool_t *channel_pool; + amqp_frame_t *frame_copy; + amqp_link_t *link; + + channel_pool = amqp_get_or_create_channel_pool(state, frame.channel); + if (NULL == channel_pool) { + return AMQP_STATUS_NO_MEMORY; + } + + frame_copy = amqp_pool_alloc(channel_pool, sizeof(amqp_frame_t)); + link = amqp_pool_alloc(channel_pool, sizeof(amqp_link_t)); + + if (frame_copy == NULL || link == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + + *frame_copy = frame; + + link->next = NULL; + link->data = frame_copy; + + if (state->last_queued_frame == NULL) { + state->first_queued_frame = link; + } else { + state->last_queued_frame->next = link; + } + state->last_queued_frame = link; + } + } + timeout = amqp_time_immediate(); + + return recv_with_timeout(state, timeout); +} + +static int wait_frame_inner(amqp_connection_state_t state, + amqp_frame_t *decoded_frame, + amqp_time_t timeout_deadline) { + amqp_time_t deadline; + int res; + + for (;;) { + while (amqp_data_in_buffer(state)) { + res = consume_one_frame(state, decoded_frame); + + if (AMQP_STATUS_OK != res) { + return res; + } + + if (AMQP_FRAME_HEARTBEAT == decoded_frame->frame_type) { + amqp_maybe_release_buffers_on_channel(state, 0); + continue; + } + + if (decoded_frame->frame_type != 0) { + /* Complete frame was read. Return it. */ + return AMQP_STATUS_OK; + } + } + + beginrecv: + res = amqp_time_has_past(state->next_send_heartbeat); + if (AMQP_STATUS_TIMER_FAILURE == res) { + return res; + } else if (AMQP_STATUS_TIMEOUT == res) { + amqp_frame_t heartbeat; + heartbeat.channel = 0; + heartbeat.frame_type = AMQP_FRAME_HEARTBEAT; + + res = amqp_send_frame(state, &heartbeat); + if (AMQP_STATUS_OK != res) { + return res; + } + } + deadline = amqp_time_first(timeout_deadline, + amqp_time_first(state->next_recv_heartbeat, + state->next_send_heartbeat)); + + /* TODO this needs to wait for a _frame_ and not anything written from the + * socket */ + res = recv_with_timeout(state, deadline); + + if (AMQP_STATUS_TIMEOUT == res) { + if (amqp_time_equal(deadline, state->next_recv_heartbeat)) { + amqp_socket_close(state->socket, AMQP_SC_FORCE); + return AMQP_STATUS_HEARTBEAT_TIMEOUT; + } else if (amqp_time_equal(deadline, timeout_deadline)) { + return AMQP_STATUS_TIMEOUT; + } else if (amqp_time_equal(deadline, state->next_send_heartbeat)) { + /* send heartbeat happens before we do recv_with_timeout */ + goto beginrecv; + } else { + amqp_abort("Internal error: unable to determine timeout reason"); + } + } else if (AMQP_STATUS_OK != res) { + return res; + } + } +} + +static amqp_link_t *amqp_create_link_for_frame(amqp_connection_state_t state, + amqp_frame_t *frame) { + amqp_link_t *link; + amqp_frame_t *frame_copy; + + amqp_pool_t *channel_pool = + amqp_get_or_create_channel_pool(state, frame->channel); + + if (NULL == channel_pool) { + return NULL; + } + + link = amqp_pool_alloc(channel_pool, sizeof(amqp_link_t)); + frame_copy = amqp_pool_alloc(channel_pool, sizeof(amqp_frame_t)); + + if (NULL == link || NULL == frame_copy) { + return NULL; + } + + *frame_copy = *frame; + link->data = frame_copy; + + return link; +} + +int amqp_queue_frame(amqp_connection_state_t state, amqp_frame_t *frame) { + amqp_link_t *link = amqp_create_link_for_frame(state, frame); + if (NULL == link) { + return AMQP_STATUS_NO_MEMORY; + } + + if (NULL == state->first_queued_frame) { + state->first_queued_frame = link; + } else { + state->last_queued_frame->next = link; + } + + link->next = NULL; + state->last_queued_frame = link; + + return AMQP_STATUS_OK; +} + +int amqp_put_back_frame(amqp_connection_state_t state, amqp_frame_t *frame) { + amqp_link_t *link = amqp_create_link_for_frame(state, frame); + if (NULL == link) { + return AMQP_STATUS_NO_MEMORY; + } + + if (NULL == state->first_queued_frame) { + state->first_queued_frame = link; + state->last_queued_frame = link; + link->next = NULL; + } else { + link->next = state->first_queued_frame; + state->first_queued_frame = link; + } + + return AMQP_STATUS_OK; +} + +int amqp_simple_wait_frame_on_channel(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_frame_t *decoded_frame) { + amqp_frame_t *frame_ptr; + amqp_link_t *cur; + int res; + + for (cur = state->first_queued_frame; NULL != cur; cur = cur->next) { + frame_ptr = cur->data; + + if (channel == frame_ptr->channel) { + state->first_queued_frame = cur->next; + if (NULL == state->first_queued_frame) { + state->last_queued_frame = NULL; + } + + *decoded_frame = *frame_ptr; + + return AMQP_STATUS_OK; + } + } + + for (;;) { + res = wait_frame_inner(state, decoded_frame, amqp_time_infinite()); + + if (AMQP_STATUS_OK != res) { + return res; + } + + if (channel == decoded_frame->channel) { + return AMQP_STATUS_OK; + } else { + res = amqp_queue_frame(state, decoded_frame); + if (res != AMQP_STATUS_OK) { + return res; + } + } + } +} + +int amqp_simple_wait_frame(amqp_connection_state_t state, + amqp_frame_t *decoded_frame) { + return amqp_simple_wait_frame_noblock(state, decoded_frame, NULL); +} + +int amqp_simple_wait_frame_noblock(amqp_connection_state_t state, + amqp_frame_t *decoded_frame, + struct timeval *timeout) { + amqp_time_t deadline; + + int res = amqp_time_from_now(&deadline, timeout); + if (AMQP_STATUS_OK != res) { + return res; + } + + if (state->first_queued_frame != NULL) { + amqp_frame_t *f = (amqp_frame_t *)state->first_queued_frame->data; + state->first_queued_frame = state->first_queued_frame->next; + if (state->first_queued_frame == NULL) { + state->last_queued_frame = NULL; + } + *decoded_frame = *f; + return AMQP_STATUS_OK; + } else { + return wait_frame_inner(state, decoded_frame, deadline); + } +} + +static int amqp_simple_wait_method_list(amqp_connection_state_t state, + amqp_channel_t expected_channel, + amqp_method_number_t *expected_methods, + amqp_time_t deadline, + amqp_method_t *output) { + amqp_frame_t frame; + struct timeval tv; + struct timeval *tvp; + + int res = amqp_time_tv_until(deadline, &tv, &tvp); + if (res != AMQP_STATUS_OK) { + return res; + } + + res = amqp_simple_wait_frame_noblock(state, &frame, tvp); + if (AMQP_STATUS_OK != res) { + return res; + } + + if (AMQP_FRAME_METHOD != frame.frame_type || + expected_channel != frame.channel || + !amqp_id_in_reply_list(frame.payload.method.id, expected_methods)) { + return AMQP_STATUS_WRONG_METHOD; + } + *output = frame.payload.method; + return AMQP_STATUS_OK; +} + +static int simple_wait_method_inner(amqp_connection_state_t state, + amqp_channel_t expected_channel, + amqp_method_number_t expected_method, + amqp_time_t deadline, + amqp_method_t *output) { + amqp_method_number_t expected_methods[] = {expected_method, 0}; + return amqp_simple_wait_method_list(state, expected_channel, expected_methods, + deadline, output); +} + +int amqp_simple_wait_method(amqp_connection_state_t state, + amqp_channel_t expected_channel, + amqp_method_number_t expected_method, + amqp_method_t *output) { + return simple_wait_method_inner(state, expected_channel, expected_method, + amqp_time_infinite(), output); +} + +int amqp_send_method(amqp_connection_state_t state, amqp_channel_t channel, + amqp_method_number_t id, void *decoded) { + return amqp_send_method_inner(state, channel, id, decoded, AMQP_SF_NONE, + amqp_time_infinite()); +} + +int amqp_send_method_inner(amqp_connection_state_t state, + amqp_channel_t channel, amqp_method_number_t id, + void *decoded, int flags, amqp_time_t deadline) { + amqp_frame_t frame; + + frame.frame_type = AMQP_FRAME_METHOD; + frame.channel = channel; + frame.payload.method.id = id; + frame.payload.method.decoded = decoded; + return amqp_send_frame_inner(state, &frame, flags, deadline); +} + +static int amqp_id_in_reply_list(amqp_method_number_t expected, + amqp_method_number_t *list) { + while (*list != 0) { + if (*list == expected) { + return 1; + } + list++; + } + return 0; +} + +static amqp_rpc_reply_t simple_rpc_inner( + 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, amqp_time_t deadline) { + int status; + amqp_rpc_reply_t result; + + memset(&result, 0, sizeof(result)); + + status = amqp_send_method(state, channel, request_id, decoded_request_method); + if (status < 0) { + return amqp_rpc_reply_error(status); + } + + { + amqp_frame_t frame; + + retry: + status = wait_frame_inner(state, &frame, deadline); + if (status < 0) { + if (status == AMQP_STATUS_TIMEOUT) { + amqp_socket_close(state->socket, AMQP_SC_FORCE); + } + return amqp_rpc_reply_error(status); + } + + /* + * We store the frame for later processing unless it's something + * that directly affects us here, namely a method frame that is + * either + * - on the channel we want, and of the expected type, or + * - on the channel we want, and a channel.close frame, or + * - on channel zero, and a connection.close frame. + */ + if (!((frame.frame_type == AMQP_FRAME_METHOD) && + (((frame.channel == channel) && + (amqp_id_in_reply_list(frame.payload.method.id, + expected_reply_ids) || + (frame.payload.method.id == AMQP_CHANNEL_CLOSE_METHOD))) || + ((frame.channel == 0) && + (frame.payload.method.id == AMQP_CONNECTION_CLOSE_METHOD))))) { + amqp_pool_t *channel_pool; + amqp_frame_t *frame_copy; + amqp_link_t *link; + + channel_pool = amqp_get_or_create_channel_pool(state, frame.channel); + if (NULL == channel_pool) { + return amqp_rpc_reply_error(AMQP_STATUS_NO_MEMORY); + } + + frame_copy = amqp_pool_alloc(channel_pool, sizeof(amqp_frame_t)); + link = amqp_pool_alloc(channel_pool, sizeof(amqp_link_t)); + + if (frame_copy == NULL || link == NULL) { + return amqp_rpc_reply_error(AMQP_STATUS_NO_MEMORY); + } + + *frame_copy = frame; + + link->next = NULL; + link->data = frame_copy; + + if (state->last_queued_frame == NULL) { + state->first_queued_frame = link; + } else { + state->last_queued_frame->next = link; + } + state->last_queued_frame = link; + + goto retry; + } + + result.reply_type = + (amqp_id_in_reply_list(frame.payload.method.id, expected_reply_ids)) + ? AMQP_RESPONSE_NORMAL + : AMQP_RESPONSE_SERVER_EXCEPTION; + + result.reply = frame.payload.method; + return result; + } +} + +amqp_rpc_reply_t 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) { + amqp_time_t deadline; + int res; + + res = amqp_time_from_now(&deadline, state->rpc_timeout); + if (res != AMQP_STATUS_OK) { + return amqp_rpc_reply_error(res); + } + + return simple_rpc_inner(state, channel, request_id, expected_reply_ids, + decoded_request_method, deadline); +} + +void *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) { + amqp_time_t deadline; + int res; + amqp_method_number_t replies[2]; + + res = amqp_time_from_now(&deadline, state->rpc_timeout); + if (res != AMQP_STATUS_OK) { + state->most_recent_api_result = amqp_rpc_reply_error(res); + return NULL; + } + + replies[0] = reply_id; + replies[1] = 0; + + state->most_recent_api_result = simple_rpc_inner( + state, channel, request_id, replies, decoded_request_method, deadline); + + if (state->most_recent_api_result.reply_type == AMQP_RESPONSE_NORMAL) { + return state->most_recent_api_result.reply.decoded; + } else { + return NULL; + } +} + +amqp_rpc_reply_t amqp_get_rpc_reply(amqp_connection_state_t state) { + return state->most_recent_api_result; +} + +/* + * Merge base and add tables. If the two tables contain an entry with the same + * key, the entry from the add table takes precedence. For entries that are both + * tables with the same key, the table is recursively merged. + */ +int amqp_merge_capabilities(const amqp_table_t *base, const amqp_table_t *add, + amqp_table_t *result, amqp_pool_t *pool) { + int i; + int res; + amqp_pool_t temp_pool; + amqp_table_t temp_result; + assert(base != NULL); + assert(result != NULL); + assert(pool != NULL); + + if (NULL == add) { + return amqp_table_clone(base, result, pool); + } + + init_amqp_pool(&temp_pool, 4096); + temp_result.num_entries = 0; + temp_result.entries = + amqp_pool_alloc(&temp_pool, sizeof(amqp_table_entry_t) * + (base->num_entries + add->num_entries)); + if (NULL == temp_result.entries) { + res = AMQP_STATUS_NO_MEMORY; + goto error_out; + } + for (i = 0; i < base->num_entries; ++i) { + temp_result.entries[temp_result.num_entries] = base->entries[i]; + temp_result.num_entries++; + } + for (i = 0; i < add->num_entries; ++i) { + amqp_table_entry_t *e = + amqp_table_get_entry_by_key(&temp_result, add->entries[i].key); + if (NULL != e) { + if (AMQP_FIELD_KIND_TABLE == add->entries[i].value.kind && + AMQP_FIELD_KIND_TABLE == e->value.kind) { + amqp_table_entry_t *be = + amqp_table_get_entry_by_key(base, add->entries[i].key); + + res = amqp_merge_capabilities(&be->value.value.table, + &add->entries[i].value.value.table, + &e->value.value.table, &temp_pool); + if (AMQP_STATUS_OK != res) { + goto error_out; + } + } else { + e->value = add->entries[i].value; + } + } else { + temp_result.entries[temp_result.num_entries] = add->entries[i]; + temp_result.num_entries++; + } + } + res = amqp_table_clone(&temp_result, result, pool); +error_out: + empty_amqp_pool(&temp_pool); + return res; +} + +static amqp_rpc_reply_t amqp_login_inner( + amqp_connection_state_t state, char const *vhost, int channel_max, + int frame_max, int heartbeat, const amqp_table_t *client_properties, + struct timeval *timeout, amqp_sasl_method_enum sasl_method, va_list vl) { + int res; + amqp_method_t method; + + uint16_t client_channel_max; + uint32_t client_frame_max; + uint16_t client_heartbeat; + + uint16_t server_channel_max; + uint32_t server_frame_max; + uint16_t server_heartbeat; + + amqp_rpc_reply_t result; + amqp_time_t deadline; + + if (channel_max < 0 || channel_max > UINT16_MAX) { + return amqp_rpc_reply_error(AMQP_STATUS_INVALID_PARAMETER); + } + client_channel_max = (uint16_t)channel_max; + + if (frame_max < 0) { + return amqp_rpc_reply_error(AMQP_STATUS_INVALID_PARAMETER); + } + client_frame_max = (uint32_t)frame_max; + + if (heartbeat < 0 || heartbeat > UINT16_MAX) { + return amqp_rpc_reply_error(AMQP_STATUS_INVALID_PARAMETER); + } + client_heartbeat = (uint16_t)heartbeat; + + res = amqp_time_from_now(&deadline, timeout); + if (AMQP_STATUS_OK != res) { + goto error_res; + } + + res = send_header_inner(state, deadline); + if (AMQP_STATUS_OK != res) { + goto error_res; + } + + res = simple_wait_method_inner(state, 0, AMQP_CONNECTION_START_METHOD, + deadline, &method); + if (AMQP_STATUS_OK != res) { + goto error_res; + } + + { + amqp_connection_start_t *s = (amqp_connection_start_t *)method.decoded; + if ((s->version_major != AMQP_PROTOCOL_VERSION_MAJOR) || + (s->version_minor != AMQP_PROTOCOL_VERSION_MINOR)) { + res = AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION; + goto error_res; + } + + res = amqp_table_clone(&s->server_properties, &state->server_properties, + &state->properties_pool); + + if (AMQP_STATUS_OK != res) { + goto error_res; + } + + /* TODO: check that our chosen SASL mechanism is in the list of + acceptable mechanisms. Or even let the application choose from + the list! */ + if (!sasl_mechanism_in_list(s->mechanisms, sasl_method)) { + res = AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD; + goto error_res; + } + } + + { + amqp_table_entry_t default_properties[6]; + amqp_table_t default_table; + amqp_table_entry_t client_capabilities[2]; + amqp_table_t client_capabilities_table; + amqp_connection_start_ok_t s; + amqp_pool_t *channel_pool; + amqp_bytes_t response_bytes; + + channel_pool = amqp_get_or_create_channel_pool(state, 0); + if (NULL == channel_pool) { + res = AMQP_STATUS_NO_MEMORY; + goto error_res; + } + + response_bytes = sasl_response(channel_pool, sasl_method, vl); + if (response_bytes.bytes == NULL) { + res = AMQP_STATUS_NO_MEMORY; + goto error_res; + } + + client_capabilities[0] = + amqp_table_construct_bool_entry("authentication_failure_close", 1); + client_capabilities[1] = + amqp_table_construct_bool_entry("exchange_exchange_bindings", 1); + + client_capabilities_table.entries = client_capabilities; + client_capabilities_table.num_entries = + sizeof(client_capabilities) / sizeof(amqp_table_entry_t); + + default_properties[0] = + amqp_table_construct_utf8_entry("product", "rabbitmq-c"); + default_properties[1] = + amqp_table_construct_utf8_entry("version", AMQP_VERSION_STRING); + default_properties[2] = + amqp_table_construct_utf8_entry("platform", AMQ_PLATFORM); + default_properties[3] = + amqp_table_construct_utf8_entry("copyright", AMQ_COPYRIGHT); + default_properties[4] = amqp_table_construct_utf8_entry( + "information", "See https://github.com/alanxz/rabbitmq-c"); + default_properties[5] = amqp_table_construct_table_entry( + "capabilities", &client_capabilities_table); + + default_table.entries = default_properties; + default_table.num_entries = + sizeof(default_properties) / sizeof(amqp_table_entry_t); + + res = amqp_merge_capabilities(&default_table, client_properties, + &state->client_properties, channel_pool); + if (AMQP_STATUS_OK != res) { + goto error_res; + } + + s.client_properties = state->client_properties; + s.mechanism = sasl_method_name(sasl_method); + s.response = response_bytes; + s.locale = amqp_cstring_bytes("en_US"); + + res = amqp_send_method_inner(state, 0, AMQP_CONNECTION_START_OK_METHOD, &s, + AMQP_SF_NONE, deadline); + if (res < 0) { + goto error_res; + } + } + + amqp_release_buffers(state); + + { + amqp_method_number_t expected[] = {AMQP_CONNECTION_TUNE_METHOD, + AMQP_CONNECTION_CLOSE_METHOD, 0}; + + res = amqp_simple_wait_method_list(state, 0, expected, deadline, &method); + if (AMQP_STATUS_OK != res) { + goto error_res; + } + } + + if (AMQP_CONNECTION_CLOSE_METHOD == method.id) { + result.reply_type = AMQP_RESPONSE_SERVER_EXCEPTION; + result.reply = method; + result.library_error = 0; + goto out; + } + + { + amqp_connection_tune_t *s = (amqp_connection_tune_t *)method.decoded; + server_channel_max = s->channel_max; + server_frame_max = s->frame_max; + server_heartbeat = s->heartbeat; + } + + if (server_channel_max != 0 && + (server_channel_max < client_channel_max || client_channel_max == 0)) { + client_channel_max = server_channel_max; + } else if (server_channel_max == 0 && client_channel_max == 0) { + client_channel_max = UINT16_MAX; + } + + if (server_frame_max != 0 && server_frame_max < client_frame_max) { + client_frame_max = server_frame_max; + } + + if (server_heartbeat != 0 && server_heartbeat < client_heartbeat) { + client_heartbeat = server_heartbeat; + } + + res = amqp_tune_connection(state, client_channel_max, client_frame_max, + client_heartbeat); + if (res < 0) { + goto error_res; + } + + { + amqp_connection_tune_ok_t s; + s.frame_max = client_frame_max; + s.channel_max = client_channel_max; + s.heartbeat = client_heartbeat; + + res = amqp_send_method_inner(state, 0, AMQP_CONNECTION_TUNE_OK_METHOD, &s, + AMQP_SF_NONE, deadline); + if (res < 0) { + goto error_res; + } + } + + amqp_release_buffers(state); + + { + amqp_method_number_t replies[] = {AMQP_CONNECTION_OPEN_OK_METHOD, 0}; + amqp_connection_open_t s; + s.virtual_host = amqp_cstring_bytes(vhost); + s.capabilities = amqp_empty_bytes; + s.insist = 1; + + result = simple_rpc_inner(state, 0, AMQP_CONNECTION_OPEN_METHOD, replies, + &s, deadline); + if (result.reply_type != AMQP_RESPONSE_NORMAL) { + goto out; + } + } + + result.reply_type = AMQP_RESPONSE_NORMAL; + result.reply.id = 0; + result.reply.decoded = NULL; + result.library_error = 0; + amqp_maybe_release_buffers(state); + +out: + return result; + +error_res: + amqp_socket_close(state->socket, AMQP_SC_FORCE); + result = amqp_rpc_reply_error(res); + + goto out; +} + +amqp_rpc_reply_t amqp_login(amqp_connection_state_t state, char const *vhost, + int channel_max, int frame_max, int heartbeat, + int sasl_method, ...) { + va_list vl; + amqp_rpc_reply_t ret; + + va_start(vl, sasl_method); + + ret = amqp_login_inner(state, vhost, channel_max, frame_max, heartbeat, + &amqp_empty_table, state->handshake_timeout, + sasl_method, vl); + + va_end(vl); + + return ret; +} + +amqp_rpc_reply_t amqp_login_with_properties( + amqp_connection_state_t state, char const *vhost, int channel_max, + int frame_max, int heartbeat, const amqp_table_t *client_properties, + int sasl_method, ...) { + va_list vl; + amqp_rpc_reply_t ret; + + va_start(vl, sasl_method); + + ret = amqp_login_inner(state, vhost, channel_max, frame_max, heartbeat, + client_properties, state->handshake_timeout, + sasl_method, vl); + + va_end(vl); + + return ret; +} diff --git a/librab/build/librabbitmq/amqp_socket.h b/librab/build/librabbitmq/amqp_socket.h new file mode 100644 index 0000000..3101cf6 --- /dev/null +++ b/librab/build/librabbitmq/amqp_socket.h @@ -0,0 +1,188 @@ +/* + * 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. + */ + +/** + * An abstract socket interface. + */ + +#ifndef AMQP_SOCKET_H +#define AMQP_SOCKET_H + +#include "amqp_private.h" +#include "amqp_time.h" + +AMQP_BEGIN_DECLS + +typedef enum { + AMQP_SF_NONE = 0, + AMQP_SF_MORE = 1, + AMQP_SF_POLLIN = 2, + AMQP_SF_POLLOUT = 4, + AMQP_SF_POLLERR = 8 +} amqp_socket_flag_enum; + +typedef enum { AMQP_SC_NONE = 0, AMQP_SC_FORCE = 1 } amqp_socket_close_enum; + +int amqp_os_socket_error(void); + +int amqp_os_socket_close(int sockfd); + +/* Socket callbacks. */ +typedef ssize_t (*amqp_socket_send_fn)(void *, const void *, size_t, int); +typedef ssize_t (*amqp_socket_recv_fn)(void *, void *, size_t, int); +typedef int (*amqp_socket_open_fn)(void *, const char *, int, struct timeval *); +typedef int (*amqp_socket_close_fn)(void *, amqp_socket_close_enum); +typedef int (*amqp_socket_get_sockfd_fn)(void *); +typedef void (*amqp_socket_delete_fn)(void *); + +/** V-table for amqp_socket_t */ +struct amqp_socket_class_t { + amqp_socket_send_fn send; + amqp_socket_recv_fn recv; + amqp_socket_open_fn open; + amqp_socket_close_fn close; + amqp_socket_get_sockfd_fn get_sockfd; + amqp_socket_delete_fn delete; +}; + +/** Abstract base class for amqp_socket_t */ +struct amqp_socket_t_ { + const struct amqp_socket_class_t *klass; +}; + +/** + * Set set the socket object for a connection + * + * This assigns a socket object to the connection, closing and deleting any + * existing socket + * + * \param [in] state The connection object to add the socket to + * \param [in] socket The socket object to assign to the connection + */ +void amqp_set_socket(amqp_connection_state_t state, amqp_socket_t *socket); + +/** + * Send a message from a socket. + * + * This function wraps send(2) functionality. + * + * This function will only return on error, or when all of the bytes in buf + * have been sent, or when an error occurs. + * + * \param [in,out] self A socket object. + * \param [in] buf A buffer to read from. + * \param [in] len The number of bytes in \e buf. + * \param [in] + * + * \return AMQP_STATUS_OK on success. amqp_status_enum value otherwise + */ +ssize_t amqp_socket_send(amqp_socket_t *self, const void *buf, size_t len, + int flags); + +ssize_t amqp_try_send(amqp_connection_state_t state, const void *buf, + size_t len, amqp_time_t deadline, int flags); + +/** + * Receive a message from a socket. + * + * This function wraps recv(2) functionality. + * + * \param [in,out] self A socket object. + * \param [out] buf A buffer to write to. + * \param [in] len The number of bytes at \e buf. + * \param [in] flags Receive flags, implementation specific. + * + * \return The number of bytes received, or < 0 on error (\ref amqp_status_enum) + */ +ssize_t amqp_socket_recv(amqp_socket_t *self, void *buf, size_t len, int flags); + +/** + * Close a socket connection and free resources. + * + * This function closes a socket connection and releases any resources used by + * the object. After calling this function the specified socket should no + * longer be referenced. + * + * \param [in,out] self A socket object. + * \param [in] force, if set, just close the socket, don't attempt a TLS + * shutdown. + * + * \return Zero upon success, non-zero otherwise. + */ +int amqp_socket_close(amqp_socket_t *self, amqp_socket_close_enum force); + +/** + * Destroy a socket object + * + * \param [in] self the socket object to delete + */ +void amqp_socket_delete(amqp_socket_t *self); + +/** + * Open a socket connection. + * + * This function opens a socket connection returned from amqp_tcp_socket_new() + * or amqp_ssl_socket_new(). This function should be called after setting + * socket options and prior to assigning the socket to an AMQP connection with + * amqp_set_socket(). + * + * \param [in] host Connect to this host. + * \param [in] port Connect on this remote port. + * \param [in] timeout Max allowed time to spent on opening. If NULL - run in + * blocking mode + * + * \return File descriptor upon success, non-zero negative error code otherwise. + */ +int amqp_open_socket_noblock(char const *hostname, int portnumber, + struct timeval *timeout); + +int amqp_open_socket_inner(char const *hostname, int portnumber, + amqp_time_t deadline); + +/* Wait up to dealline for fd to become readable or writeable depending on + * event (AMQP_SF_POLLIN, AMQP_SF_POLLOUT) */ +int amqp_poll(int fd, int event, amqp_time_t deadline); + +int amqp_send_method_inner(amqp_connection_state_t state, + amqp_channel_t channel, amqp_method_number_t id, + void *decoded, int flags, amqp_time_t deadline); + +int amqp_queue_frame(amqp_connection_state_t state, amqp_frame_t *frame); + +int amqp_put_back_frame(amqp_connection_state_t state, amqp_frame_t *frame); + +int amqp_simple_wait_frame_on_channel(amqp_connection_state_t state, + amqp_channel_t channel, + amqp_frame_t *decoded_frame); + +int sasl_mechanism_in_list(amqp_bytes_t mechanisms, + amqp_sasl_method_enum method); + +int amqp_merge_capabilities(const amqp_table_t *base, const amqp_table_t *add, + amqp_table_t *result, amqp_pool_t *pool); +AMQP_END_DECLS + +#endif /* AMQP_SOCKET_H */ diff --git a/librab/build/librabbitmq/amqp_ssl_socket.h b/librab/build/librabbitmq/amqp_ssl_socket.h new file mode 100644 index 0000000..9977ae4 --- /dev/null +++ b/librab/build/librabbitmq/amqp_ssl_socket.h @@ -0,0 +1,239 @@ +/** \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. + */ + +#ifndef AMQP_SSL_H +#define AMQP_SSL_H + +#include + +AMQP_BEGIN_DECLS + +/** + * Create a new SSL/TLS socket object. + * + * The returned socket object is owned by the \ref amqp_connection_state_t + * object and will be destroyed when the state object is destroyed or a new + * socket object is created. + * + * If the socket object creation fails, the \ref amqp_connection_state_t object + * will not be changed. + * + * The object returned by this function can be retrieved from the + * amqp_connection_state_t object later using the amqp_get_socket() function. + * + * Calling this function may result in the underlying SSL library being + * initialized. + * \sa amqp_set_initialize_ssl_library() + * + * \param [in,out] state The connection object that owns the SSL/TLS socket + * \return A new socket object or NULL if an error occurred. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +amqp_socket_t *AMQP_CALL amqp_ssl_socket_new(amqp_connection_state_t state); + +/** + * Set the CA certificate. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] cacert Path to the CA cert file in PEM format. + * + * \return \ref AMQP_STATUS_OK on success an \ref amqp_status_enum value on + * failure. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_ssl_socket_set_cacert(amqp_socket_t *self, + const char *cacert); + +/** + * Set the client key. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] cert Path to the client certificate in PEM foramt. + * \param [in] key Path to the client key in PEM format. + * + * \return \ref AMQP_STATUS_OK on success an \ref amqp_status_enum value on + * failure. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_ssl_socket_set_key(amqp_socket_t *self, const char *cert, + const char *key); + +/** + * Set the client key from a buffer. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] cert Path to the client certificate in PEM foramt. + * \param [in] key A buffer containing client key in PEM format. + * \param [in] n The length of the buffer. + * + * \return \ref AMQP_STATUS_OK on success an \ref amqp_status_enum value on + * failure. + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_ssl_socket_set_key_buffer(amqp_socket_t *self, + const char *cert, const void *key, + size_t n); + +/** + * Enable or disable peer verification. + * + * \deprecated use \amqp_ssl_socket_set_verify_peer and + * \amqp_ssl_socket_set_verify_hostname instead. + * + * If peer verification is enabled then the common name in the server + * certificate must match the server name. Peer verification is enabled by + * default. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] verify Enable or disable peer verification. + * + * \since v0.4.0 + */ +AMQP_DEPRECATED(AMQP_PUBLIC_FUNCTION void AMQP_CALL amqp_ssl_socket_set_verify( + amqp_socket_t *self, amqp_boolean_t verify)); + +/** + * Enable or disable peer verification. + * + * Peer verification validates the certificate chain that is sent by the broker. + * Hostname validation is controlled by \amqp_ssl_socket_set_verify_peer. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] verify enable or disable peer validation + * + * \since v0.8.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_ssl_socket_set_verify_peer(amqp_socket_t *self, + amqp_boolean_t verify); + +/** + * Enable or disable hostname verification. + * + * Hostname verification checks the broker cert for a CN or SAN that matches the + * hostname that amqp_socket_open() is presented. Peer verification is + * controlled by \amqp_ssl_socket_set_verify_peer + * + * \since v0.8.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_ssl_socket_set_verify_hostname(amqp_socket_t *self, + amqp_boolean_t verify); + +typedef enum { + AMQP_TLSv1 = 1, + AMQP_TLSv1_1 = 2, + AMQP_TLSv1_2 = 3, + AMQP_TLSvLATEST = 0xFFFF +} amqp_tls_version_t; + +/** + * Set min and max TLS versions. + * + * Set the oldest and newest acceptable TLS versions that are acceptable when + * connecting to the broker. Set min == max to restrict to just that + * version. + * + * \param [in,out] self An SSL/TLS socket object. + * \param [in] min the minimum acceptable TLS version + * \param [in] max the maxmium acceptable TLS version + * \returns AMQP_STATUS_OK on success, AMQP_STATUS_UNSUPPORTED if OpenSSL does + * not support the requested TLS version, AMQP_STATUS_INVALID_PARAMETER if an + * invalid combination of parameters is passed. + * + * \since v0.8.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_ssl_socket_set_ssl_versions(amqp_socket_t *self, + amqp_tls_version_t min, + amqp_tls_version_t max); + +/** + * Sets whether rabbitmq-c will initialize OpenSSL. + * + * OpenSSL requires a one-time initialization across a whole program, this sets + * whether or not rabbitmq-c will initialize the SSL library when the first call + * to amqp_ssl_socket_new() is made. You should call this function with + * do_init = 0 if the underlying SSL library is initialized somewhere else + * the program. + * + * Failing to initialize or double initialization of the SSL library will + * result in undefined behavior + * + * By default rabbitmq-c will initialize the underlying SSL library. + * + * NOTE: calling this function after the first socket has been opened with + * amqp_open_socket() will not have any effect. + * + * \param [in] do_initialize If 0 rabbitmq-c will not initialize the SSL + * library, otherwise rabbitmq-c will initialize the + * SSL library + * + * \since v0.4.0 + */ +AMQP_PUBLIC_FUNCTION +void AMQP_CALL amqp_set_initialize_ssl_library(amqp_boolean_t do_initialize); + +/** + * Initialize the underlying SSL/TLS library. + * + * The OpenSSL library requires a one-time initialization across the whole + * program. + * + * This function unconditionally initializes OpenSSL so that rabbitmq-c may + * use it. + * + * This function is thread-safe, and may be called more than once. + * + * \return AMQP_STATUS_OK on success. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_initialize_ssl_library(void); + +/** + * Uninitialize the underlying SSL/TLS library. + * + * \return AMQP_STATUS_OK on success. + * + * \since v0.9.0 + */ +AMQP_PUBLIC_FUNCTION +int AMQP_CALL amqp_uninitialize_ssl_library(void); + +AMQP_END_DECLS + +#endif /* AMQP_SSL_H */ diff --git a/librab/build/librabbitmq/amqp_table.c b/librab/build/librabbitmq/amqp_table.c new file mode 100644 index 0000000..24b087c --- /dev/null +++ b/librab/build/librabbitmq/amqp_table.c @@ -0,0 +1,668 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include "amqp_table.h" +#include +#include +#include +#include +#include + +#define INITIAL_ARRAY_SIZE 16 +#define INITIAL_TABLE_SIZE 16 + +static int amqp_decode_field_value(amqp_bytes_t encoded, amqp_pool_t *pool, + amqp_field_value_t *entry, size_t *offset); + +static int amqp_encode_field_value(amqp_bytes_t encoded, + amqp_field_value_t *entry, size_t *offset); + +/*---------------------------------------------------------------------------*/ + +static int amqp_decode_array(amqp_bytes_t encoded, amqp_pool_t *pool, + amqp_array_t *output, size_t *offset) { + uint32_t arraysize; + int num_entries = 0; + int allocated_entries = INITIAL_ARRAY_SIZE; + amqp_field_value_t *entries; + size_t limit; + int res; + + if (!amqp_decode_32(encoded, offset, &arraysize)) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + if (arraysize + *offset > encoded.len) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + entries = malloc(allocated_entries * sizeof(amqp_field_value_t)); + if (entries == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + + limit = *offset + arraysize; + while (*offset < limit) { + if (num_entries >= allocated_entries) { + void *newentries; + allocated_entries = allocated_entries * 2; + newentries = + realloc(entries, allocated_entries * sizeof(amqp_field_value_t)); + res = AMQP_STATUS_NO_MEMORY; + if (newentries == NULL) { + goto out; + } + + entries = newentries; + } + + res = amqp_decode_field_value(encoded, pool, &entries[num_entries], offset); + if (res < 0) { + goto out; + } + + num_entries++; + } + + output->num_entries = num_entries; + output->entries = + amqp_pool_alloc(pool, num_entries * sizeof(amqp_field_value_t)); + /* NULL is legitimate if we requested a zero-length block. */ + if (output->entries == NULL) { + if (num_entries == 0) { + res = AMQP_STATUS_OK; + } else { + res = AMQP_STATUS_NO_MEMORY; + } + goto out; + } + + memcpy(output->entries, entries, num_entries * sizeof(amqp_field_value_t)); + res = AMQP_STATUS_OK; + +out: + free(entries); + return res; +} + +int amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool, + amqp_table_t *output, size_t *offset) { + uint32_t tablesize; + int num_entries = 0; + amqp_table_entry_t *entries; + int allocated_entries = INITIAL_TABLE_SIZE; + size_t limit; + int res; + + if (!amqp_decode_32(encoded, offset, &tablesize)) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + if (tablesize + *offset > encoded.len) { + return AMQP_STATUS_BAD_AMQP_DATA; + } + + entries = malloc(allocated_entries * sizeof(amqp_table_entry_t)); + if (entries == NULL) { + return AMQP_STATUS_NO_MEMORY; + } + + limit = *offset + tablesize; + while (*offset < limit) { + uint8_t keylen; + + res = AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_8(encoded, offset, &keylen)) { + goto out; + } + + if (num_entries >= allocated_entries) { + void *newentries; + allocated_entries = allocated_entries * 2; + newentries = + realloc(entries, allocated_entries * sizeof(amqp_table_entry_t)); + res = AMQP_STATUS_NO_MEMORY; + if (newentries == NULL) { + goto out; + } + + entries = newentries; + } + + res = AMQP_STATUS_BAD_AMQP_DATA; + if (!amqp_decode_bytes(encoded, offset, &entries[num_entries].key, + keylen)) { + goto out; + } + + res = amqp_decode_field_value(encoded, pool, &entries[num_entries].value, + offset); + if (res < 0) { + goto out; + } + + num_entries++; + } + + output->num_entries = num_entries; + output->entries = + amqp_pool_alloc(pool, num_entries * sizeof(amqp_table_entry_t)); + /* NULL is legitimate if we requested a zero-length block. */ + if (output->entries == NULL) { + if (num_entries == 0) { + res = AMQP_STATUS_OK; + } else { + res = AMQP_STATUS_NO_MEMORY; + } + goto out; + } + + memcpy(output->entries, entries, num_entries * sizeof(amqp_table_entry_t)); + res = AMQP_STATUS_OK; + +out: + free(entries); + return res; +} + +static int amqp_decode_field_value(amqp_bytes_t encoded, amqp_pool_t *pool, + amqp_field_value_t *entry, size_t *offset) { + int res = AMQP_STATUS_BAD_AMQP_DATA; + + if (!amqp_decode_8(encoded, offset, &entry->kind)) { + goto out; + } + +#define TRIVIAL_FIELD_DECODER(bits) \ + if (!amqp_decode_##bits(encoded, offset, &entry->value.u##bits)) goto out; \ + break +#define SIMPLE_FIELD_DECODER(bits, dest, how) \ + { \ + uint##bits##_t val; \ + if (!amqp_decode_##bits(encoded, offset, &val)) goto out; \ + entry->value.dest = how; \ + } \ + break + + switch (entry->kind) { + case AMQP_FIELD_KIND_BOOLEAN: + SIMPLE_FIELD_DECODER(8, boolean, val ? 1 : 0); + + case AMQP_FIELD_KIND_I8: + SIMPLE_FIELD_DECODER(8, i8, (int8_t)val); + case AMQP_FIELD_KIND_U8: + TRIVIAL_FIELD_DECODER(8); + + case AMQP_FIELD_KIND_I16: + SIMPLE_FIELD_DECODER(16, i16, (int16_t)val); + case AMQP_FIELD_KIND_U16: + TRIVIAL_FIELD_DECODER(16); + + case AMQP_FIELD_KIND_I32: + SIMPLE_FIELD_DECODER(32, i32, (int32_t)val); + case AMQP_FIELD_KIND_U32: + TRIVIAL_FIELD_DECODER(32); + + case AMQP_FIELD_KIND_I64: + SIMPLE_FIELD_DECODER(64, i64, (int64_t)val); + case AMQP_FIELD_KIND_U64: + TRIVIAL_FIELD_DECODER(64); + + case AMQP_FIELD_KIND_F32: + TRIVIAL_FIELD_DECODER(32); + /* and by punning, f32 magically gets the right value...! */ + + case AMQP_FIELD_KIND_F64: + TRIVIAL_FIELD_DECODER(64); + /* and by punning, f64 magically gets the right value...! */ + + case AMQP_FIELD_KIND_DECIMAL: + if (!amqp_decode_8(encoded, offset, &entry->value.decimal.decimals) || + !amqp_decode_32(encoded, offset, &entry->value.decimal.value)) { + goto out; + } + break; + + case AMQP_FIELD_KIND_UTF8: + /* AMQP_FIELD_KIND_UTF8 and AMQP_FIELD_KIND_BYTES have the + same implementation, but different interpretations. */ + /* fall through */ + case AMQP_FIELD_KIND_BYTES: { + uint32_t len; + if (!amqp_decode_32(encoded, offset, &len) || + !amqp_decode_bytes(encoded, offset, &entry->value.bytes, len)) { + goto out; + } + break; + } + + case AMQP_FIELD_KIND_ARRAY: + res = amqp_decode_array(encoded, pool, &(entry->value.array), offset); + goto out; + + case AMQP_FIELD_KIND_TIMESTAMP: + TRIVIAL_FIELD_DECODER(64); + + case AMQP_FIELD_KIND_TABLE: + res = amqp_decode_table(encoded, pool, &(entry->value.table), offset); + goto out; + + case AMQP_FIELD_KIND_VOID: + break; + + default: + goto out; + } + + res = AMQP_STATUS_OK; + +out: + return res; +} + +/*---------------------------------------------------------------------------*/ + +static int amqp_encode_array(amqp_bytes_t encoded, amqp_array_t *input, + size_t *offset) { + size_t start = *offset; + int i, res; + + *offset += 4; /* size of the array gets filled in later on */ + + for (i = 0; i < input->num_entries; i++) { + res = amqp_encode_field_value(encoded, &input->entries[i], offset); + if (res < 0) { + goto out; + } + } + + if (!amqp_encode_32(encoded, &start, (uint32_t)(*offset - start - 4))) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + + res = AMQP_STATUS_OK; + +out: + return res; +} + +int amqp_encode_table(amqp_bytes_t encoded, amqp_table_t *input, + size_t *offset) { + size_t start = *offset; + int i, res; + + *offset += 4; /* size of the table gets filled in later on */ + + for (i = 0; i < input->num_entries; i++) { + if (!amqp_encode_8(encoded, offset, (uint8_t)input->entries[i].key.len)) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + + if (!amqp_encode_bytes(encoded, offset, input->entries[i].key)) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + + res = amqp_encode_field_value(encoded, &input->entries[i].value, offset); + if (res < 0) { + goto out; + } + } + + if (!amqp_encode_32(encoded, &start, (uint32_t)(*offset - start - 4))) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + + res = AMQP_STATUS_OK; + +out: + return res; +} + +static int amqp_encode_field_value(amqp_bytes_t encoded, + amqp_field_value_t *entry, size_t *offset) { + int res = AMQP_STATUS_BAD_AMQP_DATA; + + if (!amqp_encode_8(encoded, offset, entry->kind)) { + goto out; + } + +#define FIELD_ENCODER(bits, val) \ + if (!amqp_encode_##bits(encoded, offset, val)) { \ + res = AMQP_STATUS_TABLE_TOO_BIG; \ + goto out; \ + } \ + break + + switch (entry->kind) { + case AMQP_FIELD_KIND_BOOLEAN: + FIELD_ENCODER(8, entry->value.boolean ? 1 : 0); + + case AMQP_FIELD_KIND_I8: + FIELD_ENCODER(8, entry->value.i8); + case AMQP_FIELD_KIND_U8: + FIELD_ENCODER(8, entry->value.u8); + + case AMQP_FIELD_KIND_I16: + FIELD_ENCODER(16, entry->value.i16); + case AMQP_FIELD_KIND_U16: + FIELD_ENCODER(16, entry->value.u16); + + case AMQP_FIELD_KIND_I32: + FIELD_ENCODER(32, entry->value.i32); + case AMQP_FIELD_KIND_U32: + FIELD_ENCODER(32, entry->value.u32); + + case AMQP_FIELD_KIND_I64: + FIELD_ENCODER(64, entry->value.i64); + case AMQP_FIELD_KIND_U64: + FIELD_ENCODER(64, entry->value.u64); + + case AMQP_FIELD_KIND_F32: + /* by punning, u32 magically gets the right value...! */ + FIELD_ENCODER(32, entry->value.u32); + + case AMQP_FIELD_KIND_F64: + /* by punning, u64 magically gets the right value...! */ + FIELD_ENCODER(64, entry->value.u64); + + case AMQP_FIELD_KIND_DECIMAL: + if (!amqp_encode_8(encoded, offset, entry->value.decimal.decimals) || + !amqp_encode_32(encoded, offset, entry->value.decimal.value)) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + break; + + case AMQP_FIELD_KIND_UTF8: + /* AMQP_FIELD_KIND_UTF8 and AMQP_FIELD_KIND_BYTES have the + same implementation, but different interpretations. */ + /* fall through */ + case AMQP_FIELD_KIND_BYTES: + if (!amqp_encode_32(encoded, offset, (uint32_t)entry->value.bytes.len) || + !amqp_encode_bytes(encoded, offset, entry->value.bytes)) { + res = AMQP_STATUS_TABLE_TOO_BIG; + goto out; + } + break; + + case AMQP_FIELD_KIND_ARRAY: + res = amqp_encode_array(encoded, &entry->value.array, offset); + goto out; + + case AMQP_FIELD_KIND_TIMESTAMP: + FIELD_ENCODER(64, entry->value.u64); + + case AMQP_FIELD_KIND_TABLE: + res = amqp_encode_table(encoded, &entry->value.table, offset); + goto out; + + case AMQP_FIELD_KIND_VOID: + break; + + default: + res = AMQP_STATUS_INVALID_PARAMETER; + goto out; + } + + res = AMQP_STATUS_OK; + +out: + return res; +} + +/*---------------------------------------------------------------------------*/ + +int amqp_table_entry_cmp(void const *entry1, void const *entry2) { + amqp_table_entry_t const *p1 = (amqp_table_entry_t const *)entry1; + amqp_table_entry_t const *p2 = (amqp_table_entry_t const *)entry2; + + int d; + size_t minlen; + + minlen = p1->key.len; + if (p2->key.len < minlen) { + minlen = p2->key.len; + } + + d = memcmp(p1->key.bytes, p2->key.bytes, minlen); + if (d != 0) { + return d; + } + + return (int)p1->key.len - (int)p2->key.len; +} + +static int amqp_field_value_clone(const amqp_field_value_t *original, + amqp_field_value_t *clone, + amqp_pool_t *pool) { + int i; + int res; + clone->kind = original->kind; + + switch (clone->kind) { + case AMQP_FIELD_KIND_BOOLEAN: + clone->value.boolean = original->value.boolean; + break; + + case AMQP_FIELD_KIND_I8: + clone->value.i8 = original->value.i8; + break; + + case AMQP_FIELD_KIND_U8: + clone->value.u8 = original->value.u8; + break; + + case AMQP_FIELD_KIND_I16: + clone->value.i16 = original->value.i16; + break; + + case AMQP_FIELD_KIND_U16: + clone->value.u16 = original->value.u16; + break; + + case AMQP_FIELD_KIND_I32: + clone->value.i32 = original->value.i32; + break; + + case AMQP_FIELD_KIND_U32: + clone->value.u32 = original->value.u32; + break; + + case AMQP_FIELD_KIND_I64: + clone->value.i64 = original->value.i64; + break; + + case AMQP_FIELD_KIND_U64: + case AMQP_FIELD_KIND_TIMESTAMP: + clone->value.u64 = original->value.u64; + break; + + case AMQP_FIELD_KIND_F32: + clone->value.f32 = original->value.f32; + break; + + case AMQP_FIELD_KIND_F64: + clone->value.f64 = original->value.f64; + break; + + case AMQP_FIELD_KIND_DECIMAL: + clone->value.decimal = original->value.decimal; + break; + + case AMQP_FIELD_KIND_UTF8: + case AMQP_FIELD_KIND_BYTES: + if (0 == original->value.bytes.len) { + clone->value.bytes = amqp_empty_bytes; + } else { + amqp_pool_alloc_bytes(pool, original->value.bytes.len, + &clone->value.bytes); + if (NULL == clone->value.bytes.bytes) { + return AMQP_STATUS_NO_MEMORY; + } + memcpy(clone->value.bytes.bytes, original->value.bytes.bytes, + clone->value.bytes.len); + } + break; + + case AMQP_FIELD_KIND_ARRAY: + if (0 == original->value.array.entries) { + clone->value.array = amqp_empty_array; + } else { + clone->value.array.num_entries = original->value.array.num_entries; + clone->value.array.entries = amqp_pool_alloc( + pool, clone->value.array.num_entries * sizeof(amqp_field_value_t)); + if (NULL == clone->value.array.entries) { + return AMQP_STATUS_NO_MEMORY; + } + + for (i = 0; i < clone->value.array.num_entries; ++i) { + res = amqp_field_value_clone(&original->value.array.entries[i], + &clone->value.array.entries[i], pool); + if (AMQP_STATUS_OK != res) { + return res; + } + } + } + break; + + case AMQP_FIELD_KIND_TABLE: + return amqp_table_clone(&original->value.table, &clone->value.table, + pool); + + case AMQP_FIELD_KIND_VOID: + break; + + default: + return AMQP_STATUS_INVALID_PARAMETER; + } + + return AMQP_STATUS_OK; +} + +static int amqp_table_entry_clone(const amqp_table_entry_t *original, + amqp_table_entry_t *clone, + amqp_pool_t *pool) { + if (0 == original->key.len) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + amqp_pool_alloc_bytes(pool, original->key.len, &clone->key); + if (NULL == clone->key.bytes) { + return AMQP_STATUS_NO_MEMORY; + } + + memcpy(clone->key.bytes, original->key.bytes, clone->key.len); + + return amqp_field_value_clone(&original->value, &clone->value, pool); +} + +int amqp_table_clone(const amqp_table_t *original, amqp_table_t *clone, + amqp_pool_t *pool) { + int i; + int res; + clone->num_entries = original->num_entries; + if (0 == clone->num_entries) { + *clone = amqp_empty_table; + return AMQP_STATUS_OK; + } + + clone->entries = + amqp_pool_alloc(pool, clone->num_entries * sizeof(amqp_table_entry_t)); + + if (NULL == clone->entries) { + return AMQP_STATUS_NO_MEMORY; + } + + for (i = 0; i < clone->num_entries; ++i) { + res = + amqp_table_entry_clone(&original->entries[i], &clone->entries[i], pool); + if (AMQP_STATUS_OK != res) { + goto error_out1; + } + } + + return AMQP_STATUS_OK; + +error_out1: + return res; +} + +amqp_table_entry_t amqp_table_construct_utf8_entry(const char *key, + const char *value) { + amqp_table_entry_t ret; + ret.key = amqp_cstring_bytes(key); + ret.value.kind = AMQP_FIELD_KIND_UTF8; + ret.value.value.bytes = amqp_cstring_bytes(value); + return ret; +} + +amqp_table_entry_t amqp_table_construct_table_entry(const char *key, + const amqp_table_t *value) { + amqp_table_entry_t ret; + ret.key = amqp_cstring_bytes(key); + ret.value.kind = AMQP_FIELD_KIND_TABLE; + ret.value.value.table = *value; + return ret; +} + +amqp_table_entry_t amqp_table_construct_bool_entry(const char *key, + const int value) { + amqp_table_entry_t ret; + ret.key = amqp_cstring_bytes(key); + ret.value.kind = AMQP_FIELD_KIND_BOOLEAN; + ret.value.value.boolean = value; + return ret; +} + +amqp_table_entry_t *amqp_table_get_entry_by_key(const amqp_table_t *table, + const amqp_bytes_t key) { + int i; + assert(table != NULL); + for (i = 0; i < table->num_entries; ++i) { + if (amqp_bytes_equal(table->entries[i].key, key)) { + return &table->entries[i]; + } + } + return NULL; +} diff --git a/librab/build/librabbitmq/amqp_table.h b/librab/build/librabbitmq/amqp_table.h new file mode 100644 index 0000000..7b009a9 --- /dev/null +++ b/librab/build/librabbitmq/amqp_table.h @@ -0,0 +1,81 @@ +/* + * ***** BEGIN LICENSE BLOCK ***** + * Version: MIT + * + * Portions created by Alan Antonuk are Copyright (c) 2014 Alan Antonuk. + * 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_TABLE_H +#define AMQP_TABLE_H + +#include "amqp.h" +#include "amqp_private.h" + +/** + * Initializes a table entry with utf-8 string type value. + * + * \param [in] key the table entry key. The string must remain valid for the + * life of the resulting amqp_table_entry_t. + * \param [in] value the string value. The string must remain valid for the life + * of the resulting amqp_table_entry_t. + * \returns An initialized table entry. + */ +amqp_table_entry_t amqp_table_construct_utf8_entry(const char *key, + const char *value); + +/** + * Initializes a table entry with table type value. + * + * \param [in] key the table entry key. The string must remain value for the + * life of the resulting amqp_table_entry_t. + * \param [in] value the amqp_table_t value. The table must remain valid for the + * life of the resulting amqp_table_entry_t. + * \returns An initialized table entry. + */ +amqp_table_entry_t amqp_table_construct_table_entry(const char *key, + const amqp_table_t *value); + +/** + * Initializes a table entry with boolean type value. + * + * \param [in] key the table entry key. The string must remain value for the + * life of the resulting amqp_table_entry_t. + * \param [in] value the boolean value. 0 means false, any other value is true. + * \returns An initialized table entry. + */ +amqp_table_entry_t amqp_table_construct_bool_entry(const char *key, + const int value); + +/** + * Searches a table for an entry with a matching key. + * + * \param [in] table the table to search. + * \param [in] key the string to search with. + * \returns a pointer to the table entry in the table if a matching key can be + * found, NULL otherwise. + */ +amqp_table_entry_t *amqp_table_get_entry_by_key(const amqp_table_t *table, + const amqp_bytes_t key); + +#endif /* AMQP_TABLE_H */ diff --git a/librab/build/librabbitmq/amqp_tcp_socket.c b/librab/build/librabbitmq/amqp_tcp_socket.c new file mode 100644 index 0000000..12e02cd --- /dev/null +++ b/librab/build/librabbitmq/amqp_tcp_socket.c @@ -0,0 +1,238 @@ +/* + * Copyright 2012-2013 Michael Steinert + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include "amqp_tcp_socket.h" + +#include +#if ((defined(_WIN32)) || (defined(__MINGW32__)) || (defined(__MINGW64__))) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#include +#include +#endif +#include +#include + +struct amqp_tcp_socket_t { + const struct amqp_socket_class_t *klass; + int sockfd; + int internal_error; + int state; +}; + +static ssize_t amqp_tcp_socket_send(void *base, const void *buf, size_t len, + int flags) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + ssize_t res; + int flagz = 0; + + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + +#ifdef MSG_NOSIGNAL + flagz |= MSG_NOSIGNAL; +#endif + +#if defined(MSG_MORE) + if (flags & AMQP_SF_MORE) { + flagz |= MSG_MORE; + } +/* Cygwin defines TCP_NOPUSH, but trying to use it will return not + * implemented. Disable it here. */ +#elif defined(TCP_NOPUSH) && !defined(__CYGWIN__) + if (flags & AMQP_SF_MORE && !(self->state & AMQP_SF_MORE)) { + int one = 1; + res = setsockopt(self->sockfd, IPPROTO_TCP, TCP_NOPUSH, &one, sizeof(one)); + if (0 != res) { + self->internal_error = res; + return AMQP_STATUS_SOCKET_ERROR; + } + self->state |= AMQP_SF_MORE; + } else if (!(flags & AMQP_SF_MORE) && self->state & AMQP_SF_MORE) { + int zero = 0; + res = + setsockopt(self->sockfd, IPPROTO_TCP, TCP_NOPUSH, &zero, sizeof(&zero)); + if (0 != res) { + self->internal_error = res; + res = AMQP_STATUS_SOCKET_ERROR; + } else { + self->state &= ~AMQP_SF_MORE; + } + } +#endif + +start: +#ifdef _WIN32 + res = send(self->sockfd, buf, (int)len, flagz); +#else + res = send(self->sockfd, buf, len, flagz); +#endif + + if (res < 0) { + self->internal_error = amqp_os_socket_error(); + switch (self->internal_error) { + case EINTR: + goto start; +#ifdef _WIN32 + case WSAEWOULDBLOCK: +#else + case EWOULDBLOCK: +#endif +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + case EAGAIN: +#endif + res = AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE; + break; + default: + res = AMQP_STATUS_SOCKET_ERROR; + } + } else { + self->internal_error = 0; + } + + return res; +} + +static ssize_t amqp_tcp_socket_recv(void *base, void *buf, size_t len, + int flags) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + ssize_t ret; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + +start: +#ifdef _WIN32 + ret = recv(self->sockfd, buf, (int)len, flags); +#else + ret = recv(self->sockfd, buf, len, flags); +#endif + + if (0 > ret) { + self->internal_error = amqp_os_socket_error(); + switch (self->internal_error) { + case EINTR: + goto start; +#ifdef _WIN32 + case WSAEWOULDBLOCK: +#else + case EWOULDBLOCK: +#endif +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + case EAGAIN: +#endif + ret = AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD; + break; + default: + ret = AMQP_STATUS_SOCKET_ERROR; + } + } else if (0 == ret) { + ret = AMQP_STATUS_CONNECTION_CLOSED; + } + + return ret; +} + +static int amqp_tcp_socket_open(void *base, const char *host, int port, + struct timeval *timeout) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + if (-1 != self->sockfd) { + return AMQP_STATUS_SOCKET_INUSE; + } + self->sockfd = amqp_open_socket_noblock(host, port, timeout); + if (0 > self->sockfd) { + int err = self->sockfd; + self->sockfd = -1; + return err; + } + return AMQP_STATUS_OK; +} + +static int amqp_tcp_socket_close(void *base, + AMQP_UNUSED amqp_socket_close_enum force) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + + if (amqp_os_socket_close(self->sockfd)) { + return AMQP_STATUS_SOCKET_ERROR; + } + self->sockfd = -1; + + return AMQP_STATUS_OK; +} + +static int amqp_tcp_socket_get_sockfd(void *base) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + return self->sockfd; +} + +static void amqp_tcp_socket_delete(void *base) { + struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; + + if (self) { + amqp_tcp_socket_close(self, AMQP_SC_NONE); + free(self); + } +} + +static const struct amqp_socket_class_t amqp_tcp_socket_class = { + amqp_tcp_socket_send, /* send */ + amqp_tcp_socket_recv, /* recv */ + amqp_tcp_socket_open, /* open */ + amqp_tcp_socket_close, /* close */ + amqp_tcp_socket_get_sockfd, /* get_sockfd */ + amqp_tcp_socket_delete /* delete */ +}; + +amqp_socket_t *amqp_tcp_socket_new(amqp_connection_state_t state) { + struct amqp_tcp_socket_t *self = calloc(1, sizeof(*self)); + if (!self) { + return NULL; + } + self->klass = &amqp_tcp_socket_class; + self->sockfd = -1; + + amqp_set_socket(state, (amqp_socket_t *)self); + + return (amqp_socket_t *)self; +} + +void amqp_tcp_socket_set_sockfd(amqp_socket_t *base, int sockfd) { + struct amqp_tcp_socket_t *self; + if (base->klass != &amqp_tcp_socket_class) { + amqp_abort("<%p> is not of type amqp_tcp_socket_t", base); + } + self = (struct amqp_tcp_socket_t *)base; + self->sockfd = sockfd; +} diff --git a/librab/build/librabbitmq/amqp_tcp_socket.h b/librab/build/librabbitmq/amqp_tcp_socket.h new file mode 100644 index 0000000..3e9d82f --- /dev/null +++ b/librab/build/librabbitmq/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/librab/build/librabbitmq/amqp_time.c b/librab/build/librabbitmq/amqp_time.c new file mode 100644 index 0000000..7b0a42d --- /dev/null +++ b/librab/build/librabbitmq/amqp_time.c @@ -0,0 +1,265 @@ +/* + * Portions created by Alan Antonuk are Copyright (c) 2013-2014 Alan Antonuk. + * 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. + */ +#include "amqp_time.h" +#include "amqp.h" +#include +#include +#include + +#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || \ + defined(__MINGW32__) || defined(__MINGW64__)) +#define AMQP_WIN_TIMER_API +#elif (defined(machintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) +#define AMQP_MAC_TIMER_API +#else +#define AMQP_POSIX_TIMER_API +#endif + +#ifdef AMQP_WIN_TIMER_API +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include + +uint64_t amqp_get_monotonic_timestamp(void) { + static double NS_PER_COUNT = 0; + LARGE_INTEGER perf_count; + + if (0 == NS_PER_COUNT) { + LARGE_INTEGER perf_frequency; + if (!QueryPerformanceFrequency(&perf_frequency)) { + return 0; + } + NS_PER_COUNT = (double)AMQP_NS_PER_S / perf_frequency.QuadPart; + } + + if (!QueryPerformanceCounter(&perf_count)) { + return 0; + } + + return (uint64_t)(perf_count.QuadPart * NS_PER_COUNT); +} +#endif /* AMQP_WIN_TIMER_API */ + +#ifdef AMQP_MAC_TIMER_API +#include + +uint64_t amqp_get_monotonic_timestamp(void) { + static mach_timebase_info_data_t s_timebase = {0, 0}; + uint64_t timestamp; + + timestamp = mach_absolute_time(); + + if (s_timebase.denom == 0) { + mach_timebase_info(&s_timebase); + if (0 == s_timebase.denom) { + return 0; + } + } + + timestamp *= (uint64_t)s_timebase.numer; + timestamp /= (uint64_t)s_timebase.denom; + + return timestamp; +} +#endif /* AMQP_MAC_TIMER_API */ + +#ifdef AMQP_POSIX_TIMER_API +#include + +uint64_t amqp_get_monotonic_timestamp(void) { +#ifdef __hpux + return (uint64_t)gethrtime(); +#else + struct timespec tp; + if (-1 == clock_gettime(CLOCK_MONOTONIC, &tp)) { + return 0; + } + + return ((uint64_t)tp.tv_sec * AMQP_NS_PER_S + (uint64_t)tp.tv_nsec); +#endif +} +#endif /* AMQP_POSIX_TIMER_API */ + +int amqp_time_from_now(amqp_time_t *time, struct timeval *timeout) { + uint64_t now_ns; + uint64_t delta_ns; + + assert(NULL != time); + + if (NULL == timeout) { + *time = amqp_time_infinite(); + return AMQP_STATUS_OK; + } + if (0 == timeout->tv_sec && 0 == timeout->tv_usec) { + *time = amqp_time_immediate(); + return AMQP_STATUS_OK; + } + + if (timeout->tv_sec < 0 || timeout->tv_usec < 0) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + delta_ns = (uint64_t)timeout->tv_sec * AMQP_NS_PER_S + + (uint64_t)timeout->tv_usec * AMQP_NS_PER_US; + + now_ns = amqp_get_monotonic_timestamp(); + if (0 == now_ns) { + return AMQP_STATUS_TIMER_FAILURE; + } + + time->time_point_ns = now_ns + delta_ns; + if (now_ns > time->time_point_ns || delta_ns > time->time_point_ns) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + return AMQP_STATUS_OK; +} + +int amqp_time_s_from_now(amqp_time_t *time, int seconds) { + uint64_t now_ns; + uint64_t delta_ns; + assert(NULL != time); + + if (0 >= seconds) { + *time = amqp_time_infinite(); + return AMQP_STATUS_OK; + } + + now_ns = amqp_get_monotonic_timestamp(); + if (0 == now_ns) { + return AMQP_STATUS_TIMER_FAILURE; + } + + delta_ns = (uint64_t)seconds * AMQP_NS_PER_S; + time->time_point_ns = now_ns + delta_ns; + if (now_ns > time->time_point_ns || delta_ns > time->time_point_ns) { + return AMQP_STATUS_INVALID_PARAMETER; + } + + return AMQP_STATUS_OK; +} + +amqp_time_t amqp_time_immediate(void) { + amqp_time_t time; + time.time_point_ns = 0; + return time; +} + +amqp_time_t amqp_time_infinite(void) { + amqp_time_t time; + time.time_point_ns = UINT64_MAX; + return time; +} + +int amqp_time_ms_until(amqp_time_t time) { + uint64_t now_ns; + uint64_t delta_ns; + int left_ms; + + if (UINT64_MAX == time.time_point_ns) { + return -1; + } + if (0 == time.time_point_ns) { + return 0; + } + + now_ns = amqp_get_monotonic_timestamp(); + if (0 == now_ns) { + return AMQP_STATUS_TIMER_FAILURE; + } + + if (now_ns >= time.time_point_ns) { + return 0; + } + + delta_ns = time.time_point_ns - now_ns; + left_ms = (int)(delta_ns / AMQP_NS_PER_MS); + + return left_ms; +} + +int amqp_time_tv_until(amqp_time_t time, struct timeval *in, + struct timeval **out) { + uint64_t now_ns; + uint64_t delta_ns; + + assert(in != NULL); + if (UINT64_MAX == time.time_point_ns) { + *out = NULL; + return AMQP_STATUS_OK; + } + if (0 == time.time_point_ns) { + in->tv_sec = 0; + in->tv_usec = 0; + *out = in; + return AMQP_STATUS_OK; + } + + now_ns = amqp_get_monotonic_timestamp(); + if (0 == now_ns) { + return AMQP_STATUS_TIMER_FAILURE; + } + + if (now_ns >= time.time_point_ns) { + in->tv_sec = 0; + in->tv_usec = 0; + *out = in; + return AMQP_STATUS_OK; + } + + delta_ns = time.time_point_ns - now_ns; + in->tv_sec = (int)(delta_ns / AMQP_NS_PER_S); + in->tv_usec = (int)((delta_ns % AMQP_NS_PER_S) / AMQP_NS_PER_US); + *out = in; + + return AMQP_STATUS_OK; +} + +int amqp_time_has_past(amqp_time_t time) { + uint64_t now_ns; + if (UINT64_MAX == time.time_point_ns) { + return AMQP_STATUS_OK; + } + + now_ns = amqp_get_monotonic_timestamp(); + if (0 == now_ns) { + return AMQP_STATUS_TIMER_FAILURE; + } + + if (now_ns > time.time_point_ns) { + return AMQP_STATUS_TIMEOUT; + } + return AMQP_STATUS_OK; +} + +amqp_time_t amqp_time_first(amqp_time_t l, amqp_time_t r) { + if (l.time_point_ns < r.time_point_ns) { + return l; + } + return r; +} + +int amqp_time_equal(amqp_time_t l, amqp_time_t r) { + return l.time_point_ns == r.time_point_ns; +} diff --git a/librab/build/librabbitmq/amqp_time.h b/librab/build/librabbitmq/amqp_time.h new file mode 100644 index 0000000..194bf67 --- /dev/null +++ b/librab/build/librabbitmq/amqp_time.h @@ -0,0 +1,130 @@ +/* + * Portions created by Alan Antonuk are Copyright (c) 2013-2014 Alan Antonuk. + * 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. + */ +#ifndef AMQP_TIMER_H +#define AMQP_TIMER_H + +#include + +#if ((defined(_WIN32)) || (defined(__MINGW32__)) || (defined(__MINGW64__))) +#ifndef WINVER +#define WINVER 0x0502 +#endif +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#include +#endif + +#define AMQP_MS_PER_S 1000 +#define AMQP_US_PER_MS 1000 +#define AMQP_NS_PER_S 1000000000 +#define AMQP_NS_PER_MS 1000000 +#define AMQP_NS_PER_US 1000 + +/* This represents a point in time in reference to a monotonic clock. + * + * The internal representation is ns, relative to the monotonic clock. + * + * There are two 'special' values: + * - 0: means 'this instant', its meant for polls with a 0-timeout, or + * non-blocking option + * - UINT64_MAX: means 'at infinity', its mean for polls with an infinite + * timeout + */ +typedef struct amqp_time_t_ { uint64_t time_point_ns; } amqp_time_t; + +/* Gets a monotonic timestamp. This will return 0 if the underlying call to the + * system fails. + */ +uint64_t amqp_get_monotonic_timestamp(void); + +/* Get a amqp_time_t that is timeout from now. + * If timeout is NULL, an amqp_time_infinite() is created. + * If timeout = {0, 0}, an amqp_time_immediate() is created. + * + * Returns AMQP_STATUS_OK on success. + * AMQP_STATUS_INVALID_PARAMETER if timeout is invalid + * AMQP_STATUS_TIMER_FAILURE if the underlying call to get the current timestamp + * fails. + */ +int amqp_time_from_now(amqp_time_t *time, struct timeval *timeout); + +/* Get a amqp_time_t that is seconds from now. + * If seconds <= 0, then amqp_time_infinite() is created. + * + * Returns AMQP_STATUS_OK on success. + * AMQP_STATUS_TIMER_FAILURE if the underlying call to get the current timestamp + * fails. + */ +int amqp_time_s_from_now(amqp_time_t *time, int seconds); + +/* Create an immediate amqp_time_t */ +amqp_time_t amqp_time_immediate(void); + +/* Create an infinite amqp_time_t */ +amqp_time_t amqp_time_infinite(void); + +/* Gets the number of ms until the amqp_time_t, suitable for the timeout + * parameter in poll(). + * + * -1 will be returned for amqp_time_infinite values. + * 0 will be returned for amqp_time_immediate values. + * AMQP_STATUS_TIMEOUT will be returned if time was in the past. + * AMQP_STATUS_TIMER_FAILURE will be returned if the underlying call to get the + * current timestamp fails. + */ +int amqp_time_ms_until(amqp_time_t time); + +/* Gets a timeval filled in with the time until amqp_time_t. Suitable for the + * parameter in select(). + * + * The in parameter specifies a storage location for *out. + * If time is an inf timeout, then *out = NULL. + * If time is a 0-timeout or the timer has expired, then *out = {0, 0} + * Otherwise *out is set to the time left on the time. + * + * AMQP_STATUS_OK will be returned if successfully filled. + * AMQP_STATUS_TIMER_FAILURE is returned when the underlying call to get the + * current timestamp fails. + */ +int amqp_time_tv_until(amqp_time_t time, struct timeval *in, + struct timeval **out); + +/* Test whether current time is past the provided time. + * + * TODO: this isn't a great interface to use. Fix this. + * + * Return AMQP_STATUS_OK if time has not past + * Return AMQP_STATUS_TIMEOUT if time has past + * Return AMQP_STATUS_TIMER_FAILURE if the underlying call to get the current + * timestamp fails. + */ +int amqp_time_has_past(amqp_time_t time); + +/* Return the time value that happens first */ +amqp_time_t amqp_time_first(amqp_time_t l, amqp_time_t r); + +int amqp_time_equal(amqp_time_t l, amqp_time_t r); +#endif /* AMQP_TIMER_H */ diff --git a/librab/build/librabbitmq/amqp_url.c b/librab/build/librabbitmq/amqp_url.c new file mode 100644 index 0000000..b5304e5 --- /dev/null +++ b/librab/build/librabbitmq/amqp_url.c @@ -0,0 +1,220 @@ +/* + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "amqp_private.h" +#include +#include +#include +#include +#include + +void amqp_default_connection_info(struct amqp_connection_info *ci) { + /* Apply defaults */ + ci->user = "guest"; + ci->password = "guest"; + ci->host = "localhost"; + ci->port = 5672; + ci->vhost = "/"; + ci->ssl = 0; +} + +/* Scan for the next delimiter, handling percent-encodings on the way. */ +static char find_delim(char **pp, int colon_and_at_sign_are_delims) { + char *from = *pp; + char *to = from; + + for (;;) { + char ch = *from++; + + switch (ch) { + case ':': + case '@': + if (!colon_and_at_sign_are_delims) { + *to++ = ch; + break; + } + + /* fall through */ + case 0: + case '/': + case '?': + case '#': + case '[': + case ']': + *to = 0; + *pp = from; + return ch; + + case '%': { + unsigned int val; + int chars; + int res = sscanf(from, "%2x%n", &val, &chars); + + if (res == EOF || res < 1 || chars != 2 || val > CHAR_MAX) + /* Return a surprising delimiter to + force an error. */ + { + return '%'; + } + + *to++ = (char)val; + from += 2; + break; + } + + default: + *to++ = ch; + break; + } + } +} + +/* Parse an AMQP URL into its component parts. */ +int amqp_parse_url(char *url, struct amqp_connection_info *parsed) { + int res = AMQP_STATUS_BAD_URL; + char delim; + char *start; + char *host; + char *port = NULL; + + amqp_default_connection_info(parsed); + + /* check the prefix */ + if (!strncmp(url, "amqp://", 7)) { + /* do nothing */ + } else if (!strncmp(url, "amqps://", 8)) { + parsed->port = 5671; + parsed->ssl = 1; + } else { + goto out; + } + + host = start = url += (parsed->ssl ? 8 : 7); + delim = find_delim(&url, 1); + + if (delim == ':') { + /* The colon could be introducing the port or the + password part of the userinfo. We don't know yet, + so stash the preceding component. */ + port = start = url; + delim = find_delim(&url, 1); + } + + if (delim == '@') { + /* What might have been the host and port were in fact + the username and password */ + parsed->user = host; + if (port) { + parsed->password = port; + } + + port = NULL; + host = start = url; + delim = find_delim(&url, 1); + } + + if (delim == '[') { + /* IPv6 address. The bracket should be the first + character in the host. */ + if (host != start || *host != 0) { + goto out; + } + + start = url; + delim = find_delim(&url, 0); + + if (delim != ']') { + goto out; + } + + parsed->host = start; + start = url; + delim = find_delim(&url, 1); + + /* Closing bracket should be the last character in the + host. */ + if (*start != 0) { + goto out; + } + } else { + /* If we haven't seen the host yet, this is it. */ + if (*host != 0) { + parsed->host = host; + } + } + + if (delim == ':') { + port = start = url; + delim = find_delim(&url, 1); + } + + if (port) { + char *end; + long portnum = strtol(port, &end, 10); + + if (port == end || *end != 0 || portnum < 0 || portnum > 65535) { + goto out; + } + + parsed->port = portnum; + } + + if (delim == '/') { + start = url; + delim = find_delim(&url, 1); + + if (delim != 0) { + goto out; + } + + parsed->vhost = start; + res = AMQP_STATUS_OK; + } else if (delim == 0) { + res = AMQP_STATUS_OK; + } + +/* Any other delimiter is bad, and we will return AMQP_STATUS_BAD_AMQP_URL. */ + +out: + return res; +} diff --git a/librab/build/librabbitmq/cmake_install.cmake b/librab/build/librabbitmq/cmake_install.cmake new file mode 100644 index 0000000..eee9164 --- /dev/null +++ b/librab/build/librabbitmq/cmake_install.cmake @@ -0,0 +1,79 @@ +# Install script for directory: /home2/tcs/librab/build/librabbitmq + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "0") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FOREACH(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so.4.3.1" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so.4" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so" + ) + IF(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + FILE(RPATH_CHECK + FILE "${file}" + RPATH "") + ENDIF() + ENDFOREACH() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib64" TYPE SHARED_LIBRARY FILES + "/home2/tcs/librab/build/librabbitmq/librabbitmq.so.4.3.1" + "/home2/tcs/librab/build/librabbitmq/librabbitmq.so.4" + "/home2/tcs/librab/build/librabbitmq/librabbitmq.so" + ) + FOREACH(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so.4.3.1" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so.4" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib64/librabbitmq.so" + ) + IF(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/bin/strip" "${file}") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() + ENDFOREACH() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib64" TYPE STATIC_LIBRARY FILES "/home2/tcs/librab/build/librabbitmq/librabbitmq.a") +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES + "/home2/tcs/librab/build/librabbitmq/amqp.h" + "/home2/tcs/librab/build/librabbitmq/amqp_framing.h" + "/home2/tcs/librab/build/librabbitmq/amqp_tcp_socket.h" + "/home2/tcs/librab/build/librabbitmq/amqp_ssl_socket.h" + ) +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + diff --git a/librab/build/librabbitmq/codegen.py b/librab/build/librabbitmq/codegen.py new file mode 100644 index 0000000..3ae24b6 --- /dev/null +++ b/librab/build/librabbitmq/codegen.py @@ -0,0 +1,785 @@ +# ***** 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 ***** + +from __future__ import nested_scopes +from __future__ import division + +from amqp_codegen import * +import string +import re + + +class Emitter(object): + """An object the trivially emits generated code lines. + + This largely exists to be wrapped by more sophisticated emitter + classes. + """ + + def __init__(self, prefix): + self.prefix = prefix + + def emit(self, line): + """Emit a line of generated code.""" + print self.prefix + line + + +class BitDecoder(object): + """An emitter object that keeps track of the state involved in + decoding the AMQP bit type.""" + + def __init__(self, emitter): + self.emitter = emitter + self.bit = 0 + + def emit(self, line): + self.bit = 0 + self.emitter.emit(line) + + def decode_bit(self, lvalue): + """Generate code to decode a value of the AMQP bit type into + the given lvalue.""" + if self.bit == 0: + self.emitter.emit("if (!amqp_decode_8(encoded, &offset, &bit_buffer)) return AMQP_STATUS_BAD_AMQP_DATA;") + + self.emitter.emit("%s = (bit_buffer & (1 << %d)) ? 1 : 0;" + % (lvalue, self.bit)) + self.bit += 1 + if self.bit == 8: + self.bit = 0 + + +class BitEncoder(object): + """An emitter object that keeps track of the state involved in + encoding the AMQP bit type.""" + + def __init__(self, emitter): + self.emitter = emitter + self.bit = 0 + + def flush(self): + """Flush the state associated with AMQP bit types.""" + if self.bit: + self.emitter.emit("if (!amqp_encode_8(encoded, &offset, bit_buffer)) return AMQP_STATUS_BAD_AMQP_DATA;") + self.bit = 0 + + def emit(self, line): + self.flush() + self.emitter.emit(line) + + def encode_bit(self, value): + """Generate code to encode a value of the AMQP bit type from + the given value.""" + if self.bit == 0: + self.emitter.emit("bit_buffer = 0;") + + self.emitter.emit("if (%s) bit_buffer |= (1 << %d);" + % (value, self.bit)) + self.bit += 1 + if self.bit == 8: + self.flush() + + +class SimpleType(object): + """A AMQP type that corresponds to a simple scalar C value of a + certain width.""" + + def __init__(self, bits): + self.bits = bits + self.ctype = "uint%d_t" % (bits,) + + def decode(self, emitter, lvalue): + emitter.emit("if (!amqp_decode_%d(encoded, &offset, &%s)) return AMQP_STATUS_BAD_AMQP_DATA;" % (self.bits, lvalue)) + + def encode(self, emitter, value): + emitter.emit("if (!amqp_encode_%d(encoded, &offset, %s)) return AMQP_STATUS_BAD_AMQP_DATA;" % (self.bits, value)) + + def literal(self, value): + return value + +class StrType(object): + """The AMQP shortstr or longstr types.""" + + def __init__(self, lenbits): + self.lenbits = lenbits + self.ctype = "amqp_bytes_t" + + def decode(self, emitter, lvalue): + emitter.emit("{") + emitter.emit(" uint%d_t len;" % (self.lenbits,)) + emitter.emit(" if (!amqp_decode_%d(encoded, &offset, &len)" % (self.lenbits,)) + emitter.emit(" || !amqp_decode_bytes(encoded, &offset, &%s, len))" % (lvalue,)) + emitter.emit(" return AMQP_STATUS_BAD_AMQP_DATA;") + emitter.emit("}") + + def encode(self, emitter, value): + emitter.emit("if (UINT%d_MAX < %s.len" % (self.lenbits, value)) + emitter.emit(" || !amqp_encode_%d(encoded, &offset, (uint%d_t)%s.len)" % + (self.lenbits, self.lenbits, value)) + emitter.emit(" || !amqp_encode_bytes(encoded, &offset, %s))" % (value,)) + emitter.emit(" return AMQP_STATUS_BAD_AMQP_DATA;") + + def literal(self, value): + if value != '': + raise NotImplementedError() + + return "amqp_empty_bytes" + +class BitType(object): + """The AMQP bit type.""" + + def __init__(self): + self.ctype = "amqp_boolean_t" + + def decode(self, emitter, lvalue): + emitter.decode_bit(lvalue) + + def encode(self, emitter, value): + emitter.encode_bit(value) + + def literal(self, value): + return {True: 1, False: 0}[value] + +class TableType(object): + """The AMQP table type.""" + + def __init__(self): + self.ctype = "amqp_table_t" + + def decode(self, emitter, lvalue): + emitter.emit("{") + emitter.emit(" int res = amqp_decode_table(encoded, pool, &(%s), &offset);" % (lvalue,)) + emitter.emit(" if (res < 0) return res;") + emitter.emit("}") + + def encode(self, emitter, value): + emitter.emit("{") + emitter.emit(" int res = amqp_encode_table(encoded, &(%s), &offset);" % (value,)) + emitter.emit(" if (res < 0) return res;") + emitter.emit("}") + + def literal(self, value): + raise NotImplementedError() + +types = { + 'octet': SimpleType(8), + 'short': SimpleType(16), + 'long': SimpleType(32), + 'longlong': SimpleType(64), + 'shortstr': StrType(8), + 'longstr': StrType(32), + 'bit': BitType(), + 'table': TableType(), + 'timestamp': SimpleType(64), +} + +def typeFor(spec, f): + """Get a representation of the AMQP type of a field.""" + return types[spec.resolveDomain(f.domain)] + +def c_ize(s): + s = s.replace('-', '_') + s = s.replace(' ', '_') + return s + +# When generating API functions corresponding to synchronous methods, +# we need some information that isn't in the protocol def: Some +# methods should not be exposed, indicated here by a False value. +# Some methods should be exposed but certain fields should not be +# exposed as parameters. +apiMethodInfo = { + "amqp_connection_start": False, # application code should not use this + "amqp_connection_secure": False, # application code should not use this + "amqp_connection_tune": False, # application code should not use this + "amqp_connection_open": False, # application code should not use this + "amqp_connection_close": False, # needs special handling + "amqp_channel_open": ["out_of_band"], + "amqp_channel_close": False, # needs special handling + "amqp_access_request": False, # huh? + "amqp_basic_get": False, # get-ok has content +} + +# When generating API functions corresponding to synchronous methods, +# some fields should be suppressed everywhere. This dict names those +# fields, and the fixed values to use for them. +apiMethodsSuppressArgs = {"ticket": 0, "nowait": False} + +AmqpMethod.defName = lambda m: cConstantName(c_ize(m.klass.name) + '_' + c_ize(m.name) + "_method") +AmqpMethod.fullName = lambda m: "amqp_%s_%s" % (c_ize(m.klass.name), c_ize(m.name)) +AmqpMethod.structName = lambda m: m.fullName() + "_t" + +AmqpClass.structName = lambda c: "amqp_" + c_ize(c.name) + "_properties_t" + +def methodApiPrototype(m): + fn = m.fullName() + info = apiMethodInfo.get(fn, []) + + docs = "/**\n * %s\n *\n" % (fn) + docs += " * @param [in] state connection state\n" + docs += " * @param [in] channel the channel to do the RPC on\n" + + args = [] + for f in m.arguments: + n = c_ize(f.name) + if n in apiMethodsSuppressArgs or n in info: + continue + + args.append(", ") + args.append(typeFor(m.klass.spec, f).ctype) + args.append(" ") + args.append(n) + docs += " * @param [in] %s %s\n" % (n, n) + + docs += " * @returns %s_ok_t\n" % (fn) + docs += " */\n" + + return "%sAMQP_PUBLIC_FUNCTION\n%s_ok_t *\nAMQP_CALL %s(amqp_connection_state_t state, amqp_channel_t channel%s)" % (docs, fn, fn, ''.join(args)) + +AmqpMethod.apiPrototype = methodApiPrototype + +def cConstantName(s): + return 'AMQP_' + '_'.join(re.split('[- ]', s.upper())) + +def cFlagName(c, f): + return cConstantName(c.name + '_' + f.name) + '_FLAG' + +def genErl(spec): + def fieldTempList(fields): + return '[' + ', '.join(['F' + str(f.index) for f in fields]) + ']' + + def fieldMapList(fields): + return ', '.join([c_ize(f.name) + " = F" + str(f.index) for f in fields]) + + def genLookupMethodName(m): + print ' case %s: return "%s";' % (m.defName(), m.defName()) + + def genDecodeMethodFields(m): + print " case %s: {" % (m.defName(),) + print " %s *m = (%s *) amqp_pool_alloc(pool, sizeof(%s));" % \ + (m.structName(), m.structName(), m.structName()) + print " if (m == NULL) { return AMQP_STATUS_NO_MEMORY; }" + + emitter = BitDecoder(Emitter(" ")) + for f in m.arguments: + typeFor(spec, f).decode(emitter, "m->"+c_ize(f.name)) + + print " *decoded = m;" + print " return 0;" + print " }" + + def genDecodeProperties(c): + print " case %d: {" % (c.index,) + print " %s *p = (%s *) amqp_pool_alloc(pool, sizeof(%s));" % \ + (c.structName(), c.structName(), c.structName()) + print " if (p == NULL) { return AMQP_STATUS_NO_MEMORY; }" + print " p->_flags = flags;" + + emitter = Emitter(" ") + for f in c.fields: + emitter.emit("if (flags & %s) {" % (cFlagName(c, f),)) + typeFor(spec, f).decode(emitter, "p->"+c_ize(f.name)) + emitter.emit("}") + + print " *decoded = p;" + print " return 0;" + print " }" + + def genEncodeMethodFields(m): + print " case %s: {" % (m.defName(),) + if m.arguments: + print " %s *m = (%s *) decoded;" % (m.structName(), m.structName()) + + emitter = BitEncoder(Emitter(" ")) + for f in m.arguments: + typeFor(spec, f).encode(emitter, "m->"+c_ize(f.name)) + emitter.flush() + + print " return (int)offset;" + print " }" + + def genEncodeProperties(c): + print " case %d: {" % (c.index,) + if c.fields: + print " %s *p = (%s *) decoded;" % (c.structName(), c.structName()) + + emitter = Emitter(" ") + for f in c.fields: + emitter.emit(" if (flags & %s) {" % (cFlagName(c, f),)) + typeFor(spec, f).encode(emitter, "p->"+c_ize(f.name)) + emitter.emit("}") + + print " return (int)offset;" + print " }" + + methods = spec.allMethods() + + print """/* 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "amqp_private.h" +#include +#include +#include +#include +""" + + print """ +char const *amqp_constant_name(int constantNumber) { + switch (constantNumber) {""" + for (c,v,cls) in spec.constants: + print " case %s: return \"%s\";" % (cConstantName(c), cConstantName(c)) + print """ default: return "(unknown)"; + } +}""" + + print """ +amqp_boolean_t amqp_constant_is_hard_error(int constantNumber) { + switch (constantNumber) {""" + for (c,v,cls) in spec.constants: + if cls == 'hard-error': + print " case %s: return 1;" % (cConstantName(c),) + print """ default: return 0; + } +}""" + + print """ +char const *amqp_method_name(amqp_method_number_t methodNumber) { + switch (methodNumber) {""" + for m in methods: genLookupMethodName(m) + print """ default: return NULL; + } +}""" + + print """ +amqp_boolean_t amqp_method_has_content(amqp_method_number_t methodNumber) { + switch (methodNumber) {""" + for m in methods: + if m.hasContent: + print ' case %s: return 1;' % (m.defName()) + print """ default: return 0; + } +}""" + + print """ +int amqp_decode_method(amqp_method_number_t methodNumber, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded) +{ + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) {""" + for m in methods: genDecodeMethodFields(m) + print """ default: return AMQP_STATUS_UNKNOWN_METHOD; + } +}""" + + print """ +int amqp_decode_properties(uint16_t class_id, + amqp_pool_t *pool, + amqp_bytes_t encoded, + void **decoded) +{ + size_t offset = 0; + + amqp_flags_t flags = 0; + int flagword_index = 0; + uint16_t partial_flags; + + do { + if (!amqp_decode_16(encoded, &offset, &partial_flags)) + return AMQP_STATUS_BAD_AMQP_DATA; + flags |= (partial_flags << (flagword_index * 16)); + flagword_index++; + } while (partial_flags & 1); + + switch (class_id) {""" + for c in spec.allClasses(): genDecodeProperties(c) + print """ default: return AMQP_STATUS_UNKNOWN_CLASS; + } +}""" + + print """ +int amqp_encode_method(amqp_method_number_t methodNumber, + void *decoded, + amqp_bytes_t encoded) +{ + size_t offset = 0; + uint8_t bit_buffer; + + switch (methodNumber) {""" + for m in methods: genEncodeMethodFields(m) + print """ default: return AMQP_STATUS_UNKNOWN_METHOD; + } +}""" + + print """ +int amqp_encode_properties(uint16_t class_id, + void *decoded, + amqp_bytes_t encoded) +{ + size_t offset = 0; + + /* Cheat, and get the flags out generically, relying on the + similarity of structure between classes */ + amqp_flags_t flags = * (amqp_flags_t *) decoded; /* cheating! */ + + { + /* We take a copy of flags to avoid destroying it, as it is used + in the autogenerated code below. */ + amqp_flags_t remaining_flags = flags; + do { + amqp_flags_t remainder = remaining_flags >> 16; + uint16_t partial_flags = remaining_flags & 0xFFFE; + if (remainder != 0) { partial_flags |= 1; } + if (!amqp_encode_16(encoded, &offset, partial_flags)) + return AMQP_STATUS_BAD_AMQP_DATA; + remaining_flags = remainder; + } while (remaining_flags != 0); + } + + switch (class_id) {""" + for c in spec.allClasses(): genEncodeProperties(c) + print """ default: return AMQP_STATUS_UNKNOWN_CLASS; + } +}""" + + for m in methods: + if not m.isSynchronous: + continue + + info = apiMethodInfo.get(m.fullName(), []) + if info is False: + continue + + print + print m.apiPrototype() + print "{" + print " %s req;" % (m.structName(),) + + for f in m.arguments: + n = c_ize(f.name) + + val = apiMethodsSuppressArgs.get(n) + if val is None and n in info: + val = f.defaultvalue + + if val is None: + val = n + else: + val = typeFor(spec, f).literal(val) + + + print " req.%s = %s;" % (n, val) + + reply = cConstantName(c_ize(m.klass.name) + '_' + c_ize(m.name) + + "_ok_method") + print """ + return amqp_simple_rpc_decoded(state, channel, %s, %s, &req); +} +""" % (m.defName(), reply) + +def genHrl(spec): + def fieldDeclList(fields): + if fields: + return ''.join([" %s %s; /**< %s */\n" % (typeFor(spec, f).ctype, + c_ize(f.name), f.name) + for f in fields]) + else: + return " char dummy; /**< Dummy field to avoid empty struct */\n" + + def propDeclList(fields): + return ''.join([" %s %s;\n" % (typeFor(spec, f).ctype, c_ize(f.name)) + for f in fields + if spec.resolveDomain(f.domain) != 'bit']) + + methods = spec.allMethods() + + print """/* 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 +""" + print "#define AMQP_PROTOCOL_VERSION_MAJOR %d /**< AMQP protocol version major */" % (spec.major) + print "#define AMQP_PROTOCOL_VERSION_MINOR %d /**< AMQP protocol version minor */" % (spec.minor) + print "#define AMQP_PROTOCOL_VERSION_REVISION %d /**< AMQP protocol version revision */" % (spec.revision) + print "#define AMQP_PROTOCOL_PORT %d /**< Default AMQP Port */" % (spec.port) + + for (c,v,cls) in spec.constants: + print "#define %s %s /**< Constant: %s */" % (cConstantName(c), v, c) + print + + print """/* 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); +""" + + print "/* Method field records. */\n" + for m in methods: + methodid = m.klass.index << 16 | m.index + print "#define %s ((amqp_method_number_t) 0x%.08X) /**< %s.%s method id @internal %d, %d; %d */" % \ + (m.defName(), + methodid, + m.klass.name, + m.name, + m.klass.index, + m.index, + methodid) + print "/** %s.%s method fields */\ntypedef struct %s_ {\n%s} %s;\n" % \ + (m.klass.name, m.name, m.structName(), fieldDeclList(m.arguments), m.structName()) + + print "/* Class property records. */" + for c in spec.allClasses(): + print "#define %s (0x%.04X) /**< %s class id @internal %d */" % \ + (cConstantName(c.name + "_class"), c.index, c.name, c.index) + index = 0 + for f in c.fields: + if index % 16 == 15: + index = index + 1 + shortnum = index // 16 + partialindex = 15 - (index % 16) + bitindex = shortnum * 16 + partialindex + print '#define %s (1 << %d) /**< %s.%s property flag */' % (cFlagName(c, f), bitindex, c.name, f.name) + index = index + 1 + print "/** %s class properties */\ntypedef struct %s_ {\n amqp_flags_t _flags; /**< bit-mask of set fields */\n%s} %s;\n" % \ + (c.name, + c.structName(), + fieldDeclList(c.fields), + c.structName()) + + print "/* API functions for methods */\n" + + for m in methods: + if m.isSynchronous and apiMethodInfo.get(m.fullName()) is not False: + print "%s;" % (m.apiPrototype(),) + + print """ +AMQP_END_DECLS + +#endif /* AMQP_FRAMING_H */""" + +def generateErl(specPath): + genErl(AmqpSpec(specPath)) + +def generateHrl(specPath): + genHrl(AmqpSpec(specPath)) + +if __name__ == "__main__": + do_main(generateHrl, generateErl) diff --git a/librab/build/librabbitmq/config.h b/librab/build/librabbitmq/config.h new file mode 100644 index 0000000..00e1d81 --- /dev/null +++ b/librab/build/librabbitmq/config.h @@ -0,0 +1,14 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#ifndef __cplusplus +# define inline inline +#endif + +/* #undef HAVE_SELECT */ + +#define HAVE_POLL + +#define AMQ_PLATFORM "Linux" + +#endif /* CONFIG_H */ diff --git a/librab/build/librabbitmq/librabbitmq.a b/librab/build/librabbitmq/librabbitmq.a new file mode 100644 index 0000000000000000000000000000000000000000..28bd6676476d2ce8dcdf94a2ec78f04ed72af91c GIT binary patch literal 169644 zcmeFa3w%`7xjwve0V2@ssHmy+GTPXNs+b_!q*BieNnno*5Ft^#)DXhNL~}El;i9O4 z%#iFe#->%Pe#f4}>9H-n)6;5IP*M8Q!-nG`d-u15QUi*}}&Alyc=TAM$mw8p5bI!T5 O_d$!M4A-tTw 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 literal 0 HcmV?d00001 diff --git a/librab/build/librabbitmq/librabbitmq.so b/librab/build/librabbitmq/librabbitmq.so new file mode 100644 index 0000000000000000000000000000000000000000..c6c190cd8ef9b85f794b3b5afb2cf65a90000ba8 GIT binary patch literal 117632 zcmd?Sd3;pW88?0t0t}1Zh=8e87&X?QR1?ISDB27pa7P117R3bvghbE)F`2L^VnQY) z*D)Fw+-h4~+M?A;s{&HRum-4Nq%OErajSPgD;0}~OMc()bIzT)nPmF*_x}4{KEu7w zbDr~@=RD^*&w0*rZ*D0p8k?GuVz^fi<3fW_cA>)Ly9rz3H2FrZ(c8#3h8QObZBLh` zoBKl*DxZ5d48Kqj+Y3M65|!>-a+2WP`*5FthNJIpzEqv>{+m_4`)^kH+3ZCBa4+%uU8mwP8Iui{Tbv-mu{P-RTKKcp+~-rancA|LDbzh3E@aH1|RnO+X} zP=xMXS4ZkL5J^lPH(`pA`SssEXwRN{(b|XSZ}{lX@9ZeM?ZG_eoPl2%ek`vqetzF0 zCx?CcqmBOQX+{AMJ<|O~I#UbFYEz8dM(3dsBL|%{yeWS`>S;ZOWlU``j6TChoRpH1 ze$293w#uWmevm($?rR-*O2A4_>jA#0r-psTvOtDW+jnejD%e_mGyH)9Bh@&%CB^8M zvVDBP&y3Wxv|K+55_x#PmjB_p4!`T=$uKJPeJ<|v@vFoygkKGQ3-DWrAFoCDEynLg z0=RC%ZwY?4;8%wquVwhv;t$zsGlFg{Wtji z7QaXEdlbLl;m7L_>SjEF`;+?lY1~)q=RfQFGq^v8-x>|C)%WN1{RP}x_46j&x8k=A zzc&1~fmP&onNu4-`y`iQ=j#lzkaas_b>l+{aaafO3Qh_dU4;}8`nK{ z)6$_g?0;}r_S>^Z{q(rJUjI1ela!NFYQ}H*$&)L_)cnr=)y%rt9ogs96izv7&)28F zvG9hUT+nn+pKDK8a@Ft+H;%si{EC62SFB#!+q`o;_>C!i<8vc&@RI>Qf8)W2Kl;;K z4{tqk+u+crY47)4@Xe5WORxXikl_zraKSUHpLnBR)Hvg;-we9p{EB^l|MKYbQchcT zUbN@iPkh*We^P8x8M9{`mM^*FRZz__48%O#Jxm z8>XJ{_8Gr>>Dl(nPC2FE(mna_)IB)&_dBk8Vf3$uwBB%L?q5H?Ysq!RE8p93?V+vt zn?^q{V8yy`diUv9*?3gt*Pp$3-nP~IzVVH}>**0`!>3%+e8*qS^5HAayLI>HkFDR)GY`u;iz{nJVM zD~Uc=B;kKs5U$@QVu!(QDkvo-!c&A&EX@#nmh*IzWB zVvT^tlYCStT5cd~BBk*D83zPt^T&t^Z1`|1$ye+NtY1UDvlvp^ahU zXZjoMy1p)clv`h05l+|i%WxNawiLqEPn*`mO5Kliu|}<~m+>D(KUVYMIuQBn<)Q#C z*B70v`54U#{~xWN%XB;LJz61r8h@`_uGYU+xAdC<#!<%hQ#GMtXS8a&%KnQ&xc2iC zUEge7-(P6@<8-+#y4;gB{-@H8eT;RZG(z9baqE>}pSjQj`}KhlN*=dgH@NlX0tYUw zR^xj-OZ%1z+HlvguF(2ye^lY&X5~tS!lhl_RPZS};Sycn%EuKxQ{9Xa+CEomg=J~{ zPO-P2bg{QuZ72ChDfu^R`V`H-B|)BtUHqRFp*A~Xi`H{xMBz`>e2&xdKLu(bnV{?HJ>-N{09>H%js^px_$FC{Q#{`zvh3L#;3adR|{UL@w-rc z>bbH}A!cj*A&oC?Qixd^e~;#0tnJ^mpU1R3*;)^NO}|5zTf9;sj?wsIQE`^La*IN| ztMQNOa#t@`2zOoYDy<)5g~H#f>7UW|>_0}e<6w0&rs;C`YI|_?yhqEqQp;JV`7~&H zL+c-)T$V2PK!W`@YkSE4qoNz6>Ce&aYiP%>yQQ&6)B82O>z^mMdWb3pXKOwWxbm!2 z2$%jct)Kkm3V)8KAENoxZdHi)G=4tr)U$uALikXBUTX=}%J0#&pfUUH8*$jX$9EIbG|yTI1h#?N-MFFKYZVntySE zT^-W&do}$hn*MsNhrL>#gZrq2^R=C{YQN{#^xyPT^_rgG58u`LuUx4JUHkdD)_>)z z3jYz>n-}lY&uTqhxczR0mOni~{yR0FTHTJW-s-h}R%$!{qvk(d^KaF5rPXTeL)k2M z`Zf{6*ns@JI1UqU=y=1`&uP#b{r27jzipJ1TswFEyprnBjH*yciBVEMXWks6Bsh6| z$*i)fvTNs5hsvrZj~`Ppe_q+-88a)&R9g2bC8djIkim?KIX8mvq6H-rHHR@3Gpei0 zs*M?QZ>TIOoj(u7%?p*xn=!X60X3((WcG}zStVsvRr9M<+T60x?D?}i#2PVsMm1T5 z%I1X>;jFUK`LoJORI)-<&YxdVGNYnmerYF?kkmwk(U~f%=2wnp-xv zv~saxp;J68G$xTn>FgQv=9N{Hfbl$?b#7&7ammcZA-9z3Iddy3%1Wv#OQCHRI7<<_ zS<5TtFVtBV5qE7F=_+PaX|rZ8T4V4?^l{Fz)%*^>!x;Q0YWzEcrIn}dufx3B1E9O_18Pz(c*i^h(W3tUd zMdqNNDQcloJYyB8E}J*2lkKYXYs)%`P*rwaOeKn7UW@}s(Rt?0s-8XL`m&PHoVjK5 zYjo!7!&~ z-h-p?nrjIi!@T(==+HB$PqbW>$5prmxjGBg%qydh(Aqbu$~?XRMS0UoRTA7^s6^U_ zzC*Pi*}7eF?u@qmgnPoGy;%AjX!ugB61!*oj)inoD z;kr_BqR>2DdkMR+>QZ#A8tcWBSCy3+mGBn|sm(I(m_3M+dGlw2=k*5Uo-u0{{6YDA zqr7xpsKS69l5l=y$RNX5DkxpNNI|~Zo^^Tb+As__8EM6ANd+HkHk}Qc8i^-^7!<=JF1TY!Pcx4j=p04wR3dC z$YaUEIicBI8c=0J(^kR4U5lMnRz9Pq0zD?y?@%2mQADkrQ3bQDsj7hUodd1q<&{)d zm(G}1&Ym1Xhl7DGfTl5WL7LL*={x9|RBpF7%`L00p5cy3F0yRig0c$eUXh}!)17+g z^biz7PMTB%Wx_D{P(8aQG;99Cc}C&HiO>T&u?|6)NT)P9cuDMzF`}dt#;9^an=|Lk zm**H#*IkfQxAIZsU0GIky@xdufvPGgW%N-#2X3v*n0iijUR*SipmWSAUyK&3hGvB; z>n9HjtL7j}WoWk47(-@x447LJDqBQfd3^$^W}YC&OuV9aGOATGSBR<;sOSm}O+z0% zXI2TFq>Q;9G+AMQji+5wTsVPhgA&T;Tq{CW%$Zp=14be&nN~3$%_CaTgK=Wvx>Y6j zn8{O>I+V3nS9nJYa9c3qY_yrU7;Wb)g1Ojo?z1#bA_vy1bOx0lqZ84z!cjLFXLKx6 z9WR<0uP<91%T)uj_Ou}#E;@1f97N2n03<1{nzH~+d~w-gmDZg+VC(jNZFR8OxkMSo zh2voaP#r9;Wa6YioL#3Y2D*ISf*<8etFf4YavBBa=C3873KqZaB z3FCqj3Z;k7!>BRlk_ls(SW|&fn~dKSmQBC2appNcbUJ>*}S(G&l8^#ZOZaQr__?xY|_ zK?a`rk2v)|C-0}yRqna-Uaau=jKdmt+?+Ys+3jWY zFx4KF%HPwIKgD>w3;(oE>9>2*{h_b1qTa(Gju%^@PNx%Y|J6dIrwWd+d;Zm3XWCmx zEM#%d$12cRsqy{;G>h-Zz33yiz zs}t})*YxWW@W0gf)&%^O8oxaOU!(Eu3HU~h-;;oE*YfX8!2ed$I|=ybHU2;Xey7GC zPQV}5{0)8H+O<#rNM&#S1pM@`m7!)O;M)%>e0Bo9MdNc5@aY<#pMWpb}N9(=0@uZKcO z-R{9-$cB<=@1_~jn_VGn+w2XEBH?N)C^ zORCRcJ29;J175Yd!dO5B}#K{2mYf zOb>pq2Y;3a?|AU;-Yb(2cvKkdP<^5FA5 z_|+bKz=L1s!H@RfTRr$O9{hF>zQBWT_u%zW14-TE!RslI;P-m)V?BHv4}P2nf53yc zJov*Ne9(h8>f`o*kq7Vd;B5~+-Gjf_gU|5bi#&M02S46}&+_2ivk*+q_TVRY=yN^z zOFZ~|4}OCOZ+Y;mJosV{zSx7G>cL;?!B6+#CwlO+J@_^czS4uAg>;0=B5tT%8oJb0f6e}@O3 z?!nLW;4?hh$j`Uqi$)X}{HKS-FNbhKUIy9hIc zj*;Ln4xd9Mc^vJ3~i&e0$)e?IKq_z&m_!HHacD4D+zOI z8Z8!hB4LKK(R_g~BFrgjG+W@&gc;gK{Q{py_(a0#0*@d(gs>s->4X`=Mi2bJ`kzeL zPk67u#}lS=kG2aufG|VVXsf_|37Q}VA!syT;GKjywT@;ByooSF$f#f7^@JHBM$-lU3t@(a zQA6M-2%kmx!1vPrgc%A(_X_+VVTORwc7g9A%n&cyD)6m@8QMix3%ralL%Qfnfo~+t z&@9>_a1~*OWYJoIuOrNmD_SY=Ou`JcqSFPwk}yN8XtBT(2{VL><_mlgVTMl8Y=K7; zX2=xv3w$2o3katRJc96rgbjgDC(IBidf+>0f5Q2M_X>PG;Q--wfd>#~=n`!exG&)` zgjWlkO1OaVN`a5$17;`^Z4vk@!VE#8wF2)WJdSXsz#kE|2u~OI9l}Av#RBgpd=cS% zfp-#S2ocQ|coSiU4pG0r>j^Vth^7nt7s3n)qK3dv5Wa-)fg{rXggK-~_X_+VVGiZd zc7g9A%ppA5D)6m@IYdWS3%ralhv4W+fo~+tp*Pwha1~(=tWHSJc2NXx~L)W>4Z7N zMGt%{?N4|*;k^PMPnbhmv|Zo&c6m;+FBy1?%co19xK-d=2{VL>t`>M1VTL@>l>*;L zxQ1|xz*U475Uv&YI>HMHR|-6n@FK#~1-_E-V#37&Pb7RJ;e3HFB776!Y=K7;UP9O} z@Ogx9CY&zt2*OJV8v>tB_!hzkzLEAPTuXSbz{eA=Bit_V0K&@%w+g)MypxRbmX1@` z%iU`3=>vh)e8G_mPco)h!wy^ar&j&pqZg)5+l+u@38)y5d^N3OFXIi+zXn3k@AS}b zJlw;wH(49^{nAQlw_ZD3Bbf(XBAIt1vt@7V_=x#yFL(g?jGEJ|`U}oQGK#c64fO}V z-RGWUIAy4jGaLU++t#xZgeeC%GgtYU=Fl*zz>w&I>|Y>T=w}e_r936v@l%lhc%Z?n zqkUTRaxgH5){;JYF`nbuTk1OQNihsF{5t-><;uE_U7#_;ZxVO=N<7zfTBfYdYaaLciE9r+4B7ogct3E<%7a&suWXTx7BsYz zQ{RyS%qQ;yv#h=&70>(dY&Lv^w1b=LI{0P|kOz^)3{QhLZn>$hV}(LC3ep0yuH#;X zvWaT=on$tLLdbI!K2=Ch6w+LU>IGEIQq@9r9p5VCn?m;=ger9%M-=L9(p~1#9a6}U z(7hsb-zZcy>CRMi^&LJ4J(@KMuM(o|5DBPj1+@Yw(K9gHkquU&?W4KpqoDA@KTCj5 z^3p3IZ}BTV-TZUaq@h#mI@si)6LVU@O4^ex7&>anzv{kZ!$9i`KVAnC7Ui+ex{g7{ z2*@1n3CWi)MS5MwSYs40yVDHxJF{`0;Q9$}o>0+J>N+HU;nD>7@|;lg8Eh%4pgWwKSaic-y@@|??J{uFnk@QvnQF2yM=rhzG`EJ|3vI^ zzwo>O7?i*H6QIIuf3xueDgSJhaGfOFCb>r`)Iy*_H`jHHP~Zz}ng+hX!?MGmq^ye| zm>C|GhBTJHe7%&`&$trU3B)enj@bySc_qvL8g&W{GnXF}N>I%IGf-zRIFq<8KBuP z9R+y#i+;YND7M+yL%8)*HQxrL8RmSbu4AA=UGWd1*x%|p`YO~gq8hk?=GD(I*bAgw z!y>~!2ff*Nny6@~N|+-F1BFqRLfs&!6hRG9s53<3KcU`kyZ6KQtiab`qlDjJe`z#D z=3y`hBs?twz94<8ucCckP>%~LOHs`Ss^&_syjLniTe+8fZx+4_MP5rKOp%0HNI)TH z5mRWouvx0g@P$Lvo1yD5+Y1FX6tFEJ;s^~fIu|7`;@j!*TP*4wQmZG#n?}Dmf z95hdr6fpl#)wumWWd6BAoTX4LBo1FGs38h9L-P0b=I^H@J3(~+b6vie#LonEye?l* z?@^?NHmD+2{ybILVWOljFh!{An6FUTf_g_#vlMDBrEF;Q=I^IWo`VqTFT?{C%24$e zR9}T^SM`tQM;o65oqGCvKVu5b>uxE0n$9fU_H}8Gi!@58CX%Y*8&ok?pMk26ze(bT zf9Mo)T*`8A--tZ1@&K=Xr!!pdl?Ul;GcWx!sFoN032GjLoA21uvAH9swf@_o3y&55 zZvB1l<0)zBwdRUeb4@G7^u{BB%K}rz+gk&ZgZ9@`CSesPU5x-%TUsXV%M2fnPG{MF zx9nHU<=03@QR6{79Guzsq+rx&Z~)Kd@@3-qI2xGY_c=Z^*7}rxB<5vcl>axwzJYwE z<2M^JQOX7j1s2(#Ie+*Xov)!aXm2yauY$;mq-9#o#i>@_JC;2#(`+1!^&E5U&BlKM6ST)-NDib}Df@!@@J=8_VXJ zqNC7615?1mY~;KAR*Dm}CuAU#-)bHWyr$;+#Na*1us79zloGHn%d$7M?^BP%?MDBAy}IV+J&eUmjBYPnijY^FfDKm%&r!c!a2(bZ8w*nEY6%`Txh-7i0{)Oje}e0 zNj0jO;i-L8$s8Ap@JxBvq4#y{{~dzVFxd$|)_03o<5H2GgPIv0ff}mO%nbitY?8xR z&4vwJ>!6hdl*D3Xa|Y1L2ExibZM~X2+17!kUfKj{Aj$;qR*5|gG_TLwyn&{%Db9cP zt0w*yo<{Rci`mdrWQ|N7WSBec*J4ID2FT7v7te57Ji~6-H2MK-dVrhZvMg9>wl<_D z6i7YMY8c1y`#ff2FVPDJWHbDgXqqFj8NTKyrC~fbJc67X{8~4s{#&JACCfy46MKeLC?*Cawvcj@~!$Xz5Q}y|q%JmR;$yY%3kqP@|?U z5^5*|9mXz3f1}|5iZl?3RAb~IsxCn@iJDAX$N#Y znm9L+2KLnBRXVI>_4o@DJJn+)FrDiWS4p@tD=P!FL<8ztmP_j7(^JJ?*~Q1}dU9-Y z>&dtz1m#{Nb!0GNhJSj?LU@+3C9Wan*~@S>vi6HY}q=tKTZDyt#T{ylI9DfKh>_ z89ppBGQu<)9s)i#4i8l_iiaF0VkV5kx2y7!jKkbt=sXTz15C1Uc(hP^$6@X-basho z06h*56lxf+_J_(b{fNFVIh0R~)?vlTtvBOy_>tah4+iFDcqO6;wiEl+V_2KpkgeP1 zw9j?hOoV2-w9Nx3B%y8M-fsyL*Py4vGW){V&Bp5}6HMJ|z6`MkydXTFJBUmW>d-l? z#bC6e**J>S>>iaF$b{JAQrGCrM(!_&;n}Yt%(oOLaR`7UwRpV-rr##t>)?G$G%1twYh&J=2I`*MFF zS^JJuya#c3%})|*A<&W#ESqsxTI;?ZvA8Q2ao5Ob<00yU^9wVa34Ur~VTLWNBi40r zMqxHQiRWl<7Usq$oX?oyff!xs`}o`rb+NCoe=Gt0hJ3BRj%Zwer}gbdfAi=SlIoB9 z3vi5#Q`6uW_n3_r0weJ$Lkh&G&BgK7KUt^?B;Y`eRn;@%(dP-!f~ygK7mZ{=Bbm{f z|G51jW&`JY>QIV-ri%?c0gsTp4!1G2lMUPmOfnm|MyS0uPy|de8{qx|^us=`Bl96K z>MX`Qouai=p+>Yui-9Es?6JAgFlG`GSI7MN#g4R@8D4;1p~p;jTrnG8gd5}_{!r#oYT^iUq<6oBM z^Qg;b7d)1hGj0rn$Y)K6lNRkbdH^GiBU?EekKb_6=e6H}*MR?l|A@-dK>M}UXsSGB z;BjACYqSRpi-=;sZJnSU%h{sET1aMW$k6ijaOFF*JNas)NUwaQz;u!?u5=4YTIt2G zc~1y)rlbr@Lvs`l)WZD!ptn6@(R}qkwcdXNuihmV`V`&vzr{jZkuIhtx?n&X5A7b8 zw8^JqnOeK_`^e3vtgcJXh`IEegxc%U=a5=lx*wUcP{DZB$0NSh zh^)&PJczuLMec{$Ejx|D{{%*L3%9}IWAIL)_BPl$QYRUM9};SBrEYbptt=GbHll$_ zNj&NH=f8if>+>V$ZHY6HLb6R(pDZcUJEIybWp+QKI>OG%u-<+x-mz2B;k)+ht1vrq z{g+?c*%_{!mvtxSugN@_oV8N2SI&9Bbe=K6Janu&F)n93n#r(>U8l1FlbiCE*nHsb zkF@^iX}k3Ao-8P4(p~2|pTcQqrNj&K*~R^}4PJ`E)Hvbxw^LMk68m0^A~D6c?2Yk7 zoMYcpGyLN?2TNQzSRloDN3L1GsBsSC%2;%((QpDfmbH-9Wj)~RSOz~bz-xFGCXN&K z@!;2N?CDZtxe4Q*UJSSia~QXMT|2z^L#@XJoXx5^W4zD42;b9rT=^qcN!S^>jw>x) zh?ly=mFegUbRKcmGld#MpEwp&N;*H+!la+LrbeG|>24fS!biJ&bp-QvIypNF-O|JtI{)6_DE#kpAT zShgxv`sux-zV1xS!PH_M=5HO*_wiKT61Y6@JVS@TW#jE_fhj@zKU|7^IcEp9%hnY)wAARSiez;)RER{P`|5WOIt z`O^962f97-L2P4zrk9s(PAeF1*sf{6d|zmTcAFVK2IPm@YVC~BFXG+9QA@7Zp#A}K z&A@?b@&-S~RV8lY7NzVB+LuFFAYwqj z=XyK0m4cD9G|Su`v>R*D+=n*%L!-KAwxQc1=DS7Q*Myv4&>{@dyJ1k!ErT;-4DMG9 zRtf`OHw=1o%YfTTQpx*PDF&-?tN%DHl-s2Wn?UN-lG(UAmU*4Z+=|kcfa$JK@V*o zgd>1QSXjnIc`n60kK)b7W0B}?4YVNyHWSK$%+Se2e3{Gw7Wxa zm*BbeZ8rRfiC>hTw8MU++TB@%=`8&+*8kCu++A>bOS6%uY3n+;UWwH!t}id&B`cJi zX@`cWS$60ecZU54(&GNsYWO131N*sP(a`|Qu-9Dvh{!Gb3%kw6Ow>p3FKlu57h15gr?$+ot_pu= z)gMVQ*Y={jrAs!Kp9LxDX3OmqD}vpl3pzyg89;+Jm4wh4w9pHfra-C{xeSM(7o=Ma zyUm6>2OGwECR>qRea&HzX1_w>OatmOvvOkO#pdM;|%Jn6-`x1B@?8AwU)lS1q zXqfv&$3v59SKAC<1}b-z@gv!5P^*l$bIzEk?TrZZyV3R&KzG*m{lFw@dlI$@yJ~wL z^Ln*C4T%4)?ejq)+CKU1uG$_V{5;w|O89lswi)Iz1+}E3HToIU2cG?%U3<{|xlQV^ zSGB)UAcmcf-gOaJx_cah;W(&2?r~g%ofuj!SKudz1^xhQ?Gd-uIyMrmHGq9hD>5c# zuRJYp)&JnJSH|{%rh?4WqR92I*y{B04PTfI3sJ&)G`-Ya$DK_KiW1LN)h zpD8QPY6tj6l-$K8o`Nd7v59-B;Z8j;3{0X;{0*CWU2Wn@X&pw>x^;p;B-n)65RzTY zt&!@i$W6lwB4e@(A{UQrID}1fEWPbaZRjuyH}NU05Nr7A(O1~81CPPxDd7EvQrj13 z>oHAf!_k{^(UJ7HaNnCUE(Fsuqrc#)p6u5R5)XYfTGnhFEBey=nBt{)D#r|8h*a7G zeKzfcj%JNGER=)vrMOXtO(`+6STi=oT+aO`ELQlMu>Ea+2|+kI9iyaZdIk$;^ieW6 zS$P}HMmaL4<}?U{wVF-_4|4|_Inh<6#$3yfkU~1orx^LPt9qVeo|U)LY}|`fs~KUk z>#JS`!rU3KJNKW49Im?C+oQ)rF!~#;w>5r(5p7pWM})qcRsQkL2e*sHxV z_XE<{8xlS7xoEL2`ojJL8?sZcI~th8Ubi3i+O^kxf-*aK;=cpYrPsAW=RtdGLFB5e zf=Ko7$i>-_>XDI~atj;Yb$ebRI-%}*(%skzeKB0Rbj(g&@H!MET@c+5V_KBEm+^Rn zXC&yAK9P7s?F+4w5lrn1eL|Z})X#BX*^PeqeoJTl{0sg&Q9t|(M_u)^1(coi^9&GO z^z#z(LO+o)S&@r}!|}in+v~TdQW5RJ=0f^3bJ=3#9Md##c=R1ClF<*-bId|JyL*y8 zcv^a3;${CGb|>d5qN|X@9p}{!bOo51%ia{f!yV|FH!+g*rj^1pp(jL1eJDC725FfX zbSPCTXnbb)05r`}#41jG%y#~{iX8GVY2Y& z15eE6eX+qPT@6NX$L6wX6a}*%$x)|yQg##pDC>uoTMre(A-9{2mxzErNLx|>bNL0p znA=qVaja+z(SdR{w{eNB`AT?iaW>|%V?axXljeN$syLkMNKv2AcKhM1sT(Bpl*lA9 zCXKcOi$Zy?Al2NCwB7+5;RxalpSgUU&I0m+%wFt`M)YX#7XMiPLk~fw$2?Jobrk24l@tCq%CDbBu`% zH}7J&;mDH)cc=!QWw(JFI{V1z7hD1X?In1XRek3q>`IT5;;Lc%|k3!2tH-kd#vzI%~`ZF*X=G-w5`}IIHr4&WZ z#2m{fV{{$n5jtY!Fp01$G6pM;3|OnlZ@Z3GeUXa?if^1otOPO97qC7Ddw?zIX9d0$>FIWQ8@?0MhvmCD*2v^KkQSNX zV_1c8<47+vybdWGH+rpu_(t?t>{7($OP=<+6J(w2qZWwH_HjN&I_doZIj1OoKi#bN zu`5qx`Ca|N`Q!?T;i5Qd!7pIuuLrdwa05SOApwMmW7A#3@i9yNkv`0Wfd(VmAq*x> zfj;OWN?n@M@$x8)m%1$*>Q5L*-E+C9ypTA6IiAd zcZ2}mTs8pd5R?lI@#_2_LqIDwPxY+fb089`li(V5fz9`~O_+8^6oY5mWur~=cx zZ@DAmo#r_ln%rrgYt+Irz9_W?G+^1^`J=FmO8dHtTz?Rb9ue;aLR(eb3ik6fQ}YSf z+0|B1sd%P2mxCv*UG9Ef7d__%7(T`~*YqgL`%jTQ5 zmvSPa9FPDmkgE~=t&jYt8jlA}5)uQt-S|_SEJyh$3s<2OVDdI^`K@VE4)ryL0 z2-a`K`X?x(|3EiH{XnIcM{m_s&J9Qgsl3+SiDI@(afzll6Ju4UlE%hMa!yzBq(%Dz z*@=(e<@|KsxbR*Jb;h`YdGZvc0tb{L-~a^ zCa#+b?Tvx@y+0P%t$~fv^!n{7peQg4TZ7G`F_i6Dup?nVl`qMv@fQ23T*p`Ysb69^ zu$l)A{}W;W?x*%&Z>8+)_$ctr7NZu6IHQA+DLy^4Eqp3izo|zs@0}tE{tAQ~sj>qIutLx$KOG%*+%pC8-2;OG+HFw>kr1d^N~em=yvDE?2? z#;)E#e~HW=mDIO}4tp4yeQdQFe4t2Jvx=fZk=jCFo@ ztj~zEo(|TtyRz=XY$A0ASs&U`D|{3`)`)6hozOAjoH$Q}x zy|m0=q!~s6`@vCR_rMkRQ!R6cWf%1{Ab~%06{wm>w-ND}ei{s+KEcM>g`@%5DqT3OZHS*I$yl`lNtW-U1#bjaqC* zn5T{Ews-*~Mh#YXTL8CGRRPs3p#GCIGyH{QXy#^ZtQMoXE9A6zA+oa@d9GCzg3}8~ zDr(M54d%U9WM^Ur{5uRzs-V6osL0+M{TDFhEo%4oBRr$0#JBlgCV66|)&i+*BLlX< ztv)k+uGB!@=~2fZ?qpW6kChwX){a9u#($hG!|uTce0}T+pb^d4eUTEKEd^mCp#%>y z|H65ZNYA<7`r(2OVK@4Dc|SA)ql#cMGda_@o-c9GXF0{|P!i6FY;K9KhtgXj+)a6ww|$D^^_1!{BQc?GOTL- zUq9DXpNZ{{3Ovt6=Ji}r)=i%wO<$sNXKn5zZ*HRf@ZC727w&9p`*Ahl7fyo|r`*l| zV}0c%@BdO?>LP!=yyOin=Q__ltLq8=?2qV*bXy8i2S>ckq{CHAC zrStrVQsY8jtpw?z;9rK4k#Rrh&2 z$_uwzb_gCzY!D5VORtD{{Uw z7Lr+!vtQzJm~#aHC%l@&SH6Mske3DQLvkp}vVWlX7DBp$$V)PwL|&pm91wtHWvrat z4h{l~@IKbZG^bv06oh8+l9kHe^$y)JH^e2!6=^GPtTjbh-# zMw2uBbRGj1_9?Ot2VS78!IW(jBg1)UHfj(-nJB)1Z>WFiyp0X1hStTu!v~S-wov(Y zd#6*Rwa5?A_kSq+Ey$2DL{t~bX~5wKGt6**{}x(ArCaake}XKQ{g!3lBYHS!{V~c7 z;PsgCb?m?2Gk(ZfIQu&obv}2jU^{7eqitEM)SVzH*z<;dfa~?!r3fQmbwAwqV4z$A(jADO-;h`PwFG6dprlCEZ zhl8!=+SlO`5OE>ydYm48x&plB(FT8Os?PV$NLoaQO%dGanMefIxZdh4ob z-tj3e|2vQI*c+wOqNgVlJuWtn_pygi@Q0rg!7ULy?uW!5(|{bQ5r^tb+hl2x5shz6-fDLjLzRC7_tHu^9kCpxBVlHtNst=H8-wiL8?p= zQv&-wdMpURw9e&`SMGlb`-ez9$w0($rFo>`d^c0k)$Fk%e{BacSo*bPKeL@Y=A*;0;(p7nXOiv2 zJV09``S8j)v_JA9wYC3VC?d3y80bOvBZnH3Hnc+hFR=-n7N`vDEPFG)U%{L^at^IG zj1<(X&FS%^%<>u{NU)mg!Nz!rf0)Q>t6zm@AAW81wfLW`fNaH$NQkytVfNz29FFe^ zT~56NL}(0ZTZ~*AkY+gVvZFWGi>o8hfrCp@kUAFt5Eha`maO%6Dt} z?Dwm2XTQ~alh65_;z!P)909537d4**VMM{Y?`y%hrY#tGkxk{Cf>bFH#{6?VayDeDgS%f(a@kpD*$BM~P2xVjCy2l_~SP#|?+JrC|6khCYM#n;zS& z>D$&=i&8jZ!JO8~O`596KE!Vo<~f!*ZmZSfuWU2y@LBdI=W&t3v3k@i`ny}1Ee`>L zAk4a`pP%%!g^FY3U4KsaSBL~UE4Hm4{B_O~yX@`ba2UI!aYb6U!0%%UXJ^|j@JwW*9f+jxe%XhgY0rdCKa_A zmnJ8z_|%h6efZRiPks5+n@|0s*T5~Q^Id3|Rv4oq8__p`RdPW4xAaDiW62N0`?m6pud*e;G8nnMAD7Y1ok7Gr=~hHKLJ+Y5noVbVMD`!g)>5~nuH508!BmF0RIu>(^ zefGc0^Quy72JX*|wI{IUc^9RI@V!pb)%=SFvH(rUOvk{^*+S7b;4!2;Lf-YX_(X;U z%c#|`yCzuF{B$kVZ-1}#5{#UX3HKKIsfNw9)dlAy({i!@qP(IrZv5a zB7cxEZE_}de(&23>DW7PRzu!26GKY@*(h{`UrI;#5G13}4<6^;=gKYL2YeA7$XHK1 zhn>QzdZ5_{?%JOR{o{mU_;Tcj0~G%=jl-?kP$8%ye`XOA&Z60TZTuILQo`jaSZ`*OWWLaJu*bXvq8OTil+puMAsVkk0+p-p++| z^f&^KzSlgZw^hH@XKq(tTy@)jR7%Y#8~_O-tnCM@>(9e+1(`TPwje!%;pc~kX?}}Z z>RZ#SQU}LIG@EEIG5LJNqgyg0rc>>uyKp{SsA767O}U)MV1zH?d){$!1jkEwrV_o@ zTzeBm&Tv{)pK2Nk-u12hI~S{ofGvPz^AV6LQ`-Kpm77|U!94?`X!nEC7(DS5P_*n2Dt|D;O7G|QZ6x4 zFdw93DiKxp%nunkpnT`C-!UAaY%K>oA~HaZ%e5TrWgwG|nM*MeF@M_ZB0u}jF;l=F5~pHoy? z>cgu=1$iHt%?J@70?yKv?yTR0BXDWkZM<}3kIA;|>vLVxV9hN1l3ctr8biSxRB-#u zW3YvW)}Xz`4D(ebtMqy-gWTjVXr7xAEd7tQ@t-|Vbu;`cq&b734G^pEwhE;^MkulQ z;uP4|XJEr6R)qLjRmcRl5Ugg5$u`6Hf>~j6MJ6P^DLr0FXpZx&q6{r$EkT?vWE1R> zd%@m^AN>EA?C6QGd>zN4c5DZDobA66>5$8BHe4qZa9^J}?Z0K<8~p-fO>94y^!LZ; z(`$aM`y1%Cg02Prc?344oh@+5VCZAm>|H+)|9u}ATlPDQq&xMuU%HGpa^%5B8L%|b z<}7B_;0w|55Tsl7PEMd)|0Vo-GoOtB5+S_QD&D^!Z`6n4T>8Ki`#}9(GcXxD?QLSJ zGC;ue=3>PAB6MPTUX8`GMNUoM{YCH$dBs-fB0V;K^-?ig^Zs9>IM`QVxjhww7~Wl< zirAtMGpT3wuFwb0tVckjBvuW(87yf}pzVy$d3XPtae3_n_E(S(7TLxkPA$)?v})4# zXSniLM3fc!SqhlOz?<#^mqv&0*#d}&Q z2R@l8EyUS0{89_Mm71Z*L>Ax64BDSyUa<$sIXi-p6?^f3(aOQiiuCTlz8gEiHq#yg z4xC)9e+b_Da0e%Sxj+T$e*6&!8$y%u(18at{3x;(*auL0{OgIa_Ov&}zPNY;TDAVL zaZ8>0PMnIToHJGeo12F3`GJi(!EJwumqWM=ljgiQnZs+x&FievcG-Rmz?|*&{dc+g z@bEuI@i*^arwCoB`Tq^Z0{%5)`5k0*55;>jc+b$hUvPPU`XeU6kEncB+a``Sc6&4v zw|IL3k2513(M9+#Xg3@N&p@PsLl}my7T($#4&cU%)AOq*;Y28p9IV5-LPzv1JazJ~ zY)9v`-(oF-L$7ahwBLiB)*sL&Fb=-suG^n*zK@7nmVxw~9l)d$BYv3a0=emcGvf4c z-~EJXepbica(vIZbAMJz{un)`wtTT))(F!vZ-e!ynMD1MX`$@>OFjC(Qw+s0?`VZw zW_Tz5FK=-!W~;D$cLVOyzWgEk#SX5}xwk|YqKRC+LLN1phD6jW;8^_O8Se#8i=bCv zf4e+rzZ$r#P<V+!5d?Wg-i=cX_Z|y5tNl;!2lXDY`+AX$?JrKQ3_4 zY>=0*880z@u!il4t^x`D7lvq`R+{rFY!5xuyrT*g3cXIta3a(q+wWFnkoH3uTwu@Q z8ht@#rt{NFRST}M?%#h0>f_~ii_7n1@(T;U^A*3E3#A?6ye5O!t8mBc?dz@k<&PJM ze3Z9-OKcFADJALwl+`AGVZj|}kpj$@C~E(%nEwe}p40j~PQl}Y71|L7?bk6LG@o<+ z?f7E|+^<yPSu6L7%wo(zu;35dYQtU(kaQe)WG5#l$3i1;vjxEg$22<0p7)6l zZa5EX21VGO$R5wQW(XkF<{0DCi|}8*W#jC_6X4?7d7Jo0%!aCHqK7*|b8(zYzRp!( z<49IJQl{#ZNja_ZqAL=d0*(7+?aMy-R#=Ssbe(c)K=-z&XnF%hXU_AKsA2x0=JJ-m z(sqFk*dI78D|jTO1A9t*FLHcjK^AHex*!m_tbYJ+6a*qm(-0`8QytDoX9AIGPTwM#s3Mrg77BAad%l;fn1F6(y!V}R zE*PVSTndXX%xPWEuw6>o=$r@%vHMhi*oQaxu+O$RzP`v=ii*8>Oz0Ej;n8)y9(=*m za378dB_Os4+HYZ&T$J~*3IxVCbkq#me~Z$4QQoIk^RyIvh!hOQ+n;XmtHOiB{!xS@ zs3+bHQMm-YHFPsyFc|ia@p=EM*~yiNtwjv;-sdF!Ezx?-GjI~V)hQk$gMVti;O7v< zeiQwwHvSb)TrlH9VaVedH4-X#Uqd_W%Vx~j~EwVd{+(K@sd`0cXUA5f&K zn*3R{n7#134=;%a!RsPu8LZ$iX0Y-a86}u^wK8Dyv{zi8uj`S64VN3VKUL+jz1BfC zPCniNhoVS58DTY3*xL9u%?CvYoqOEPh^}bZHs{8BNWEx?b-$G&wC0*Zu789#f*{-) zdI~#a7zaAL*qqiPu?_n8R4jq{oMXkpYu-Xh_e+7Y1L3>}Yr@G=in&E2hIX$U!p9kH$9FXG9~y8S zoV-*2f$-B`H<9iFt$#x9)}2b<)F@WdCYRe0^FOe3_$ zT#MCOvJ0YbOOTC~rB^6cHi;3)PlqSa-w(rZztt%Q3_>&f2NK{dKl#2g`>kb9fh0V_ zVB>_Y+H{U~CX09b;CZb!aAIMz5$5j>jkat^R4*wIYdIHv?j2iLOAVcZjoKVx>H<08AB*1dmSJZ{Qehx~dyW;6AvRxp%rFxM_fb;e=g z&(#2D4^nAr;2Id2{;I8LU;<##z|E8z)44@>r(C`bja4yzqn0m+@WY1kwhunw#dmx7 z8CrgF1m7+U;;e&oKFcojh0X{@!kMbFSyo#iHGvh)Clw0aoQ?wPf74Ji!Ar&7)cp?W z-g>$E=(c{>!n#!bLbt@~whaByTem8}APP-my{7*Es~4-o%1}b`7zRX4WO}SvRS0PmLbI(1dR7lBG8%S@ zFPlV0!%ne06&Z~&7-s+?qhY6GV5g&Dr(f`Q`HzC7n}KjguZ6u#dkH}{{&=MnZCq|tWfr{J2V3YL#P380ywQeYzXH7AmXuX zKg;HtGkO&dE=16)Y<}toy~;-KisWmFVKIyt+yk;YM+IBNuLPP2Ovvp%&h^=vCf= z$AMUbNsFXo+v6+Avj1MGPXUgIz@6r^S)m|=Y&U@)Cl#-#P5xM9mg^iELrear_)jb} zm)jMYshl(Uitv<<@ifIbWr*%Lc#WtTQhq*4H^XbetQ=wf(RE8QbLER%;ZH!x!L0)GPw5Egm-)cO2Dkb< zVuRZ^-2JEqEdBC$P$2}w8FsQjlVk^Nte2r_g7zh_LpjuT2@DZOc7TB;;$$2iV2VXN z{d-AP=fSPWUc|x8Y&Z$cgVBxFEpLZOe+fixHjpnD%OEG`eQSmTNX3U=_V?5FiT2No zw}0KY>ib0|SVj4VOj_`{neb6~;0s=XNFh7c=c{{gZqBI-EaYkq%9|MHLsHB-Xe)#u zE{W(92#7O4yNEY{A#<%$cF0tW8QV`FwXaP!n1L=%pxBD6btTDmR$NF)%m#^L(4^TSAWxv>n`_@d zSyIsZ1#l1f=&o>oYzq|mIVM~p6D*lCZ$85z*Yn_n4)gBzYdq>wpM_`qHKo6jHpMav zHlewTUCYA!Ls7H|FE)5iYn$+r0^91zN*+7sir3eQ+$&;W3U40=K;*y|F!3m2*q5Ut z+)F7e`*OUg!S%3j+`S#1kFEb4?-(Iym*z%Wn_(I^*G958aPN$(Dc{_Rxp|=x=+PSx z)ZrJA?#K76Yq<~OoC`k|w6Ow@4kSb5c%C~w357;#jD|x?OAFA&{W-gHFb~+F{amER zXO-@#Z^J3&G&|VbAAf8!Z7|-Jhe8L#@c4#&!C>^yKzdPR@?cB{FGc?i4fb30o1oVl z{CPJUf#x8-(!K*0>c8dbK*TI+o`v;;9p>%)`*At%;;^e=_79iwg5&3n&E^Q(1K@FpRL!q1!`P4KI8=*1AO*gKu00Vhb5 zu>RrBkEh7XlHXzZZV}8!9lc$648A8*Xm456C!i1ua=PvLZDZ8Q+qx~x+t~pGan337 zY$jixwwiHJnk{6%#q*-+PWyT6!~uJ2O^y}0P13MRa>h;ZRT9o$k3?CA!}v4{@`UC~ zhS2O_WCN$5FM_Xk9*QQIiikWL22_B%g*!q>?z8YHGSM<(Xp}^f(*GGshJ~C1NHhm3 z)OOw+&OCrJtmfNP_K2#4)Bv$!E7Ii8BXW$|1;iF0cu8lXN%@`a=j(b(74Uap*g)W0 zD`MRv{83Y~%*OnXIn$kw!?ZIf$81OkeeDZEj?)O`n1d}tPNOCVN^2qy@M;Bu?6d2> zl|OUUZ~qW!X^g)J?A-V(@FHWjsJxI#jU#j5Ma&C2%IorsKKQ$v9CDf$}qib#6>k+aOk?|Tw; zo1pM9tW7?vM*ES$|o-WH`6jLIjq$Th=PBQyQ)bQtq6{GnyNF#n}< z;B<1uQ37y%zAx%{@OL0N1tbtnsGL_wg65>!S$6ZFp-5)WnF>ri(?FGp68J4x_&RWd z@vX*<%5#1mf7$u;sMv>f|2E98I0U(;l|w3^YPBYVPwVMM@7TN zZSgVMNb?0ht8wkTu3i}l`Y;YAwKKnud?K`x<_mtM31K$3sf7j*q-%m)QgiHg&IcC) zew~8ve|;14ju0ga_?+F_RF6+7N8L6-I3;d7@7ft4VLL$i1Fy=bWIG*iyFR7q1@wA) z*YB6m^yNi7&J4A8LuOW;pNPZb*LY-zibpDfm-F>6JU$J2tN=fY-5!Y?j$nAop*hE+ zb7@C54n(daGaKeZ^)Y8=HcSTy22F0g#bHGFU7&CwlJa(jOgggtp9kt+>4<)hNpRf} zO2sbOf=p&O!vEK%N365}&JwK6_myKZI-r~jeT_&e&)a7%Tgrz%`_{urbrc|+E6Dq> zx>o~V_WuwIBHIh>SE_rJBeE<6gI5r@9>7a6QWZETXZ})F#cV18lLGs(%#pYkMP_BD z=j`T*wCr;GNf~RT$ttK$HL78877a$fAq^(p+raBVs-HuxthD?cRxn^)oGE)$N&kU5 z*-TSzVsmxqcHtj{)a`6=V!_pVb4k71C ziXtt=H9s+R7AvYG8aeL=jGYM^G4ndC4MEAdz(k%D*95mSmBjf#;e&7NZ5aS9fT7bc zW<^8jW`aeuIhC#SB6^Dv<>$8oI0L}_8dhs51qVq65)G2_9z9p6wnj6^r1^pkH@H1) zC`?JrLiMod1Kemqxf~AMF#v%fVm1bJm-?cIU?uPj98kb03`W?dh;EPP(u2syDAr}r zX%N9W{toOW;aJF5f5LEsfupE-4nBPR_wF-TkzA{O7cy{sxZ2{zGiLN({R#Q`o=hG{dAGQ(p4B>|t}N(kf-lNBd7MBEsGXEK z6a=!Lg&>iB3ws^;<}h?V=)xR!Tjol+E1%9+2wMeyER$Zz9QI`9Ub#Ojo`tUv(gNwN z=+QWRgEG*EtY*A<4O7U<208A-d1s33_Gh`K=0_$V5w3PXog&v!30unqF_l3!B8=YFafM0u?d$n1k=_F`qdg+ zwc6U2R*HDTAXhE6sAy?zEncc;8nv`4;&pzXwe~(UCzDLux6k{>`+FYedCsh}*Is+= zwbx#I?aSF`pN9hwW3$6}ToOWOFx3@;5aT)sM2U8(V3sZwT(@0{B4bvw{>PG;41)h} zmap)?DW52%fB9^;AO$R8B=>(@z+$@|7JQ5b7_(0jDwz547JMZWAxx492jiY_X9EX4 zeiCjk;OGNHnb47W786hZ?)DzOViFp6Sn45q2R}*{9=K5BdT;$i(mve;e+|9HM(~SzGS-La=oQ$5JqSTr$U- z*&YZ>DIjO0Z#s2|f8A*OTex*+L9_(L>U>rB#$~%5aw8k;kWV-(*QGx(^Neuq4$iJ( zI{s>g>~|O|MW-rWDr-O8S&#EawS3qG&E8K&I^WaH61$wM>A*+z^p?8o#+=OBS(Ry& zwsb_0k2c7bj8oH|_(a+Gk0Hh;PrlX~P1Jzt zeIXj9+x3LKcK&N<-8M)GJhtdxE#J+I+vCvakKi)D>zR4dYhiYwTFfoJB9$e5pm>uf z{B2Kaw)!4(c67bwjeao#ci+4*xM|9dcBBfDniC%t2z6!_OD!>36_u&BI#1mpWzp&Z zK|5p9k*v{RyUr=gq_-ucO>ROUGE%z3i!?~mS2P)VcT=Z-7_`d-S7J;a?u5?S(kEBXn8UA$pHB#d4p_WPKyk4Ch7 zvi=t{d#|3C*W`@zE(r6mNl)}V9B%h5oq!iSmX#M?Qd^Uzo^a_%W`U1>)AfSi4y8R2 zdqwQDPeT8yOZxhQ*6jsJ?cUJyMwn*whmb7#$?3VQ_d%R^?xx$yO2wIqVDu$Qe;?$u z!XQt3dVi>X$Ha5Umd3YJtH)~7RvLXGWc{PJfd18&pb;q~Cvj36(W$|-;8&F?@>2#CPk-IjALkv z)%aKci3sCA?rw_v4}A13((B+q^8Kwc)*tm2^(md3jAw?(P485<{j?GzYo-{XI11^1 z2n-nq`kE0m4i4M5jf3MNtjlm{;~1yE?Q@b3Mvm^qX>g;hmv>^Y#zUOJRp9KQ(cv}L zD;r4joG)If9wIOLWu)hQsO`)!Ie{Xq&$#7N?ZLUxvl_L@$Lo(CQ0m9O`meCFdQZ~y zZ-}wAI~Z+l6+-Nb+fCfY{l}=DmZD>&pD-1CtCEqAG=D5*C{FR!3`&wm-^bcRP)g_A zY`k+=VCF%vw z&I5U9%7B`AjV{Kq^vdf!90bczZ&Z}5P~V}w@C3GpGk9jJc28Dl+%6s7{Dc}*{~dg+ zfZMWBF}8dq`ZJCJJ-UK^BBO!P=((W|*>}Q9Iuq41@KooNN_i{B9gxnlwj%9!a#%&4 zmcKINT1ipCvIS>P3RU|jq0WhE{!KIZRE#88a)EnFU8ql^Z9xq2+aWoiO2;}v?O*j> zLAP!X$>$Eeuls1bYwTH%146? zw)UizjT>}rX;@#NYA(Pn4K5HjWk~(2uO;J3d3o!-=xZ3Gjw?t`x^Vm8qe%;w6LC5<$|ASgi#td4{)%g-BAFAiu6(U!(7KGdW z2y<4R=p`LONDS#XkGf^;o)&%AwK2D!$Nl&frl2>xzG1Jzi>)g%FN3aPDFY z@X8*kJr=UT`qxY+iDdCSFkv5HY&}_p`d7~q-g0I&5|yEC4i1Az+W)P>qH{3y|1u*f z|LW5TbJ`;BhCJcP`XaI>MI!I$rNYtpOZw;zHaH*}s5oVISAlagd@sUdKJq z{e|1#!jvu7rz_iEh(G`MXE=k6QCeR5QRjcLDp@0uZ(ap?Jj9?lzwF%Q`PV$J<*uL? zE(o_rweuu%saG6w1ZrJyeVAS@HsYzYy{2xXe^gP6MgPWpj*NA z(Rb~lhv9+}qB|8??0vo{=gZhVRI(A@?2zF7N8TCH5iOoh8sEq@gO8PseN1}nRN@S6 z0>_+P=QaVi6K$cyKDX(yg~Rg#ugXn*$~;B-OlhT+w7LA`HW&AgLffZ3J>!2;-k}_P zoFwbRT=V60K$f`M2Orz}ZEYtc#-4RvWJ}UTNoXR~YRPKH4{E&hx#9;_FC<3Vhny`k z_}J*#66`ZSGV)6wuJlF1=}AcOUI@#9l^r?az=q<$_*SeTIu0UC(eJ!SS3J4qf zl;-U17hh^XHv{XLPmGZiU3XLtRxXCl*yF2W-q_?^c9r7{mg6thZ^Nbf$s3%9?ktd@mpd9huF4DCbsY()E@=F>tQ z$IQPkK+R*~7lY3YwSOb|Ic41bbOg>pJ@QyMK-M}4rV{*ZuP~2i`X(oUuX~$1Fk3V9 zb=ouZtwULA4?b=>J2BD?fPgF~oe~w_<~-Z=UNWjc&F5sigTx znjd8%7wckPfn;92SvkVWGFdmt$p)yTWb>o{kS`)2bB`7>02pX{|x%`kP2`#f?o!eX$S8ZJV5YM;&^@Ym8H30$5h_oD>n0H zMzcXaKGu1mEUI)|9FQ8#i!yE%eThe~33{I~`eqlG;n3To^^v{C27lQVMqhd8>jp6~ z^hE;`1C$3ID2-&Qv$LodEFHe=pZI`^z^q3-iPB^uSSUJkFm9RlSBcKXmdQrmrXf~_RgDfhTGq+%vhYqp%h5M`3q$}tFZ5g3+VjP`nbYcLuvbC2ZD@^g6ux+_&RUU zV}H_R%4j|~?)U!AUDRGh$AY}x`{M0K$5MvA_c{EkHXF5{sSsm7i|>xxPe>0+GOCFF z2$kzRe+cHXm?ymW2rYmkJBcvLl~E?1T3)G(=wd@}>NESF{-Z4)S#E)ksn6_p;`kDS z$NtM@q@^W_o=%k+y`T*Wy2hZTbBK>WifA7f<~u*SR2@P<9fEwDSV|UPk3_z+o`w`1 zN|!F>ZM{~i^CGc~+HzZ)bL3g9Je}2cP-g1%(t6tt%BWLW2Mp4oNHgH|K4>f0Sti@s z*8N(1nWm;@XYpjAq8;x=q`W0Fy{!Fdt(S27Ul@V&&e5>rDasLYG=iLcVbexBVzy zt>N|=dAv?5CKG*Hsj(ZWr}AuRb|zw@Migs3m1j${Gx*yqz7*{amBAQ|3nvhjT>#Sl z%q;4q58QggqJrM6tw&m?5tZzoxQR=0&$)9JYNxFY`E|?|qi{ z`}_}1G-n?uM%ph7Ijls3zYMpokm^1SM&a6tTHU6Sr6o%rbq$KNeH7Jv9)`uFO`Qt< z4h^q+M5|Yx#-siE3U*p|oI0%csJMSa56nA@W=oH|^^J^B+Na@+6?x7+3`Qzw-{DxS zvqZKSr3KF=(`$Y!`l^=Bubv`A2a}`dexmB$h^;&K!X4}#k_tQ@PH6GPJ3ST11l3hS z^eJ>>tVBA%&K23tta-*bW|6n#aW53o-X>~2+C09m$)xej@EX>fxzdc5GbVFwTpQGI zsLlD}OPG+v&G0Kd`;j;uXPrDQH1XZ+wV|ryhdWYMB5Fwzq4kLZM?%dqePYf ze$VpQW0z-j*KOwyt zO-#$~W$exVf-*bW0P!oHr?f5?2UW%JB2-IKSx%M)#@LF58t)k6S;`Y1W4r^sw3_xE zxGAiOHb|o)ne<5Fvh)>A8JDpr%{dJFW!RBd*}hMBvlh)!3C12OIsPW2DX%i^uXs-H zctiFP(=FXQr*F69jyHk~F^#{LDZ16i60D=Lqh9rq*L#=5yW<%kob!9OY#xOjt7$<_C692l9Ze0tmDiAx1USulIl#hBYb4MS< zjaRm%?E4YC9esco|7ONd?l?mP)^$N!@9}YoMr2XfreE)r?c}B%h5ryK|`&+x}eIRh#K z=RGi`*~ctWxRA= z@4c=)hPD0J1dPw);~0698?U_Y*0{a6;}}(jEC30A?>I&yW@|*Bag5?i44(0WG)S9a z^b)sTrF7X0H&yUxIcPFpO6JkuYOkYKDYdnn>X(Xob&jd1lZe(ts!{FVIji4v<$pI_ zd0wInybH+MgPYA?sL`--2!nLQVjY6!puWJ4O?M)v`U0uSH-u~ZP84UyrU6a@V#~-p znQY9F1B-tnn~d^%kHG)vdJDr9eY*s?<71ZPc}{>)o3yEFpdGWED-u9<%`Rb4CBv3k zQJH;;p0#1QvY&+PGRV+Y?XB*)!JWMNd^+@`{IuBXCo*LyNHLmjtmI9HOfJJbo7wk0Ey z_1J!5s1v82rWs2x-T-}Wo0QynG)Pm4Hh!WRS4zgy^j7Tortr-8_x6L$IW>V{J^n-sElOIEvR zbI#Wk!G=Pe>t_y=Go4wr!0l)Zv7)WD-r^1j*OofG4&8M?+A&+Zbk z6V?%vrwX1&*CwTby<{%jU<*dx>yszA@?xK-IDPobqnktW(il%e<-OQZZ%yL_mlrwY zdcDGl+Z*v{;W*MxRn!!J^JvzzoC1LwBAF` zkc+5?&hbx@{vifjq!XYcOw$=YOZ<6-9H!42 zS`V-AuYOlXk88-Tb$bR&v1$597mc*N=wG>+LNTgDh@G+}$T8n9Z~3U$-zLwYTRxi2 z`>EUnTb9!)t-J+tX#H)sb5ptUwFsXsiVQ2{$bL!vhI67iBBmMPar-!rLO7g5vJb_* zj+eu@{j1;Ro`teN%SR*qZO_o7ix__pg4XS!q~UrSY^@L%O0TkRs|GJ&L`*Qa<{P{+ z^JcU_qG(|VR@vT|=U*ugmnt~pOq5<&fq*RGxmqtn>wKVF3sFMu{_9sV4n*_*w$T!V zkAIzPg4a5bZ;Dd~yEs-!>VS0#3>V$s_jRND$BDPP-^i`2dsVx9Y?9R$tM(mfx;QEP zJEv{s2v7g&BE;;Y`;~3t>$@uC!*HGKs8*v%h%N@>ie8Tea;A;SiRiKx<6n0H|0?!R zWGLJ@CeMm3rjxLnx2lZnA3WP-^Z3{5njt}1uk)`v z#jUSVrp+A32~~aS>jU~*S&4WTLR;o2w{DrWzV?IYQ(sqUaf^Kw;~f9WvkBNna4NT^ zjuy%iCNqX`yF;U9i``7VG#5%MqJgZ&QdiU!Q8&+X=U;aOiYXdygD}Q!zamy#-xG#gU=@bvIG;qS<0!k@-cJL@rJE ze<7{p8*9?^={sXIYR)*l{;wo(O)(u^GRSB{F6$3w^R$tQ$bu zCSNN!9kfx~4&w*u*5mdp`_O`GF2SLE9R1YDC64K9$ch?hgiQEQM)YMyN_M^>@wJ}# zPojS#5_@m&t>~;nA9zOprVM!xB@pVoIxP$$R&-9J(SN<{lPo$ZQfKU8-2|yST>e)~ z@n=<;;{QXAhdHm(nC>RVF}8d^>NZr zHA6_v$jh>Q{j56qiNyM^|A6YZHnD1qG8Py6R`h98`Nlq!{tYnx>tFWJ%R_YI5k8JS zjm5<6spx$F%4MiDD*IE!PxSa#*6Xd|7k$9smG3W<@0}jLw<}*$GaFHG7gpY;KL7gf z30akT(^bc61&SWpKZ?Ffnt1*#AJJiaRRoX+lk>Z%x3+w5{+W`e_%-Ox7h9L9X`=lo z{(Vi*LWaJmWaZMwgzqJN=!;;pMp@eOu_$Kf@tc341kt-ij`;Ik^`|#`_-}IMfnLsY zjegRHz6f-Im%o`wi(cFEz(-}X6!Ni%PWKX(Z))q-f!CsEaa+;;bo3I0pj}0W!(8Ba zU_u_2&-$FVBx58V6Si{R*)V711~JFxoLwc^lqx3YV{T?FEjOV=yNsb*KS(?N#p_=6@z%g~+k8E2LB|Wq5z9^~E>9#p+qw1UM#8P_ zWrI04)0`RC`hkclr{*D}yd!Og(c3zfXZJpgJiE#Ui~06)mVb-fkWS^}P`uJU^Mx() zE(ikZ0k8US+^IKtv-Bu?46;609gyKMwiByYo(rjO7TqFNPS?h8Fbrp1SqikjxRtNyha^ zt}DU$iTZbStIu@XI1-N;`?0b+qQSqWOG7NSG8$OZDuD&hD$DlQO_mFK9J&elhOyH| z*6mMh=3t*#>xZ$($)OIO+bwv?NWdl{PSxlfk`o&D6e|$EMdL!_o?ANF$f8p|a@BmA zzaQEq(+L^ivU`N{z;{V!BdW@m@$NRA*Z1y zXF6x%)K$K@6^mR->ux?ui=AiR--ydw(pTO;^^^B0bhcz$XvA}&hhH4M>G$7$>4Xxb zWH!4$^!_WeLtFp$d79a__QSn*de46|P1!aem4ffpi+)$)CEj6c)-Gz0Af_pBR8P2l zC^@GFP8J!sU4MIiP&cFWC?p@qFmvX&3)*_sGqqSiKY4>U<9Q5HBZG`$XJ; zGL-Ij?@xR6?*HA+qR?Axmv*2-H(US4-bGnz_R10W|Dj!U`)VGE<2n2IKRB>D;cEQM zxcskP&_{lnh#08H9@xh6oYeh0T6!w5MKc=5DME)s{*s;X_A~B%&f0b3wSGIzcVY6# zBGmE7ZjrC!fxUp)(KkzIv7YnY4E>6bb0)JgmZ4bQSzPSwgo;1`fkNjY6JW7oao+6c zPYHR_%Y2;kMfEJp5O-{;rXIJ*tC$qJ{t&P0yIV)&FRIB+Knuf7f!z34R%H5o#fNq= z55Cykal&U4ckTZe)w4C4QG94;CTCzqj&xh&u1rwrk-=;Z4Ylr)Z-q_#wDtA0NXE`1 zZ~%<$OZ^YNLf=#>M|k|r*`eJ{BrLK>g|Qk$;RwjN%DP-4PlR>3gd1HzVV7N*9!|o{ z+FjGoUD+)vF&k_Oi_#-=IpF?G7>yk-Z|Oyj7%vC3G_%K6SIT&$OmY;HHmg9a&;)u{ zN&lj!c(~$-9(YMG=8WIS5TKSjx4nit_4_?~6b1X|g-f<`8Fdvrv@1w7$Y?;b(Ib?8rT|qb1nxkDL@= zbAA^*%Wu_f0f4)u29-_BKD47)>CD!f!-j5bA3A0dd{Jyiz`yb^8b7onFCyR6C?CsS zpRtE_WSh`9LgNnY$W&&<`n>lo!>qT}n`sDU#fNsJD_xb+*#{`w`q0gSuIkW^G^MLn zy7vsf|LsFp4_)=4tu0E|q;#Jcy2X9ymO61Xlu46xYtdPMQflkp8K{( zFE?*6352Niq9C20^xTH=vXbG zPGV^H$YidW!xhvHmK&-(_NLqy(HDH`S+ zF;U!$w2(Bu+nlzua@>Q$k=G|Aar@u2(f-BB`<09lBX_y2L>g_lLo*L|JSY-5Upikn zu@%QTiDwki5lnlGJoZ)3;!Ve?S84kRQv(^F$Rh&$MeEz*GNyb=B}-73>B+rK9KlfG)xC92>l$yVuqFC>Twdp$pp5j5y4!D7vQnORxvCI{ftQFy&$i|AMnD(S&jX5| z5#@wCZBDkMF=v zgiypkMCLASzH_3X4G8Tq&<1q#(FvCJpU~>^y(_8IX4HIJTt&RF*!jzNk#9vvI6Mc3 z5FCn~Ka`r>6I$Be0>N4t8lB4_Qb@O^j z>lA6VbaSt1Win3HNSLZolIJlTH5gC6_Y&{iZ_;jX)81mzN|>}ta*Iv-B56hWG(}%D z#%!_(*T4M}U5>EbSB`dH{*^xm`>(pNsH{f>v3>U2r2T4FbQNpCzq_RxDdgD=r|jqughw`<#Dt62@j?I*83SS=?oFY4GgfZ=D~ICT z%y{9CaMEVH@*sErX1s7@q8+=V1w96v^>3L+{u~p=<4hpu02#L zDC9;*2|OgyPbe)A*LtsG5;NpPJ@#;9GusS-^SY95I;X zg~TCGnZy@5&w^xkMK%t#4D1YCZy9~COrF|w|8eW`0^CDcp~cDRz0i*pT(QON6kR{a zJ2st_AsK0jmR@)2&ll^EXH6YU>lo57lwz^2^{^gffUbCkAeel)<3N`ig^Tr%Jp4nW z&BadbIAOA!q|JrSOcQ`%bDk3>peG!NeiH6F?yZl<#Bs{T|MvCQviN8G_0BR%)44pY zc+=eIKCo_$iuO@{EXvE7ij>x%r#jkaM1Ohb?&zuHV8`1X6Z876r?3x5)-xjI97WEH z)K}*_w~VI=@%)x!oZ#hip8SCrQS+B}mE=iIW<`X3>G{t2G}hkVsD0RVm#*aXmf#Fs zDKX<{JtJE(Y(A6qg`l*Sr=6$Bj(oG78oAL;xB33I3d%wC$QvXNVOmokG{X155U=xl1Hp5fCQ3oXey-g!2x6+aoaUxPTKnw$wu+v43DWT?#Hc z{>biO+KdF{ZI_p~oGpANf)X>EOIml{BARMEU)BS7UGHin{uPuQ!0-|F-Fi5kLq{Wv zTMuV6Pu54_Lx$-g^3GA{vV8{!(mvjMj_S>seLMALG)o#`<>aGQSNl?Ecf8J=$oJSM zpJ?qkXC~71KABkGaC4KE>D&QL`;Oi&(mB({b592F+wA+)eg3h{$)Q_LwX*%1J=q5J^SkF>s02VI8QMW7P!pd1!OrMX^SrN0V zc2D$faqY;id;NSM`Q*7xfB8-k`EC&HCd>EtvsAt>SfS%$mcqu!c?m5cS?2Wj;S}0_AYdg3h^;jLb7- zkN;v#ZFpx1jfrFVGh4!)bG8?#hFQ(j+~$aM5-&_^I6ek3r z*J+i#q8W^N#}G{L5X^$WZSTS9dcv(NL+YC7H0PV>RqJb;zbzMs%yF%#TV!ogX|hHv z3ix)F$bm2b-44NM$9aHca_rQ0|H?lR({a?Z%P7c`%?%w{*;*u?lZZuhjvqm=HR~0k z)0{79p)}QQVx3RU5bf-8W{ACMUzHtc8ujGE#AVpe8|-olMhlUi&HSa+a=YKU3)*4F zF+Y)fpKV^_T#56-kiNVt>-&-yETT;m#Ps*hbNT9W{|ABA6YYH8mA`p{RL>ARATQ0| zvn#9IP0WNV)&=f+$hT5N=p559MoaWp0s1|6TFi$lFaoJ$SKVngzTm*n@5xb0rv zM(fOazA2z<=3l{}viY*#4r=#danf{un~~gSpG2@i%8EKNSHO?VI+c^hK4-ve4a{_q zEWBBWKVO*QfSq4p5-@Bgm#ee&06giC+bwo5eOGp&EK0VhYkeh?!UhuEJmuUIA@#l}Y~1eH+L&d2CT2DL289#aJp&ym-W zHDB&}ng_LiiAQeYvzh@;6K0@pT1I(1a1%FtjmX~JU%r}pg1$|FX8quz3kA4UCfB!tsVhV*KCgNs;dl*D)%TZc@T~0aLl2+tjBd31|&1;A+k1TdMe>8<--!(o) z5XXx!(zi3fc+TQ(6kC*+Ja;&!NHkVayWfeC5gTIFRq=Gozw$oF<)jt7yu8uD7>Scj zc*iB$MTC0ZM_3W|MbAYFqwmfO?`Zk(c>n5+lnYll<8-{-re{O7L-=yt-q?Yz%@d&a zj2AZtlfoA#g)d49&q@lj3$+hFc69a$OPzc3W7}Sz@U*1x)THp&lfqR=;VDVs$w^^x zxZeCLlEOTw?-M^MDI87;hmyh*lfvamVb)pt@Ta%z6E5i+Za*xekwkl&G0nf}xHdk} z)k{UoSF}5`qNifhokvYNO^!(9J1InTPP(JzgX5Q8Den_K8Ll0?rXp=?>}By6!H1>7 z6Z|?uO38r~&}Ft)$Z2&#r*=Wk!Ld&?^PGBD8rgd79)_L~fjGY%*N( z-C+B(z4vQ+u@e$UWUB&Y^l$mlzv=Yo=S6A>tDW`U*|k~htM`_8``aw`)Z3m2i#)NmwMD*7QdNByy^kn13Afh)W;>94MD-&Tch-h;nECvy+ zON2`#JR=bn#YW2#VNqCgOd_lb8=eSD1B@P%2ulNuW+lSX0Hg0QSFrL*1B~jqOHxn4 zhs7a8pHIX~g++I`;myka1%jrYH!FKN2gQb!y*-ji>Rs92lZe;qyeSdZ>RgowYjrM3 zgta>7C&F5tGZSI0&hkW9tMjZxSgZ5oL|Ciy*hE;Xb5J6z)p_XSczLus6VIVGYjwVm zh}Y`enFwoj%6>+x53SC7;$hkaLxh=(LyP@eK55_PT)^$vZR}8(jbCRfvZ*0$RIK;U zG#G4bdr`W&g5FX`$3ORKk;cpUtWh*B#!!pDd3jCXn4tF-GZ`nh)#$)ed zbuPanz}J$!-*q*9V=Kb7VTah0`j216!@-BtKAYq1{UJ3lSvs`xs)5Z&gw?)iLf^4tVCG- zMckik*6cm+b!qmA=MI}S`?nMAO|yR~5!UQ~n+R+6TM}W-UY@@hd)=(n{ewhUt9xA{ ztkr#OBCOTjkO*saeYkhkYjvNO2y1npo(OAoe>oA>>dsAswYoozxBtyr-ESwt zTHP-t!dl((UY9MOR`-@fSgZTz@i5=#@|%EZAHnu#qV*u$_CgCT#OFA#y~hJd|CUb~ zU_1Nee(Vli5aDZVA2F~!g{CFL*iTNfW7SeQlE=@g|CZBj)GH>6MG1e~Ast;VOVdba zw~1l@FX##mt>wTiIp085g%*<6ZqK@uLjwLac;WrG-a4UpeCMZ5;6ZA@zupJwi0{Huw5C=65KN(d4d?5Je{tgz(d$|Ciu+^it%(jS+Cd8t ze%KycVxrd&3_c{j!OpWgZNG7xOG9#9!q~wg$#VphyLQoaO+#VN4_gf ziX+E3u*4Exq^aSf%&w&Eisef1o3i-ka5d^mc6) zztP*iS=>eMw>PVoSO&|@>K_{9PCdgsxl^BTvD~RQsFFMN1M(j5X7vC?a;I&d`FPB< zdfAa;#t&bXJ8kJhdoht#9q zuea(<@6=oMqc`cTy3h{2RqxrNx9T{h-v~aWKJ%M;tL}2H-l`7d6v3eB6T^C|S~yQ{ zRSjqAt?EJc?FUW&C-2P!A5u+xUT;+uN9e73z>n1+)cO5GZ&e$w>#eHeMZHyh?A2RU zh>Syn4+TXx59_V!;TPQM2fW|M^U+#9cHTS4P5bufvmmf`>+1eWi}i2$!1=wz`nR0V z@M{mZqn?!k7^nFW&G(|B)v&`${NqG&kxe1ozb^N`GxvYweiXidhVOKeTp#Y^Sfal$ z@sASU`x5OLZ$#4jCFu<&s#~Hwvr+bYOb@p28}%$}$?t7hK(XvPHrs?>cB)R`@k$Xp z2;L6Y?t92r%yQGuzKFB-Lnp7~oR{tfzGrQvi6-5`Eu*w z%Ol6LjCi+Z)QJy2Xv2%0Xu^N5bHCzH|GX$^{WK=%<)oJ z$NUjYs3Ut<*7Mw?5fN(V;5zw8!6f!qgwXsXcCLhYd_O547yz;=9x4FxI6cJ9mPzd1 z2(e{k605qQVqh`fF$jg)CxlpWk#@>0HJ=qQw`_!$r8rYBn`zsz-oMBFrLMnsj4wkL zX9M*e+Lbkid-?6kI@8{1a$8>=S;vEw6ZPdSf$VKcn)nM=e!XgL`P5)#+1$#q>7gm5 zJ`W~T7A!5B>cvc$QhJd$48_#x6Uu_qy~xV&2s$~nKHK`ICY{;IC;w4sZ(Z5PlTYGHlwm^s!bMD7IUYTmCu+~ zX1PzEGJS6Olo^T4rcIeKwWMrr#gvi@T$-w>WpFADPY+L-Jhwa;u5cs3PA)4k=qaSK zJj0V`1}nm)bE|^WLw$-gb?OwWoM{(Lo*tYvw=97vnNnF9oLoBBCbk6)1<9epOE+V3 z*{muuEh{y(Ua;mtJiYe2Q5?Y1yPvwo6azS5? zHm)39q>f0DD76eGCMj9m#=btIY+7G+B}FAAESpt=m=nw9mX?)Z(|wEWiL5A_o+55S z81wPA$#^P_NtNG>$^8-{`;37F=^K;8(nO}uuw&|7$B+0+4&Of2hbtcG5&1LiFeWtCOaFB*VVu%vJEGpweT zO~PvpKrYU8V42*Q0VSB6oXzxEbEjbzNqHo&NnD5!mmBUYQUcqbeCm{niU|Yc8pkIk zp~lO@Q!59ODk&)f~c-I7tr3LAIOI$(skBP<7*);R- zuK(BRGSB+=W%zex{CDvK=|FJza-hefGyeVc|2o})|F9hYNm*0T45S0WxdX32-J(T} zi$?fr0@J2dm_VShwzhfEqPlrLLDknZ%v)Svb9r50e$9e~AZr4P8*4AGizE}*Ha0Ju z7iegV1Zoy8Y^<$`)CI1nyP|Q?RlWrcOKKJ_m=}=kv9`o?*Ju5Vl%X{foPF0in%@$%*-SB?b@wT)La)kGFty0FeLT2i-Y@q)$%UqX_m znnjCkA1IU2UXp9_3J3 z7S+|(Em(pI7S&zZT(>w9h%C5**v96FZ}C-&BXw6OVi77^>P!(v!mB=y_x~96i zMSN6_BoW*W40b4wEoTs#I0layi)_0 zVfMo%&u{}~)ljoAnMutRS2oQ}Fqx}N=0;9CPj4h`;pw9aPcJ;JX;Gc8sv;Pk>?@mP zrb_TMf=mliX~q`MkrXw}k@~uZh^^qc(mtCP)y-AC`s$X|(sVDYn;XBmbV0*BinrLe zsOHj37eubO^0ZnXMmev!HsY&T(9pch*R-%ELJPQp7Swdrq6L@LM`$vF(3Onf4S`@oq_Ls- z^3x4F-?X~AKz$_AwD_EnBQIMJsc*jYbPRE14W!GyHPTaJaY8x`TbaI?RR-E z>U+E!e}jQVE(ABkb3fYB32pLq12{K+o+nK*-9TYCe>Z)mhrjpUjUR}|Fw!jK+UH3t zGR?aw7W?={;}a1_kWuIKGIC* z66oe5GDU9Xx`l@w{~L?lX5n@V1-Eg%iIe*|o_h&D1e(L-6kc_izck-$J<`X5-}kUFa2h;@$8@p|kNHd(#X+>!xv` zo4=dho2U2Qjd#;|VHQc@dEsc%xapUB z(s*f7-Mjf`-eK|_YN62or}<}+zt9SF^AVXga^1!C8!5Ym+u<)^xu#p3H{Ol&!W&5A zrl03YfXEYZrBU2 zAdMS8&y&VWlj{C1OFzrz`{;j>{|)dESp~ZJh)hF&M7#MRc6%4{S-26LgyouNao%`0 z&I@0I&P{)WC%u;@)%|vx$D20YK2Q4pH2=HcA+!SBd|u=J26#odhH=faa3kfCuw0`p z^v1h!Uf3qOu(YL~G+vri_iq00+I$D!{a@s7Wo`51EiwtuQn_qd1wLxSaz77xf!=sG z?1lS~NpvMRk=GmdZ|`k>nfI7F2vE*jo+o=je3e%&}f5V@+UE}(OYNNv+xGfA5pVN9DC=?3OC z)){&`QwlUO&tBTNXkI|3qGo1$dEHfubp+iMsh4@@+$)+Rb<5@=)8z#xD}R}XE?&G) zQ8kMe)m$~Z;gS(PUtjv>hJT;J4AlFkGpXDxWO8W)7?FbiK$M1WO8toJas8Ck*VSGg z817Eb14YB8_I+RwF{YctoqTQ4%dFJrsvry3D1N3VzC2Ud%1eJHgI)wb#b+DHE~sQRdE$_ z6>TwPo(TuofnTs_ck;Oge;;%eb);;QDVB7Qe{tl`@K2kyBxbKT3eo@)))GOl{A zSzIBmv0MdQ`CQpthvDOJ?dRIfwVCT)uJv4NxR!D4hyUW2;KOwZ*Ho^FTt!@?xK8Fe zfh&(Ii|fNb$6|lydX4K3T)*Yo#^^F z;WXJ<<{MexctzbABO|qoN9tP6r6VtGUa)YU4d`;f$Ug1;(glsD*ZO>ECuE#^Tb9rF zD|ocL|7mP9_dP!96u37Xy#fOn=wy)3cOV;`1M@zIEdaZ|Oc?}zg*rHb_;b;%z+!X{ z3jy_Jut5nI{{V!*8?{IHvkU+cMHA@ zIe{&}!x9h7V{^z}U;*$Tuo#$Ej@O!~q2 z+$rb**aEBqb^+^w-M|)LaTV!+2dAO8qo}ay&;y%*vw#PH>jggpI$-gIq|YTD*ad6> z-V5vk_5izq`+*yP2Z6p>)C-$+T7YAL2Y~ewzL`dSD^&AaE8iZ#H%a3;?@; zJ-`D%-yHMzdB^_`q@Bpw1*nI{00}lds3%-eVdmM6Hi9Uecz}>*EMdX_gf8bbP zUNd}w#Vg1U7-*qf$D@zy$QRhN3ckR+@1VCYf?o$eU{@F66OaQq7U;W`asj)3NPP|^ z%oxi7HUaa#1RZcJu=p1~xzstOl-;@Gq$^U^g&30AFAL*aI93EdCYrz`_TR7uW*a59|US1aH zSOCo1NIe3JAEo|)2e&{E^gRweuo{^E74Tcp3$W`6`N-BMRo?TDPh-XSK3{HLd2aqBf6mhE7T@__Jol6{hoJ$Jz7)9s z!%t(`>4Gso;X8+G@5i6UN-R!*;3Hhw9CIvvf%_BuTCNT0v6wQp5yImxuHE3TrLFiT zpf?#d{5=bZHW`}Yz=4FB| z?~9&@W8^oFE0gj%$D!*C0wlUVJ(QcjPWX3bmgN?#%_`3=Tm}EJtw)sSR$X&s?pQJ; zmkFL+%5%~u_Kzsd%?_G;q#O&$r{#oLY%*=nQx4dy&4it&9A~8UFUO>ujJ823%TWZ& zJ@A)zlt0Nd{5z!_Yco*BD$!GG*2LW6^hrmm9)hlVCK>re|AVQ&!f~h$K^Y~eE<{C@D~8hqgrOTQ4j?;LE?rLQ&gZNh&5 z{B7Xnj2fvUI-m+HNcY57UlLOO4K3?nWRKeQhFZ9=I0!iHZ{ z`bw9Fq(2q9JjR&b^nx!1UjQB#tMyRh)<5`S@Zvt*pU_9Zj|D%|MFIuC7JSP9^ml<@ zHURyj;CsMJSL*(xKKFs&4PM(Zi(my7dYW<~@>LFOl3P%sb_W3h&x3R*8Mlz`r?eZ7-Q%x2Gu7@%XYF1(p9(sk0egnh)XhQ5 z*+xFQnJdT;+5Jg9-Uhx0e4QXMWv#|ZIdm$f9X(2X-bBU_60hZ=U3&e!l&d1i-`oC3 z_Z@AC!J^BHnr5fW@aFMu?ybP3ker za?)#w2=$Ao$PtANlz=X{KU#!0cC`n2_l6iN38If(U)0C0--T{Jbb$Cz>}oJ`G)bR~ z9|nH+0Qe&CJ>W5~_)qvu2frD7SsaV+;C>^LG8reOR~@;HA;3-sFMAjSJdL^kHaEL8Co~W`n3Fzx zAUwkzdYf%K_dNYuDzJ6Xs;sq{of+%WwLh88oOKOzT&7IcuByaj^(S^0vGHo}+Wsrz z@!}tDAbuI?&z2N@>haRt{E5b;3!g`!>w=CcoXuxSoR8GQpKQFFw~$GH_O8u8;SVNC zy9voSN&NvvmOhJi!x$(&P73Bs?uUVw+#vg;neBwXB4+UQho@DW#;75a>H2{4Dcv-7R<}(j`2)x>Zd_ZlqW=hq}^$rk1Iq7YLOWfvAF5V-+Tm{3yk6(Z{ON7jL|6Ta!SH@zi zE&uDKKk$zCz2ljtj3OD%^dIq;shjHWzKnydpd52#jbw5xwl(fQ8CR^!(EdZ`6_wI| zSpRu2Eo14x87V_)7x%-jr;6u4+?#emskPspsl}CkTjKUXw;MVgk81lt9YR<5jX0h9 zf9Uo?S7`aQrZ>df&pdELX`ly)m(SIC{C`saXXP(W??g@gM|~wZ%>&}?{7dYhjeORB zy>I^~_}jpDftP8Y`xCuxwDimWrCd5+o0!{_UN>O%*?v&?WwQ3Pdn$8s%db=Bm$n~O zf56Bx<2Wiu=9O`WP@XeAx1ijEP!WaSbm2FRxw&8x{W6AV{R=gbew&vaU3%$&>~s!& z7yM?i_V(Pr;xheftj(`Es}AjC4Dw)k|9A1oW6QtlB#Zi^i(>U0O_1~ zd#2#t_M8|GP0sC3%lI=28;dVb8u(n0lgc9Jr?Av{De%Z7?PNQ0ExRZd8^JyOK=C|U zvDo3Cz;}Uf6+Gqa=jRgRS1kO>0fn7l>u)+NPQ`)mh2LwI-#YP|-gOvSf9oKofNAL+ z{X4FboXb@e-nAJce;a)3FSh(3ayMkj0#N^2wfjpFP+GD7j&DU+aevh)?-4xkj%fe9<3kl zO3N536OsNB>KyDESiB3rf-7RNN%472La*8{CF~fxNM}|yfL6m8qH-DX1B<5ANJQx#`!vO>c<;(`(e?DM5j1fA>Qe=EVPR5!nJCFHYIX=7fh*g8uW_4z+%eY>Q#6PyKkko4hba^~msp(Hw;iZc}Hw(J2$LVw&Hz~Jjxl5-0`!?vhpu1e?sQ-ce zZ91zgeHOgSbLep5Ue>xCnu705_-%mSnZnQh+JKonBiaxC*tne~{6SJZPr|upw26K9 zZ~5VzjO`NBze$$mWL%vwU>fT+O+T;}Ihw9#50)z&Q1p5i_wLo`<&@mrsO|OB1F$okB|0eO>#E+ABRZpa1IKlYK=%Ldk;#2gdNjUq+exL z>d+M9(D?m?99mvJ%X#3foTEuPnrDTf?{c1RUp_Lbof1!5(l@Qhy-=Ppl1|*d`xAT{ z_%-0Y^HLcv-Uhw}d_;(~zF4CC`jILQ3lKr>7;_qbCH>?c==VbZiqKPkYtwaI5>2%7 z{G$;6DAfidhJz(J>DPI~7vx;vnM4|W4&~Wr)A#sPhVaw;!?}UwX8l3rE+W30csoQA zDjkna2frS?G$;2b^|KIs7kII0!|xkvyAqW6wU%FE-L^3vFXg+R_#V=qE{f9rAkj{B z9FXX@EAVCM+i7zBhXF=kVy_=dez&rYF0M}PUG0@Zu3{aYby0>bY3Yw(uwH{V{i~KA zq4RF<-(IJK&jx=XY)v^AVTolqGx?uj?QsrK*FaYcU3)x#U5CMS#pg-ItS9$rE-WX$ z2FklsTbh&Jf2t$)^C$Q>-C^e&Y7bPuU8j~L))aJHB=m!Mc6|W)JGnRZ3!?ZITKZ-ooa(O2%j%I?&s|G=59yv2M6$fs#`C`* z2X%@p7=PS<3jaOA|4yDAOM3NxV&jHJ%J(Mmc|VNBuA*-@{8<-Rl|g;CW~Oh7^VjkT zzo9%>sQyvRJimn>4TyF_1i#T-MZ|XzUndCUStZXKbv>d9X2xxl$}}{ehfUUn6hRsx z-EPutlXPl#tcxW3Ntw@jYuP?Q5VMz~ zQ)@1wU7$v--N#E z$FbP0w*Ie|b&h_|@$7i6nB~r~{fD=9*+%WWD1biir5=T!{fR!O2dJN)#Ehd?J!!c! zqKpA#3M3+lJl8-cdqVcb#~n%I^MpTR9zrb-FzB$4ueJZ)1HYaJ+0y~_Xv5!?HyKvHYcPA?F|fxyN8>ccvPal>}!lXER~zEg*& zT?^Lttq8k&M)%qX*?J(qquA>sKlhmekF4|;e`eBR#7Vfn01q)xd@Q{Ur&bRqnc(R3OSy*o2Obh2* zxWvL$7T#pxJr-`VaHoYYSopeyhb$aaZ1cD9WDC!-u-w9#7S6YDiG`~yyvf3QEZk(_ zP77bK@O29hSvV-@)8DZco^0V+7M5E$)57@{F0pWxg*RDvkA<5o+-czp7QSxbAqxjh zu=!hfvV~_^SZ?7=3+G$7#KKh;-eloD7H+a|r-d(A__~FMEF4r~^SAJ13(vB!+`^d_ z&bM%hg{v&Q$-;Xq++^WS3tzDCbqfz!IH=U-Z{f)no@HUVg)=RjZ{ZRPS6O(Ih4)yv z$-tRL-*&+!GUKKtSa`w9odALVoV<-YW} zz5}+u?u+;Ps>}K-G{eUu+6xB4AMJDd`M!KU?{oY2zW6Wr@@>E07eB-o7!ZGqZ=ilA z!*{Ij-W4Z$S?GO+kKWt%^WMk|U%szU9u_72GJMDTiU-8Iqm)DfDSf8zAF%|++{rK^ z&DXzNG7d`j^{*Eh4+*|HslHCP_~dc4G^aF=oNg^lQ+$6tf6MYYki>tL()X{gyTK1s zu8k@1k1L-l<~JLAc|#^9c%l)lUuGa!W6J*cJbP!RuaSZfh*Q>0yJ{y{_CY z0zZ(PD=d9rkD=GSqTJqW@zu{6yzZ^!_7^VxF9xrB2D#mtg8wrq@UL1v?z|$?u=9Ot z@$S6iY>OX~Zp&-uAG-I8IQb@$=)s+@jI;E`7QffhUuW?%EZ&{(=pHWOz6oCJAz;Ue zb~x>80Y8x5)~3MAyUYX8{}jB|S0)AI=azS;#k=#Q3pJKKEf(+2qjc{KasP1n*m;)j zApk!p!|-?KVRu?SCs=&9Zf5Yw@fZ60s>SzMe3r$JxA?sluX|XCn+jgq^D&L z>8tdlRG&}xv_QYq;@$b)Zp(k2<N?O#^Bw}Z#60SL@a&RNrqncGQjUU z7GF55FaA#OqW=R{epmm$w0I|}T#|aAay_N=dA{{>NP*|KU-A9>1tA%T&uh?&9;zL~ zq{i~f!jJ^-`-MSR_u)I<;y3)r;9WbEcddnf@BId^@8)oOj>QKy8@#?7!0l9v@4m<2 z^_?qj7g+p(!v^optFHpj$JhFe6XYFi$+zV_L+|>T`&>R&PJK5Gk_Rk)!|_IMx|ap~ z6Bd8a=IhR{pSAeBTtgo;+4y?Frw!2Wr?F5V@)X;A-G1j-i!Y2C2A5ktXIOldrH8Hl zCc1n!nXo%B{f5Qwwe_WYk|DX);=8Q;VUx`FT^B#x$nVbge`4`@cN;=|w~pJ*7JuM- z27j{Uvm1OGU^TzsEeeD$pcKN|li zzacDyh(4<=AGf^>xA=o^7`jUh@ReD-?|p;Fu=tBCzQ@|hgBHKg;sZZ7i2WA7+~V^r zA2;7Fm;O#eIM&kNWAS@!dw2QEJKt)bGVtKH)BxWz7GG`o*y+3P6^r-%#1QJceB6Fu z@l8qkJQBf#e~+zSSI!eGK49gK*nDL#s?Z;>?ONXI_Tl&3Lz$Qz7^pOMWbC}}s=beU7&j#W4>=g7DSo#BZ z7<#vkYApWXWd^Tj<8UkQh)cax?=*OQ_let87T?ri@WT!8-3mTn@4etYOMf70u=)UrKzW;pr$CkeEr-tz{mj5H*k7jgK*F2`cVo#k6HQ+b^-LAZJ=QoJSdfa%}^p0In{BV$EUzwmI8lu3jFQh16snqe-Eahe=!CA2pZZz z_WTva)9)wM@Awq-b(X%^+SQ3xtfdy;)MXGZepL!S-Qd5{w@4a#)bcrK+v7+}^E-?0 zvi&vPoc$gX{^glI(n1}wt7Ta{$L9Haa8(1 z^*$~IewyO(!{0R-o^122wfI8opU<-RND4lyEPYkCAw)d=txrM!^Az}JQ{dmS{JVZ> z_`2he#H;=1#G@(ce^RjAX~10;%&eK z&PaimceTYHy1NXqZT7y|Dd?A2`n~rV`a+w>YKt$n?XJ<{Z*}=c4dP6Tf6(F!ZMnu+ z{L_lJ0T1|l3j7KARuA2V*zI>txA;7(pEAp9yo>+7LAZ8Xsd!7|0avBKcUnF^+Y$ZB zrjhf8KkrHJ-fpz?#kRk5+n2nnE&8vvaxS(BUIH)nb}-4_UbXavYYkz*(!Zy88}NW* zjyL@ClE%ZsEWT=uA)aT`oNe*NKQIVALyg;sinl}_P@e+7!sTN-UOkJIbT?Uix9uNY z{r@rrpJ%|keV->=-(M}C!lZJ&Yw^WLnQ_84o9GK)9JpT2Oo0z6o^hS6mukyrmWxmF zx0hRd;AoStzKckjc8l+^dak#8ZgKh8_Hv@d-|ym+{MA{Pu%3Cs?JXAH zW80B+E52V?yf4S-Q{UBvew*SA5AXj=mcBd9(CfS05WJIu{+OWym$x7V{#?aVE<0~> z{Z*yK``$Cslv|-{Qt-LX(jR=@5RS6+H>IHewWY7V#Spsl|ZqWD?%Bsxj&T%d^xpa3S zghq%f633C4D-y@~2Ov&JT=)Y>K5^xS5GTI3WkxP#I8c(Em67oxUc7i)L}kbK-C*MV zgmqb0HIO<1QsCUjCrbx#>MQ4hC@$mc1ZbS4t24qv1Z*H`M1{Lfi&dDqs4mLNg@8M3 zkt%0D{P5slx{})fmBcadi38Rm&`dXk9qOVc%XT2~?i}Nn_*EHDfocGD5q$D(xJ~et zP)Qhh6+nDLgd7V;0i;&P7O1X>D{PzE(X5I&Yd@GiSWC|U${qMMC5NH{8g}giy0)V;xFpXH zkPCsGmjJ194lmBR`3vRx#nYv9Nm`v1fTt?*WX(PY$hO&59&U?NCE8AbJm7{sfqTjU z#d8Es9JuE%&ySB@y7OnxF6US7>gf38+zEM68MEvswM~{7@xu<=t#%GDS3?5d)L`a1 zO(S3DNq$unaM~OLWM)VxzZ(Zyt|^kz_!!P6(H}8``EUGM5*3 zQUqA#20B2&&#MD?U@}B4BAFBFa2}^_3u#G3&xqKPJ@N_-`kkzHbzG?dRzP*etWbMN zm4VWw2%(h4t6T$oWaUFcoEQ3v+}PD-(W80|%&ekl%OmQ*bS*Ddk$<-&WLDXMf9$l2lE$Dw7?+y=v&jd4= zRRsW{xgG;HL4iopgU38uBDGB!>ojOw2Fe@!8iO_ann5E8PL{7OuFhTFWDM+9akJ}k zx2+59m`OS(>&P;dk?Nwo0Y!SU%i7=}L7Wjb!XdQE+g%ehw*;wFXivF;xpK7V<7 zeBvI>9?cGbb(n8D?tUcHGQXK{7d7freRWm_S*gy?E?`wL#f%JK;#GwJsNPMcxl=At3ruY5 zG%#NwJ6(CyCWQgiJd7fws+*$YZ{K9N;&s4@v+$1~9FqOYR7qK!ZR?#cYVj{kz5+^l z@X5i$Cz9_qt4|?Rm&5IhwZ)8xhRaX8p^3EmtdhIvmp~1-#g@f2ZkWV2(F$>X~{oOl_!=wQSI76JEB^?Paq zp=9>FJ{b9lE*w(!M|>9BDbuR&U5UWXDJ2h+gG>lX&~!0()7CG_1({H+t8T*Aal1(A z<3oza^KJk6d@)}l8Gsj^zir+iQc`?THVBpCcn(dXGEy5((gsuIPOr`owr%~0z)Y*h zD@rG%ox!xxt@cv|x0@}jqxP(~wT}3nJR0&X%v%a{d$8a=MD{D*EeJ8i}@L6)|^F+V`DE$nFna~tn&b^;i+|cYOc|b(lBpXH0Fex zkN{G~N)@-sLmU;Hg+wAwD?ZK_G4dIU~2Mma_mm(Vrm zje?u0o19k%rrTWD+F??`#L7r^5rlcp;E-eG?8tQaLUxE%Mv_AXrJ9C0Kl1qj$IAm* zirxB+jKcDSYQIT%8y$~=lk>$hEFPjJMfTS^^U*|;7v07X0!64~ldO?3@uYQ=-Ug2N z9?PFc$#_o9!5~^s*{aNKPLs=`6nDREuv`jg6*DoDes~UG6TB4Z*CRD0?#0n#&Z{OJ zrgBuLx@qdDxP!s!Gw2o73(XrR=OH;%FW{6pY)INvEAAn$t zMc?A|>6lTb6|L@~6shng4X0e0&74l^cv?K?&bv*XZy9c}?BRwiM#WBysE&}Li$F;1 zmJ(;-J%=yad6-m^$+r4S8E@Z=`com&K-=l-42tDN9FVWFokUFND2tX6^e1Zm(+lKA zahOx6gXnr{NF7?XGw6@l^7~^ZbRA0}S>)16o>N9gPA)HKIm3HC15OaL$~Y@-VH35v zjUGGBVbvvBdv9^pt<2!f)1kkiLD(|R^GY;dNO&g*D0q@cO7Y2KvCz6nD(uln7KUJT z`(~qw2ra8t&>V6HeGwR|dt@$VhnW_0YE_{pB<`C%jcg|OELJu^r6`IwAzYl7bs@NH z3VR3zDt7QCw{ePS7x-DhbRMEsrOHGLH3uV~uFFiW(FJX9%3_Z4NXO;fwgf4)C~Z66 zX%S*0o0IWYkA`a|T0v%m%uRaKrN3;}&|YgX$mY13`X1Uhf^)0kPid=uhmm;$%qvhFH9Z75UC0DvS9;PHD z*l}V%Upzlu%=f#4sz&BLwKB(eu#(LZ+xqEyI4o#vU1^cMgRt)#0BmMFCz>eJ?+Ja? zkRM0L-?Ge_{B3(7B4qYMTw9C@^9qNfUcB{Iy2N!cX)miDxjXC_PWf|b=(9riBP?JJ z7Bj53zNQS7mYmA%v`P1+rXBPJ$3x1(-3q@C4R>8gaHR|zucf)vqURWgV&M)Q* zR({&uxgHya(C}6>=R^)(!M4?G^I;hB_6yQ^Tanr;W%N@j!7F$CAw#vxAaPugUGeqC zzF`wSo?Yk7j3M6NPojYD;Bsz)S+vVRDc8D`CmK6?HxAD*+aVF?w{2PnGctokEUxdRMga$ zJPu|E(ZP(o0lCfp%LhNR^O-AO)7JhhKf||w&u{PNS!Z9jFM6Hf`cIslV)XX+{&s!y zj#Si3d%lb{^B7;gjekaO=K|RE5bwj$hx#Sf?7b7bHp8Do{7-Egy`3LmS38e}E8{;M zp4|p7@Qu!fF?u^^z^-2@f$?wk?D`YX(^)fiZ|4!%^^e*U@&66{Gyb($@T+iR^mcB6 zUEip{t$(Ap@#mnWD#zNOotI-*J70(B@hVo^ztP{LjD~3Mq1kytcExKay^pffmeG4p zKE0inVAn%qSSj$@GJov)3*7ni5A=mEyIMUZYx%c(dfmpSxAPb5`o$ZoDc50pzaG%r zISqFGR-c?@?HAGOXw<*WpPlDm*Ux|8*Y5s4#Y%rWpto}$?D{1sjrSSKpWeIi`)|*O z&~qZbe9t4s*THn~pJ&j!cddTu`2gSiIkh^jZ}fKk1L}MS|BT+wn|Swsr2h+OsVAei zb1A;}U+6)?pTFXNpWe=|c%bz6G7PO91P|J8^5t*1knUUmcFx5YdLY5OI?u=Ys$5{xf>J{vD5e`u5z6&xM};Ufcf|on8Mipttii9{x(`2jqAc zt^c9dpQtSx|DnFO_>t0o)vq2r7~KCG_tewFLAlYtKPVTjgoYl`z1fam^+x;u&3jUc t*Q5BAO&hoQFS1YL-KYQ8@3g1y`=wpKR!Z+EPSXEL=-<(1tp4CO_z%JCeSZJ| literal 0 HcmV?d00001 diff --git a/librab/build/librabbitmq/librabbitmq.so.4 b/librab/build/librabbitmq/librabbitmq.so.4 new file mode 100644 index 0000000000000000000000000000000000000000..c6c190cd8ef9b85f794b3b5afb2cf65a90000ba8 GIT binary patch literal 117632 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 literal 0 HcmV?d00001 diff --git a/librab/build/librabbitmq/librabbitmq.so.4.3.1 b/librab/build/librabbitmq/librabbitmq.so.4.3.1 new file mode 100644 index 0000000000000000000000000000000000000000..c6c190cd8ef9b85f794b3b5afb2cf65a90000ba8 GIT binary patch literal 117632 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 literal 0 HcmV?d00001 diff --git a/librab/build/librabbitmq/unix/threads.h b/librab/build/librabbitmq/unix/threads.h new file mode 100644 index 0000000..8a2623b --- /dev/null +++ b/librab/build/librabbitmq/unix/threads.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012-2013 Michael Steinert + * + * 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. + */ + +#ifndef AMQP_THREADS_H +#define AMQP_THREADS_H + +#include + +#endif /* AMQP_THREADS_H */ diff --git a/librab/build/librabbitmq/win32/msinttypes/stdint.h b/librab/build/librabbitmq/win32/msinttypes/stdint.h new file mode 100644 index 0000000..a7437be --- /dev/null +++ b/librab/build/librabbitmq/win32/msinttypes/stdint.h @@ -0,0 +1,245 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +#define _W64 __w64 +#else +#define _W64 +#endif +#endif + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#else +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ +typedef signed __int64 intptr_t; +typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ +typedef _W64 signed int intptr_t; +typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || \ + defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and + // footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +#define PTRDIFF_MIN _I64_MIN +#define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +#define PTRDIFF_MIN _I32_MIN +#define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +#ifdef _WIN64 // [ +#define SIZE_MAX _UI64_MAX +#else // _WIN64 ][ +#define SIZE_MAX _UI32_MAX +#endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +#define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +#define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || \ + defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_STDINT_H_ ] diff --git a/librab/build/librabbitmq/win32/threads.c b/librab/build/librabbitmq/win32/threads.c new file mode 100644 index 0000000..cce3158 --- /dev/null +++ b/librab/build/librabbitmq/win32/threads.c @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2013 Michael Steinert + * + * 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. + */ + +#include "threads.h" + +#include + +DWORD pthread_self(void) { return GetCurrentThreadId(); } + +int pthread_mutex_init(pthread_mutex_t *mutex, void *attr) { + if (!mutex) { + return 1; + } + InitializeSRWLock(mutex); + return 0; +} + +int pthread_mutex_lock(pthread_mutex_t *mutex) { + if (!mutex) { + return 1; + } + AcquireSRWLockExclusive(mutex); + return 0; +} + +int pthread_mutex_unlock(pthread_mutex_t *mutex) { + if (!mutex) { + return 1; + } + ReleaseSRWLockExclusive(mutex); + return 0; +} + +int pthread_mutex_destroy(pthread_mutex_t *mutex) { + /* SRW's do not require destruction. */ + return 0; +} diff --git a/librab/build/librabbitmq/win32/threads.h b/librab/build/librabbitmq/win32/threads.h new file mode 100644 index 0000000..69371f3 --- /dev/null +++ b/librab/build/librabbitmq/win32/threads.h @@ -0,0 +1,52 @@ +/* + * 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. + */ + +#ifndef AMQP_THREAD_H +#define AMQP_THREAD_H + +#if !defined(WINVER) || defined(__MINGW32__) || defined(__MINGW64__) +#ifdef WINVER +#undef WINVER +#endif +/* Windows Vista or newer */ +#define WINVER 0x0600 +#endif +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include + +typedef SRWLOCK pthread_mutex_t; +#define PTHREAD_MUTEX_INITIALIZER SRWLOCK_INIT; + +DWORD pthread_self(void); + +int pthread_mutex_init(pthread_mutex_t *, void *attr); +int pthread_mutex_lock(pthread_mutex_t *); +int pthread_mutex_unlock(pthread_mutex_t *); +int pthread_mutex_destroy(pthread_mutex_t *); + +#endif /* AMQP_THREAD_H */