#include "asterisk.h"
-
+
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/module.h"
int betweenWordsSilence = dfltBetweenWordsSilence;
int maximumNumberOfWords = dfltMaximumNumberOfWords;
int silenceThreshold = dfltSilenceThreshold;
- int maximumWordLength = dfltMaximumWordLength;
+ int maximumWordLength = dfltMaximumWordLength;
int maxWaitTimeForFrame = dfltMaxWaitTimeForFrame;
AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(argInitialSilence);
- AST_APP_ARG(argGreeting);
- AST_APP_ARG(argAfterGreetingSilence);
- AST_APP_ARG(argTotalAnalysisTime);
- AST_APP_ARG(argMinimumWordLength);
- AST_APP_ARG(argBetweenWordsSilence);
- AST_APP_ARG(argMaximumNumberOfWords);
- AST_APP_ARG(argSilenceThreshold);
- AST_APP_ARG(argMaximumWordLength);
+ AST_APP_ARG(argInitialSilence);
+ AST_APP_ARG(argGreeting);
+ AST_APP_ARG(argAfterGreetingSilence);
+ AST_APP_ARG(argTotalAnalysisTime);
+ AST_APP_ARG(argMinimumWordLength);
+ AST_APP_ARG(argBetweenWordsSilence);
+ AST_APP_ARG(argMaximumNumberOfWords);
+ AST_APP_ARG(argSilenceThreshold);
+ AST_APP_ARG(argMaximumWordLength);
);
ast_verb(3, "AMD: %s %s %s (Fmt: %d)\n", chan->name ,chan->cid.cid_ani, chan->cid.cid_rdnis, chan->readformat);
maximumNumberOfWords = atoi(args.argMaximumNumberOfWords);
if (!ast_strlen_zero(args.argSilenceThreshold))
silenceThreshold = atoi(args.argSilenceThreshold);
- if (!ast_strlen_zero(args.argMaximumWordLength))
- maximumWordLength = atoi(args.argMaximumWordLength);
+ if (!ast_strlen_zero(args.argMaximumWordLength))
+ maximumWordLength = atoi(args.argMaximumWordLength);
} else {
ast_debug(1, "AMD using the default parameters.\n");
}
ast_verb(3, "AMD: Channel [%s]. Changed state to STATE_IN_SILENCE\n", chan->name);
}
/* Find words less than word duration */
- if (consecutiveVoiceDuration < minimumWordLength && consecutiveVoiceDuration > 0){
- ast_verb(3, "AMD: Channel [%s]. Short Word Duration: %d\n", chan->name, consecutiveVoiceDuration);
- }
+ if (consecutiveVoiceDuration < minimumWordLength && consecutiveVoiceDuration > 0){
+ ast_verb(3, "AMD: Channel [%s]. Short Word Duration: %d\n", chan->name, consecutiveVoiceDuration);
+ }
currentState = STATE_IN_SILENCE;
consecutiveVoiceDuration = 0;
}
-
+
if (inInitialSilence == 1 && silenceDuration >= initialSilence) {
ast_verb(3, "AMD: Channel [%s]. ANSWERING MACHINE: silenceDuration:%d initialSilence:%d\n",
- chan->name, silenceDuration, initialSilence);
+ chan->name, silenceDuration, initialSilence);
ast_frfree(f);
strcpy(amdStatus , "MACHINE");
sprintf(amdCause , "INITIALSILENCE-%d-%d", silenceDuration, initialSilence);
if (silenceDuration >= afterGreetingSilence && inGreeting == 1) {
ast_verb(3, "AMD: Channel [%s]. HUMAN: silenceDuration:%d afterGreetingSilence:%d\n",
- chan->name, silenceDuration, afterGreetingSilence);
+ chan->name, silenceDuration, afterGreetingSilence);
ast_frfree(f);
strcpy(amdStatus , "HUMAN");
sprintf(amdCause , "HUMAN-%d-%d", silenceDuration, afterGreetingSilence);
} else {
consecutiveVoiceDuration += framelength;
voiceDuration += framelength;
-
+
/* If I have enough consecutive voice to say that I am in a Word, I can only increment the
number of words if my previous state was Silence, which means that I moved into a word. */
if (consecutiveVoiceDuration >= minimumWordLength && currentState == STATE_IN_SILENCE) {
previousState = currentState;
currentState = STATE_IN_WORD;
}
- if (consecutiveVoiceDuration >= maximumWordLength){
- ast_verb(3, "AMD: Channel [%s]. Maximum Word Length detected. [%d]\n", chan->name, consecutiveVoiceDuration);
- ast_frfree(f);
- strcpy(amdStatus , "MACHINE");
- sprintf(amdCause , "MAXWORDLENGTH-%d", consecutiveVoiceDuration);
- break;
- }
+ if (consecutiveVoiceDuration >= maximumWordLength){
+ ast_verb(3, "AMD: Channel [%s]. Maximum Word Length detected. [%d]\n", chan->name, consecutiveVoiceDuration);
+ ast_frfree(f);
+ strcpy(amdStatus , "MACHINE");
+ sprintf(amdCause , "MAXWORDLENGTH-%d", consecutiveVoiceDuration);
+ break;
+ }
if (iWordsCount >= maximumNumberOfWords) {
ast_verb(3, "AMD: Channel [%s]. ANSWERING MACHINE: iWordsCount:%d\n", chan->name, iWordsCount);
ast_frfree(f);
res = 1;
break;
}
-
+
if (inGreeting == 1 && voiceDuration >= greeting) {
ast_verb(3, "AMD: Channel [%s]. ANSWERING MACHINE: voiceDuration:%d greeting:%d\n", chan->name, voiceDuration, greeting);
ast_frfree(f);
res = 1;
break;
}
-
+
if (voiceDuration >= minimumWordLength ) {
if (silenceDuration > 0)
ast_verb(3, "AMD: Channel [%s]. Detected Talk, previous silence duration: %d\n", chan->name, silenceDuration);
silenceDuration = 0;
}
- if (consecutiveVoiceDuration >= minimumWordLength && inGreeting == 0){
+ if (consecutiveVoiceDuration >= minimumWordLength && inGreeting == 0) {
/* Only go in here once to change the greeting flag when we detect the 1st word */
if (silenceDuration > 0)
ast_verb(3, "AMD: Channel [%s]. Before Greeting Time: silenceDuration: %d voiceDuration: %d\n", chan->name, silenceDuration, voiceDuration);
dfltMaximumNumberOfWords = atoi(var->value);
} else if (!strcasecmp(var->name, "maximum_word_length")) {
dfltMaximumWordLength = atoi(var->value);
-
+
} else {
ast_log(LOG_WARNING, "%s: Cat:%s. Unknown keyword %s at line %d of amd.conf\n",
app, cat, var->name, var->lineno);
ast_verb(3, "AMD defaults: initialSilence [%d] greeting [%d] afterGreetingSilence [%d] "
"totalAnalysisTime [%d] minimumWordLength [%d] betweenWordsSilence [%d] maximumNumberOfWords [%d] silenceThreshold [%d] maximumWordLength [%d]\n",
- dfltInitialSilence, dfltGreeting, dfltAfterGreetingSilence, dfltTotalAnalysisTime,
- dfltMinimumWordLength, dfltBetweenWordsSilence, dfltMaximumNumberOfWords, dfltSilenceThreshold, dfltMaximumWordLength);
+ dfltInitialSilence, dfltGreeting, dfltAfterGreetingSilence, dfltTotalAnalysisTime,
+ dfltMinimumWordLength, dfltBetweenWordsSilence, dfltMaximumNumberOfWords, dfltSilenceThreshold, dfltMaximumWordLength);
return 0;
}
.load = load_module,
.unload = unload_module,
.reload = reload,
- );
+);
* \brief Execute arbitrary authenticate commands
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
AST_APP_ARG(options);
AST_APP_ARG(maxdigits);
);
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Authenticate requires an argument(password)\n");
return -1;
if ((res = ast_answer(chan)))
return -1;
}
-
+
argcopy = ast_strdupa(data);
AST_STANDARD_APP_ARGS(arglist, argcopy);
-
+
if (!ast_strlen_zero(arglist.options))
ast_app_parse_options(auth_app_options, &flags, NULL, arglist.options);
if (arglist.password[0] != '/') {
/* Compare against a fixed password */
- if (!strcmp(passwd, arglist.password))
+ if (!strcmp(passwd, arglist.password))
break;
}
/* Compare against a file */
FILE *f;
char buf[256] = "", md5passwd[33] = "", *md5secret = NULL;
-
+
if (!(f = fopen(arglist.password, "r"))) {
ast_log(LOG_WARNING, "Unable to open file '%s' for authentication: %s\n", arglist.password, strerror(errno));
continue;
}
if ((retries < 3) && !res) {
- if (ast_test_flag(&flags,OPT_ACCOUNT) && !ast_test_flag(&flags,OPT_MULTIPLE))
+ if (ast_test_flag(&flags,OPT_ACCOUNT) && !ast_test_flag(&flags,OPT_MULTIPLE))
ast_cdr_setaccount(chan, passwd);
if (!(res = ast_streamfile(chan, "auth-thankyou", chan->language)))
res = ast_waitstream(chan, "");
*/
/*! \file
- *
+ *
* \brief Applications connected with CDR engine
*
* \author Martin Pycko <martinp@digium.com>
#include "asterisk/channel.h"
#include "asterisk/module.h"
-static char *nocdr_descrip =
+static char *nocdr_descrip =
" NoCDR(): This application will tell Asterisk not to maintain a CDR for the\n"
"current call.\n";
*/
/*! \file
- *
+ *
* \brief Check if Channel is Available
- *
+ *
* \author Mark Spencer <markster@digium.com>
* \author James Golovich <james@gnuinter.net>
static char *synopsis = "Check channel availability";
-static char *descrip =
+static char *descrip =
" ChanIsAvail(Technology/resource[&Technology2/resource2...][,options]): \n"
"This application will check to see if any of the specified channels are\n"
"available.\n"
return -1;
}
- info = ast_strdupa(data);
+ info = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, info);
number++;
if (string_compare) {
- /* ast_parse_device_state checks for "SIP/1234" as a channel name.
+ /* ast_parse_device_state checks for "SIP/1234" as a channel name.
ast_device_state will ask the SIP driver for the channel state. */
snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
status = inuse = ast_parse_device_state(trychan);
} else if (option_state) {
/* If the pbx says in use then don't bother trying further.
- This is to permit testing if someone's on a call, even if the
- channel can permit more calls (ie callwaiting, sip calls, etc). */
-
+ This is to permit testing if someone's on a call, even if the
+ channel can permit more calls (ie callwaiting, sip calls, etc). */
+
snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
status = inuse = ast_device_state(trychan);
}
static char *app = "ChannelRedirect";
static char *synopsis = "Redirects given channel to a dialplan target.";
-static char *descrip =
+static char *descrip =
"ChannelRedirect(channel,[[context,]extension,]priority)\n"
" Sends the specified channel to the specified extension priority\n";
#include <ctype.h>
-#include "asterisk/paths.h" /* use ast_config_AST_MONITOR_DIR */
+#include "asterisk/paths.h" /* use ast_config_AST_MONITOR_DIR */
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/audiohook.h"
static const char *tdesc = "Listen to a channel, and optionally whisper into it";
static const char *app_chan = "ChanSpy";
-static const char *desc_chan =
+static const char *desc_chan =
" ChanSpy([chanprefix][,options]): This application is used to listen to the\n"
"audio from an Asterisk channel. This includes the audio coming in and\n"
"out of the channel being spied on. If the 'chanprefix' parameter is specified,\n"
;
static const char *app_ext = "ExtenSpy";
-static const char *desc_ext =
+static const char *desc_ext =
" ExtenSpy(exten[@context][,options]): This application is used to listen to the\n"
"audio from an Asterisk channel. This includes the audio coming in and\n"
"out of the channel being spied on. Only channels created by outgoing calls for the\n"
;
enum {
- OPTION_QUIET = (1 << 0), /* Quiet, no announcement */
- OPTION_BRIDGED = (1 << 1), /* Only look at bridged calls */
- OPTION_VOLUME = (1 << 2), /* Specify initial volume */
- OPTION_GROUP = (1 << 3), /* Only look at channels in group */
+ OPTION_QUIET = (1 << 0), /* Quiet, no announcement */
+ OPTION_BRIDGED = (1 << 1), /* Only look at bridged calls */
+ OPTION_VOLUME = (1 << 2), /* Specify initial volume */
+ OPTION_GROUP = (1 << 3), /* Only look at channels in group */
OPTION_RECORD = (1 << 4),
- OPTION_WHISPER = (1 << 5),
- OPTION_PRIVATE = (1 << 6), /* Private Whisper mode */
- OPTION_READONLY = (1 << 7), /* Don't mix the two channels */
- OPTION_EXIT = (1 << 8), /* Exit to a valid single digit extension */
+ OPTION_WHISPER = (1 << 5),
+ OPTION_PRIVATE = (1 << 6), /* Private Whisper mode */
+ OPTION_READONLY = (1 << 7), /* Don't mix the two channels */
+ OPTION_EXIT = (1 << 8), /* Exit to a valid single digit extension */
OPTION_ENFORCED = (1 << 9), /* Enforced mode */
} chanspy_opt_flags;
/* nothing to do */
}
-static int spy_generate(struct ast_channel *chan, void *data, int len, int samples)
+static int spy_generate(struct ast_channel *chan, void *data, int len, int samples)
{
struct chanspy_translation_helper *csth = data;
struct ast_frame *f = NULL;
-
+
ast_audiohook_lock(&csth->spy_audiohook);
if (csth->spy_audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
/* Channel is already gone more than likely */
f = ast_audiohook_read_frame(&csth->spy_audiohook, samples, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR);
ast_audiohook_unlock(&csth->spy_audiohook);
-
+
if (!f)
return 0;
-
+
if (ast_write(chan, f)) {
ast_frfree(f);
return -1;
static struct ast_generator spygen = {
.alloc = spy_alloc,
.release = spy_release,
- .generate = spy_generate,
+ .generate = spy_generate,
};
-static int start_spying(struct ast_channel *chan, struct ast_channel *spychan, struct ast_audiohook *audiohook)
+static int start_spying(struct ast_channel *chan, struct ast_channel *spychan, struct ast_audiohook *audiohook)
{
int res = 0;
struct ast_channel *peer = NULL;
res = ast_audiohook_attach(chan, audiohook);
if (!res && ast_test_flag(chan, AST_FLAG_NBRIDGE) && (peer = ast_bridged_channel(chan)))
- ast_softhangup(peer, AST_SOFTHANGUP_UNBRIDGE);
+ ast_softhangup(peer, AST_SOFTHANGUP_UNBRIDGE);
return res;
}
static int channel_spy(struct ast_channel *chan, struct ast_channel *spyee, int *volfactor, int fd,
- const struct ast_flags *flags, char *exitcontext)
+ const struct ast_flags *flags, char *exitcontext)
{
struct chanspy_translation_helper csth;
int running = 0, res, x = 0;
memset(&csth, 0, sizeof(csth));
ast_audiohook_init(&csth.spy_audiohook, AST_AUDIOHOOK_TYPE_SPY, "ChanSpy");
-
+
if (start_spying(spyee, chan, &csth.spy_audiohook)) {
ast_audiohook_destroy(&csth.spy_audiohook);
return 0;
running = -1;
break;
}
-
+
if (ast_test_flag(flags, OPTION_EXIT)) {
char tmp[2];
tmp[0] = res;
ast_audiohook_destroy(&csth.spy_audiohook);
ast_verb(2, "Done Spying on channel %s\n", name);
-
+
return running;
}
static struct ast_channel *next_channel(const struct ast_channel *last, const char *spec,
- const char *exten, const char *context)
+ const char *exten, const char *context)
{
struct ast_channel *this;
-
+
redo:
if (!ast_strlen_zero(spec))
this = ast_walk_channel_by_name_prefix_locked(last, spec, strlen(spec));
}
static int common_exec(struct ast_channel *chan, const struct ast_flags *flags,
- int volfactor, const int fd, const char *mygroup, const char *myenforced,
- const char *spec, const char *exten, const char *context)
+ int volfactor, const int fd, const char *mygroup, const char *myenforced,
+ const char *spec, const char *exten, const char *context)
{
struct ast_channel *peer, *prev, *next;
char nameprefix[AST_NAME_STRLEN];
if (ast_test_flag(flags, OPTION_EXIT)) {
const char *c;
- if ((c = pbx_builtin_getvar_helper(chan, "SPY_EXIT_CONTEXT")))
+ if ((c = pbx_builtin_getvar_helper(chan, "SPY_EXIT_CONTEXT")))
ast_copy_string(exitcontext, c, sizeof(exitcontext));
- else if (!ast_strlen_zero(chan->macrocontext))
+ else if (!ast_strlen_zero(chan->macrocontext))
ast_copy_string(exitcontext, chan->macrocontext, sizeof(exitcontext));
else
ast_copy_string(exitcontext, chan->context, sizeof(exitcontext));
else
ast_debug(2, "Exit by single digit did not work in chanspy. Extension %s does not exist in context %s\n", tmp, exitcontext);
}
-
+
/* reset for the next loop around, unless overridden later */
waitms = 100;
peer = prev = next = NULL;
num_spyed_upon = 0;
for (peer = next_channel(peer, spec, exten, context);
- peer;
- prev = peer, peer = next ? next : next_channel(peer, spec, exten, context), next = NULL) {
+ peer;
+ prev = peer, peer = next ? next : next_channel(peer, spec, exten, context), next = NULL) {
const char *group;
int igrp = !mygroup;
char *groups[25];
char *ext;
char *form_enforced;
int ienf = !myenforced;
-
+
if (peer == prev)
break;
if ((group = pbx_builtin_getvar_helper(peer, "SPYGROUP"))) {
dup_group = ast_strdupa(group);
num_groups = ast_app_separate_args(dup_group, ':', groups,
- sizeof(groups) / sizeof(groups[0]));
+ sizeof(groups) / sizeof(groups[0]));
}
-
+
for (x = 0; x < num_groups; x++) {
if (!strcmp(mygroup, groups[x])) {
igrp = 1;
}
}
}
-
+
if (!igrp)
continue;
if (myenforced) {
-
+
/* We don't need to allocate more space than just the
length of (peer->name) for ext as we will cut the
channel name's ending before copying into ext */
ext = alloca(strlen(peer->name));
- form_enforced = alloca(strlen(myenforced) + 3);
-
+ form_enforced = alloca(strlen(myenforced) + 3);
+
strcpy(form_enforced, ":");
strcat(form_enforced, myenforced);
strcat(form_enforced, ":");
-
+
buffer = ast_strdupa(peer->name);
if ((end = strchr(buffer, '-'))) {
- *end++ = ':';
- *end = '\0';
+ *end++ = ':';
+ *end = '\0';
}
-
+
strcpy(ext, ":");
- strcat(ext, buffer);
+ strcat(ext, buffer);
if (strcasestr(form_enforced, ext))
ienf = 1;
strncat(peer_name, peer->name, AST_NAME_STRLEN);
ptr = strchr(peer_name, '/');
*ptr++ = '\0';
-
+
for (s = peer_name; s < ptr; s++)
*s = tolower(*s);
-
+
if (!ast_test_flag(flags, OPTION_QUIET)) {
if (ast_fileexists(peer_name, NULL, NULL) != -1) {
res = ast_streamfile(chan, peer_name, chan->language);
break;
} else
res = ast_say_character_str(chan, peer_name, "", chan->language);
- if ((num = atoi(ptr)))
+ if ((num = atoi(ptr)))
ast_say_digits(chan, atoi(ptr), "", chan->language);
}
-
+
waitms = 5000;
res = channel_spy(chan, peer, &volfactor, fd, flags, exitcontext);
- num_spyed_upon++;
+ num_spyed_upon++;
if (res == -1) {
goto exit;
mygroup = opts[OPT_ARG_GROUP];
if (ast_test_flag(&flags, OPTION_RECORD) &&
- !(recbase = opts[OPT_ARG_RECORD]))
+ !(recbase = opts[OPT_ARG_RECORD]))
recbase = "chanspy";
if (ast_test_flag(&flags, OPTION_VOLUME) && opts[OPT_ARG_VOLUME]) {
if (args.options) {
char *opts[OPT_ARG_ARRAY_SIZE];
-
+
ast_app_parse_options(spy_opts, &flags, opts, args.options);
if (ast_test_flag(&flags, OPTION_GROUP))
mygroup = opts[OPT_ARG_GROUP];
if (ast_test_flag(&flags, OPTION_RECORD) &&
- !(recbase = opts[OPT_ARG_RECORD]))
+ !(recbase = opts[OPT_ARG_RECORD]))
recbase = "chanspy";
if (ast_test_flag(&flags, OPTION_VOLUME) && opts[OPT_ARG_VOLUME]) {
*/
/*! \file
- *
+ *
* \brief Trivial application to control playback of a sound file
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static const char *synopsis = "Play a file with fast forward and rewind";
-static const char *descrip =
+static const char *descrip =
" ControlPlayback(file[,skipms[,ff[,rew[,stop[,pause[,restart,options]]]]]]]):\n"
"This application will play back the given filename. By default, the '*' key\n"
"can be used to rewind, and the '#' key can be used to fast-forward.\n"
AST_APP_OPTIONS(cpb_opts, BEGIN_OPTIONS
AST_APP_OPTION_ARG('o', OPT_OFFSET, OPT_ARG_OFFSET),
-END_OPTIONS );
+ END_OPTIONS
+);
static int is_on_phonepad(char key)
{
args.restart = NULL;
if (args.options) {
- ast_app_parse_options(cpb_opts, &opts, opt_args, args.options);
+ ast_app_parse_options(cpb_opts, &opts, opt_args, args.options);
if (ast_test_flag(&opts, OPT_OFFSET))
offsetms = atol(opt_args[OPT_ARG_OFFSET]);
}
static int deltree_exec(struct ast_channel *chan, void *data)
{
char *argv, *family, *keytree;
-
+
argv = ast_strdupa(data);
-
+
if (strchr(argv, '/')) {
family = strsep(&argv, "/");
keytree = strsep(&argv, "\0");
family = argv;
keytree = 0;
}
-
+
if (keytree)
ast_verb(3, "DBdeltree: family=%s, keytree=%s\n", family, keytree);
else
ast_verb(3, "DBdeltree: family=%s\n", family);
-
+
if (ast_db_deltree(family, keytree))
ast_verb(3, "DBdeltree: Error deleting key from database.\n");
{
char *argv, *family, *key;
static int deprecation_warning = 0;
-
+
if (!deprecation_warning) {
deprecation_warning = 1;
ast_log(LOG_WARNING, "The DBdel application has been deprecated in favor of the DB_DELETE dialplan function!\n");
}
-
+
argv = ast_strdupa(data);
-
+
if (strchr(argv, '/')) {
family = strsep(&argv, "/");
key = strsep(&argv, "\0");
} else {
ast_debug(1, "Ignoring, no parameters\n");
}
-
+
return 0;
}
retval = ast_register_application(d_app, del_exec, d_synopsis, d_descrip);
retval |= ast_register_application(dt_app, deltree_exec, dt_synopsis, dt_descrip);
-
+
return retval;
}
* \brief dial() & retrydial() - Trivial application to dial a channel and send an URL on answer
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
#include <sys/stat.h>
#include <netinet/in.h>
-#include "asterisk/paths.h" /* use ast_config_AST_DATA_DIR */
+#include "asterisk/paths.h" /* use ast_config_AST_DATA_DIR */
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
"continue if no requested channels can be called, or if the timeout expires.\n\n"
" This application sets the following channel variables upon completion:\n"
" DIALEDTIME - This is the time from dialing a channel until when it\n"
-" is disconnected.\n"
+" is disconnected.\n"
" ANSWEREDTIME - This is the amount of time for actual call.\n"
" DIALSTATUS - This is the status of the call:\n"
-" CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | ANSWER | CANCEL\n"
+" CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | ANSWER | CANCEL\n"
" DONTCALL | TORTURE | INVALIDARGS\n"
" For the Privacy and Screening Modes, the DIALSTATUS variable will be set to\n"
"DONTCALL if the called party chooses to send the calling party to the 'Go Away'\n"
" the specified priority and the called party to the specified priority+1.\n"
" Optionally, an extension, or extension and context may be specified. \n"
" Otherwise, the current extension is used. You cannot use any additional\n"
-" action post answer options in conjunction with this option.\n"
+" action post answer options in conjunction with this option.\n"
" h - Allow the called party to hang up by sending the '*' DTMF digit.\n"
" H - Allow the calling party to hang up by hitting the '*' DTMF digit.\n"
" i - Asterisk will ignore any forwarding requests it may receive on this\n"
" M(x[^arg]) - Execute the Macro for the *called* channel before connecting\n"
" to the calling channel. Arguments can be specified to the Macro\n"
" using '^' as a delimeter. The Macro can set the variable\n"
-" MACRO_RESULT to specify the following actions after the Macro is\n"
+" MACRO_RESULT to specify the following actions after the Macro is\n"
" finished executing.\n"
" * ABORT Hangup both legs of the call.\n"
" * CONGESTION Behave as if line congestion was encountered.\n"
" r - Indicate ringing to the calling party. Pass no audio to the calling\n"
" party until the called channel has answered.\n"
" S(x) - Hang up the call after 'x' seconds *after* the called party has\n"
-" answered the call.\n"
+" answered the call.\n"
" t - Allow the called party to transfer the calling party by sending the\n"
" DTMF sequence defined in features.conf.\n"
" T - Allow the calling party to transfer the called party by sending the\n"
" U(x[^arg]) - Execute via Gosub the routine 'x' for the *called* channel before connecting\n"
" to the calling channel. Arguments can be specified to the Gosub\n"
" using '^' as a delimeter. The Gosub routine can set the variable\n"
-" GOSUB_RESULT to specify the following actions after the Gosub returns.\n"
+" GOSUB_RESULT to specify the following actions after the Gosub returns.\n"
" * ABORT Hangup both legs of the call.\n"
" * CONGESTION Behave as if line congestion was encountered.\n"
" * BUSY Behave as if a busy signal was encountered.\n"
" the DTMF sequence defined for one-touch automixmonitor in features.conf\n"
" X - Allow the calling party to enable recording of the call by sending\n"
" the DTMF sequence defined for one-touch automixmonitor in features.conf\n";
-
+
/* RetryDial App by Anthony Minessale II <anthmct@yahoo.com> Jan/2005 */
static char *rapp = "RetryDial";
static char *rsynopsis = "Place a call, retrying on failure allowing optional exit extension.";
OPT_CALLER_MIXMONITOR = (1 << 30),
};
-#define DIAL_STILLGOING (1 << 31)
-#define DIAL_NOFORWARDHTML ((uint64_t)1 << 32) /* flags are now 64 bits, so keep it up! */
-#define OPT_CANCEL_ELSEWHERE ((uint64_t)1 << 33)
-#define OPT_PEER_H ((uint64_t)1 << 34)
+#define DIAL_STILLGOING (1 << 31)
+#define DIAL_NOFORWARDHTML ((uint64_t)1 << 32) /* flags are now 64 bits, so keep it up! */
+#define OPT_CANCEL_ELSEWHERE ((uint64_t)1 << 33)
+#define OPT_PEER_H ((uint64_t)1 << 34)
enum {
OPT_ARG_ANNOUNCE = 0,
s = (new_val); \
} while (0)
-static int onedigit_goto(struct ast_channel *chan, const char *context, char exten, int pri)
+static int onedigit_goto(struct ast_channel *chan, const char *context, char exten, int pri)
{
char rexten[2] = { exten, '\0' };
static void senddialevent(struct ast_channel *src, struct ast_channel *dst, const char *dialstring)
{
- manager_event(EVENT_FLAG_CALL, "Dial",
- "SubEvent: Begin\r\n"
- "Channel: %s\r\n"
- "Destination: %s\r\n"
- "CallerIDNum: %s\r\n"
- "CallerIDName: %s\r\n"
- "UniqueID: %s\r\n"
- "DestUniqueID: %s\r\n"
- "Dialstring: %s\r\n",
- src->name, dst->name, S_OR(src->cid.cid_num, "<unknown>"),
- S_OR(src->cid.cid_name, "<unknown>"), src->uniqueid,
- dst->uniqueid, dialstring ? dialstring : "");
+ manager_event(EVENT_FLAG_CALL, "Dial",
+ "SubEvent: Begin\r\n"
+ "Channel: %s\r\n"
+ "Destination: %s\r\n"
+ "CallerIDNum: %s\r\n"
+ "CallerIDName: %s\r\n"
+ "UniqueID: %s\r\n"
+ "DestUniqueID: %s\r\n"
+ "Dialstring: %s\r\n",
+ src->name, dst->name, S_OR(src->cid.cid_num, "<unknown>"),
+ S_OR(src->cid.cid_name, "<unknown>"), src->uniqueid,
+ dst->uniqueid, dialstring ? dialstring : "");
}
static void senddialendevent(const struct ast_channel *src, const char *dialstatus)
{
manager_event(EVENT_FLAG_CALL, "Dial",
- "SubEvent: End\r\n"
- "Channel: %s\r\n"
- "UniqueID: %s\r\n"
- "DialStatus: %s\r\n",
- src->name, src->uniqueid, dialstatus);
-}
+ "SubEvent: End\r\n"
+ "Channel: %s\r\n"
+ "UniqueID: %s\r\n"
+ "DialStatus: %s\r\n",
+ src->name, src->uniqueid, dialstatus);
+}
/*!
* helper function for wait_for_answer()
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
}
if (!c) {
- ast_clear_flag64(o, DIAL_STILLGOING);
+ ast_clear_flag64(o, DIAL_STILLGOING);
handle_cause(cause, num);
} else {
char *new_cid_num, *new_cid_name;
if (ast_test_flag64(o, OPT_FORCECLID)) {
new_cid_num = ast_strdup(S_OR(in->macroexten, in->exten));
new_cid_name = NULL; /* XXX no name ? */
- src = c; /* XXX possible bug in previous code, which used 'winner' ? it may have changed */
+ src = c; /* XXX possible bug in previous code, which used 'winner' ? it may have changed */
} else {
new_cid_num = ast_strdup(in->cid.cid_num);
new_cid_name = ast_strdup(in->cid.cid_name);
S_REPLACE(c->cid.cid_rdnis, ast_strdup(S_OR(in->macroexten, in->exten)));
if (ast_call(c, tmpchan, 0)) {
ast_log(LOG_NOTICE, "Failed to dial on local channel for call forward to '%s'\n", tmpchan);
- ast_clear_flag64(o, DIAL_STILLGOING);
+ ast_clear_flag64(o, DIAL_STILLGOING);
ast_hangup(original);
c = o->chan = NULL;
num->nochan++;
/* argument used for some functions. */
struct privacy_args {
- int sentringing;
- int privdb_val;
- char privcid[256];
- char privintro[1024];
- char status[256];
+ int sentringing;
+ int privdb_val;
+ char privcid[256];
+ char privintro[1024];
+ char status[256];
};
static struct ast_channel *wait_for_answer(struct ast_channel *in,
#ifdef HAVE_EPOLL
struct chanlist *epollo;
#endif
-
+
if (single) {
/* Turn off hold music, etc */
ast_deactivate_generator(in);
#ifdef HAVE_EPOLL
for (epollo = outgoing; epollo; epollo = epollo->next)
ast_poll_channel_add(in, epollo->chan);
-#endif
-
+#endif
+
while (*to && !peer) {
struct chanlist *o;
- int pos = 0; /* how many channels do we handle */
+ int pos = 0; /* how many channels do we handle */
int numlines = prestart;
struct ast_channel *winner;
struct ast_channel *watchers[AST_MAX_WATCHERS];
watchers[pos++] = o->chan;
numlines++;
}
- if (pos == 1) { /* only the input channel is available */
+ if (pos == 1) { /* only the input channel is available */
if (numlines == (num.busy + num.congestion + num.nochan)) {
ast_verb(2, "Everyone is busy/congested at this time (%d:%d/%d/%d)\n", numlines, num.busy, num.congestion, num.nochan);
if (num.busy)
- strcpy(pa->status, "BUSY");
+ strcpy(pa->status, "BUSY");
else if (num.congestion)
strcpy(pa->status, "CONGESTION");
else if (num.nochan)
ast_verb(3, "%s answered %s\n", c->name, in->name);
peer = c;
ast_copy_flags64(peerflags, o,
- OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
- OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
- OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
- OPT_CALLEE_PARK | OPT_CALLER_PARK |
- OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
- DIAL_NOFORWARDHTML);
+ OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
+ OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
+ OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
+ OPT_CALLEE_PARK | OPT_CALLER_PARK |
+ OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
+ DIAL_NOFORWARDHTML);
ast_copy_string(c->dialcontext, "", sizeof(c->dialcontext));
ast_copy_string(c->exten, "", sizeof(c->exten));
}
ast_verb(3, "%s answered %s\n", c->name, in->name);
peer = c;
ast_copy_flags64(peerflags, o,
- OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
- OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
- OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
- OPT_CALLEE_PARK | OPT_CALLER_PARK |
- OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
- DIAL_NOFORWARDHTML);
+ OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
+ OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
+ OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
+ OPT_CALLEE_PARK | OPT_CALLER_PARK |
+ OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
+ DIAL_NOFORWARDHTML);
ast_copy_string(c->dialcontext, "", sizeof(c->dialcontext));
ast_copy_string(c->exten, "", sizeof(c->exten));
if (CAN_EARLY_BRIDGE(peerflags))
in->hangupcause = c->hangupcause;
ast_hangup(c);
c = o->chan = NULL;
- ast_clear_flag64(o, DIAL_STILLGOING);
+ ast_clear_flag64(o, DIAL_STILLGOING);
handle_cause(AST_CAUSE_BUSY, &num);
break;
case AST_CONTROL_CONGESTION:
} else if (single) {
/* XXX are we sure the logic is correct ? or we should just switch on f->frametype ? */
if (f->frametype == AST_FRAME_VOICE && !ast_test_flag64(outgoing, OPT_RINGBACK|OPT_MUSICBACK)) {
- if (ast_write(in, f))
+ if (ast_write(in, f))
ast_log(LOG_WARNING, "Unable to forward voice frame\n");
} else if (f->frametype == AST_FRAME_IMAGE && !ast_test_flag64(outgoing, OPT_RINGBACK|OPT_MUSICBACK)) {
if (ast_write(in, f))
}
}
- if (ast_test_flag64(peerflags, OPT_CALLER_HANGUP) &&
- (f->subclass == '*')) { /* hmm it it not guaranteed to be '*' anymore. */
+ if (ast_test_flag64(peerflags, OPT_CALLER_HANGUP) &&
+ (f->subclass == '*')) { /* hmm it it not guaranteed to be '*' anymore. */
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass);
*to = 0;
strcpy(pa->status, "CANCEL");
}
/* Forward HTML stuff */
- if (single && (f->frametype == AST_FRAME_HTML) && !ast_test_flag64(outgoing, DIAL_NOFORWARDHTML))
+ if (single && (f->frametype == AST_FRAME_HTML) && !ast_test_flag64(outgoing, DIAL_NOFORWARDHTML))
if (ast_channel_sendhtml(outgoing->chan, f->subclass, f->data, f->datalen) == -1)
ast_log(LOG_WARNING, "Unable to send URL\n");
-
if (single && ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF_BEGIN) || (f->frametype == AST_FRAME_DTMF_END))) {
if (ast_write(outgoing->chan, f))
ast_log(LOG_WARNING, "Unable to forward voice or dtmf\n");
}
- if (single && (f->frametype == AST_FRAME_CONTROL) &&
- ((f->subclass == AST_CONTROL_HOLD) ||
- (f->subclass == AST_CONTROL_UNHOLD) ||
- (f->subclass == AST_CONTROL_VIDUPDATE))) {
+ if (single && (f->frametype == AST_FRAME_CONTROL) &&
+ ((f->subclass == AST_CONTROL_HOLD) ||
+ (f->subclass == AST_CONTROL_UNHOLD) ||
+ (f->subclass == AST_CONTROL_VIDUPDATE))) {
ast_verb(3, "%s requested special control %d, passing it to %s\n", in->name, f->subclass, outgoing->chan->name);
ast_indicate_data(outgoing->chan, f->subclass, f->data, f->datalen);
}
}
if (!*to)
ast_verb(3, "Nobody picked up in %d ms\n", orig);
- if (!*to || ast_check_hangup(in)) {
+ if (!*to || ast_check_hangup(in))
ast_cdr_noanswer(in->cdr);
- }
-
}
if (peer && !ast_cdr_log_unanswered()) {
/* suppress the CDR's that didn't win */
struct chanlist *o;
for (o = outgoing; o; o = o->next) {
struct ast_channel *c = o->chan;
- if (c && c != peer && c->cdr) {
+ if (c && c != peer && c->cdr)
ast_set_flag(c->cdr, AST_CDR_FLAG_POST_DISABLED);
- }
}
} else if (!peer && !ast_cdr_log_unanswered()) {
/* suppress the CDR's that didn't win */
struct chanlist *o;
for (o = outgoing; o; o = o->next) {
struct ast_channel *c = o->chan;
- if (c && c->cdr) {
- ast_set_flag(c->cdr, AST_CDR_FLAG_POST_DISABLED);
- }
+ if (c && c->cdr)
+ ast_set_flag(c->cdr, AST_CDR_FLAG_POST_DISABLED);
}
}
-
+
#ifdef HAVE_EPOLL
for (epollo = outgoing; epollo; epollo = epollo->next) {
if (epollo->chan)
*s = ',';
}
-
/* returns true if there is a valid privacy reply */
static int valid_priv_reply(struct ast_flags64 *opts, int res)
{
ast_log(LOG_WARNING, "Dial does not accept L(%s), hanging up.\n", limit_str);
config->timelimit = config->play_warning = config->warning_freq = 0;
config->warning_sound = NULL;
- return -1; /* error */
+ return -1; /* error */
} else if ( (delta = config->play_warning - config->timelimit) > 0) {
int w = config->warning_freq;
var = pbx_builtin_getvar_helper(chan, "LIMIT_PLAYAUDIO_CALLER");
play_to_caller = var ? ast_true(var) : 1;
-
+
var = pbx_builtin_getvar_helper(chan, "LIMIT_PLAYAUDIO_CALLEE");
play_to_callee = var ? ast_true(var) : 0;
-
+
if (!play_to_caller && !play_to_callee)
play_to_caller = 1;
-
+
var = pbx_builtin_getvar_helper(chan, "LIMIT_WARNING_FILE");
config->warning_sound = S_OR(var, "timeleft");
if (!config->play_warning && !config->start_sound && !config->end_sound && config->timelimit) {
*calldurationlimit = config->timelimit / 1000;
ast_verb(3, "Setting call duration limit to %d seconds.\n",
- *calldurationlimit);
+ *calldurationlimit);
config->timelimit = play_to_caller = play_to_callee =
config->play_warning = config->warning_freq = 0;
} else {
ast_verb(4, "warning_sound = %s\n", config->warning_sound);
ast_verb(4, "end_sound = %s\n", S_OR(config->end_sound, ""));
}
- if (play_to_caller)
- ast_set_flag(&(config->features_caller), AST_FEATURE_PLAY_WARNING);
- if (play_to_callee)
- ast_set_flag(&(config->features_callee), AST_FEATURE_PLAY_WARNING);
+ if (play_to_caller)
+ ast_set_flag(&(config->features_caller), AST_FEATURE_PLAY_WARNING);
+ if (play_to_callee)
+ ast_set_flag(&(config->features_callee), AST_FEATURE_PLAY_WARNING);
return 0;
}
static int do_privacy(struct ast_channel *chan, struct ast_channel *peer,
- struct ast_flags64 *opts, char **opt_args, struct privacy_args *pa)
+ struct ast_flags64 *opts, char **opt_args, struct privacy_args *pa)
{
int res2;
int loopcount = 0;
- /* Get the user's intro, store it in priv-callerintros/$CID,
- unless it is already there-- this should be done before the
+ /* Get the user's intro, store it in priv-callerintros/$CID,
+ unless it is already there-- this should be done before the
call is actually dialed */
- /* all ring indications and moh for the caller has been halted as soon as the
+ /* all ring indications and moh for the caller has been halted as soon as the
target extension was picked up. We are going to have to kill some
time and make the caller believe the peer hasn't picked up yet */
res2 = ast_autoservice_start(chan);
/* Now Stream the File */
for (loopcount = 0; loopcount < 3; loopcount++) {
- if (res2 && loopcount == 0) /* error in ast_autoservice_start() */
+ if (res2 && loopcount == 0) /* error in ast_autoservice_start() */
break;
- if (!res2) /* on timeout, play the message again */
+ if (!res2) /* on timeout, play the message again */
res2 = ast_play_and_wait(peer, "priv-callpending");
if (!valid_priv_reply(opts, res2))
res2 = 0;
- /* priv-callpending script:
+ /* priv-callpending script:
"I have a caller waiting, who introduces themselves as:"
*/
if (!res2)
\par priv-callee-options script:
"Dial 1 if you wish this caller to reach you directly in the future,
and immediately connect to their incoming call
- Dial 2 if you wish to send this caller to voicemail now and
+ Dial 2 if you wish to send this caller to voicemail now and
forevermore.
Dial 3 to send this caller to the torture menus, now and forevermore.
Dial 4 to send this caller to a simple "go away" menu, now and forevermore.
static const int _flag[] = { AST_PRIVACY_ALLOW, AST_PRIVACY_DENY, AST_PRIVACY_TORTURE, AST_PRIVACY_KILL, AST_PRIVACY_ALLOW};
int i = res2 - '1';
ast_verb(3, "--Set privacy database entry %s/%s to %s\n",
- opt_args[OPT_ARG_PRIVACY], pa->privcid, _val[i]);
+ opt_args[OPT_ARG_PRIVACY], pa->privcid, _val[i]);
ast_privacy_set(opt_args[OPT_ARG_PRIVACY], pa->privcid, _flag[i]);
}
switch (res2) {
if (ast_test_flag64(opts, OPT_PRIVACY))
break;
/* if not privacy, then 5 is the same as "default" case */
- default: /* bad input or -1 if failure to start autoservice */
+ default: /* bad input or -1 if failure to start autoservice */
/* well, if the user messes up, ... he had his chance... What Is The Best Thing To Do? */
/* well, there seems basically two choices. Just patch the caller thru immediately,
or,... put 'em thru to voicemail. */
break;
}
- if (res2 == '1') { /* the only case where we actually connect */
- /* if the intro is NOCALLERID, then there's no reason to leave it on disk, it'll
+ if (res2 == '1') { /* the only case where we actually connect */
+ /* if the intro is NOCALLERID, then there's no reason to leave it on disk, it'll
just clog things up, and it's not useful information, not being tied to a CID */
if (strncmp(pa->privcid, "NOCALLERID", 10) == 0 || ast_test_flag64(opts, OPT_SCREEN_NOINTRO)) {
ast_filedelete(pa->privintro, NULL);
else
ast_verb(3, "Successfully deleted %s intro file\n", pa->privintro);
}
- return 0; /* the good exit path */
+ return 0; /* the good exit path */
} else {
ast_hangup(peer); /* hang up on the callee -- he didn't want to talk anyway! */
return -1;
l = callerid;
pa->privdb_val = AST_PRIVACY_UNKNOWN;
}
-
+
ast_copy_string(pa->privcid, l, sizeof(pa->privcid));
if (strncmp(pa->privcid, "NOCALLERID", 10) != 0 && ast_test_flag64(opts, OPT_SCREEN_NOCLID)) {
- /* if callerid is set and OPT_SCREEN_NOCLID is set also */
+ /* if callerid is set and OPT_SCREEN_NOCLID is set also */
ast_verb(3, "CallerID set (%s); N option set; Screening should be off\n", pa->privcid);
pa->privdb_val = AST_PRIVACY_ALLOW;
} else if (ast_test_flag64(opts, OPT_SCREEN_NOCLID) && strncmp(pa->privcid, "NOCALLERID", 10) == 0) {
ast_copy_string(pa->status, "TORTURE", sizeof(pa->status));
return 0; /* is this right??? */
} else if (pa->privdb_val == AST_PRIVACY_UNKNOWN) {
- /* Get the user's intro, store it in priv-callerintros/$CID,
- unless it is already there-- this should be done before the
+ /* Get the user's intro, store it in priv-callerintros/$CID,
+ unless it is already there-- this should be done before the
call is actually dialed */
/* make sure the priv-callerintros dir actually exists */
ast_waitstream(chan, "");
}
}
- return 1; /* success */
+ return 1; /* success */
}
static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags64 *peerflags, int *continue_exec)
{
- int res = -1; /* default: error */
- char *rest, *cur; /* scan the list of destinations */
- struct chanlist *outgoing = NULL; /* list of destinations */
+ int res = -1; /* default: error */
+ char *rest, *cur; /* scan the list of destinations */
+ struct chanlist *outgoing = NULL; /* list of destinations */
struct ast_channel *peer;
- int to; /* timeout */
+ int to; /* timeout */
struct cause_args num = { chan, 0, 0, 0 };
int cause;
char numsubst[256];
char *parse;
int opermode = 0;
AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(peers);
- AST_APP_ARG(timeout);
- AST_APP_ARG(options);
- AST_APP_ARG(url);
+ AST_APP_ARG(peers);
+ AST_APP_ARG(timeout);
+ AST_APP_ARG(options);
+ AST_APP_ARG(url);
);
struct ast_flags64 opts = { 0, };
char *opt_args[OPT_ARG_ARRAY_SIZE];
}
parse = ast_strdupa(data);
-
+
AST_STANDARD_APP_ARGS(args, parse);
if (!ast_strlen_zero(args.options) &&
- ast_app_parse_options64(dial_exec_options, &opts, opt_args, args.options)) {
+ ast_app_parse_options64(dial_exec_options, &opts, opt_args, args.options)) {
pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
goto done;
}
res = setup_privacy_args(&pa, &opts, opt_args, chan);
if (res <= 0)
goto out;
- res = -1; /* reset default */
+ res = -1; /* reset default */
}
if (continue_exec)
*continue_exec = 0;
-
+
/* If a channel group has been specified, get it for use when we create peer channels */
if ((outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP_ONCE"))) {
outbound_group = ast_strdupa(outbound_group);
} else {
outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP");
}
-
+
ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING);
/* loop through the list of dial destinations */
rest = args.peers;
while ((cur = strsep(&rest, "&")) ) {
struct chanlist *tmp;
- struct ast_channel *tc; /* channel for this destination */
+ struct ast_channel *tc; /* channel for this destination */
/* Get a technology/[device:]number pair */
char *number = cur;
char *interface = ast_strdupa(number);
goto out;
if (opts.flags) {
ast_copy_flags64(tmp, &opts,
- OPT_CANCEL_ELSEWHERE |
- OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
- OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
- OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
- OPT_CALLEE_PARK | OPT_CALLER_PARK |
- OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
- OPT_RINGBACK | OPT_MUSICBACK | OPT_FORCECLID);
- ast_set2_flag64(tmp, args.url, DIAL_NOFORWARDHTML);
+ OPT_CANCEL_ELSEWHERE |
+ OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
+ OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
+ OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
+ OPT_CALLEE_PARK | OPT_CALLER_PARK |
+ OPT_CALLEE_MIXMONITOR | OPT_CALLER_MIXMONITOR |
+ OPT_RINGBACK | OPT_MUSICBACK | OPT_FORCECLID);
+ ast_set2_flag64(tmp, args.url, DIAL_NOFORWARDHTML);
}
ast_copy_string(numsubst, number, sizeof(numsubst));
/* Request the peer */
dialed_interfaces = datastore->data;
else {
if (!(datastore = ast_channel_datastore_alloc(&dialed_interface_info, NULL))) {
- ast_log(LOG_WARNING, "Unable to create channel datastore for dialed interfaces. Aborting!\n");
+ ast_log(LOG_WARNING, "Unable to create channel datastore for dialed interfaces. Aborting!\n");
ast_free(tmp);
goto out;
}
AST_LIST_LOCK(dialed_interfaces);
AST_LIST_TRAVERSE(dialed_interfaces, di, list) {
if (!strcasecmp(di->interface, interface)) {
- ast_log(LOG_WARNING, "Skipping dialing interface '%s' again since it has already been dialed\n",
+ ast_log(LOG_WARNING, "Skipping dialing interface '%s' again since it has already been dialed\n",
di->interface);
break;
}
if (!tc) {
/* If we can't, just go on to the next call */
ast_log(LOG_WARNING, "Unable to create channel of type '%s' (cause %d - %s)\n",
- tech, cause, ast_cause2str(cause));
+ tech, cause, ast_cause2str(cause));
handle_cause(cause, &num);
- if (!rest) /* we are on the last destination */
+ if (!rest) /* we are on the last destination */
chan->hangupcause = cause;
ast_free(tmp);
continue;
else
ast_copy_string(tc->exten, chan->exten, sizeof(tc->exten));
- res = ast_call(tc, numsubst, 0); /* Place the call, but don't wait on the answer */
+ res = ast_call(tc, numsubst, 0); /* Place the call, but don't wait on the answer */
/* Save the info in cdr's that we called them */
if (chan->cdr)
if (!ast_test_flag64(peerflags, OPT_ORIGINAL_CLID))
ast_set_callerid(tc, S_OR(chan->macroexten, chan->exten), get_cid_name(cidname, sizeof(cidname), chan), NULL);
}
- /* Put them in the list of outgoing thingies... We're ready now.
+ /* Put them in the list of outgoing thingies... We're ready now.
XXX If we're forcibly removed, these outgoing calls won't get
hung up XXX */
- ast_set_flag64(tmp, DIAL_STILLGOING);
+ ast_set_flag64(tmp, DIAL_STILLGOING);
tmp->chan = tc;
tmp->next = outgoing;
outgoing = tmp;
} else {
const char *number;
time_t end_time, answer_time = time(NULL);
- char toast[80]; /* buffer to set variables */
+ char toast[80]; /* buffer to set variables */
strcpy(pa.status, "ANSWER");
/* Ah ha! Someone answered within the desired timeframe. Of course after this
- we will always return with -1 so that it is hung up properly after the
+ we will always return with -1 so that it is hung up properly after the
conversation. */
hanguptree(outgoing, peer, 1);
outgoing = NULL;
if (!number)
number = numsubst;
pbx_builtin_setvar_helper(chan, "DIALEDPEERNUMBER", number);
- if (!ast_strlen_zero(args.url) && ast_channel_supports_html(peer) ) {
- ast_debug(1, "app_dial: sendurl=%s.\n", args.url);
- ast_channel_sendurl( peer, args.url );
- }
+ if (!ast_strlen_zero(args.url) && ast_channel_supports_html(peer) ) {
+ ast_debug(1, "app_dial: sendurl=%s.\n", args.url);
+ ast_channel_sendurl( peer, args.url );
+ }
if ( (ast_test_flag64(&opts, OPT_PRIVACY) || ast_test_flag64(&opts, OPT_SCREENING)) && pa.privdb_val == AST_PRIVACY_UNKNOWN) {
if (do_privacy(chan, peer, &opts, opt_args, &pa)) {
res = 0;
if (!res)
res = ast_streamfile(peer, opt_args[OPT_ARG_ANNOUNCE], peer->language);
if (!res) {
- digit = ast_waitstream(peer, AST_DIGIT_ANY);
+ digit = ast_waitstream(peer, AST_DIGIT_ANY);
}
/* Ok, done. stop autoservice */
res = ast_autoservice_stop(chan);
if (digit > 0 && !res)
- res = ast_senddigit(chan, digit, 0);
+ res = ast_senddigit(chan, digit, 0);
else
res = digit;
theapp = pbx_findapp("Macro");
- if (theapp && !res) { /* XXX why check res here ? */
+ if (theapp && !res) { /* XXX why check res here ? */
replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_MACRO]);
res = pbx_exec(peer, theapp, opt_args[OPT_ARG_CALLEE_MACRO]);
ast_debug(1, "Macro exited with status %d\n", res);
res = -1;
} else if (!strcasecmp(macro_result, "CONGESTION") || !strcasecmp(macro_result, "CHANUNAVAIL")) {
ast_copy_string(pa.status, macro_result, sizeof(pa.status));
- ast_set_flag64(peerflags, OPT_GO_ON);
+ ast_set_flag64(peerflags, OPT_GO_ON);
res = -1;
} else if (!strcasecmp(macro_result, "CONTINUE")) {
- /* hangup peer and keep chan alive assuming the macro has changed
- the context / exten / priority or perhaps
+ /* hangup peer and keep chan alive assuming the macro has changed
+ the context / exten / priority or perhaps
the next priority in the current exten is desired.
*/
- ast_set_flag64(peerflags, OPT_GO_ON);
+ ast_set_flag64(peerflags, OPT_GO_ON);
res = -1;
} else if (!strcasecmp(macro_result, "ABORT")) {
/* Hangup both ends unless the caller has the g flag */
theapp = pbx_findapp("Gosub");
- if (theapp && !res) { /* XXX why check res here ? */
+ if (theapp && !res) { /* XXX why check res here ? */
replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GOSUB]);
/* Set where we came from */
ast_log(LOG_DEBUG, "Gosub exited with status %d\n", res);
} else
ast_log(LOG_ERROR, "Could not Allocate string for Gosub arguments -- Gosub Call Aborted!\n");
-
+
res = 0;
} else {
ast_log(LOG_ERROR, "Could not find application Gosub\n");
res = -1;
} else if (!strcasecmp(gosub_result, "CONGESTION") || !strcasecmp(gosub_result, "CHANUNAVAIL")) {
ast_copy_string(pa.status, gosub_result, sizeof(pa.status));
- ast_set_flag64(peerflags, OPT_GO_ON);
+ ast_set_flag64(peerflags, OPT_GO_ON);
res = -1;
} else if (!strcasecmp(gosub_result, "CONTINUE")) {
- /* hangup peer and keep chan alive assuming the macro has changed
- the context / exten / priority or perhaps
+ /* hangup peer and keep chan alive assuming the macro has changed
+ the context / exten / priority or perhaps
the next priority in the current exten is desired.
*/
- ast_set_flag64(peerflags, OPT_GO_ON);
+ ast_set_flag64(peerflags, OPT_GO_ON);
res = -1;
} else if (!strcasecmp(gosub_result, "ABORT")) {
/* Hangup both ends unless the caller has the g flag */
if (calldurationlimit > 0) {
peer->whentohangup = time(NULL) + calldurationlimit;
}
- if (!ast_strlen_zero(dtmfcalled)) {
+ if (!ast_strlen_zero(dtmfcalled)) {
ast_verb(3, "Sending DTMF '%s' to the called party.\n", dtmfcalled);
res = ast_dtmf_stream(peer, chan, dtmfcalled, 250, 0);
}
}
}
- if (res) { /* some error */
+ if (res) { /* some error */
res = -1;
end_time = time(NULL);
} else {
ast_set_flag(&(config.features_caller), AST_FEATURE_DISCONNECT);
if (ast_test_flag64(peerflags, OPT_CALLEE_MONITOR))
ast_set_flag(&(config.features_callee), AST_FEATURE_AUTOMON);
- if (ast_test_flag64(peerflags, OPT_CALLER_MONITOR))
+ if (ast_test_flag64(peerflags, OPT_CALLER_MONITOR))
ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMON);
if (ast_test_flag64(peerflags, OPT_CALLEE_PARK))
ast_set_flag(&(config.features_callee), AST_FEATURE_PARKCALL);
snprintf(toast, sizeof(toast), "%ld", (long)(end_time - start_time));
pbx_builtin_setvar_helper(chan, "DIALEDTIME", toast);
-
-
+
if (ast_test_flag64(&opts, OPT_PEER_H)) {
- ast_log(LOG_NOTICE, "PEER context: %s; PEER exten: %s; PEER priority: %d\n",
- peer->context, peer->exten, peer->priority);
+ ast_log(LOG_NOTICE, "PEER context: %s; PEER exten: %s; PEER priority: %d\n",
+ peer->context, peer->exten, peer->priority);
}
-
+
strcpy(peer->context, chan->context);
if (ast_test_flag64(&opts, OPT_PEER_H) && ast_exists_extension(peer, peer->context, "h", 1, peer->cid.cid_num)) {
int found;
strcpy(peer->exten, "h");
peer->priority = 1;
- autoloopflag = ast_test_flag(peer, AST_FLAG_IN_AUTOLOOP); /* save value to restore at the end */
+ autoloopflag = ast_test_flag(peer, AST_FLAG_IN_AUTOLOOP); /* save value to restore at the end */
ast_set_flag(peer, AST_FLAG_IN_AUTOLOOP);
-
- while ((res = ast_spawn_extension(peer, peer->context, peer->exten, peer->priority, peer->cid.cid_num, &found, 1))) {
+
+ while ((res = ast_spawn_extension(peer, peer->context, peer->exten, peer->priority, peer->cid.cid_num, &found, 1)))
peer->priority++;
- }
+
if (found && res) {
/* Something bad happened, or a hangup has been requested. */
ast_debug(1, "Spawn extension (%s,%s,%d) exited non-zero on '%s'\n", peer->context, peer->exten, peer->priority, peer->name);
chan->hangupcause = peer->hangupcause;
ast_hangup(peer);
}
- }
+ }
out:
if (moh) {
moh = 0;
ast_indicate(chan, -1);
}
ast_channel_early_bridge(chan, NULL);
- hanguptree(outgoing, NULL, 0); /* In this case, there's no answer anywhere */
+ hanguptree(outgoing, NULL, 0); /* In this case, there's no answer anywhere */
pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
senddialendevent(chan, pa.status);
ast_debug(1, "Exiting with DIALSTATUS=%s.\n", pa.status);
-
+
if ((ast_test_flag64(peerflags, OPT_GO_ON)) && !ast_check_hangup(chan) && (res != AST_PBX_KEEPALIVE)) {
if (calldurationlimit)
chan->whentohangup = 0;
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "RetryDial requires an argument!\n");
return -1;
- }
+ }
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
- if ((sleep = atoi(args.sleep))) {
+ if ((sleep = atoi(args.sleep)))
sleep *= 1000;
- }
loops = atoi(args.retries);
ast_log(LOG_ERROR, "%s requires a 4th argument (dialdata)\n", rapp);
goto done;
}
-
+
if (sleep < 1000)
sleep = 10000;
if (!loops)
- loops = -1; /* run forever */
-
+ loops = -1; /* run forever */
+
context = pbx_builtin_getvar_helper(chan, "EXITCONTEXT");
res = 0;
if (ast_test_flag64(&peerflags, OPT_DTMF_EXIT)) {
if (!ast_strlen_zero(args.announce)) {
if (ast_fileexists(args.announce, NULL, chan->language) > 0) {
- if (!(res = ast_streamfile(chan, args.announce, chan->language)))
+ if (!(res = ast_streamfile(chan, args.announce, chan->language)))
ast_waitstream(chan, AST_DIGIT_ANY);
} else
ast_log(LOG_WARNING, "Announce file \"%s\" specified in Retrydial does not exist\n", args.announce);
res = ast_unregister_application(app);
res |= ast_unregister_application(rapp);
- if ((con = ast_context_find("app_dial_gosub_virtual_context")))
- {
+ if ((con = ast_context_find("app_dial_gosub_virtual_context"))) {
ast_context_remove_extension2(con, "s", 1, NULL);
ast_context_destroy(con, "app_dial"); /* leave nothing behind */
}
-
+
return res;
}
res = ast_register_application(app, dial_exec, synopsis, descrip);
res |= ast_register_application(rapp, retrydial_exec, rsynopsis, rdescrip);
-
+
return res;
}
#include <sys/stat.h>
-#include "asterisk/paths.h" /* use ast_config_AST_SPOOL_DIR */
+#include "asterisk/paths.h" /* use ast_config_AST_SPOOL_DIR */
#include "asterisk/file.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#define ast_toggle_flag(it,flag) if(ast_test_flag(it, flag)) ast_clear_flag(it, flag); else ast_set_flag(it, flag)
-static int play_and_wait(struct ast_channel *chan, char *file, char *digits)
+static int play_and_wait(struct ast_channel *chan, char *file, char *digits)
{
int res = -1;
if (!ast_streamfile(chan, file, chan->language)) {
len = 0,
maxlen = 0,
mode = 0;
-
+
snprintf(dftbase, sizeof(dftbase), "%s/dictate", ast_config_AST_SPOOL_DIR);
if (!ast_strlen_zero(data)) {
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
} else
args.argc = 0;
-
+
if (args.argc && !ast_strlen_zero(args.base)) {
base = args.base;
} else {
}
if (args.argc > 1 && args.filename) {
filename = args.filename;
- }
+ }
oldr = chan->readformat;
if ((res = ast_set_read_format(chan, AST_FORMAT_SLINEAR)) < 0) {
ast_log(LOG_WARNING, "Unable to set to linear mode.\n");
ast_safe_sleep(chan, 200);
for (res = 0; !res;) {
if (ast_strlen_zero(filename)) {
- if (ast_app_getdata(chan, "dictate/enter_filename", filein, sizeof(filein), 0) ||
+ if (ast_app_getdata(chan, "dictate/enter_filename", filein, sizeof(filein), 0) ||
ast_strlen_zero(filein)) {
res = -1;
break;
case DMODE_RECORD:
if (lastop != DMODE_RECORD) {
int oflags = O_CREAT | O_WRONLY;
- if (ast_test_flag(&flags, DFLAG_PAUSE)) {
+ if (ast_test_flag(&flags, DFLAG_PAUSE)) {
digit = play_and_wait(chan, "dictate/record_mode", AST_DIGIT_ANY);
if (digit == 0) {
digit = play_and_wait(chan, "dictate/paused", AST_DIGIT_ANY);
while ((target = ast_channel_walk_locked(target))) {
if ((!strcasecmp(target->macroexten, exten) || !strcasecmp(target->exten, exten)) &&
- !strcasecmp(target->dialcontext, context) &&
- can_pickup(target)) {
+ !strcasecmp(target->dialcontext, context) &&
+ can_pickup(target)) {
res = pickup_do(chan, target);
ast_channel_unlock(target);
break;
while ((target = ast_channel_walk_locked(target))) {
if ((tmp = pbx_builtin_getvar_helper(target, PICKUPMARK)) &&
- !strcasecmp(tmp, mark) &&
- can_pickup(target)) {
+ !strcasecmp(tmp, mark) &&
+ can_pickup(target)) {
res = pickup_do(chan, target);
ast_channel_unlock(target);
break;
int res;
res = ast_unregister_application(app);
-
+
return res;
}
* \brief Provide a directory of extensions
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <ctype.h>
-#include "asterisk/paths.h" /* use ast_config_AST_SPOOL_DIR */
+#include "asterisk/paths.h" /* use ast_config_AST_SPOOL_DIR */
#include "asterisk/file.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
struct directory_item {
char exten[AST_MAX_EXTENSION + 1];
char name[AST_MAX_EXTENSION + 1];
- char key[50]; /* Text to order items. Either lastname+firstname or firstname+lastname */
+ char key[50]; /* Text to order items. Either lastname+firstname or firstname+lastname */
AST_LIST_ENTRY(directory_item) entry;
};
* '*' for skipped entry from directory
*/
static int play_mailbox_owner(struct ast_channel *chan, const char *context,
- const char *ext, const char *name, struct ast_flags *flags)
+ const char *ext, const char *name, struct ast_flags *flags)
{
int res = 0;
char fn[256];
}
}
#ifdef ODBC_STORAGE
- ast_filedelete(fn, NULL);
+ ast_filedelete(fn, NULL);
#endif
return res;
res = ast_waitfordigit(chan, 3000);
ast_stopstream(chan);
- if (res == '1') { /* Name selected */
+ if (res == '1') { /* Name selected */
return select_entry(chan, context, dialcontext, item, flags) ? -1 : 1;
} else if (res == '*') {
/* Skip to next match in list */
fullname = ast_variable_retrieve(rtdata, mailbox, "fullname");
hidefromdir = ast_variable_retrieve(rtdata, mailbox, "hidefromdir");
snprintf(tmp, sizeof(tmp), "no-password,%s,hidefromdir=%s",
- fullname ? fullname : "",
- hidefromdir ? hidefromdir : "no");
+ fullname ? fullname : "",
+ hidefromdir ? hidefromdir : "no");
var = ast_variable_new(mailbox, tmp, "");
if (var)
ast_variable_append(cat, var);
continue;
if (!ast_true(ast_config_option(ucfg, cat, "hasdirectory")))
continue;
-
+
/* Find all candidate extensions */
pos = ast_variable_retrieve(ucfg, cat, "fullname");
if (!pos)
static int goto_exten(struct ast_channel *chan, const char *dialcontext, char *ext)
{
if (!ast_goto_if_exists(chan, dialcontext, ext, 1) ||
- (!ast_strlen_zero(chan->macrocontext) &&
- !ast_goto_if_exists(chan, chan->macrocontext, ext, 1))) {
+ (!ast_strlen_zero(chan->macrocontext) &&
+ !ast_goto_if_exists(chan, chan->macrocontext, ext, 1))) {
return 0;
} else {
ast_log(LOG_WARNING, "Can't find extension '%s' in current context. "
if (digit == '0' && !goto_exten(chan, dialcontext, "o")) {
return 0;
- }
+ }
if (digit == '*' && !goto_exten(chan, dialcontext, "a")) {
return 0;
- }
+ }
ext[0] = digit;
if (ast_readstring(chan, ext + 1, NUMDIGITS - 1, 3000, 3000, "#") < 0)
if (args.options && ast_app_parse_options(directory_app_options, &flags, opts, args.options))
return -1;
- if (ast_strlen_zero(args.dialcontext))
+ if (ast_strlen_zero(args.dialcontext))
args.dialcontext = args.vmcontext;
cfg = realtime_directory(args.vmcontext);
ast_log(LOG_ERROR, "Unable to read the configuration data!\n");
return -1;
}
-
+
ucfg = ast_config_load("users.conf", config_flags);
dirintro = ast_variable_retrieve(cfg, args.vmcontext, "directoryintro");
if (ast_strlen_zero(dirintro))
dirintro = ast_test_flag(&flags, OPT_LISTBYFIRSTNAME) ? "dir-intro-fn" : "dir-intro";
- if (chan->_state != AST_STATE_UP)
+ if (chan->_state != AST_STATE_UP)
res = ast_answer(chan);
for (;;) {
* \brief DISA -- Direct Inward System Access Application
*
* \author Jim Dixon <jim@lambdatel.com>
- *
+ *
* \ingroup applications
*/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static char *synopsis = "DISA (Direct Inward System Access)";
-static char *descrip =
+static char *descrip =
"DISA(<numeric passcode>[,<context>[,<cid>[,mailbox[,options]]]]) or\n"
"DISA(<filename>[,,,,options])\n"
"The DISA, Direct Inward System Access, application allows someone from \n"
ast_log(LOG_WARNING, "DISA requires an argument (passcode/passcode file)\n");
return -1;
}
-
+
ast_debug(1, "Digittimeout: %d\n", digittimeout);
ast_debug(1, "Responsetimeout: %d\n", firstdigittimeout);
AST_STANDARD_APP_ARGS(args, tmp);
- if (ast_strlen_zero(args.context))
- args.context = "disa";
+ if (ast_strlen_zero(args.context))
+ args.context = "disa";
if (ast_strlen_zero(args.mailbox))
args.mailbox = "";
if (!ast_strlen_zero(args.options))
/* if outa time, give em reorder */
if (ast_tvdiff_ms(ast_tvnow(), lastdigittime) > ((k&2) ? digittimeout : firstdigittimeout)) {
ast_debug(1,"DISA %s entry timeout on chan %s\n",
- ((k&1) ? "extension" : "password"),chan->name);
+ ((k&1) ? "extension" : "password"),chan->name);
break;
}
-
+
if ((res = ast_waitfor(chan, -1) < 0)) {
ast_debug(1, "Waitfor returned %d\n", res);
continue;
ast_frfree(f);
if (!i) {
- k |= 2; /* We have the first digit */
+ k |= 2; /* We have the first digit */
ast_playtones_stop(chan);
}
while(fgets(pwline,sizeof(pwline) - 1,fp)) {
if (!pwline[0])
continue;
- if (pwline[strlen(pwline) - 1] == '\n')
+ if (pwline[strlen(pwline) - 1] == '\n')
pwline[strlen(pwline) - 1] = 0;
if (!pwline[0])
continue;
continue;
AST_STANDARD_APP_ARGS(args, pwline);
-
+
ast_debug(1, "Mailbox: %s\n",args.mailbox);
/* password must be in valid format (numeric) */
static char *app = "DumpChan";
static char *synopsis = "Dump Info About The Calling Channel";
-static char *desc =
+static char *desc =
" DumpChan([<min_verbose_level>])\n"
"Displays information on channel and listing of all channel\n"
"variables. If min_verbose_level is specified, output is only\n"
char cgrp[BUFSIZ/2];
char pgrp[BUFSIZ/2];
char formatbuf[BUFSIZ/2];
-
+
now = ast_tvnow();
memset(buf, 0, size);
if (!c)
sec = elapsed_seconds % 60;
}
- snprintf(buf,size,
- "Name= %s\n"
- "Type= %s\n"
- "UniqueID= %s\n"
- "CallerIDNum= %s\n"
- "CallerIDName= %s\n"
- "DNIDDigits= %s\n"
- "RDNIS= %s\n"
- "Language= %s\n"
- "State= %s (%d)\n"
- "Rings= %d\n"
- "NativeFormat= %s\n"
- "WriteFormat= %s\n"
- "ReadFormat= %s\n"
- "RawWriteFormat= %s\n"
- "RawReadFormat= %s\n"
- "1stFileDescriptor= %d\n"
- "Framesin= %d %s\n"
- "Framesout= %d %s\n"
- "TimetoHangup= %ld\n"
- "ElapsedTime= %dh%dm%ds\n"
- "Context= %s\n"
- "Extension= %s\n"
- "Priority= %d\n"
- "CallGroup= %s\n"
- "PickupGroup= %s\n"
- "Application= %s\n"
- "Data= %s\n"
- "Blocking_in= %s\n",
- c->name,
- c->tech->type,
- c->uniqueid,
- S_OR(c->cid.cid_num, "(N/A)"),
- S_OR(c->cid.cid_name, "(N/A)"),
- S_OR(c->cid.cid_dnid, "(N/A)"),
- S_OR(c->cid.cid_rdnis, "(N/A)"),
- c->language,
- ast_state2str(c->_state),
- c->_state,
- c->rings,
- ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->nativeformats),
- ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->writeformat),
- ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->readformat),
- ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->rawwriteformat),
- ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->rawreadformat),
- c->fds[0], c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "",
- c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", (long)c->whentohangup,
- hour,
- min,
- sec,
- c->context,
- c->exten,
- c->priority,
- ast_print_group(cgrp, sizeof(cgrp), c->callgroup),
- ast_print_group(pgrp, sizeof(pgrp), c->pickupgroup),
- ( c->appl ? c->appl : "(N/A)" ),
- ( c-> data ? S_OR(c->data, "(Empty)") : "(None)"),
- (ast_test_flag(c, AST_FLAG_BLOCKING) ? c->blockproc : "(Not Blocking)"));
+ snprintf(buf,size,
+ "Name= %s\n"
+ "Type= %s\n"
+ "UniqueID= %s\n"
+ "CallerIDNum= %s\n"
+ "CallerIDName= %s\n"
+ "DNIDDigits= %s\n"
+ "RDNIS= %s\n"
+ "Language= %s\n"
+ "State= %s (%d)\n"
+ "Rings= %d\n"
+ "NativeFormat= %s\n"
+ "WriteFormat= %s\n"
+ "ReadFormat= %s\n"
+ "RawWriteFormat= %s\n"
+ "RawReadFormat= %s\n"
+ "1stFileDescriptor= %d\n"
+ "Framesin= %d %s\n"
+ "Framesout= %d %s\n"
+ "TimetoHangup= %ld\n"
+ "ElapsedTime= %dh%dm%ds\n"
+ "Context= %s\n"
+ "Extension= %s\n"
+ "Priority= %d\n"
+ "CallGroup= %s\n"
+ "PickupGroup= %s\n"
+ "Application= %s\n"
+ "Data= %s\n"
+ "Blocking_in= %s\n",
+ c->name,
+ c->tech->type,
+ c->uniqueid,
+ S_OR(c->cid.cid_num, "(N/A)"),
+ S_OR(c->cid.cid_name, "(N/A)"),
+ S_OR(c->cid.cid_dnid, "(N/A)"),
+ S_OR(c->cid.cid_rdnis, "(N/A)"),
+ c->language,
+ ast_state2str(c->_state),
+ c->_state,
+ c->rings,
+ ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->nativeformats),
+ ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->writeformat),
+ ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->readformat),
+ ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->rawwriteformat),
+ ast_getformatname_multiple(formatbuf, sizeof(formatbuf), c->rawreadformat),
+ c->fds[0], c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "",
+ c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", (long)c->whentohangup,
+ hour,
+ min,
+ sec,
+ c->context,
+ c->exten,
+ c->priority,
+ ast_print_group(cgrp, sizeof(cgrp), c->callgroup),
+ ast_print_group(pgrp, sizeof(pgrp), c->pickupgroup),
+ ( c->appl ? c->appl : "(N/A)" ),
+ ( c-> data ? S_OR(c->data, "(Empty)") : "(None)"),
+ (ast_test_flag(c, AST_FLAG_BLOCKING) ? c->blockproc : "(Not Blocking)"));
return 0;
}
char info[1024];
int level = 0;
static char *line = "================================================================================";
-
- if (!ast_strlen_zero(data))
+
+ if (!ast_strlen_zero(data))
level = atoi(data);
pbx_builtin_serialize_variables(chan, &vars);
serialize_showchan(chan, info, sizeof(info));
if (level > 0)
ast_verb(level, "\nDumping Info For Channel: %s:\n%s\nInfo:\n%s\nVariables:\n%s%s\n", chan->name, line, info, vars->str, line);
-
+
return 0;
}
* \brief Echo application -- play back what you hear to evaluate latency
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
static char *synopsis = "Echo audio, video, or DTMF back to the calling party";
-static char *descrip =
+static char *descrip =
" Echo(): This application will echo any audio, video, or DTMF frames read from\n"
"the calling channel back to itself. If the DTMF digit '#' is received, the\n"
"application will exit.\n";
#include "asterisk/app.h"
/* Maximum length of any variable */
-#define MAXRESULT 1024
+#define MAXRESULT 1024
/*! Note
*
static char *app_execif = "ExecIf";
static char *execif_synopsis = "Executes dialplan application, conditionally";
-static char *execif_descrip =
+static char *execif_descrip =
" ExecIF (<expr>?<appiftrue>(<args>)[:<appiffalse>(<args>)])\n"
"If <expr> is true, execute and return the result of <appiftrue>(<args>).\n"
"If <expr> is true, but <appiftrue> is not found, then the application\n"
if (ast_strlen_zero(data))
return 0;
-
+
s = ast_strdupa(data);
args[0] = 0;
appname = strsep(&s, "(");
*end = '\0';
}
- if (pbx_checkcondition(expr.expr)) {
+ if (pbx_checkcondition(expr.expr)) {
if (!ast_strlen_zero(apps.t) && (app = pbx_findapp(apps.t))) {
res = pbx_exec(chan, app, S_OR(truedata, ""));
} else {
static const char *synopsis = "Interfaces with an external IVR application";
-static const char *descrip =
+static const char *descrip =
" ExternalIVR(command[,arg[,arg...]]): Forks a process to run the supplied command,\n"
"and starts a generator on the channel. The generator's play list is\n"
"controlled by the external application, which can add and clear entries\n"
};
static void send_child_event(FILE *handle, const char event, const char *data,
- const struct ast_channel *chan)
+ const struct ast_channel *chan)
{
char tmp[256];
{
struct ivr_localuser *u = params;
struct gen_state *state;
-
+
if (!(state = ast_calloc(1, sizeof(*state))))
return NULL;
{
struct ivr_localuser *u = state->u;
char *file_to_stream;
-
+
u->abort_current_sound = 0;
u->playing_silence = 0;
gen_closestream(state);
ast_chan_log(LOG_WARNING, u->chan, "File '%s' could not be opened: %s\n", file_to_stream, strerror(errno));
if (!u->playing_silence) {
continue;
- } else {
+ } else {
break;
}
}
{
struct ast_frame *f = NULL;
struct ivr_localuser *u = state->u;
-
+
if (u->abort_current_sound ||
- (u->playing_silence && AST_LIST_FIRST(&u->playlist))) {
+ (u->playing_silence && AST_LIST_FIRST(&u->playlist))) {
gen_closestream(state);
AST_LIST_LOCK(&u->playlist);
gen_nextfile(state);
static struct playlist_entry *make_entry(const char *filename)
{
struct playlist_entry *entry;
-
+
if (!(entry = ast_calloc(1, sizeof(*entry) + strlen(filename) + 10))) /* XXX why 10 ? */
return NULL;
u->abort_current_sound = 0;
u->chan = chan;
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "ExternalIVR requires a command to execute\n");
- return -1;
+ return -1;
}
buf = ast_strdupa(data);
command = ast_strip(input);
ast_chan_log(LOG_NOTICE, chan, "stderr: %s\n", command);
}
- } else if ((ready_fd < 0) && ms) {
+ } else if ((ready_fd < 0) && ms) {
if (errno == 0 || errno == EINTR)
continue;