Remove optional_api from 1.6.2 branch, since it is not currently working.

This is a blocking issue for the 1.6.2 release.
(closes issue #15914)
 Reported by: mbeckwell
 Branch: http://svn.digium.com/svn/asterisk/team/tilghman/optional_api_162
 Tested by: mbeckwell


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@221042 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.2
Tilghman Lesher 17 years ago
parent f51a43531a
commit 4ddccae801

@ -40,10 +40,6 @@ c-client (http://www.washington.edu/imap/
* with a plan to clean this up.
*/
/*** MODULEINFO
<depend>res_smdi</depend>
***/
/*** MAKEOPTS
<category name="MENUSELECT_OPTS_app_voicemail" displayname="Voicemail Build Options" positive_output="yes" remove_on_change="apps/app_voicemail.o apps/app_voicemail.so apps/app_directory.o apps/app_directory.so">
<member name="FILE_STORAGE" displayname="Storage of Voicemail using filesystem">

@ -29,7 +29,6 @@ extern "C" {
#include "asterisk/cli.h"
#include "asterisk/xmldoc.h"
#include "asterisk/optional_api.h"
typedef struct agi_state {
int fd; /*!< FD for general output */
@ -72,8 +71,7 @@ typedef struct agi_command {
* \return 1 on success, 0 if the command is already registered
*
*/
AST_OPTIONAL_API(int, ast_agi_register, (struct ast_module *mod, agi_command *cmd),
{ return AST_OPTIONAL_API_UNAVAILABLE; });
int ast_agi_register(struct ast_module *mod, agi_command *cmd) attribute_weak;
/*!
* \brief
@ -85,8 +83,7 @@ AST_OPTIONAL_API(int, ast_agi_register, (struct ast_module *mod, agi_command *cm
* \return 1 on success, 0 if the command was not already registered
*
*/
AST_OPTIONAL_API(int, ast_agi_unregister, (struct ast_module *mod, agi_command *cmd),
{ return AST_OPTIONAL_API_UNAVAILABLE; });
int ast_agi_unregister(struct ast_module *mod, agi_command *cmd) attribute_weak;
/*!
* \brief
@ -97,14 +94,13 @@ AST_OPTIONAL_API(int, ast_agi_unregister, (struct ast_module *mod, agi_command *
* \param mod Pointer to the module_info structure for the module that is registering the commands
* \param cmd Pointer to the first entry in the array of command descriptors
* \param len Length of the array (use the ARRAY_LEN macro to determine this easily)
* \return 0 on success, -1 on failure, AST_OPTIONAL_API_UNAVAILABLE if res_agi is not loaded
* \return 0 on success, -1 on failure
*
* \note If any command fails to register, all commands previously registered during the operation
* will be unregistered. In other words, this function registers all the provided commands, or none
* of them.
*/
AST_OPTIONAL_API(int, ast_agi_register_multiple, (struct ast_module *mod, struct agi_command *cmd, unsigned int len),
{ return AST_OPTIONAL_API_UNAVAILABLE; });
int ast_agi_register_multiple(struct ast_module *mod, struct agi_command *cmd, unsigned int len) attribute_weak;
/*!
* \brief
@ -115,13 +111,12 @@ AST_OPTIONAL_API(int, ast_agi_register_multiple, (struct ast_module *mod, struct
* \param mod Pointer to the module_info structure for the module that is unregistering the commands
* \param cmd Pointer to the first entry in the array of command descriptors
* \param len Length of the array (use the ARRAY_LEN macro to determine this easily)
* \return 0 on success, -1 on failure, AST_OPTIONAL_API_UNAVAILABLE if res_agi is not loaded
* \return 0 on success, -1 on failure
*
* \note If any command fails to unregister, this function will continue to unregister the
* remaining commands in the array; it will not reregister the already-unregistered commands.
*/
AST_OPTIONAL_API(int, ast_agi_unregister_multiple, (struct ast_module *mod, struct agi_command *cmd, unsigned int len),
{ return AST_OPTIONAL_API_UNAVAILABLE; });
int ast_agi_unregister_multiple(struct ast_module *mod, struct agi_command *cmd, unsigned int len) attribute_weak;
/*!
* \brief
@ -131,11 +126,10 @@ AST_OPTIONAL_API(int, ast_agi_unregister_multiple, (struct ast_module *mod, stru
* \param fd The file descriptor for the AGI session (from struct agi_state)
* \param chan Pointer to an associated Asterisk channel, if any
* \param fmt printf-style format string
* \return 0 for success, -1 for failure, AST_OPTIONAL_API_UNAVAILABLE if res_agi is not loaded
* \return 0 for success, -1 for failure
*
*/
AST_OPTIONAL_API_ATTR(int, format(printf, 3, 4), ast_agi_send, (int fd, struct ast_channel *chan, char *fmt, ...),
{ return AST_OPTIONAL_API_UNAVAILABLE; });
int ast_agi_send(int fd, struct ast_channel *chan, char *fmt, ...) attribute_weak __attribute__((format(printf, 3, 4)));
#if defined(__cplusplus) || defined(c_plusplus)
}

@ -24,7 +24,6 @@
#define _ASTERISK_MONITOR_H
#include "asterisk/channel.h"
#include "asterisk/optional_api.h"
enum AST_MONITORING_STATE {
AST_MONITOR_RUNNING,
@ -51,27 +50,25 @@ struct ast_channel_monitor {
};
/* Start monitoring a channel */
AST_OPTIONAL_API(int, ast_monitor_start, (struct ast_channel *chan, const char
*format_spec, const char *fname_base, int need_lock, int stream_action),
{ return -1; });
int ast_monitor_start(struct ast_channel *chan, const char
*format_spec, const char *fname_base, int need_lock, int stream_action)
attribute_weak;
/* Stop monitoring a channel */
AST_OPTIONAL_API(int, ast_monitor_stop, (struct ast_channel *chan, int
need_lock), { return -1; });
int ast_monitor_stop(struct ast_channel *chan, int need_lock)
attribute_weak;
/* Change monitoring filename of a channel */
AST_OPTIONAL_API(int, ast_monitor_change_fname, (struct ast_channel *chan,
const char *fname_base, int need_lock), { return -1; });
int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base,
int need_lock) attribute_weak;
AST_OPTIONAL_API(void, ast_monitor_setjoinfiles, (struct ast_channel *chan,
int turnon), { return; });
void ast_monitor_setjoinfiles(struct ast_channel *chan, int turnon)
attribute_weak;
/* Pause monitoring of a channel */
AST_OPTIONAL_API(int, ast_monitor_pause, (struct ast_channel *chan),
{ return -1; });
int ast_monitor_pause(struct ast_channel *chan) attribute_weak;
/* Unpause monitoring of a channel */
AST_OPTIONAL_API(int, ast_monitor_unpause, (struct ast_channel *chan),
{ return -1; });
int ast_monitor_unpause(struct ast_channel *chan) attribute_weak;
#endif /* _ASTERISK_MONITOR_H */

@ -1,126 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2008, Digium, Inc.
*
* Kevin P. Fleming <kpfleming@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
#ifndef __ASTERISK_OPTIONAL_API_H
#define __ASTERISK_OPTIONAL_API_H
/*!
* \file
* \brief Optional API function macros
*
* Some Asterisk API functions are provided by loadable modules, thus,
* they may or may not be available at run time depending on whether the
* providing module has been loaded or not. In addition, there are some
* modules that are consumers of these APIs that *optionally* use them; they
* have only a part of their functionality dependent on the APIs, and can
* provide the remainder even if the APIs are not available.
*
* To accomodate this situation, the AST_OPTIONAL_API macro allows an API
* function to be declared in a special way, if Asterisk being built on a
* platform that supports the GCC 'weak' and 'alias' attributes. If so,
* the API function is actually a weak symbol, which means if the provider
* of the API is not loaded, the symbol can still be referenced (unlike a
* strong symbol, which would cause an immediate fault if not defined when
* referenced), but it will return NULL signifying the linker/loader was
* not able to resolve the symbol. In addition, the macro defines a hidden
* 'stub' version of the API call, using a provided function body, and uses
* the alias attribute to make the API function symbol actually resolve to
* that hidden stub, but only when the *real* provider of the symbol has
* not been found.
*
* An example can be found in agi.h:
*
* \code
* AST_OPTIONAL_API(int, ast_agi_register, (struct ast_module *mod, agi_command *cmd),
* { return AST_OPTIONAL_API_UNAVAILABLE; });
* \endcode
*
* This defines the 'ast_agi_register' function as an optional API; if a
* consumer of this API is loaded when there is no provider of it, then
* calling this function will actually call the hidden stub, and return
* the value AST_OPTIONAL_API_UNAVAILABLE. This allows the consumer to
* safely know that the API is not available, and to avoid using any
* other APIs from the not-present provider.
*
* In the module providing the API, the AST_OPTIONAL_API macro must
* be informed that it should not build the hidden stub function or
* apply special aliases to the function prototype; this can be done
* by defining AST_API_MODULE just before including the header file
* containing the AST_OPTIONAL_API macro calls.
*
* \note If the GCC 'weak' and 'alias' attributes are not available,
* then the AST_OPTIONAL_API macro will result in a non-optional function
* definition; this means that any consumers of the API functions so
* defined will require that the provider of the API functions be
* loaded before they can reference the symbols.
*/
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
/*!
* \brief A common value for optional API stub functions to return
*
* This value is defined as INT_MIN, the minimum value for an integer
* (maximum negative value), which can be used by any optional API
* functions that return a signed integer value and would not be
* able to return such a value under normal circumstances.
*/
#define AST_OPTIONAL_API_UNAVAILABLE INT_MIN
#if defined(HAVE_ATTRIBUTE_weak_import) && !defined(AST_API_MODULE)
#define AST_OPTIONAL_API(result, name, proto, stub) result name proto __attribute__((weak_import));
#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) result name proto __attribute__((weak_import,attr));
#elif defined(HAVE_ATTRIBUTE_weak) && defined(HAVE_ATTRIBUTE_alias) && !defined(AST_API_MODULE) && !defined(HAVE_ATTRIBUTE_weak_import)
#define AST_OPTIONAL_API(result, name, proto, stub) \
static result __##name proto stub; \
result __attribute__((weak, alias("__" __stringify(name)))) name proto;
#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
static result __attribute__((attr)) __##name proto stub; \
result __attribute__((weak, alias("__" __stringify(name)), attr)) name proto;
#else
/*!
* \brief Define an optional API function
*
* \param result The type of result the function returns
* \param name The name of the function
* \param proto The prototype (arguments) of the function
* \param stub The code block that will be used by the hidden stub when needed
*
* Example usage:
* \code
* AST_OPTIONAL_API(int, ast_agi_register, (struct ast_module *mod, agi_command *cmd),
* { return AST_OPTIONAL_API_UNAVAILABLE; });
* \endcode
*/
#define AST_OPTIONAL_API(result, name, proto, stub) result name proto;
/*!
* \brief Define an optional API function with compiler attributes
*
* \param result The type of result the function returns
* \param attr Any compiler attributes to be applied to the function (without the __attribute__ wrapper)
* \param name The name of the function
* \param proto The prototype (arguments) of the function
* \param stub The code block that will be used by the hidden stub when needed
*/
#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) result __attribute__((attr)) name proto;
#endif
#undef AST_API_MODULE
#endif /* __ASTERISK_OPTIONAL_API_H */

@ -37,7 +37,6 @@
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/astobj.h"
#include "asterisk/optional_api.h"
#define SMDI_MESG_DESK_NUM_LEN 3
#define SMDI_MESG_DESK_TERM_LEN 4
@ -85,8 +84,7 @@ struct ast_smdi_md_message {
*/
struct ast_smdi_interface;
AST_OPTIONAL_API(void, ast_smdi_interface_unref, (struct ast_smdi_interface
*iface), { return; });
void ast_smdi_interface_unref(struct ast_smdi_interface *iface) attribute_weak;
/*!
* \brief Get the next SMDI message from the queue.
@ -98,8 +96,7 @@ AST_OPTIONAL_API(void, ast_smdi_interface_unref, (struct ast_smdi_interface
*
* \return the next SMDI message, or NULL if there were no pending messages.
*/
AST_OPTIONAL_API(struct ast_smdi_md_message *, ast_smdi_md_message_pop, (struct
ast_smdi_interface *iface), { return NULL; });
struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *iface) attribute_weak;
/*!
* \brief Get the next SMDI message from the queue.
@ -113,8 +110,7 @@ AST_OPTIONAL_API(struct ast_smdi_md_message *, ast_smdi_md_message_pop, (struct
* \return the next SMDI message, or NULL if there were no pending messages and
* the timeout has expired.
*/
AST_OPTIONAL_API(struct ast_smdi_md_message *, ast_smdi_md_message_wait,
(struct ast_smdi_interface *iface, int timeout), { return NULL; });
struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout) attribute_weak;
/*!
* \brief Put an SMDI message back in the front of the queue.
@ -125,8 +121,7 @@ AST_OPTIONAL_API(struct ast_smdi_md_message *, ast_smdi_md_message_wait,
* should be used if a message was popped but is not going to be processed for
* some reason, and the message needs to be returned to the queue.
*/
AST_OPTIONAL_API(void, ast_smdi_md_message_putback, (struct ast_smdi_interface
*iface, struct ast_smdi_md_message *msg), { return; });
void ast_smdi_md_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_md_message *msg) attribute_weak;
/*!
* \brief Get the next SMDI message from the queue.
@ -138,8 +133,7 @@ AST_OPTIONAL_API(void, ast_smdi_md_message_putback, (struct ast_smdi_interface
*
* \return the next SMDI message, or NULL if there were no pending messages.
*/
AST_OPTIONAL_API(struct ast_smdi_mwi_message *, ast_smdi_mwi_message_pop,
(struct ast_smdi_interface *iface), { return NULL; });
struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface *iface) attribute_weak;
/*!
* \brief Get the next SMDI message from the queue.
@ -153,11 +147,9 @@ AST_OPTIONAL_API(struct ast_smdi_mwi_message *, ast_smdi_mwi_message_pop,
* \return the next SMDI message, or NULL if there were no pending messages and
* the timeout has expired.
*/
AST_OPTIONAL_API(struct ast_smdi_mwi_message *, ast_smdi_mwi_message_wait,
(struct ast_smdi_interface *iface, int timeout), { return NULL; });
AST_OPTIONAL_API(struct ast_smdi_mwi_message *,
ast_smdi_mwi_message_wait_station, (struct ast_smdi_interface *iface, int
timeout, const char *station), { return NULL; });
struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait(struct ast_smdi_interface *iface, int timeout) attribute_weak;
struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait_station(struct ast_smdi_interface *iface, int
timeout, const char *station) attribute_weak;
/*!
* \brief Put an SMDI message back in the front of the queue.
@ -168,8 +160,7 @@ AST_OPTIONAL_API(struct ast_smdi_mwi_message *,
* should be used if a message was popped but is not going to be processed for
* some reason, and the message needs to be returned to the queue.
*/
AST_OPTIONAL_API(void, ast_smdi_mwi_message_putback, (struct ast_smdi_interface
*iface, struct ast_smdi_mwi_message *msg), { return; });
void ast_smdi_mwi_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_mwi_message *msg) attribute_weak;
/*!
* \brief Find an SMDI interface with the specified name.
@ -179,31 +170,26 @@ AST_OPTIONAL_API(void, ast_smdi_mwi_message_putback, (struct ast_smdi_interface
* actually returns an ASTOBJ reference and should be released using
* #ASTOBJ_UNREF(iface, ast_smdi_interface_destroy).
*/
AST_OPTIONAL_API(struct ast_smdi_interface *, ast_smdi_interface_find,
(const char *iface_name), { return NULL; });
struct ast_smdi_interface *ast_smdi_interface_find(const char *iface_name) attribute_weak;
/*!
* \brief Set the MWI indicator for a mailbox.
* \param iface the interface to use.
* \param mailbox the mailbox to use.
*/
AST_OPTIONAL_API(int, ast_smdi_mwi_set, (struct ast_smdi_interface *iface,
const char *mailbox), { return -1; });
int ast_smdi_mwi_set(struct ast_smdi_interface *iface, const char *mailbox) attribute_weak;
/*!
* \brief Unset the MWI indicator for a mailbox.
* \param iface the interface to use.
* \param mailbox the mailbox to use.
*/
AST_OPTIONAL_API(int, ast_smdi_mwi_unset, (struct ast_smdi_interface *iface,
const char *mailbox), { return -1; });
int ast_smdi_mwi_unset(struct ast_smdi_interface *iface, const char *mailbox) attribute_weak;
/*! \brief ast_smdi_md_message destructor. */
AST_OPTIONAL_API(void, ast_smdi_md_message_destroy,
(struct ast_smdi_md_message *msg), { return; });
void ast_smdi_md_message_destroy(struct ast_smdi_md_message *msg) attribute_weak;
/*! \brief ast_smdi_mwi_message destructor. */
AST_OPTIONAL_API(void, ast_smdi_mwi_message_destroy, (struct
ast_smdi_mwi_message *msg), { return; });
void ast_smdi_mwi_message_destroy(struct ast_smdi_mwi_message *msg) attribute_weak;
#endif /* !ASTERISK_SMDI_H */

Loading…
Cancel
Save