Fri Feb 21 07:00:01 CET 2003
[asterisk/asterisk.git] / apps / app_lookupblacklist.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * App to lookup the callerid number, and see if it is blacklisted
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <asterisk/lock.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/options.h>
18 #include <asterisk/channel.h>
19 #include <asterisk/pbx.h>
20 #include <asterisk/module.h>
21 #include <asterisk/translate.h>
22 #include <asterisk/image.h>
23 #include <asterisk/callerid.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <pthread.h>
27
28 static char *tdesc = "Look up number from local blacklist database";
29
30 static char *app = "LookupBlacklist";
31
32 static char *synopsis = "Look up number from local blacklist database";
33
34 static char *descrip =
35   "  LookupBlacklist: Looks up the Caller*ID number on the active\n"
36   "channel in the Asterisk database (family 'blacklist').  If the\n"
37   "number is found, and if there exists a priority n + 101,\n"
38   "where 'n' is the priority of the current instance, then  the\n"
39   "channel  will  be  setup  to continue at that priority level.\n"
40   "Otherwise, it returns 0.  Does nothing if no Caller*ID was received on the\n"
41   "channel.\n";
42
43 STANDARD_LOCAL_USER;
44
45 LOCAL_USER_DECL;
46
47 static int
48 lookupblacklist_exec (struct ast_channel *chan, void *data)
49 {
50   char old_cid[144] = "", *num, *name;
51   char blacklist[1];
52   char shrunknum[64] = "";
53   struct localuser *u;
54   int bl = 0;
55
56   LOCAL_USER_ADD (u);
57   if (chan->callerid)
58     {
59       strncpy (old_cid, chan->callerid, sizeof (old_cid) - 1);
60       ast_callerid_parse (old_cid, &name, &num);        /* this destroys the original string */
61       if (num)                  /* It's possible to get an empty number */
62         strncpy (shrunknum, num, sizeof (shrunknum) - 1);
63       else
64         num = shrunknum;
65       ast_shrink_phone_number (shrunknum);
66       if (!ast_db_get ("blacklist", shrunknum, blacklist, sizeof (blacklist)))
67         {
68           if (option_verbose > 2)
69             ast_verbose (VERBOSE_PREFIX_3 "Blacklisted number %s found\n",shrunknum);
70           bl = 1;
71         }
72
73     }
74   if (bl && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
75        chan->priority+=100;
76   LOCAL_USER_REMOVE (u);
77   return 0;
78 }
79
80 int
81 unload_module (void)
82 {
83   STANDARD_HANGUP_LOCALUSERS;
84   return ast_unregister_application (app);
85 }
86
87 int
88 load_module (void)
89 {
90   return ast_register_application (app, lookupblacklist_exec, synopsis,
91                                    descrip);
92 }
93
94 char *
95 description (void)
96 {
97   return tdesc;
98 }
99
100 int
101 usecount (void)
102 {
103   int res;
104   STANDARD_USECOUNT (res);
105   return res;
106 }
107
108 char *
109 key ()
110 {
111   return ASTERISK_GPL_KEY;
112 }