Sat Aug 6 00:39:29 2011

Asterisk developer's documentation


func_enum.c

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2006
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  * Oleksiy Krivoshey <oleksiyk@gmail.com>
00008  * Russell Bryant <russelb@clemson.edu>
00009  *
00010  * See http://www.asterisk.org for more information about
00011  * the Asterisk project. Please do not directly contact
00012  * any of the maintainers of this project for assistance;
00013  * the project provides a web site, mailing lists and IRC
00014  * channels for your use.
00015  *
00016  * This program is free software, distributed under the terms of
00017  * the GNU General Public License Version 2. See the LICENSE file
00018  * at the top of the source tree.
00019  */
00020 
00021 /*! \file
00022  *
00023  * \brief ENUM Functions
00024  *
00025  * \author Mark Spencer <markster@digium.com>
00026  * \author Oleksiy Krivoshey <oleksiyk@gmail.com>
00027  * \author Russell Bryant <russelb@clemson.edu>
00028  *
00029  * \arg See also AstENUM
00030  */
00031 
00032 #include "asterisk.h"
00033 
00034 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 153337 $")
00035 
00036 #include <stdlib.h>
00037 #include <stdio.h>
00038 
00039 #include "asterisk/module.h"
00040 #include "asterisk/channel.h"
00041 #include "asterisk/pbx.h"
00042 #include "asterisk/utils.h"
00043 #include "asterisk/lock.h"
00044 #include "asterisk/file.h"
00045 #include "asterisk/logger.h"
00046 #include "asterisk/pbx.h"
00047 #include "asterisk/options.h"
00048 #include "asterisk/enum.h"
00049 #include "asterisk/app.h"
00050 
00051  static char *synopsis = "Syntax: ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])\n";
00052 
00053 static int function_enum(struct ast_channel *chan, char *cmd, char *data,
00054           char *buf, size_t len)
00055 {
00056    AST_DECLARE_APP_ARGS(args,
00057       AST_APP_ARG(number);
00058       AST_APP_ARG(tech);
00059       AST_APP_ARG(options);
00060       AST_APP_ARG(record);
00061       AST_APP_ARG(zone);
00062    );
00063    int res = 0;
00064    char tech[80];
00065    char dest[256] = "", tmp[2] = "", num[AST_MAX_EXTENSION] = "";
00066    struct ast_module_user *u;
00067    char *s, *p;
00068    unsigned int record = 1;
00069 
00070    buf[0] = '\0';
00071 
00072    if (ast_strlen_zero(data)) {
00073       ast_log(LOG_WARNING, "%s", synopsis);
00074       return -1;
00075    }
00076 
00077    AST_STANDARD_APP_ARGS(args, data);
00078 
00079    if (args.argc < 1) {
00080       ast_log(LOG_WARNING, "%s", synopsis);
00081       return -1;
00082    }
00083 
00084    u = ast_module_user_add(chan);
00085 
00086    ast_copy_string(tech, args.tech ? args.tech : "sip", sizeof(tech));
00087 
00088    if (!args.zone)
00089       args.zone = "e164.arpa";
00090 
00091    if (!args.options)
00092       args.options = "";
00093 
00094    if (args.record)
00095       record = atoi(args.record);
00096 
00097    /* strip any '-' signs from number */
00098    for (s = p = args.number; *s; s++) {
00099       if (*s != '-') {
00100          snprintf(tmp, sizeof(tmp), "%c", *s);
00101          strncat(num, tmp, sizeof(num) - strlen(num) - 1);
00102       }
00103 
00104    }
00105 
00106    res = ast_get_enum(chan, num, dest, sizeof(dest), tech, sizeof(tech), args.zone,
00107             args.options, record);
00108 
00109    p = strchr(dest, ':');
00110    if (p && strcasecmp(tech, "ALL"))
00111       ast_copy_string(buf, p + 1, len);
00112    else
00113       ast_copy_string(buf, dest, len);
00114 
00115    ast_module_user_remove(u);
00116 
00117    return 0;
00118 }
00119 
00120 static struct ast_custom_function enum_function = {
00121    .name = "ENUMLOOKUP",
00122    .synopsis =
00123       "ENUMLOOKUP allows for general or specific querying of NAPTR records"
00124       " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
00125    .syntax =
00126       "ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])",
00127    .desc =
00128       "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
00129       "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
00130       "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
00131       "For more information, see doc/enum.txt",
00132    .read = function_enum,
00133 };
00134 
00135 static int function_txtcidname(struct ast_channel *chan, char *cmd,
00136                 char *data, char *buf, size_t len)
00137 {
00138    int res;
00139    char tech[80];
00140    char txt[256] = "";
00141    char dest[80];
00142    struct ast_module_user *u;
00143 
00144    buf[0] = '\0';
00145 
00146 
00147    if (ast_strlen_zero(data)) {
00148       ast_log(LOG_WARNING, "TXTCIDNAME requires an argument (number)\n");
00149       return -1;
00150    }
00151 
00152    u = ast_module_user_add(chan);
00153 
00154    res = ast_get_txt(chan, data, dest, sizeof(dest), tech, sizeof(tech), txt,
00155            sizeof(txt));
00156 
00157    if (!ast_strlen_zero(txt))
00158       ast_copy_string(buf, txt, len);
00159 
00160    ast_module_user_remove(u);
00161 
00162    return 0;
00163 }
00164 
00165 static struct ast_custom_function txtcidname_function = {
00166    .name = "TXTCIDNAME",
00167    .synopsis = "TXTCIDNAME looks up a caller name via DNS",
00168    .syntax = "TXTCIDNAME(<number>)",
00169    .desc =
00170       "This function looks up the given phone number in DNS to retrieve\n"
00171       "the caller id name.  The result will either be blank or be the value\n"
00172       "found in the TXT record in DNS.\n",
00173    .read = function_txtcidname,
00174 };
00175 
00176 static int unload_module(void)
00177 {
00178    int res = 0;
00179 
00180    res |= ast_custom_function_unregister(&enum_function);
00181    res |= ast_custom_function_unregister(&txtcidname_function);
00182 
00183    ast_module_user_hangup_all();
00184 
00185    return res;
00186 }
00187 
00188 static int load_module(void)
00189 {
00190    int res = 0;
00191 
00192    res |= ast_custom_function_register(&enum_function);
00193    res |= ast_custom_function_register(&txtcidname_function);
00194 
00195    return res;
00196 }
00197 
00198 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ENUM related dialplan functions");

Generated on Sat Aug 6 00:39:29 2011 for Asterisk - the Open Source PBX by  doxygen 1.4.7