Newer
Older
"Usage: show applications [{like|describing} <text>]\n"
" List applications which are currently available.\n"
" If 'like', <text> will be a substring of the app name\n"
" If 'describing', <text> will be a substring of the description\n";
static char show_dialplan_help[] =
"Usage: show dialplan [exten@][context]\n"
" Show dialplan\n";
static char show_switches_help[] =
"Usage: show switches\n"
" Show registered switches\n";
static char show_hints_help[] =
"Usage: show hints\n"
" Show registered hints\n";
/*
* IMPLEMENTATION OF CLI FUNCTIONS IS IN THE SAME ORDER AS COMMANDS HELPS
*
*/
/*
* 'show application' CLI command implementation functions ...
*/
/*
* There is a possibility to show informations about more than one
* application at one time. You can type 'show application Dial Echo' and
* you will see informations about these two applications ...
*/
static char *complete_show_application(char *line, char *word,
int pos, int state)
if (ast_mutex_lock(&applock)) {
ast_log(LOG_ERROR, "Unable to lock application list\n");
/* ... walk all applications ... */
a = apps;
while (a) {
/* ... check if word matches this application ... */
if (!strncasecmp(word, a->name, strlen(word))) {
/* ... if this is right app serve it ... */
if (++which > state) {
char *ret = strdup(a->name);
ast_mutex_unlock(&applock);
ast_mutex_unlock(&applock);
}
static int handle_show_application(int fd, int argc, char *argv[])
{
if (argc < 3) return RESULT_SHOWUSAGE;
/* try to lock applications list ... */
if (ast_mutex_lock(&applock)) {
ast_log(LOG_ERROR, "Unable to lock application list\n");
return -1;
}
/* ... go through all applications ... */
a = apps;
while (a) {
/* ... compare this application name with all arguments given
* to 'show application' command ... */
for (app = 2; app < argc; app++) {
if (!strcasecmp(a->name, argv[app])) {
/* Maximum number of characters added by terminal coloring is 22 */
char infotitle[64 + AST_MAX_APP + 22], syntitle[40], destitle[40];
char info[64 + AST_MAX_APP], *synopsis = NULL, *description = NULL;
int synopsis_size, description_size;
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
if (a->synopsis)
synopsis_size = strlen(a->synopsis) + 23;
else
synopsis_size = strlen("Not available") + 23;
synopsis = alloca(synopsis_size);
if (a->description)
description_size = strlen(a->description) + 23;
else
description_size = strlen("Not available") + 23;
description = alloca(description_size);
if (synopsis && description) {
snprintf(info, 64 + AST_MAX_APP, "\n -= Info about application '%s' =- \n\n", a->name);
term_color(infotitle, info, COLOR_MAGENTA, 0, 64 + AST_MAX_APP + 22);
term_color(syntitle, "[Synopsis]:\n", COLOR_MAGENTA, 0, 40);
term_color(destitle, "[Description]:\n", COLOR_MAGENTA, 0, 40);
term_color(synopsis,
a->synopsis ? a->synopsis : "Not available",
COLOR_CYAN, 0, synopsis_size);
term_color(description,
a->description ? a->description : "Not available",
COLOR_CYAN, 0, description_size);
ast_cli(fd,"%s%s%s\n\n%s%s\n", infotitle, syntitle, synopsis, destitle, description);
} else {
/* ... one of our applications, show info ...*/
ast_cli(fd,"\n -= Info about application '%s' =- \n\n"
"[Synopsis]:\n %s\n\n"
"[Description]:\n%s\n",
a->name,
a->synopsis ? a->synopsis : "Not available",
a->description ? a->description : "Not available");
ast_mutex_unlock(&applock);
/* we found at least one app? no? */
if (no_registered_app) {
ast_cli(fd, "Your application(s) is (are) not registered\n");
return RESULT_FAILURE;
}
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
/*--- handle_show_hints: CLI support for listing registred dial plan hints */
static int handle_show_hints(int fd, int argc, char *argv[])
{
struct ast_hint *hint;
int num = 0;
if (!hints) {
ast_cli(fd, "There are no registered dialplan hints\n");
return RESULT_SUCCESS;
}
/* ... we have hints ... */
ast_cli(fd, "\n -= Registered Asterisk Dial Plan Hints =-\n");
if (ast_mutex_lock(&hintlock)) {
ast_log(LOG_ERROR, "Unable to lock hints\n");
return -1;
}
hint = hints;
while (hint) {
ast_cli(fd, " %-20.20s: %-20.20s State %2d\n", ast_get_extension_name(hint->exten), ast_get_extension_app(hint->exten), hint->laststate );
num++;
hint = hint->next;
}
ast_cli(fd, "----------------\n");
ast_cli(fd, "- %d hints registred\n", num);
ast_mutex_unlock(&hintlock);
return RESULT_SUCCESS;
}
/*--- handle_show_switches: CLI support for listing registred dial plan switches */
static int handle_show_switches(int fd, int argc, char *argv[])
struct ast_switch *sw;
if (!switches) {
ast_cli(fd, "There are no registered alternative switches\n");
return RESULT_SUCCESS;
}
/* ... we have applications ... */
ast_cli(fd, "\n -= Registered Asterisk Alternative Switches =-\n");
if (ast_mutex_lock(&switchlock)) {
ast_log(LOG_ERROR, "Unable to lock switches\n");
return -1;
}
sw = switches;
while (sw) {
ast_cli(fd, "%s: %s\n", sw->name, sw->description);
sw = sw->next;
}
ast_mutex_unlock(&switchlock);
return RESULT_SUCCESS;
}
/*
* 'show applications' CLI command implementation functions ...
*/
static int handle_show_applications(int fd, int argc, char *argv[])
{
struct ast_app *a;
int like=0, describing=0;
int total_match = 0; /* Number of matches in like clause */
int total_apps = 0; /* Number of apps registered */
if (ast_mutex_lock(&applock)) {
ast_log(LOG_ERROR, "Unable to lock application list\n");
return -1;
}
/* ... have we got at least one application (first)? no? */
if (!apps) {
ast_cli(fd, "There are no registered applications\n");
ast_mutex_unlock(&applock);
/* show applications like <keyword> */
if ((argc == 4) && (!strcmp(argv[2], "like"))) {
like = 1;
} else if ((argc > 3) && (!strcmp(argv[2], "describing"))) {
describing = 1;
}
/* show applications describing <keyword1> [<keyword2>] [...] */
if ((!like) && (!describing)) {
ast_cli(fd, " -= Registered Asterisk Applications =-\n");
} else {
ast_cli(fd, " -= Matching Asterisk Applications =-\n");
}
for (a = apps; a; a = a->next) {
/* ... show informations about applications ... */
if (like) {
if (ast_strcasestr(a->name, argv[3])) {
printapp = 1;
}
} else if (describing) {
if (a->description) {
/* Match all words on command line */
int i;
printapp = 1;
for (i=3;i<argc;i++) {
if (! ast_strcasestr(a->description, argv[i])) {
printapp = 0;
}
}
}
} else {
printapp = 1;
}
if (printapp) {
ast_cli(fd," %20s: %s\n", a->name, a->synopsis ? a->synopsis : "<Synopsis not available>");
}
if ((!like) && (!describing)) {
ast_cli(fd, " -= %d Applications Registered =-\n",total_apps);
} else {
ast_cli(fd, " -= %d Applications Matching =-\n",total_match);
}
ast_mutex_unlock(&applock);
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
static char *complete_show_applications(char *line, char *word, int pos, int state)
{
if (pos == 2) {
if (ast_strlen_zero(word)) {
switch (state) {
case 0:
return strdup("like");
case 1:
return strdup("describing");
default:
return NULL;
}
} else if (! strncasecmp(word, "like", strlen(word))) {
if (state == 0) {
return strdup("like");
} else {
return NULL;
}
} else if (! strncasecmp(word, "describing", strlen(word))) {
if (state == 0) {
return strdup("describing");
} else {
return NULL;
}
}
}
return NULL;
}
/*
* 'show dialplan' CLI command implementation functions ...
*/
static char *complete_show_dialplan_context(char *line, char *word, int pos,
int state)
{
struct ast_context *c;
int which = 0;
/* we are do completion of [exten@]context on second position only */
if (pos != 2) return NULL;
/* try to lock contexts list ... */
if (ast_lock_contexts()) {
ast_log(LOG_ERROR, "Unable to lock context list\n");
return NULL;
}
/* ... walk through all contexts ... */
c = ast_walk_contexts(NULL);
while(c) {
/* ... word matches context name? yes? ... */
if (!strncasecmp(word, ast_get_context_name(c), strlen(word))) {
/* ... for serve? ... */
if (++which > state) {
/* ... yes, serve this context name ... */
char *ret = strdup(ast_get_context_name(c));
ast_unlock_contexts();
return ret;
}
/* ... unlock and return */
ast_unlock_contexts();
return NULL;
}
Mark Spencer
committed
struct dialplan_counters {
int total_context;
int total_exten;
int total_prio;
int context_existence;
int extension_existence;
};
static int show_dialplan_helper(int fd, char *context, char *exten, struct dialplan_counters *dpc, struct ast_include *rinclude)
Mark Spencer
committed
int res=0, old_total_exten = dpc->total_exten;
/* try to lock contexts */
if (ast_lock_contexts()) {
ast_log(LOG_WARNING, "Failed to lock contexts list\n");
Mark Spencer
committed
return -1;
Mark Spencer
committed
for (c = ast_walk_contexts(NULL); c ; c = ast_walk_contexts(c)) {
/* show this context? */
if (!context ||
!strcmp(ast_get_context_name(c), context)) {
Mark Spencer
committed
dpc->context_existence = 1;
/* try to lock context before walking in ... */
if (!ast_lock_context(c)) {
struct ast_exten *e;
struct ast_include *i;
struct ast_ignorepat *ip;
struct ast_sw *sw;
char buf[256], buf2[256];
int context_info_printed = 0;
/* are we looking for exten too? if yes, we print context
* if we our extension only
*/
if (!exten) {
Mark Spencer
committed
dpc->total_context++;
ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
ast_get_context_name(c), ast_get_context_registrar(c));
context_info_printed = 1;
}
/* walk extensions ... */
Mark Spencer
committed
for (e = ast_walk_context_extensions(c, NULL); e; e = ast_walk_context_extensions(c, e)) {
/* looking for extension? is this our extension? */
if (exten &&
Mark Spencer
committed
!ast_extension_match(ast_get_extension_name(e), exten))
{
/* we are looking for extension and it's not our
* extension, so skip to next extension */
continue;
}
Mark Spencer
committed
dpc->extension_existence = 1;
/* may we print context info? */
if (!context_info_printed) {
Mark Spencer
committed
dpc->total_context++;
if (rinclude) {
/* TODO Print more info about rinclude */
ast_cli(fd, "[ Included context '%s' created by '%s' ]\n",
ast_get_context_name(c),
ast_get_context_registrar(c));
} else {
ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
ast_get_context_name(c),
ast_get_context_registrar(c));
}
Mark Spencer
committed
dpc->total_prio++;
/* write extension name and first peer */
bzero(buf, sizeof(buf));
snprintf(buf, sizeof(buf), "'%s' =>",
ast_get_extension_name(e));
prio = ast_get_extension_priority(e);
if (prio == PRIORITY_HINT) {
snprintf(buf2, sizeof(buf2),
"hint: %s",
ast_get_extension_app(e));
} else {
snprintf(buf2, sizeof(buf2),
"%d. %s(%s)",
prio,
ast_get_extension_app(e),
(char *)ast_get_extension_app_data(e));
}
ast_cli(fd, " %-17s %-45s [%s]\n", buf, buf2,
ast_get_extension_registrar(e));
Mark Spencer
committed
dpc->total_exten++;
Mark Spencer
committed
for (p=ast_walk_extension_priorities(e, e); p; p=ast_walk_extension_priorities(e, p)) {
dpc->total_prio++;
bzero((void *)buf, sizeof(buf));
if (ast_get_extension_label(p))
snprintf(buf, sizeof(buf), " [%s]", ast_get_extension_label(p));
prio = ast_get_extension_priority(p);
if (prio == PRIORITY_HINT) {
snprintf(buf2, sizeof(buf2),
"hint: %s",
ast_get_extension_app(p));
} else {
snprintf(buf2, sizeof(buf2),
"%d. %s(%s)",
prio,
ast_get_extension_app(p),
(char *)ast_get_extension_app_data(p));
}
Mark Spencer
committed
ast_get_extension_registrar(p));
Mark Spencer
committed
/* walk included and write info ... */
for (i = ast_walk_context_includes(c, NULL); i; i = ast_walk_context_includes(c, i)) {
bzero(buf, sizeof(buf));
snprintf(buf, sizeof(buf), "'%s'",
ast_get_include_name(i));
if (exten) {
/* Check all includes for the requested extension */
show_dialplan_helper(fd, (char *)ast_get_include_name(i), exten, dpc, i);
} else {
ast_cli(fd, " Include => %-45s [%s]\n",
buf, ast_get_include_registrar(i));
}
Mark Spencer
committed
}
Mark Spencer
committed
/* walk ignore patterns and write info ... */
for (ip=ast_walk_context_ignorepats(c, NULL); ip; ip=ast_walk_context_ignorepats(c, ip)) {
const char *ipname = ast_get_ignorepat_name(ip);
char ignorepat[AST_MAX_EXTENSION];
snprintf(buf, sizeof(buf), "'%s'", ipname);
snprintf(ignorepat, sizeof(ignorepat), "_%s.", ipname);
if ((!exten) || ast_extension_match(ignorepat, exten)) {
Mark Spencer
committed
buf, ast_get_ignorepat_registrar(ip));
Mark Spencer
committed
}
if (!rinclude) {
for (sw = ast_walk_context_switches(c, NULL); sw; sw = ast_walk_context_switches(c, sw)) {
snprintf(buf, sizeof(buf), "'%s/%s'",
ast_get_switch_name(sw),
ast_get_switch_data(sw));
ast_cli(fd, " Alt. Switch => %-45s [%s]\n",
buf, ast_get_switch_registrar(sw));
}
}
ast_unlock_context(c);
/* if we print something in context, make an empty line */
Mark Spencer
committed
if (context_info_printed) ast_cli(fd, "\r\n");
Mark Spencer
committed
if (dpc->total_exten == old_total_exten) {
/* Nothing new under the sun */
return -1;
} else {
return res;
}
}
static int handle_show_dialplan(int fd, int argc, char *argv[])
{
char *exten = NULL, *context = NULL;
/* Variables used for different counters */
struct dialplan_counters counters;
memset(&counters, 0, sizeof(counters));
if (argc != 2 && argc != 3)
return RESULT_SHOWUSAGE;
Mark Spencer
committed
/* we obtain [exten@]context? if yes, split them ... */
if (argc == 3) {
char *splitter = ast_strdupa(argv[2]);
/* is there a '@' character? */
if (splitter && strchr(argv[2], '@')) {
/* yes, split into exten & context ... */
exten = strsep(&splitter, "@");
context = splitter;
/* check for length and change to NULL if ast_strlen_zero() */
if (ast_strlen_zero(exten))
exten = NULL;
if (ast_strlen_zero(context))
context = NULL;
Mark Spencer
committed
show_dialplan_helper(fd, context, exten, &counters, NULL);
} else {
/* no '@' char, only context given */
context = argv[2];
if (ast_strlen_zero(context))
context = NULL;
Mark Spencer
committed
show_dialplan_helper(fd, context, exten, &counters, NULL);
}
} else {
/* Show complete dial plan */
show_dialplan_helper(fd, NULL, NULL, &counters, NULL);
Mark Spencer
committed
}
/* check for input failure and throw some error messages */
Mark Spencer
committed
if (context && !counters.context_existence) {
ast_cli(fd, "There is no existence of '%s' context\n", context);
Mark Spencer
committed
if (exten && !counters.extension_existence) {
if (context)
ast_cli(fd, "There is no existence of %s@%s extension\n",
exten, context);
else
ast_cli(fd,
"There is no existence of '%s' extension in all contexts\n",
exten);
return RESULT_FAILURE;
}
Mark Spencer
committed
ast_cli(fd,"-= %d extensions (%d priorities) in %d contexts. =-\n",
counters.total_exten, counters.total_prio, counters.total_context);
/* custom commands */
static struct ast_custom_function_obj regex_function = {
.name = "regex",
.desc = "Regular Expression: Returns 1 if data matches regular expression.",
.syntax = "regex(\"<regular expression>\" <data>)",
.read = builtin_function_regex,
.write = NULL,
};
static struct ast_custom_function_obj isnull_function = {
.name = "isnull",
.desc = "NULL Test: Returns 1 if NULL or 0 otherwise",
.syntax = "isnull(<data>)",
.read = builtin_function_isnull,
.write = NULL,
};
static struct ast_custom_function_obj exists_function = {
.name = "exists",
.desc = "Existence Test: Returns 1 if exists, 0 otherwise",
.syntax = "exists(<data>)",
.read = builtin_function_exists,
.write = NULL,
};
static struct ast_custom_function_obj if_function = {
.name = "if",
.desc = "Conditional: Returns the data following '?' if true else the data following ':'",
.syntax = "if(<expr>?<true>:<false>)",
.read = builtin_function_if,
.write = NULL,
};
static struct ast_custom_function_obj env_function = {
.name = "ENV",
.desc = "Gets or sets the environment variable specified",
.syntax = "ENV(<envname>)",
.read = builtin_function_env_read,
.write = builtin_function_env_write,
};
static struct ast_custom_function_obj len_function = {
.name = "LEN",
.desc = "Returns the length of the arguments given",
.syntax = "LEN(<string>)",
.read = builtin_function_len,
.write = NULL,
};
static struct ast_custom_function_obj cdr_function = {
.name = "CDR",
Kevin P. Fleming
committed
.desc = "Gets or sets a CDR variable; option 'r' searches the entire stack of CDRs on the channel",
.syntax = "CDR(<name>[|options])",
.read = builtin_function_cdr_read,
.write = builtin_function_cdr_write,
Kevin P. Fleming
committed
static struct ast_custom_function_obj md5_function = {
.name = "MD5",
.desc = "Computes an MD5 digest",
.syntax = "MD5(<data>)",
.read = builtin_function_md5,
.write = NULL,
};
static struct ast_custom_function_obj checkmd5_function = {
.name = "CHECK_MD5",
.desc = "Checks an MD5 digest. Returns 1 on a match, 0 otherwise",
.syntax = "CHECK_MD5(<digest>,<data>)",
.read = builtin_function_checkmd5,
.write = NULL,
};
/*
* CLI entries for upper commands ...
*/
static struct ast_cli_entry show_applications_cli =
{ { "show", "applications", NULL },
handle_show_applications, "Shows registered dialplan applications",
show_applications_help, complete_show_applications };
static struct ast_cli_entry show_functions_cli =
{ { "show", "functions", NULL },
handle_show_functions, "Shows registered dialplan functions",
show_functions_help};
static struct ast_cli_entry show_application_cli =
{ { "show", "application", NULL },
handle_show_application, "Describe a specific dialplan application",
show_application_help, complete_show_application };
static struct ast_cli_entry show_dialplan_cli =
{ { "show", "dialplan", NULL },
handle_show_dialplan, "Show dialplan",
show_dialplan_help, complete_show_dialplan_context };
static struct ast_cli_entry show_switches_cli =
{ { "show", "switches", NULL },
handle_show_switches, "Show alternative switches",
show_switches_help, NULL };
static struct ast_cli_entry show_hints_cli =
{ { "show", "hints", NULL },
handle_show_hints, "Show dialplan hints",
int ast_unregister_application(const char *app) {
if (ast_mutex_lock(&applock)) {
ast_log(LOG_ERROR, "Unable to lock application list\n");
return -1;
}
tmp = apps;
while(tmp) {
if (!strcasecmp(app, tmp->name)) {
if (tmpl)
tmpl->next = tmp->next;
else
apps = tmp->next;
if (option_verbose > 1)
ast_verbose( VERBOSE_PREFIX_2 "Unregistered application '%s'\n", tmp->name);
ast_mutex_unlock(&applock);
return 0;
}
tmpl = tmp;
tmp = tmp->next;
}
ast_mutex_unlock(&applock);
struct ast_context *ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar)
struct ast_context *tmp, **local_contexts;
int length;
length = sizeof(struct ast_context);
length += strlen(name) + 1;
if (!extcontexts) {
local_contexts = &contexts;
ast_mutex_lock(&conlock);
} else
local_contexts = extcontexts;
tmp = *local_contexts;
while(tmp) {
if (!strcasecmp(tmp->name, name)) {
ast_mutex_unlock(&conlock);
ast_log(LOG_WARNING, "Tried to register context '%s', already in use\n", name);
ast_mutex_unlock(&conlock);
tmp = malloc(length);
memset(tmp, 0, length);
ast_mutex_init(&tmp->lock);
strcpy(tmp->name, name);
if (option_debug)
ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
else if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "Registered extension context '%s'\n", tmp->name);
} else
ast_log(LOG_ERROR, "Out of memory\n");
ast_mutex_unlock(&conlock);
void __ast_context_destroy(struct ast_context *con, const char *registrar);
void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar) {
struct ast_context *tmp, *lasttmp = NULL;
tmp = *extcontexts;
ast_mutex_lock(&conlock);
Mark Spencer
committed
__ast_context_destroy(NULL,registrar);
while (tmp) {
lasttmp = tmp;
tmp = tmp->next;
}
} else {
while (tmp) {
Mark Spencer
committed
__ast_context_destroy(tmp,tmp->registrar);
}
if (lasttmp) {
lasttmp->next = contexts;
contexts = *extcontexts;
*extcontexts = NULL;
} else
ast_log(LOG_WARNING, "Requested contexts didn't get merged\n");
ast_mutex_unlock(&conlock);
int ast_context_add_include(const char *context, const char *include, const char *registrar)
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
{
struct ast_context *c;
if (ast_lock_contexts()) {
errno = EBUSY;
return -1;
}
/* walk contexts ... */
c = ast_walk_contexts(NULL);
while (c) {
/* ... search for the right one ... */
if (!strcmp(ast_get_context_name(c), context)) {
int ret = ast_context_add_include2(c, include, registrar);
/* ... unlock contexts list and return */
ast_unlock_contexts();
return ret;
}
c = ast_walk_contexts(c);
}
/* we can't find the right context */
ast_unlock_contexts();
#define FIND_NEXT \
do { \
c = info; \
while(*c && (*c != '|')) c++; \
static void get_timerange(struct ast_timing *i, char *times)
{
char *e;
int x;
int s1, s2;
int e1, e2;
/* start disabling all times, fill the fields with 0's, as they may contain garbage */
memset(i->minmask, 0, sizeof(i->minmask));
if (ast_strlen_zero(times) || !strcmp(times, "*")) {
for (x=0; x<24; x++)
i->minmask[x] = (1 << 30) - 1;
return;
}
/* Otherwise expect a range */
e = strchr(times, '-');
if (!e) {
ast_log(LOG_WARNING, "Time range is not valid. Assuming no restrictions based on time.\n");
while(*e && !isdigit(*e))
e++;
ast_log(LOG_WARNING, "Invalid time range. Assuming no restrictions based on time.\n");
return;
}
if (sscanf(times, "%d:%d", &s1, &s2) != 2) {
ast_log(LOG_WARNING, "%s isn't a time. Assuming no restrictions based on time.\n", times);
return;
}
if (sscanf(e, "%d:%d", &e1, &e2) != 2) {
ast_log(LOG_WARNING, "%s isn't a time. Assuming no restrictions based on time.\n", e);
s1 = s1 * 30 + s2/2;
if ((s1 < 0) || (s1 >= 24*30)) {
ast_log(LOG_WARNING, "%s isn't a valid start time. Assuming no time.\n", times);
if ((e1 < 0) || (e1 >= 24*30)) {
ast_log(LOG_WARNING, "%s isn't a valid end time. Assuming no time.\n", e);
return;
}
/* Go through the time and enable each appropriate bit */
for (x=s1;x != e1;x = (x + 1) % (24 * 30)) {
i->minmask[x/30] |= (1 << (x % 30));
}
/* Do the last one */
i->minmask[x/30] |= (1 << (x % 30));
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
#else
for (cth=0;cth<24;cth++) {
/* Initialize masks to blank */
i->minmask[cth] = 0;
for (ctm=0;ctm<30;ctm++) {
if (
/* First hour with more than one hour */
(((cth == s1) && (ctm >= s2)) &&
((cth < e1)))
/* Only one hour */
|| (((cth == s1) && (ctm >= s2)) &&
((cth == e1) && (ctm <= e2)))
/* In between first and last hours (more than 2 hours) */
|| ((cth > s1) &&
(cth < e1))
/* Last hour with more than one hour */
|| ((cth > s1) &&
((cth == e1) && (ctm <= e2)))
)
i->minmask[cth] |= (1 << (ctm / 2));
}
}
#endif
}
static char *days[] =
{
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
};
/*--- get_dow: Get day of week */
static unsigned int get_dow(char *dow)
{
char *c;
/* The following line is coincidence, really! */
int s, e, x;
if (ast_strlen_zero(dow) || !strcmp(dow, "*"))
return (1 << 7) - 1;
/* Get start and ending days */
c = strchr(dow, '-');
if (c) {
*c = '\0';
c++;
/* Find the start */
s = 0;
while((s < 7) && strcasecmp(dow, days[s])) s++;
if (s >= 7) {
ast_log(LOG_WARNING, "Invalid day '%s', assuming none\n", dow);
return 0;
}
if (c) {
e = 0;
if (e >= 7) {
ast_log(LOG_WARNING, "Invalid day '%s', assuming none\n", c);
return 0;
}
} else
e = s;
mask = 0;
for (x=s; x != e; x = (x + 1) % 7) {
mask |= (1 << x);
}
/* One last one */
mask |= (1 << x);
return mask;
}
static unsigned int get_day(char *day)
{
char *c;
/* The following line is coincidence, really! */
int s, e, x;
unsigned int mask;
if (ast_strlen_zero(day) || !strcmp(day, "*")) {
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
}
/* Get start and ending days */
c = strchr(day, '-');
if (c) {
*c = '\0';
c++;
}
/* Find the start */
if (sscanf(day, "%d", &s) != 1) {
ast_log(LOG_WARNING, "Invalid day '%s', assuming none\n", day);
return 0;
}
if ((s < 1) || (s > 31)) {
ast_log(LOG_WARNING, "Invalid day '%s', assuming none\n", day);
return 0;
}
s--;
if (c) {
if (sscanf(c, "%d", &e) != 1) {
ast_log(LOG_WARNING, "Invalid day '%s', assuming none\n", c);
return 0;