Add Masquerade manager event which trips when a masquerade happens (issue #7840 repor...
[asterisk/asterisk.git] / funcs / func_callerid.c
index c907d96..6068739 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999-2006, Digium, Inc.
  *
  * See http://www.asterisk.org for more information about
  * the Asterisk project. Please do not directly contact
  * 
  */
 
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
 
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/module.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
@@ -38,10 +38,12 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/options.h"
 #include "asterisk/callerid.h"
 
-static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
+static int callerid_read(struct ast_channel *chan, char *cmd, char *data,
+                        char *buf, size_t len)
 {
        char *opt = data;
 
+       /* XXX we are not always clearing the buffer. Is this correct ? */
        if (strchr(opt, '|')) {
                char name[80], num[80];
 
@@ -49,22 +51,27 @@ static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char
                ast_callerid_split(opt, name, sizeof(name), num, sizeof(num));
 
                if (!strncasecmp("all", data, 3)) {
-                       snprintf(buf, len, "\"%s\" <%s>", name, num);   
+                       snprintf(buf, len, "\"%s\" <%s>", name, num);
                } else if (!strncasecmp("name", data, 4)) {
                        ast_copy_string(buf, name, len);
-               } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
+               } else if (!strncasecmp("num", data, 3) ||
+                          !strncasecmp("number", data, 6)) {
+
                        ast_copy_string(buf, num, len);
                } else {
-                       ast_log(LOG_ERROR, "Unknown callerid data type.\n");
+                       ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
                }
        } else {
                if (!strncasecmp("all", data, 3)) {
-                       snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : "");    
+                       snprintf(buf, len, "\"%s\" <%s>",
+                                S_OR(chan->cid.cid_name, ""),
+                                S_OR(chan->cid.cid_num, ""));
                } else if (!strncasecmp("name", data, 4)) {
                        if (chan->cid.cid_name) {
                                ast_copy_string(buf, chan->cid.cid_name, len);
                        }
-               } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
+               } else if (!strncasecmp("num", data, 3)
+                                  || !strncasecmp("number", data, 6)) {
                        if (chan->cid.cid_num) {
                                ast_copy_string(buf, chan->cid.cid_num, len);
                        }
@@ -81,85 +88,69 @@ static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char
                                ast_copy_string(buf, chan->cid.cid_rdnis, len);
                        }
                } else {
-                       ast_log(LOG_ERROR, "Unknown callerid data type.\n");
+                       ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
                }
        }
-       return buf;
+
+       return 0;
 }
 
-static void callerid_write(struct ast_channel *chan, char *cmd, char *data, const char *value) 
+static int callerid_write(struct ast_channel *chan, char *cmd, char *data,
+                         const char *value)
 {
        if (!value)
-                return;
-       
+               return -1;
+
        if (!strncasecmp("all", data, 3)) {
                char name[256];
                char num[256];
+
                if (!ast_callerid_split(value, name, sizeof(name), num, sizeof(num)))
-                       ast_set_callerid(chan, num, name, num); 
-        } else if (!strncasecmp("name", data, 4)) {
-                ast_set_callerid(chan, NULL, value, NULL);
-        } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
-                ast_set_callerid(chan, value, NULL, NULL);
-        } else if (!strncasecmp("ani", data, 3)) {
-                ast_set_callerid(chan, NULL, NULL, value);
-        } else if (!strncasecmp("dnid", data, 4)) {
-                /* do we need to lock chan here? */
-                if (chan->cid.cid_dnid)
-                        free(chan->cid.cid_dnid);
-                chan->cid.cid_dnid = ast_strlen_zero(value) ? NULL : strdup(value);
-        } else if (!strncasecmp("rdnis", data, 5)) {
-                /* do we need to lock chan here? */
-                if (chan->cid.cid_rdnis)
-                        free(chan->cid.cid_rdnis);
-                chan->cid.cid_rdnis = ast_strlen_zero(value) ? NULL : strdup(value);
-        } else {
-                ast_log(LOG_ERROR, "Unknown callerid data type.\n");
-        }
+                       ast_set_callerid(chan, num, name, num);
+       } else if (!strncasecmp("name", data, 4)) {
+               ast_set_callerid(chan, NULL, value, NULL);
+       } else if (!strncasecmp("num", data, 3) ||
+                  !strncasecmp("number", data, 6)) {
+               ast_set_callerid(chan, value, NULL, NULL);
+       } else if (!strncasecmp("ani", data, 3)) {
+               ast_set_callerid(chan, NULL, NULL, value);
+       } else if (!strncasecmp("dnid", data, 4)) {
+               /* do we need to lock chan here? */
+               if (chan->cid.cid_dnid)
+                       free(chan->cid.cid_dnid);
+               chan->cid.cid_dnid = ast_strdup(value);
+       } else if (!strncasecmp("rdnis", data, 5)) {
+               /* do we need to lock chan here? */
+               if (chan->cid.cid_rdnis)
+                       free(chan->cid.cid_rdnis);
+               chan->cid.cid_rdnis = ast_strdup(value);
+       } else {
+               ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
+       }
+
+       return 0;
 }
 
 static struct ast_custom_function callerid_function = {
        .name = "CALLERID",
        .synopsis = "Gets or sets Caller*ID data on the channel.",
        .syntax = "CALLERID(datatype[,<optional-CID>])",
-       .desc = "Gets or sets Caller*ID data on the channel.  The allowable datatypes\n"
-       "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n"
-       "Uses channel callerid by default or optional callerid, if specified.\n",
+       .desc =
+               "Gets or sets Caller*ID data on the channel.  The allowable datatypes\n"
+               "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n"
+               "Uses channel callerid by default or optional callerid, if specified.\n",
        .read = callerid_read,
        .write = callerid_write,
 };
 
-static char *tdesc = "Caller ID related dialplan function";
-
-int unload_module(void)
-{
-        return ast_custom_function_unregister(&callerid_function);
-}
-
-int load_module(void)
-{
-        return ast_custom_function_register(&callerid_function);
-}
-
-char *description(void)
+static int unload_module(void)
 {
-       return tdesc;
+       return ast_custom_function_unregister(&callerid_function);
 }
 
-int usecount(void)
+static int load_module(void)
 {
-       return 0;
+       return ast_custom_function_register(&callerid_function);
 }
 
-char *key()
-{
-       return ASTERISK_GPL_KEY;
-}
-
-/*
-Local Variables:
-mode: C
-c-file-style: "linux"
-indent-tabs-mode: nil
-End:
-*/
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Caller ID related dialplan function");