diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-02-25 00:25:28 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-02-25 00:25:28 +0000 |
commit | b83a2a470f84e07977ccd1d990feede00a2fdfa3 (patch) | |
tree | 78cad834ecde92a3f43fd9b0c525642ed0c2cf90 | |
parent | 72cdf46f82b7db29922b67fdb7501bcbf44142aa (diff) |
Add execiftime, remove duplicate agent logoff CLI
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5074 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | channels/chan_agent.c | 49 | ||||
-rwxr-xr-x | pbx.c | 71 |
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"; @@ -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; } |