01ce61f6ad467503f7b68bfbfcb222b8155af294
[sip-router] / modules_k / presence / utils_func.h
1 /*
2  * $Id$
3  *
4  * presence module - presence server implementation
5  *
6  * Copyright (C) 2006 Voice Sistem S.R.L.
7  *
8  * This file is part of openser, a free SIP server.
9  *
10  * openser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * openser is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  *
24  * History:
25  * --------
26  *  2006-08-15  initial version (anca)
27  */
28
29
30 #ifndef UTILS_FUNC_H
31 #define UTILS_FUNC_H
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include "../../mem/mem.h"
36 #include "../../dprint.h"
37 #include "../../str.h"
38 #include "../../parser/msg_parser.h"
39
40 #define LCONTACT_BUF_SIZE 1024
41
42 static inline int uandd_to_uri(str user,  str domain, str *out)
43 {
44         int size;
45
46         if(out==0)
47                 return -1;
48
49         size = user.len + domain.len+7;
50
51         out->s = (char*)pkg_malloc(size*sizeof(char));
52         if(out->s == NULL)
53         {
54                 LM_ERR("no more memory\n");
55                 return -1;
56         }
57         out->len = 0;
58         strcpy(out->s,"sip:");
59         out->len = 4;
60         strncpy(out->s+out->len, user.s, user.len);
61         out->len += user.len;
62         out->s[out->len] = '@';
63         out->len+= 1;
64         strncpy(out->s + out->len, domain.s, domain.len);
65         out->len += domain.len;
66
67         out->s[out->len] = 0;
68         
69         return 0;
70 }
71
72 static inline str* get_local_contact(struct sip_msg* msg)
73 {
74         str ip;
75         char* proto;
76         int port;
77         int len;
78         str* contact;
79
80         contact= (str*)pkg_malloc(sizeof(str));
81         if(contact== NULL)
82         {
83                 LM_ERR("No more memory\n");
84                 return NULL;
85         }
86         contact->s= (char*)pkg_malloc(LCONTACT_BUF_SIZE* sizeof(char));
87         if(contact->s== NULL)
88         {
89                 LM_ERR("No more memory\n");
90                 pkg_free(contact);
91                 return NULL;
92         }
93
94         memset(contact->s, 0, LCONTACT_BUF_SIZE*sizeof(char));
95         contact->len= 0;
96         
97         if(msg->rcv.proto== PROTO_NONE || msg->rcv.proto==PROTO_UDP)
98                 proto= "udp";
99         else
100         if(msg->rcv.proto== PROTO_TLS )
101                         proto= "tls";
102         else    
103         if(msg->rcv.proto== PROTO_TCP)
104                 proto= "tcp";
105         else
106         {
107                 LM_ERR("unsupported proto\n");
108                 pkg_free(contact->s);
109                 pkg_free(contact);
110                 return NULL;
111         }       
112         
113         ip.s= ip_addr2a(&msg->rcv.dst_ip);
114         if(ip.s== NULL)
115         {
116                 LM_ERR("transforming ip_addr to ascii\n");
117                 pkg_free(contact->s);
118                 pkg_free(contact);
119                 return NULL;
120         }
121         ip.len= strlen(ip.s);
122         port = msg->rcv.dst_port;
123
124         if(strncmp(ip.s, "sip:", 4)!=0)
125         {
126                 strncpy(contact->s, "sip:", 4);
127                 contact->len+= 4;
128         }       
129         strncpy(contact->s+contact->len, ip.s, ip.len);
130         contact->len += ip.len;
131         if(contact->len> LCONTACT_BUF_SIZE - 21)
132         {
133                 LM_ERR("buffer overflow\n");
134                 pkg_free(contact->s);
135                 pkg_free(contact);
136                 return NULL;
137
138         }       
139         len= sprintf(contact->s+contact->len, ":%d;transport=" , port);
140         if(len< 0)
141         {
142                 LM_ERR("unsuccessful sprintf\n");
143                 pkg_free(contact->s);
144                 pkg_free(contact);
145                 return NULL;
146         }       
147         contact->len+= len;
148         strncpy(contact->s+ contact->len, proto, 3);
149         contact->len += 3;
150         
151         return contact;
152         
153 }
154
155 //str* int_to_str(long int n);
156
157 int a_to_i (char *s,int len);
158
159 void to64frombits(unsigned char *out, const unsigned char *in, int inlen);
160
161 int send_error_reply(struct sip_msg* msg, int reply_code, str reply_str);
162
163 #endif
164