core, lib, modules: restructured source code tree
[sip-router] / src / modules / sipcapture / hash_mode.c
1 #include "../../sr_module.h"
2 #include "../../crc.h"
3
4 #include <ctype.h>
5
6 #include "sipcapture.h"
7 #include "hash_mode.h"
8
9 static int get_source(struct _sipcapture_object *sco, enum hash_source source,
10                             str *source_string);
11 static int get_call_id (struct _sipcapture_object *sco, str *source_string);
12 static int get_from_user (struct _sipcapture_object *sco, str *source_string);
13 static int get_to_user (struct _sipcapture_object *sco, str *source_string);
14
15
16 static int first_token (str *source_string);
17
18
19 int hash_func (struct _sipcapture_object * sco,
20                          enum hash_source source, int denominator) {
21         int ret;
22         unsigned int hash;
23         str source_string;
24
25         if(get_source (sco, source, &source_string) == -1) {
26                 return -1;
27         }
28
29         LM_DBG("source string: [%.*s]\n", source_string.len, source_string.s);
30         crc32_uint(&source_string, &hash);
31
32         ret = hash % denominator;
33         return ret;
34 }
35
36 static int get_source (struct _sipcapture_object *sco, enum hash_source source,
37                              str *source_string) {
38         source_string->s = NULL;
39         source_string->len = 0;
40
41         switch (source) {
42                         case hs_call_id:
43                         return get_call_id (sco, source_string);
44                         case hs_from_user:
45                         return get_from_user(sco, source_string);
46                         case hs_to_user:
47                         return get_to_user(sco, source_string);
48                         default:
49                         LM_ERR("unknown hash source %i.\n",
50                              (int) source);
51                         return -1;
52         }
53 }
54
55 static int get_call_id (struct _sipcapture_object * sco, str *source_string) {
56
57         if (!sco->callid.s || !sco->callid.len)
58         {
59                 return -1;
60         }
61         source_string->s = sco->callid.s;
62         source_string->len = sco->callid.len;
63         first_token (source_string);
64         return 0;
65 }
66
67 static int get_from_user (struct _sipcapture_object * sco, str *source_string) {
68
69         if (!sco->from_user.s || !sco->from_user.len)
70         {
71                 return -1;
72         }
73         source_string->s = sco->from_user.s;
74         source_string->len = sco->from_user.len;
75         return 0;
76 }
77
78
79 static int get_to_user (struct _sipcapture_object * sco, str *source_string) {
80
81         if (!sco->to_user.s || !sco->to_user.len)
82         {
83                 return -1;
84         }
85         source_string->s = sco->to_user.s;
86         source_string->len = sco->to_user.len;
87         return 0;
88 }
89
90
91 static int first_token (str *source_string) {
92         size_t len;
93
94         if (source_string->s == NULL || source_string->len == 0) {
95                 return 0;
96         }
97
98         while (source_string->len > 0 && isspace (*source_string->s)) {
99                 ++source_string->s;
100                 --source_string->len;
101         }
102         for (len = 0; len < source_string->len; ++len) {
103                 if (isspace (source_string->s[len])) {
104                         source_string->len = len;
105                         break;
106                 }
107         }
108         return 0;
109 }
110
111
112 enum hash_source get_hash_source (const char *hash_source){
113
114         if (strcasecmp ("call_id", hash_source) == 0){
115                 return hs_call_id;
116         }
117         else if (strcasecmp("from_user", hash_source) == 0)
118         {
119                 return hs_from_user;
120         }
121         else if (strcasecmp("to_user", hash_source) == 0)
122         {
123                 return hs_to_user;
124         }
125         else {
126                 return hs_error;
127         }
128
129 }