Fix chan_phone error code (bug #3692)
[asterisk/asterisk.git] / privacy.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Channel Management
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 <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 #include <asterisk/channel.h>
23 #include <asterisk/file.h>
24 #include <asterisk/app.h>
25 #include <asterisk/dsp.h>
26 #include <asterisk/logger.h>
27 #include <asterisk/options.h>
28 #include <asterisk/astdb.h>
29 #include <asterisk/callerid.h>
30 #include <asterisk/privacy.h>
31 #include <asterisk/utils.h>
32 #include <asterisk/lock.h>
33 #include "asterisk.h"
34
35 int ast_privacy_check(char *dest, char *cid)
36 {
37         char tmp[256] = "";
38         char *trimcid = "";
39         char *n, *l;
40         int res;
41         char key[256], result[256];
42         if (cid)
43                 strncpy(tmp, cid, sizeof(tmp) - 1);
44         ast_callerid_parse(tmp, &n, &l);
45         if (l) {
46                 ast_shrink_phone_number(l);
47                 trimcid = l;
48         }
49         snprintf(key, sizeof(key), "%s/%s", dest, trimcid);
50         res = ast_db_get("privacy", key, result, sizeof(result));
51         if (!res) {
52                 if (!strcasecmp(result, "allow"))
53                         return AST_PRIVACY_ALLOW;
54                 if (!strcasecmp(result, "deny"))
55                         return AST_PRIVACY_DENY;
56                 if (!strcasecmp(result, "kill"))
57                         return AST_PRIVACY_KILL;
58                 if (!strcasecmp(result, "torture"))
59                         return AST_PRIVACY_TORTURE;
60         }
61         return AST_PRIVACY_UNKNOWN;
62 }
63
64 int ast_privacy_reset(char *dest)
65 {
66         if (!dest)
67                 return -1;
68         return ast_db_deltree("privacy", dest);
69 }
70
71 int ast_privacy_set(char *dest, char *cid, int status)
72 {
73         char tmp[256] = "";
74         char *trimcid = "";
75         char *n, *l;
76         int res;
77         char key[256];
78         if (cid)
79                 strncpy(tmp, cid, sizeof(tmp) - 1);
80         ast_callerid_parse(tmp, &n, &l);
81         if (l) {
82                 ast_shrink_phone_number(l);
83                 trimcid = l;
84         }
85         if (ast_strlen_zero(trimcid)) {
86                 /* Don't store anything for empty Caller*ID */
87                 return 0;
88         }
89         snprintf(key, sizeof(key), "%s/%s", dest, trimcid);
90         if (status == AST_PRIVACY_UNKNOWN) 
91                 res = ast_db_del("privacy", key);
92         else if (status == AST_PRIVACY_ALLOW)
93                 res = ast_db_put("privacy", key, "allow");
94         else if (status == AST_PRIVACY_DENY)
95                 res = ast_db_put("privacy", key, "deny");
96         else if (status == AST_PRIVACY_KILL)
97                 res = ast_db_put("privacy", key, "kill");
98         else if (status == AST_PRIVACY_TORTURE)
99                 res = ast_db_put("privacy", key, "torture");
100         else
101                 res = -1;
102         return res;
103 }