diff --git a/ChangeLog b/ChangeLog index b3bb7687aa1194f9c660383b543bfbd57279ff7d..7488956558060b8e46e1ffc555a4279a1d220577 100755 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,10 @@ 2005-11-07 Russell Bryant <russell@digium.com> + * apps/app_queue.c: upgrade to new arg/option API and implement priority jumping control (issue #5580) + * res/res_indications.c: Add missing include of stdio.h + * many files: Add missing include of stdio.h, and remove some duplicate and unused header includes + * include/asterisk/app.h: Increment the arg_index in the options structure to fix applicaiton options that have arguments to them 2005-11-07 Kevin P. Fleming <kpfleming@digium.com> diff --git a/apps/app_chanisavail.c b/apps/app_chanisavail.c index 10a377f010edf011f27823b88df600380b0c871d..acdc4d9f84eb33f7c36c57c71ffec4b92b60476f 100755 --- a/apps/app_chanisavail.c +++ b/apps/app_chanisavail.c @@ -24,10 +24,10 @@ */ #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include <unistd.h> #include <errno.h> -#include <string.h> -#include <stdlib.h> #include <sys/ioctl.h> #include "asterisk.h" diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index 07b8d8d608dcb24fd4161a6be09d536b5191184b..4e96d8f6dfcc42c52fe57a483a105f9d1773bac3 100755 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -23,8 +23,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <ctype.h> #include "asterisk.h" diff --git a/apps/app_controlplayback.c b/apps/app_controlplayback.c index 47b82ac4e0054bc3e6a8597ee8be2b7261458245..6cd577d7f39c4c77da4ae081618a68de3984e019 100755 --- a/apps/app_controlplayback.c +++ b/apps/app_controlplayback.c @@ -22,8 +22,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_db.c b/apps/app_db.c index 60d25f0e6e03a867642d1d6c6495ef8cb89fd683..659f9686e702fa23e676e544d0dd72e0d96b5c85 100755 --- a/apps/app_db.c +++ b/apps/app_db.c @@ -26,8 +26,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_dictate.c b/apps/app_dictate.c index 0feee10b85ac845b954bb57afce98c4501be7dfb..91a1650eac98f7763a381cc07ce012af997b71f7 100755 --- a/apps/app_dictate.c +++ b/apps/app_dictate.c @@ -26,8 +26,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <sys/stat.h> /* for mkdir */ #include "asterisk.h" diff --git a/apps/app_directed_pickup.c b/apps/app_directed_pickup.c index 400ee0728f4dd06f518fab3bcf7796368b26e5fa..cd9c62e0155b19a9c7db36ab02fac0eb84ce9979 100755 --- a/apps/app_directed_pickup.c +++ b/apps/app_directed_pickup.c @@ -24,8 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_dumpchan.c b/apps/app_dumpchan.c index 15fb3baba9b99b5f5d91faac77e7653e653a3f4b..4802dfee1626e50204305272a73ff129385a21c1 100755 --- a/apps/app_dumpchan.c +++ b/apps/app_dumpchan.c @@ -26,8 +26,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_echo.c b/apps/app_echo.c index 1fbfba5efd7b1eaa552fb5378bde7d5cfb930aa5..2b7c20079c38a6d4158c12d1eac6ea761abdd9f4 100755 --- a/apps/app_echo.c +++ b/apps/app_echo.c @@ -24,6 +24,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <string.h> diff --git a/apps/app_enumlookup.c b/apps/app_enumlookup.c index 6ff2141b08dc8113ac208c3b6c89b1e385c9a320..435ff61e18b1c5b1af004a8f2643144e280987ac 100755 --- a/apps/app_enumlookup.c +++ b/apps/app_enumlookup.c @@ -24,9 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> #include <ctype.h> #include "asterisk.h" diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index c3e3c56279e1db21e78e337094e09a59252f2871..ff5147d726fa8a0e226033678391551bce200e89 100755 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -27,9 +27,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> #include <errno.h> #include "asterisk.h" diff --git a/apps/app_flash.c b/apps/app_flash.c index 9a53dd38244c6e86a3d3397fbde8b056f4ca5689..a9aae22b8396a1f828de4948a55d7364d7c83dd9 100755 --- a/apps/app_flash.c +++ b/apps/app_flash.c @@ -23,9 +23,10 @@ * \ingroup applications */ +#include <stdlib.h> +#include <stdio.h> #include <string.h> #include <errno.h> -#include <stdlib.h> #include <sys/ioctl.h> #ifdef __linux__ #include <linux/zaptel.h> diff --git a/apps/app_forkcdr.c b/apps/app_forkcdr.c index ad8eaa0a734d03aa989dcd77509e17aa86c6089c..21073ff506da2476a61ed97498f6edc810459c30 100755 --- a/apps/app_forkcdr.c +++ b/apps/app_forkcdr.c @@ -23,9 +23,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <pthread.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_getcpeid.c b/apps/app_getcpeid.c index 0eb16917a8dbfdb9f507fa2a9ec5f211fcdb9d2f..b2d883bc13e3018621dff24adf07129bf4a5895e 100755 --- a/apps/app_getcpeid.c +++ b/apps/app_getcpeid.c @@ -24,6 +24,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <string.h> diff --git a/apps/app_hasnewvoicemail.c b/apps/app_hasnewvoicemail.c index abb42e0c239cbadcd688cc611eba1ebeb726c088..678d8c69bbb829b28be10787c526105ffa01545b 100755 --- a/apps/app_hasnewvoicemail.c +++ b/apps/app_hasnewvoicemail.c @@ -27,11 +27,12 @@ * \ingroup applications */ -#include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <dirent.h> +#include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_image.c b/apps/app_image.c index 3e0f858d20f19d5055077ebd55e49de630a6509e..e23b274a998b0bd560cd8e8ca5f33aebfbfccc52 100755 --- a/apps/app_image.c +++ b/apps/app_image.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_lookupblacklist.c b/apps/app_lookupblacklist.c index 93d3c8c4938e540489338dd7d0fa1bce51c08a2e..1f7e30fd8dc47a5c8ceb52acd1928a444441e9fc 100755 --- a/apps/app_lookupblacklist.c +++ b/apps/app_lookupblacklist.c @@ -24,8 +24,9 @@ * */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_lookupcidname.c b/apps/app_lookupcidname.c index bce2768f496ff3e23fa2a5bb4d9bb6bdb8f22abf..52587b03ae9b85893b292d9c3c40ea909c6845a5 100755 --- a/apps/app_lookupcidname.c +++ b/apps/app_lookupcidname.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_macro.c b/apps/app_macro.c index 6d99a79ca2b41e9251d17301edcc9589e751c08a..72b75777cc6a612cc074314c031c83b1bb75e674 100755 --- a/apps/app_macro.c +++ b/apps/app_macro.c @@ -23,10 +23,11 @@ * \ingroup applications */ -#include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> +#include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_md5.c b/apps/app_md5.c index b9d5412b1bd897df54d11181229f3da172518a91..c9f4f0e110d7162f0d546e84e587d6804646d0db 100755 --- a/apps/app_md5.c +++ b/apps/app_md5.c @@ -24,8 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_meetme.c b/apps/app_meetme.c index bca2ad9729579b077d38b97970d94fdff6c75572..e9f52a7073b38f57aadc5a2060d8308090a00b54 100755 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -24,10 +24,10 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <errno.h> -#include <stdlib.h> #include <sys/ioctl.h> #ifdef __linux__ #include <linux/zaptel.h> diff --git a/apps/app_milliwatt.c b/apps/app_milliwatt.c index 446fd150aa1c9d84f7b2e2aa3bba3cc1b999abc1..5ef708c1f2e8a8c9363cae7505e9bee526a288c6 100755 --- a/apps/app_milliwatt.c +++ b/apps/app_milliwatt.c @@ -24,9 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> #include <errno.h> #include "asterisk.h" diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index ddf8f5248c59b41fcfe34aa4cc23e2cbf749fb79..6667377171c4ed7be777984ebcab9496081a33b4 100755 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -27,8 +27,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_parkandannounce.c b/apps/app_parkandannounce.c index a40c2efd7313f1a2eadc05587f2d23e8021e95e2..bb7aa38b068f3d59b5029ee95d3fbc8020e5db13 100755 --- a/apps/app_parkandannounce.c +++ b/apps/app_parkandannounce.c @@ -26,10 +26,11 @@ * \ingroup applications */ -#include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> +#include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_playback.c b/apps/app_playback.c index 89e72669b70b3ef31db92f43add53e6a0e6004bd..485e7351997e8d010d3116b2e915a08857686b36 100755 --- a/apps/app_playback.c +++ b/apps/app_playback.c @@ -25,6 +25,7 @@ #include <string.h> #include <stdlib.h> +#include <stdio.h> #include "asterisk.h" diff --git a/apps/app_privacy.c b/apps/app_privacy.c index fe566948583d3ee1ebfa18640a14d036b52a213e..799f31bd2398db98c0e4e12384e3116a927ff7e8 100755 --- a/apps/app_privacy.c +++ b/apps/app_privacy.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_queue.c b/apps/app_queue.c index ae622f05a232b05f873dc4b540f5c1191b078649..5d8b4bc4f0cea31fa8894de990afaac75df462ac 100755 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -74,6 +74,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/channel.h" #include "asterisk/pbx.h" #include "asterisk/options.h" +#include "asterisk/app.h" +#include "asterisk/linkedlists.h" #include "asterisk/module.h" #include "asterisk/translate.h" #include "asterisk/say.h" @@ -151,27 +153,39 @@ static char *descrip = static char *app_aqm = "AddQueueMember" ; static char *app_aqm_synopsis = "Dynamically adds queue members" ; static char *app_aqm_descrip = -" AddQueueMember(queuename[|interface[|penalty]]):\n" +" AddQueueMember(queuename[|interface[|penalty[|options]]]):\n" "Dynamically adds interface to an existing queue.\n" "If the interface is already in the queue and there exists an n+101 priority\n" "then it will then jump to this priority. Otherwise it will return an error\n" +"The option string may contain zero or more of the following characters:\n" +" 'j' -- jump to +101 priority when appropriate.\n" +" This application sets the following channel variable upon completion:\n" +" AQMSTATUS The status of the attempt to add a queue member as a \n" +" text string, one of\n" +" ADDED | MEMBERALREADY | NOSUCHQUEUE \n" "Example: AddQueueMember(techsupport|SIP/3000)\n" ""; static char *app_rqm = "RemoveQueueMember" ; static char *app_rqm_synopsis = "Dynamically removes queue members" ; static char *app_rqm_descrip = -" RemoveQueueMember(queuename[|interface]):\n" +" RemoveQueueMember(queuename[|interface[|options]]):\n" "Dynamically removes interface to an existing queue\n" "If the interface is NOT in the queue and there exists an n+101 priority\n" "then it will then jump to this priority. Otherwise it will return an error\n" +"The option string may contain zero or more of the following characters:\n" +" 'j' -- jump to +101 priority when appropriate.\n" +" This application sets the following channel variable upon completion:\n" +" RQMSTATUS The status of the attempt to remove a queue member as a\n" +" text string, one of\n" +" REMOVED | NOTINQUEUE | NOSUCHQUEUE \n" "Example: RemoveQueueMember(techsupport|SIP/3000)\n" ""; static char *app_pqm = "PauseQueueMember" ; static char *app_pqm_synopsis = "Pauses a queue member" ; static char *app_pqm_descrip = -" PauseQueueMember([queuename]|interface):\n" +" PauseQueueMember([queuename]|interface[|options]):\n" "Pauses (blocks calls for) a queue member.\n" "The given interface will be paused in the given queue. This prevents\n" "any calls from being sent from the queue to the interface until it is\n" @@ -179,17 +193,30 @@ static char *app_pqm_descrip = "queuename is given, the interface is paused in every queue it is a\n" "member of. If the interface is not in the named queue, or if no queue\n" "is given and the interface is not in any queue, it will jump to\n" -" priority n+101, if it exists. The application will fail if the interface is not\n" -"found and no extension to jump to exists.\n" +"priority n+101, if it exists and the appropriate options are set.\n" +"The application will fail if the interface is not found and no extension\n" +"to jump to exists.\n" +"The option string may contain zero or more of the following characters:\n" +" 'j' -- jump to +101 priority when appropriate.\n" +" This application sets the following channel variable upon completion:\n" +" PQMSTATUS The status of the attempt to pause a queue member as a\n" +" text string, one of\n" +" PAUSED | NOTFOUND\n" "Example: PauseQueueMember(|SIP/3000)\n"; static char *app_upqm = "UnpauseQueueMember" ; static char *app_upqm_synopsis = "Unpauses a queue member" ; static char *app_upqm_descrip = -" UnpauseQueueMember([queuename]|interface):\n" +" UnpauseQueueMember([queuename]|interface[|options]):\n" "Unpauses (resumes calls to) a queue member.\n" "This is the counterpart to PauseQueueMember and operates exactly the\n" "same way, except it unpauses instead of pausing the given interface.\n" +"The option string may contain zero or more of the following characters:\n" +" 'j' -- jump to +101 priority when appropriate.\n" +" This application sets the following channel variable upon completion:\n" +" UPQMSTATUS The status of the attempt to unpause a queue \n" +" member as a text string, one of\n" +" UNPAUSED | NOTFOUND\n" "Example: UnpauseQueueMember(|SIP/3000)\n"; /*! \brief Persistent Members astdb family */ @@ -243,6 +270,7 @@ struct localuser { LOCAL_USER_DECL; + struct queue_ent { struct ast_call_queue *parent; /*!< What queue is our parent */ char moh[80]; /*!< Name of musiconhold to be used */ @@ -2554,88 +2582,112 @@ static void reload_queue_members(void) static int pqm_exec(struct ast_channel *chan, void *data) { struct localuser *u; - char *queuename, *interface; + char *parse; + int priority_jump = 0; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(queuename); + AST_APP_ARG(interface); + AST_APP_ARG(options); + ); if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "PauseQueueMember requires an argument ([queuename]|interface])\n"); + ast_log(LOG_WARNING, "PauseQueueMember requires an argument ([queuename]|interface[|options])\n"); return -1; } LOCAL_USER_ADD(u); - queuename = ast_strdupa((char *)data); - if (!queuename) { - ast_log(LOG_ERROR, "Out of memory\n"); + if (!(parse = ast_strdupa(data))) { + ast_log(LOG_WARNING, "Memory Error!\n"); LOCAL_USER_REMOVE(u); return -1; } - interface = strchr(queuename, '|'); - if (!interface) { - ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface])\n"); + AST_STANDARD_APP_ARGS(args, parse); + + if (args.options) { + if (strchr(args.options, 'j')) + priority_jump = 1; + } + + if (ast_strlen_zero(args.interface)) { + ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n"); LOCAL_USER_REMOVE(u); return -1; } - *interface = '\0'; - interface++; - - if (set_member_paused(queuename, interface, 1)) { - ast_log(LOG_WARNING, "Attempt to pause interface %s, not found\n", interface); - if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { - LOCAL_USER_REMOVE(u); - return 0; + if (set_member_paused(args.queuename, args.interface, 1)) { + ast_log(LOG_WARNING, "Attempt to pause interface %s, not found\n", args.interface); + if (priority_jump || option_priority_jumping) { + if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { + pbx_builtin_setvar_helper(chan, "PQMSTATUS", "NOTFOUND"); + LOCAL_USER_REMOVE(u); + return 0; + } } LOCAL_USER_REMOVE(u); + pbx_builtin_setvar_helper(chan, "PQMSTATUS", "NOTFOUND"); return -1; } LOCAL_USER_REMOVE(u); - + pbx_builtin_setvar_helper(chan, "PQMSTATUS", "PAUSED"); return 0; } static int upqm_exec(struct ast_channel *chan, void *data) { struct localuser *u; - char *queuename, *interface; + char *parse; + int priority_jump = 0; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(queuename); + AST_APP_ARG(interface); + AST_APP_ARG(options); + ); if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "UnpauseQueueMember requires an argument ([queuename]|interface])\n"); + ast_log(LOG_WARNING, "UnpauseQueueMember requires an argument ([queuename]|interface[|options])\n"); return -1; } LOCAL_USER_ADD(u); - queuename = ast_strdupa((char *)data); - if (!queuename) { - ast_log(LOG_ERROR, "Out of memory\n"); + if (!(parse = ast_strdupa(data))) { + ast_log(LOG_WARNING, "Memory Error!\n"); LOCAL_USER_REMOVE(u); return -1; } - interface = strchr(queuename, '|'); - if (!interface) { - ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface])\n"); + AST_STANDARD_APP_ARGS(args, parse); + + if (args.options) { + if (strchr(args.options, 'j')) + priority_jump = 1; + } + + if (ast_strlen_zero(args.interface)) { + ast_log(LOG_WARNING, "Missing interface argument to PauseQueueMember ([queuename]|interface[|options])\n"); LOCAL_USER_REMOVE(u); return -1; } - *interface = '\0'; - interface++; - - if (set_member_paused(queuename, interface, 0)) { - ast_log(LOG_WARNING, "Attempt to unpause interface %s, not found\n", interface); - if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { - LOCAL_USER_REMOVE(u); - return 0; + if (set_member_paused(args.queuename, args.interface, 0)) { + ast_log(LOG_WARNING, "Attempt to unpause interface %s, not found\n", args.interface); + if (priority_jump || option_priority_jumping) { + if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { + pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "NOTFOUND"); + LOCAL_USER_REMOVE(u); + return 0; + } } LOCAL_USER_REMOVE(u); + pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "NOTFOUND"); return -1; } LOCAL_USER_REMOVE(u); - + pbx_builtin_setvar_helper(chan, "UPQMSTATUS", "UNPAUSED"); return 0; } @@ -2643,52 +2695,58 @@ static int rqm_exec(struct ast_channel *chan, void *data) { int res=-1; struct localuser *u; - char *info, *queuename; - char tmpchan[256]=""; - char *interface = NULL; + char *parse, *temppos = NULL; + int priority_jump = 0; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(queuename); + AST_APP_ARG(interface); + AST_APP_ARG(options); + ); + if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "RemoveQueueMember requires an argument (queuename[|interface])\n"); + ast_log(LOG_WARNING, "RemoveQueueMember requires an argument (queuename[|interface[|options]])\n"); return -1; } LOCAL_USER_ADD(u); - info = ast_strdupa(data); - if (!info) { - ast_log(LOG_ERROR, "Out of memory\n"); + if (!(parse = ast_strdupa(data))) { + ast_log(LOG_WARNING, "Memory Error!\n"); LOCAL_USER_REMOVE(u); return -1; } - queuename = info; - if (queuename) { - interface = strchr(queuename, '|'); - if (interface) { - *interface = '\0'; - interface++; - } - else { - ast_copy_string(tmpchan, chan->name, sizeof(tmpchan)); - interface = strrchr(tmpchan, '-'); - if (interface) - *interface = '\0'; - interface = tmpchan; - } + AST_STANDARD_APP_ARGS(args, parse); + + if (ast_strlen_zero(args.interface)) { + ast_copy_string(args.interface, chan->name, sizeof(args.interface)); + temppos = strrchr(args.interface, '-'); + if (temppos) + *temppos = '\0'; } - switch (remove_from_queue(queuename, interface)) { + if (args.options) { + if (strchr(args.options, 'j')) + priority_jump = 1; + } + + switch (remove_from_queue(args.queuename, args.interface)) { case RES_OKAY: - ast_log(LOG_NOTICE, "Removed interface '%s' from queue '%s'\n", interface, queuename); + ast_log(LOG_NOTICE, "Removed interface '%s' from queue '%s'\n", args.interface, args.queuename); + pbx_builtin_setvar_helper(chan, "RQMSTATUS", "REMOVED"); res = 0; break; case RES_EXISTS: - ast_log(LOG_WARNING, "Unable to remove interface '%s' from queue '%s': Not there\n", interface, queuename); - ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + ast_log(LOG_WARNING, "Unable to remove interface '%s' from queue '%s': Not there\n", args.interface, args.queuename); + if (priority_jump || option_priority_jumping) + ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + pbx_builtin_setvar_helper(chan, "RQMSTATUS", "NOTINQUEUE"); res = 0; break; case RES_NOSUCHQUEUE: - ast_log(LOG_WARNING, "Unable to remove interface from queue '%s': No such queue\n", queuename); + ast_log(LOG_WARNING, "Unable to remove interface from queue '%s': No such queue\n", args.queuename); + pbx_builtin_setvar_helper(chan, "RQMSTATUS", "NOSUCHQUEUE"); res = 0; break; case RES_OUTOFMEMORY: @@ -2704,72 +2762,71 @@ static int aqm_exec(struct ast_channel *chan, void *data) { int res=-1; struct localuser *u; - char *queuename; - char *info; - char tmpchan[512]=""; - char *interface=NULL; - char *penaltys=NULL; + char *parse, *temppos = NULL; + int priority_jump = 0; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(queuename); + AST_APP_ARG(interface); + AST_APP_ARG(penalty); + AST_APP_ARG(options); + ); int penalty = 0; if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[|[interface][|penalty]])\n"); + ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[|[interface]|[penalty][|options]])\n"); return -1; } LOCAL_USER_ADD(u); - info = ast_strdupa(data); - if (!info) { - ast_log(LOG_ERROR, "Out of memory\n"); + if (!(parse = ast_strdupa(data))) { + ast_log(LOG_WARNING, "Memory Error!\n"); LOCAL_USER_REMOVE(u); return -1; } - queuename = info; - if (queuename) { - interface = strchr(queuename, '|'); - if (interface) { - *interface = '\0'; - interface++; - } - if (interface) { - penaltys = strchr(interface, '|'); - if (penaltys) { - *penaltys = '\0'; - penaltys++; - } - } - if (ast_strlen_zero(interface)) { - ast_copy_string(tmpchan, chan->name, sizeof(tmpchan)); - interface = strrchr(tmpchan, '-'); - if (interface) - *interface = '\0'; - interface = tmpchan; - } - if (!ast_strlen_zero(penaltys)) { - if ((sscanf(penaltys, "%d", &penalty) != 1) || penalty < 0) { - ast_log(LOG_WARNING, "Penalty '%s' is invalid, must be an integer >= 0\n", penaltys); - penalty = 0; - } + AST_STANDARD_APP_ARGS(args, parse); + + if (ast_strlen_zero(args.interface)) { + ast_copy_string(args.interface, chan->name, sizeof(args.interface)); + temppos = strrchr(args.interface, '-'); + if (temppos) + *temppos = '\0'; + } + + if (!ast_strlen_zero(args.penalty)) { + if ((sscanf(args.penalty, "%d", &penalty) != 1) || penalty < 0) { + ast_log(LOG_WARNING, "Penalty '%s' is invalid, must be an integer >= 0\n", args.penalty); + penalty = 0; } } + + if (args.options) { + if (strchr(args.options, 'j')) + priority_jump = 1; + } - switch (add_to_queue(queuename, interface, penalty, 0, queue_persistent_members)) { + + switch (add_to_queue(args.queuename, args.interface, penalty, 0, queue_persistent_members)) { case RES_OKAY: - ast_log(LOG_NOTICE, "Added interface '%s' to queue '%s'\n", interface, queuename); + ast_log(LOG_NOTICE, "Added interface '%s' to queue '%s'\n", args.interface, args.queuename); + pbx_builtin_setvar_helper(chan, "AQMSTATUS", "ADDED"); res = 0; break; case RES_EXISTS: - ast_log(LOG_WARNING, "Unable to add interface '%s' to queue '%s': Already there\n", interface, queuename); - ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + ast_log(LOG_WARNING, "Unable to add interface '%s' to queue '%s': Already there\n", args.interface, args.queuename); + if (priority_jump || option_priority_jumping) + ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + pbx_builtin_setvar_helper(chan, "AQMSTATUS", "MEMBERALREADY"); res = 0; break; case RES_NOSUCHQUEUE: - ast_log(LOG_WARNING, "Unable to add interface to queue '%s': No such queue\n", queuename); + ast_log(LOG_WARNING, "Unable to add interface to queue '%s': No such queue\n", args.queuename); + pbx_builtin_setvar_helper(chan, "AQMSTATUS", "NOSUCHQUEUE"); res = 0; break; case RES_OUTOFMEMORY: - ast_log(LOG_ERROR, "Out of memory adding member %s to queue %s\n", interface, queuename); + ast_log(LOG_ERROR, "Out of memory adding member %s to queue %s\n", args.interface, args.queuename); break; } diff --git a/apps/app_read.c b/apps/app_read.c index e024a5c389a8ae1b21f65ffa4b2c40765ff6f86e..90e180fcfb227e3c013754758525a6129641ee78 100755 --- a/apps/app_read.c +++ b/apps/app_read.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_realtime.c b/apps/app_realtime.c index 80f092528fe8242fc423e9cd04a403e8aa1fe9c4..a731fd7c96dd884c6ed79df0e03d9627d059ee16 100755 --- a/apps/app_realtime.c +++ b/apps/app_realtime.c @@ -25,8 +25,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_record.c b/apps/app_record.c index 31905a6c69c178ed554db3d85c2c30145137c32d..7c50a1d7310aed43734740b16ede38cf331ae664 100755 --- a/apps/app_record.c +++ b/apps/app_record.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_senddtmf.c b/apps/app_senddtmf.c index 41ba1bbc41a756631156cd9d8c661dc6e5259cbe..c2c3c765d6f1e702fbed8170bbb401c4a0f1cd16 100755 --- a/apps/app_senddtmf.c +++ b/apps/app_senddtmf.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_sendtext.c b/apps/app_sendtext.c index 177a6a6b4a6f4b8531e115c4c348333de6aae89c..7830ee860091a9d4c56d4d486ebe3318836afb60 100755 --- a/apps/app_sendtext.c +++ b/apps/app_sendtext.c @@ -25,8 +25,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_setcallerid.c b/apps/app_setcallerid.c index 2d01ccfa30c3721cefff13a4e919c3a86ea7484b..877efb53393f92674bfebf5b08f5c7b05e259e61 100755 --- a/apps/app_setcallerid.c +++ b/apps/app_setcallerid.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_setcidname.c b/apps/app_setcidname.c index 2cb5896a0d0f63d7d09064dd7512839674c599d7..6906c132a65073a0c5c687a2b27198e93df9cd87 100755 --- a/apps/app_setcidname.c +++ b/apps/app_setcidname.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_setcidnum.c b/apps/app_setcidnum.c index 95ea2c0ebe0c16cc6d91f6273ecd914f85fee985..a8a7e070625636df9699696989d965f31ff8d428 100755 --- a/apps/app_setcidnum.c +++ b/apps/app_setcidnum.c @@ -24,8 +24,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_setrdnis.c b/apps/app_setrdnis.c index f7f01c2e6608120f5049083655c50ec2409584cf..69c3ed568f0d9fdcec19e420ee4ee448937df9d1 100755 --- a/apps/app_setrdnis.c +++ b/apps/app_setrdnis.c @@ -24,8 +24,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_sms.c b/apps/app_sms.c index cf47d6d9dfdb063dacc09fa8ee346fd85a8975b0..c6feb55603c9be8b0f021282453915c448385573 100755 --- a/apps/app_sms.c +++ b/apps/app_sms.c @@ -22,13 +22,14 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> #include <dirent.h> #include <ctype.h> +#include <sys/types.h> +#include <sys/stat.h> #include "asterisk.h" diff --git a/apps/app_softhangup.c b/apps/app_softhangup.c index e9b0f24f35d8a750cfc44b033fb07657e93dbcf8..804a39259e5d243ce21f9fd2302cbe844432d7d2 100755 --- a/apps/app_softhangup.c +++ b/apps/app_softhangup.c @@ -23,10 +23,11 @@ * \ingroup applications */ -#include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> +#include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_striplsd.c b/apps/app_striplsd.c index e9053946f08069a1a3d29182c5476217c618d0f5..29968d402437edf3cb19f4d4aebe48e21ebf55ee 100755 --- a/apps/app_striplsd.c +++ b/apps/app_striplsd.c @@ -24,8 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_substring.c b/apps/app_substring.c index dbaafd849d878a8e99df146d1690de547a9cfa3b..9771df98d6211b6068304edcf7350bc2159fbfa3 100755 --- a/apps/app_substring.c +++ b/apps/app_substring.c @@ -24,11 +24,11 @@ * \todo Deprecate this application in 1.3dev */ -#include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_system.c b/apps/app_system.c index 5d5216960d5878eaf8d4159188409f90f899d0df..63e9baacb624f5a094d1baa5f8567fd619a479db 100755 --- a/apps/app_system.c +++ b/apps/app_system.c @@ -24,9 +24,9 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <string.h> -#include <stdlib.h> #include <errno.h> #include "asterisk.h" diff --git a/apps/app_talkdetect.c b/apps/app_talkdetect.c index 30e27e3e0537d1b334ec3ab423e5cfa4d09e5fab..11efe7068988d7017640488426898d2155baa8c5 100755 --- a/apps/app_talkdetect.c +++ b/apps/app_talkdetect.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_test.c b/apps/app_test.c index 56b5bf2b937ffc5429435d3a3c4b48ad562e8ceb..dba8bcafb20e8e7b16a8b2e2a1b350eef2c4c120 100755 --- a/apps/app_test.c +++ b/apps/app_test.c @@ -24,12 +24,13 @@ * \ingroup applications */ -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include <unistd.h> #include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> #include "asterisk.h" diff --git a/apps/app_transfer.c b/apps/app_transfer.c index 4443a78744b7a5bce6394697bff3beabe68bb20c..aaff52be0d9b640303db4c64a1e83e20b56e4bca 100755 --- a/apps/app_transfer.c +++ b/apps/app_transfer.c @@ -26,8 +26,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_url.c b/apps/app_url.c index b44fb218b7a7d819f758604fa1402ed95dd890b3..7f274b46a9099cd4a527c6c4a98bf65824410d22 100755 --- a/apps/app_url.c +++ b/apps/app_url.c @@ -22,8 +22,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_userevent.c b/apps/app_userevent.c index 74fa58f2a46aa43f945a727b21ec3be6227bf927..95f5fbc840533c52ada4128c46261400b7d53807 100755 --- a/apps/app_userevent.c +++ b/apps/app_userevent.c @@ -23,9 +23,9 @@ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_waitforring.c b/apps/app_waitforring.c index 0de20560f5d2bfcd8d9f2bdb001ab3cf537079e4..25e651d9eb0b8a2a1a3729bebdeb9acc6522057f 100755 --- a/apps/app_waitforring.c +++ b/apps/app_waitforring.c @@ -24,9 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <stdlib.h> +#include <unistd.h> #include <sys/types.h> #include "asterisk.h" diff --git a/apps/app_waitforsilence.c b/apps/app_waitforsilence.c index 79d2b227497d27152771abd1e9a01ec64818a493..cbba6cfc66cf05a5429dedce0319d6d04c4fade5 100755 --- a/apps/app_waitforsilence.c +++ b/apps/app_waitforsilence.c @@ -30,9 +30,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> -#include <pthread.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_while.c b/apps/app_while.c index 757171ad1873d1fcc23e9e32e797f05f46a5a85a..7c98afe807ab25c434f2821fa1cca51758a4ce12 100755 --- a/apps/app_while.c +++ b/apps/app_while.c @@ -24,8 +24,9 @@ */ #include <stdlib.h> -#include <unistd.h> +#include <stdio.h> #include <string.h> +#include <unistd.h> #include "asterisk.h" diff --git a/apps/app_zapateller.c b/apps/app_zapateller.c index 00fb64787d5503698560a529bd40a31a36c8cc1c..3120a426714568785be0d290f90f315adda90597 100755 --- a/apps/app_zapateller.c +++ b/apps/app_zapateller.c @@ -23,8 +23,9 @@ * \ingroup applications */ -#include <string.h> #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include "asterisk.h" diff --git a/apps/app_zapbarge.c b/apps/app_zapbarge.c index 9511c4f6b964c628441ed9852dd0b3c6f7b4d72a..10c5c49e5f0a10aebf199ffb505e21317d3bd9b9 100755 --- a/apps/app_zapbarge.c +++ b/apps/app_zapbarge.c @@ -27,10 +27,10 @@ */ #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include <unistd.h> #include <errno.h> -#include <string.h> -#include <stdlib.h> #include <sys/ioctl.h> #ifdef __linux__ diff --git a/apps/app_zapscan.c b/apps/app_zapscan.c index a199d4e02137f60e31cbd5a3d8322bbd4423c2cd..ed0c779772544fb1cc2264636a317a18a4e3f28f 100755 --- a/apps/app_zapscan.c +++ b/apps/app_zapscan.c @@ -29,10 +29,10 @@ */ #include <stdlib.h> +#include <stdio.h> +#include <string.h> #include <unistd.h> #include <errno.h> -#include <string.h> -#include <stdlib.h> #include <sys/ioctl.h> #ifdef __linux__ diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 9ccfbeddd5a2d982868ba034ff0a9fafcc7d0250..264c404dd5fe62c2ca603266dc0f794e708eb45b 100755 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -21,6 +21,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> diff --git a/funcs/func_enum.c b/funcs/func_enum.c index 8034be87833ccb241955a43d2af6498ab9ae4d3f..6533d783637b200ed34576efc02075ed3b6a1108 100755 --- a/funcs/func_enum.c +++ b/funcs/func_enum.c @@ -25,6 +25,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include "asterisk.h" diff --git a/funcs/func_groupcount.c b/funcs/func_groupcount.c index 29742298504a64d73f092ff8f405d372a64e2590..0f07d832776611d42221d149a02397410005dbea 100755 --- a/funcs/func_groupcount.c +++ b/funcs/func_groupcount.c @@ -21,6 +21,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> diff --git a/funcs/func_math.c b/funcs/func_math.c index e53eb40237abcd84e3c4f1f0a8f3f0d63526a09c..e8a49acc8ce560f3a8f5572964316ac0071c7c91 100755 --- a/funcs/func_math.c +++ b/funcs/func_math.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> diff --git a/funcs/func_strings.c b/funcs/func_strings.c index ab9474d9bcd2cfe9959f9f6e1b0782fd1a8fa736..91564d9e48bf9408236cff8d556dddf0e18fe6b6 100755 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> #include <regex.h> diff --git a/funcs/func_timeout.c b/funcs/func_timeout.c index d7d5cf4efd08b4249f10ef941ea0fb09ba62d579..4e9256ef5b28236dd2a0cb0f7fcf0a75c4c1e56d 100755 --- a/funcs/func_timeout.c +++ b/funcs/func_timeout.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> diff --git a/funcs/func_uri.c b/funcs/func_uri.c index f75023c5ff4126a1a20aa8379a548179ecc84647..f985f38c1788efc5d6aaf5044e1df884a8826a37 100755 --- a/funcs/func_uri.c +++ b/funcs/func_uri.c @@ -26,6 +26,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c index 81559309d43a12de5a42d6e1ee6f96ac33ef6527..15b15845b4a5f88ab97a7b750c02afdb8c1c6237 100755 --- a/pbx/pbx_dundi.c +++ b/pbx/pbx_dundi.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> diff --git a/pbx/pbx_loopback.c b/pbx/pbx_loopback.c index 2abc11735998de3a9361a6200d035d04e253e8a1..5522e9b0922614cb32fff48c8b30124bccb3b7c6 100755 --- a/pbx/pbx_loopback.c +++ b/pbx/pbx_loopback.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <string.h> #include <errno.h> diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index 6b1c4511a6e4c7bc63b4754bf9a54378cafbeb74..4e9aba1fe0c32fa3415f89416d4c72146d5ee1f6 100755 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -24,6 +24,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <unistd.h> #include <string.h> #include <errno.h> diff --git a/res/res_indications.c b/res/res_indications.c index f53ea766511adb004ba784721ec818e8566f47e5..8a5a9ef1f71329c58063ed7bad9847c4da1b0547 100755 --- a/res/res_indications.c +++ b/res/res_indications.c @@ -28,6 +28,7 @@ #include <string.h> #include <ctype.h> #include <stdlib.h> +#include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h>