From 9f55e5e92808ad2fcc6c1ffcf53f1a06fe585c93 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 27 Sep 2012 17:12:08 +0000 Subject: [PATCH] Make res_http_websocket an optional dependency on supported platforms for chan_sip. (closes issue ASTERISK-20439) Reported by: sruffell Patches: 0001-chan_sip-websocket-support-is-an-optional-API.patch uploaded by sruffell (license 5417) ........ Merged revisions 373914 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@373915 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 3 ++- include/asterisk/http_websocket.h | 28 ++++++++++++++-------------- res/res_http_websocket.c | 28 +++++++++++++++------------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 9ebf2b70ff..a506b45684 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -163,6 +163,7 @@ /*** MODULEINFO res_crypto + res_http_websocket chan_local core ***/ @@ -33654,5 +33655,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, - .nonoptreq = "res_crypto,chan_local", + .nonoptreq = "res_crypto,chan_local,res_http_websocket", ); diff --git a/include/asterisk/http_websocket.h b/include/asterisk/http_websocket.h index c07986a0a7..d59bc25cdc 100644 --- a/include/asterisk/http_websocket.h +++ b/include/asterisk/http_websocket.h @@ -19,7 +19,7 @@ #ifndef _ASTERISK_HTTP_WEBSOCKET_H #define _ASTERISK_HTTP_WEBSOCKET_H -#include "asterisk/module.h" +#include "asterisk/optional_api.h" /*! * \file http_websocket.h @@ -66,7 +66,7 @@ typedef void (*ast_websocket_callback)(struct ast_websocket *session, struct ast * \retval 0 success * \retval -1 if sub-protocol handler could not be registered */ -int ast_websocket_add_protocol(const char *name, ast_websocket_callback callback); +AST_OPTIONAL_API(int, ast_websocket_add_protocol, (const char *name, ast_websocket_callback callback), {return -1;}); /*! * \brief Remove a sub-protocol handler from the server @@ -77,7 +77,7 @@ int ast_websocket_add_protocol(const char *name, ast_websocket_callback callback * \retval 0 success * \retval -1 if sub-protocol was not found or if callback did not match */ -int ast_websocket_remove_protocol(const char *name, ast_websocket_callback callback); +AST_OPTIONAL_API(int, ast_websocket_remove_protocol, (const char *name, ast_websocket_callback callback), {return -1;}); /*! * \brief Read a WebSocket frame and handle it @@ -93,7 +93,7 @@ int ast_websocket_remove_protocol(const char *name, ast_websocket_callback callb * * \note Once an AST_WEBSOCKET_OPCODE_CLOSE opcode is received the socket will be closed */ -int ast_websocket_read(struct ast_websocket *session, char **payload, uint64_t *payload_len, enum ast_websocket_opcode *opcode, int *fragmented); +AST_OPTIONAL_API(int, ast_websocket_read, (struct ast_websocket *session, char **payload, uint64_t *payload_len, enum ast_websocket_opcode *opcode, int *fragmented), {return -1;}); /*! * \brief Construct and transmit a WebSocket frame @@ -106,7 +106,7 @@ int ast_websocket_read(struct ast_websocket *session, char **payload, uint64_t * * \retval 0 if successfully written * \retval -1 if error occurred */ -int ast_websocket_write(struct ast_websocket *session, enum ast_websocket_opcode opcode, char *payload, uint64_t actual_length); +AST_OPTIONAL_API(int, ast_websocket_write, (struct ast_websocket *session, enum ast_websocket_opcode opcode, char *payload, uint64_t actual_length), {return -1;}); /*! * \brief Close a WebSocket session by sending a message with the CLOSE opcode and an optional code @@ -117,7 +117,7 @@ int ast_websocket_write(struct ast_websocket *session, enum ast_websocket_opcode * \retval 0 if successfully written * \retval -1 if error occurred */ -int ast_websocket_close(struct ast_websocket *session, uint16_t reason); +AST_OPTIONAL_API(int, ast_websocket_close, (struct ast_websocket *session, uint16_t reason), {return -1;}); /*! * \brief Enable multi-frame reconstruction up to a certain number of bytes @@ -126,7 +126,7 @@ int ast_websocket_close(struct ast_websocket *session, uint16_t reason); * \param bytes If a reconstructed payload exceeds the specified number of bytes the payload will be returned * and upon reception of the next multi-frame a new reconstructed payload will begin. */ -void ast_websocket_reconstruct_enable(struct ast_websocket *session, size_t bytes); +AST_OPTIONAL_API(void, ast_websocket_reconstruct_enable, (struct ast_websocket *session, size_t bytes), {return;}); /*! * \brief Disable multi-frame reconstruction @@ -136,21 +136,21 @@ void ast_websocket_reconstruct_enable(struct ast_websocket *session, size_t byte * \note If reconstruction is disabled each message that is part of a multi-frame message will be sent up to * the user when ast_websocket_read is called. */ -void ast_websocket_reconstruct_disable(struct ast_websocket *session); +AST_OPTIONAL_API(void, ast_websocket_reconstruct_disable, (struct ast_websocket *session), {return;}); /*! * \brief Increase the reference count for a WebSocket session * * \param session Pointer to the WebSocket session */ -void ast_websocket_ref(struct ast_websocket *session); +AST_OPTIONAL_API(void, ast_websocket_ref, (struct ast_websocket *session), {return;}); /*! * \brief Decrease the reference count for a WebSocket session * * \param session Pointer to the WebSocket session */ -void ast_websocket_unref(struct ast_websocket *session); +AST_OPTIONAL_API(void, ast_websocket_unref, (struct ast_websocket *session), {return;}); /*! * \brief Get the file descriptor for a WebSocket session. @@ -159,14 +159,14 @@ void ast_websocket_unref(struct ast_websocket *session); * * \note You must *not* directly read from or write to this file descriptor. It should only be used for polling. */ -int ast_websocket_fd(struct ast_websocket *session); +AST_OPTIONAL_API(int, ast_websocket_fd, (struct ast_websocket *session), {return -1;}); /*! * \brief Get the remote address for a WebSocket connected session. * * \retval ast_sockaddr Remote address */ -struct ast_sockaddr *ast_websocket_remote_address(struct ast_websocket *session); +AST_OPTIONAL_API(struct ast_sockaddr *, ast_websocket_remote_address, (struct ast_websocket *session), {return NULL;}); /*! * \brief Get whether the WebSocket session is using a secure transport or not. @@ -174,7 +174,7 @@ struct ast_sockaddr *ast_websocket_remote_address(struct ast_websocket *session) * \retval 0 if unsecure * \retval 1 if secure */ -int ast_websocket_is_secure(struct ast_websocket *session); +AST_OPTIONAL_API(int, ast_websocket_is_secure, (struct ast_websocket *session), {return -1;}); /*! * \brief Set the socket of a WebSocket session to be non-blocking. @@ -182,6 +182,6 @@ int ast_websocket_is_secure(struct ast_websocket *session); * \retval 0 on success * \retval -1 on failure */ -int ast_websocket_set_nonblock(struct ast_websocket *session); +AST_OPTIONAL_API(int, ast_websocket_set_nonblock, (struct ast_websocket *session), {return -1;}); #endif diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index 86e2a82a3c..cfc613cbc5 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -37,6 +37,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/strings.h" #include "asterisk/file.h" #include "asterisk/unaligned.h" + +#define AST_API_MODULE #include "asterisk/http_websocket.h" /*! \brief GUID used to compute the accept key, defined in the specifications */ @@ -116,7 +118,7 @@ static void session_destroy_fn(void *obj) ast_free(session->payload); } -int ast_websocket_add_protocol(const char *name, ast_websocket_callback callback) +int AST_OPTIONAL_API_NAME(ast_websocket_add_protocol)(const char *name, ast_websocket_callback callback) { struct websocket_protocol *protocol; @@ -151,7 +153,7 @@ int ast_websocket_add_protocol(const char *name, ast_websocket_callback callback return 0; } -int ast_websocket_remove_protocol(const char *name, ast_websocket_callback callback) +int AST_OPTIONAL_API_NAME(ast_websocket_remove_protocol)(const char *name, ast_websocket_callback callback) { struct websocket_protocol *protocol; @@ -173,7 +175,7 @@ int ast_websocket_remove_protocol(const char *name, ast_websocket_callback callb } /*! \brief Close function for websocket session */ -int ast_websocket_close(struct ast_websocket *session, uint16_t reason) +int AST_OPTIONAL_API_NAME(ast_websocket_close)(struct ast_websocket *session, uint16_t reason) { char frame[4] = { 0, }; /* The header is 2 bytes and the reason code takes up another 2 bytes */ @@ -190,7 +192,7 @@ int ast_websocket_close(struct ast_websocket *session, uint16_t reason) /*! \brief Write function for websocket traffic */ -int ast_websocket_write(struct ast_websocket *session, enum ast_websocket_opcode opcode, char *payload, uint64_t actual_length) +int AST_OPTIONAL_API_NAME(ast_websocket_write)(struct ast_websocket *session, enum ast_websocket_opcode opcode, char *payload, uint64_t actual_length) { size_t header_size = 2; /* The minimum size of a websocket frame is 2 bytes */ char *frame; @@ -232,42 +234,42 @@ int ast_websocket_write(struct ast_websocket *session, enum ast_websocket_opcode return 0; } -void ast_websocket_reconstruct_enable(struct ast_websocket *session, size_t bytes) +void AST_OPTIONAL_API_NAME(ast_websocket_reconstruct_enable)(struct ast_websocket *session, size_t bytes) { session->reconstruct = MIN(bytes, MAXIMUM_RECONSTRUCTION_CEILING); } -void ast_websocket_reconstruct_disable(struct ast_websocket *session) +void AST_OPTIONAL_API_NAME(ast_websocket_reconstruct_disable)(struct ast_websocket *session) { session->reconstruct = 0; } -void ast_websocket_ref(struct ast_websocket *session) +void AST_OPTIONAL_API_NAME(ast_websocket_ref)(struct ast_websocket *session) { ao2_ref(session, +1); } -void ast_websocket_unref(struct ast_websocket *session) +void AST_OPTIONAL_API_NAME(ast_websocket_unref)(struct ast_websocket *session) { ao2_ref(session, -1); } -int ast_websocket_fd(struct ast_websocket *session) +int AST_OPTIONAL_API_NAME(ast_websocket_fd)(struct ast_websocket *session) { return session->closing ? -1 : session->fd; } -struct ast_sockaddr *ast_websocket_remote_address(struct ast_websocket *session) +struct ast_sockaddr * AST_OPTIONAL_API_NAME(ast_websocket_remote_address)(struct ast_websocket *session) { return &session->address; } -int ast_websocket_is_secure(struct ast_websocket *session) +int AST_OPTIONAL_API_NAME(ast_websocket_is_secure)(struct ast_websocket *session) { return session->secure; } -int ast_websocket_set_nonblock(struct ast_websocket *session) +int AST_OPTIONAL_API_NAME(ast_websocket_set_nonblock)(struct ast_websocket *session) { int flags; @@ -284,7 +286,7 @@ int ast_websocket_set_nonblock(struct ast_websocket *session) return 0; } -int ast_websocket_read(struct ast_websocket *session, char **payload, uint64_t *payload_len, enum ast_websocket_opcode *opcode, int *fragmented) +int AST_OPTIONAL_API_NAME(ast_websocket_read)(struct ast_websocket *session, char **payload, uint64_t *payload_len, enum ast_websocket_opcode *opcode, int *fragmented) { char buf[MAXIMUM_FRAME_SIZE] = ""; size_t frame_size, expected = 2;