00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "asterisk.h"
00028
00029 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 276347 $")
00030
00031 #include "asterisk/module.h"
00032 #include "asterisk/channel.h"
00033 #include "asterisk/pbx.h"
00034 #include "asterisk/app.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 static int isexten_function_read(struct ast_channel *chan, const char *cmd, char *data,
00054 char *buf, size_t len)
00055 {
00056 char *parse;
00057 AST_DECLARE_APP_ARGS(args,
00058 AST_APP_ARG(context);
00059 AST_APP_ARG(exten);
00060 AST_APP_ARG(priority);
00061 );
00062
00063 strcpy(buf, "0");
00064
00065 if (ast_strlen_zero(data)) {
00066 ast_log(LOG_ERROR, "DIALPLAN_EXISTS() requires an argument\n");
00067 return -1;
00068 }
00069
00070 parse = ast_strdupa(data);
00071 AST_STANDARD_APP_ARGS(args, parse);
00072
00073 if (!ast_strlen_zero(args.priority)) {
00074 int priority_num;
00075 if (sscanf(args.priority, "%30d", &priority_num) == 1 && priority_num > 0) {
00076 int res;
00077 res = ast_exists_extension(chan, args.context, args.exten, priority_num,
00078 S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL));
00079 if (res)
00080 strcpy(buf, "1");
00081 } else {
00082 int res;
00083 res = ast_findlabel_extension(chan, args.context, args.exten, args.priority,
00084 S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL));
00085 if (res > 0)
00086 strcpy(buf, "1");
00087 }
00088 } else if (!ast_strlen_zero(args.exten)) {
00089 int res;
00090 res = ast_exists_extension(chan, args.context, args.exten, 1,
00091 S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL));
00092 if (res)
00093 strcpy(buf, "1");
00094 } else if (!ast_strlen_zero(args.context)) {
00095 if (ast_context_find(args.context))
00096 strcpy(buf, "1");
00097 } else {
00098 ast_log(LOG_ERROR, "Invalid arguments provided to DIALPLAN_EXISTS\n");
00099 return -1;
00100 }
00101
00102 return 0;
00103 }
00104
00105 static struct ast_custom_function isexten_function = {
00106 .name = "DIALPLAN_EXISTS",
00107 .read = isexten_function_read,
00108 .read_max = 2,
00109 };
00110
00111 static int unload_module(void)
00112 {
00113 return ast_custom_function_unregister(&isexten_function);
00114 }
00115
00116 static int load_module(void)
00117 {
00118 return ast_custom_function_register(&isexten_function);
00119 }
00120
00121 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dialplan Context/Extension/Priority Checking Functions");