add missing break (issue #5154)
[asterisk/asterisk.git] / privacy.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Privacy Routines
5  * 
6  * Copyright (C) 1999 - 2005, Mark Spencer
7  *
8  * Mark Spencer <markster@digium.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <sys/time.h>
18 #include <signal.h>
19 #include <errno.h>
20 #include <unistd.h>
21 #include <dirent.h>
22
23 #include "asterisk.h"
24
25 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
26
27 #include "asterisk/channel.h"
28 #include "asterisk/file.h"
29 #include "asterisk/app.h"
30 #include "asterisk/dsp.h"
31 #include "asterisk/logger.h"
32 #include "asterisk/options.h"
33 #include "asterisk/astdb.h"
34 #include "asterisk/callerid.h"
35 #include "asterisk/privacy.h"
36 #include "asterisk/utils.h"
37 #include "asterisk/lock.h"
38
39 int ast_privacy_check(char *dest, char *cid)
40 {
41         char tmp[256] = "";
42         char *trimcid = "";
43         char *n, *l;
44         int res;
45         char key[256], result[256];
46         if (cid)
47                 ast_copy_string(tmp, cid, sizeof(tmp));
48         ast_callerid_parse(tmp, &n, &l);
49         if (l) {
50                 ast_shrink_phone_number(l);
51                 trimcid = l;
52         }
53         snprintf(key, sizeof(key), "%s/%s", dest, trimcid);
54         res = ast_db_get("privacy", key, result, sizeof(result));
55         if (!res) {
56                 if (!strcasecmp(result, "allow"))
57                         return AST_PRIVACY_ALLOW;
58                 if (!strcasecmp(result, "deny"))
59                         return AST_PRIVACY_DENY;
60                 if (!strcasecmp(result, "kill"))
61                         return AST_PRIVACY_KILL;
62                 if (!strcasecmp(result, "torture"))
63                         return AST_PRIVACY_TORTURE;
64         }
65         return AST_PRIVACY_UNKNOWN;
66 }
67
68 int ast_privacy_reset(char *dest)
69 {
70         if (!dest)
71                 return -1;
72         return ast_db_deltree("privacy", dest);
73 }
74
75 int ast_privacy_set(char *dest, char *cid, int status)
76 {
77         char tmp[256] = "";
78         char *trimcid = "";
79         char *n, *l;
80         int res;
81         char key[256];
82         if (cid)
83                 ast_copy_string(tmp, cid, sizeof(tmp));
84         ast_callerid_parse(tmp, &n, &l);
85         if (l) {
86                 ast_shrink_phone_number(l);
87                 trimcid = l;
88         }
89         if (ast_strlen_zero(trimcid)) {
90                 /* Don't store anything for empty Caller*ID */
91                 return 0;
92         }
93         snprintf(key, sizeof(key), "%s/%s", dest, trimcid);
94         if (status == AST_PRIVACY_UNKNOWN) 
95                 res = ast_db_del("privacy", key);
96         else if (status == AST_PRIVACY_ALLOW)
97                 res = ast_db_put("privacy", key, "allow");
98         else if (status == AST_PRIVACY_DENY)
99                 res = ast_db_put("privacy", key, "deny");
100         else if (status == AST_PRIVACY_KILL)
101                 res = ast_db_put("privacy", key, "kill");
102         else if (status == AST_PRIVACY_TORTURE)
103                 res = ast_db_put("privacy", key, "torture");
104         else
105                 res = -1;
106         return res;
107 }