aboutsummaryrefslogtreecommitdiffstats
path: root/pbx.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-25 00:25:28 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-25 00:25:28 +0000
commitb83a2a470f84e07977ccd1d990feede00a2fdfa3 (patch)
tree78cad834ecde92a3f43fd9b0c525642ed0c2cf90 /pbx.c
parent72cdf46f82b7db29922b67fdb7501bcbf44142aa (diff)
Add execiftime, remove duplicate agent logoff CLI
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5074 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx.c')
-rwxr-xr-xpbx.c71
1 files changed, 62 insertions, 9 deletions
diff --git a/pbx.c b/pbx.c
index 7b876035d..77fdfc461 100755
--- a/pbx.c
+++ b/pbx.c
@@ -182,6 +182,7 @@ static int pbx_builtin_setglobalvar(struct ast_channel *, void *);
static int pbx_builtin_noop(struct ast_channel *, void *);
static int pbx_builtin_gotoif(struct ast_channel *, void *);
static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
+static int pbx_builtin_execiftime(struct ast_channel *, void *);
static int pbx_builtin_saynumber(struct ast_channel *, void *);
static int pbx_builtin_saydigits(struct ast_channel *, void *);
static int pbx_builtin_saycharacters(struct ast_channel *, void *);
@@ -289,6 +290,14 @@ static struct pbx_builtin {
"extension. Each of the elements may be specified either as '*' (for always)\n"
"or as a range. See the 'include' syntax for details."
},
+
+ { "ExecIfTime", pbx_builtin_execiftime,
+ "Conditional application execution on current time",
+ " ExecIfTime(<times>|<weekdays>|<mdays>|<months>?<appname>[|<appdata>]):\n"
+ "If the current time matches the specified time, then execute the specified\n"
+ "application. Each of the elements may be specified either as '*' (for always)\n"
+ "or as a range. See the 'include' syntax for details."
+ },
{ "Hangup", pbx_builtin_hangup,
"Unconditional hangup",
@@ -5004,21 +5013,65 @@ static int pbx_builtin_gotoiftime(struct ast_channel *chan, void *data)
char *s, *ts;
struct ast_timing timing;
- if (!data) {
+ if (!data || ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "GotoIfTime requires an argument:\n <time range>|<days of week>|<days of month>|<months>?[[context|]extension|]priority\n");
return -1;
}
- s = strdup((char *) data);
- ts = s;
+ if ((s = ast_strdupa((char *) data))) {
+ ts = s;
+
+ /* Separate the Goto path */
+ strsep(&ts,"?");
+
+ /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
+ if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
+ res = pbx_builtin_goto(chan, (void *)ts);
+ } else {
+ ast_log(LOG_ERROR, "Memory Error!\n");
+ }
+ return res;
+}
+
+static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
+{
+ int res = 0;
+ char *ptr1, *ptr2;
+ struct ast_timing timing;
+ const char *usage = "ExecIfTime requires an argument:\n <time range>|<days of week>|<days of month>|<months>?<appname>[|<ptr1>]";
- /* Separate the Goto path */
- strsep(&ts,"?");
+ if (!data || ast_strlen_zero(data)) {
+ ast_log(LOG_WARNING, "%s\n", usage);
+ return -1;
+ }
- /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
- if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
- res = pbx_builtin_goto(chan, (void *)ts);
- free(s);
+ if ((ptr1 = ast_strdupa((char *) data))) {
+ ptr2 = ptr1;
+ /* Separate the Application data ptr1 is the time spec ptr2 is the app|data*/
+ strsep(&ptr2,"?");
+ if (ast_build_timing(&timing, ptr1) && ast_check_timing(&timing)) {
+ if (ptr2) {
+ /* ptr2 is now the app name
+ we're done with ptr1 now so recycle it and use it to point to the app args*/
+ struct ast_app *app;
+ if((ptr1 = strchr(ptr2, '|'))) {
+ *ptr1 = '\0';
+ ptr1++;
+ }
+ if ((app = pbx_findapp(ptr2))) {
+ pbx_exec(chan, app, ptr1 ? ptr1 : "", 1);
+ } else {
+ ast_log(LOG_WARNING, "Cannot locate application %s\n", ptr2);
+ }
+ } else {
+ ast_log(LOG_WARNING, "%s\n", usage);
+ }
+ } else {
+ ast_log(LOG_WARNING, "Invalid Time Spec: %s\n%s\n", ptr1, usage);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Memory Error!\n");
+ }
return res;
}