summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchannels/chan_agent.c49
-rwxr-xr-xpbx.c71
2 files changed, 62 insertions, 58 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 8473b1337..481485c28 100755
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -1422,55 +1422,6 @@ static int agents_show(int fd, int argc, char **argv)
return RESULT_SUCCESS;
}
-static int agent_logoff(int fd, int argc, char **argv)
-{
- struct agent_pvt *p = NULL;
- char *line = NULL;
- int res = 0;
-
- /* Check args */
- if (argc != 3)
- return RESULT_SHOWUSAGE;
-
- line = argv[2];
-
- ast_mutex_lock(&agentlock);
- p = agents;
- while (p) {
- ast_mutex_lock(&p->lock);
- res = strcmp(p->agent, line);
-
- if (!res) {
- /* Found him! Now we're going to kill him. */
-
- if (ast_strlen_zero(p->loginchan)) {
- ast_cli(fd, "Agent %s already logged off the system.\n", line);
- ast_mutex_unlock(&p->lock);
- break;
- }
-
- strcpy(p->loginchan, ""); /* Bang! Killed him */
- ast_cli(fd, "Agent %s successfully logged off.\n", line);
- ast_mutex_unlock(&p->lock);
- break;
- }
-
- ast_mutex_unlock(&p->lock);
- p = p->next;
- }
- ast_mutex_unlock(&agentlock);
- if (res) ast_cli(fd, "Unable to find agent %s.\n", line);
- return RESULT_SUCCESS;
-}
-
-static char agent_logoff_usage[] =
-"Usage: agent logoff <agentnum>\n"
-" Log an agent off the system that maybe forgot to log off, etc....\n";
-
-static struct ast_cli_entry cli_agent_logoff = {
- { "agent", "logoff", NULL }, agent_logoff,
- "Log an agent off of the system", agent_logoff_usage, NULL};
-
static char show_agents_usage[] =
"Usage: show agents\n"
" Provides summary information on agents.\n";
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;
}