1 #include "utils.h"
2 #include <stdio.h>
3 #include <string.h>
4
5 #ifdef SER
6
extract_server_contact(struct sip_msg * m,str * dst,int uri_only)7 int extract_server_contact(struct sip_msg *m, str *dst, int uri_only)
8 {
9 char *tmp = "";
10 if (!dst) return -1;
11
12 switch(m->rcv.bind_address->proto){
13 case PROTO_NONE: break;
14 case PROTO_UDP: break;
15 case PROTO_TCP: tmp = ";transport=tcp"; break;
16 case PROTO_TLS: tmp = ";transport=tls"; break;
17 case PROTO_SCTP: tmp = ";transport=sctp"; break;
18 default: LOG(L_CRIT, "BUG: extract_server_contact: unknown proto %d\n", m->rcv.bind_address->proto);
19 }
20
21 dst->len = 7 + m->rcv.bind_address->name.len + m->rcv.bind_address->port_no_str.len + strlen(tmp);
22 if (!uri_only) dst->len += 11;
23 dst->s = (char *)cds_malloc(dst->len + 1);
24 if (!dst->s) {
25 dst->len = 0;
26 return -1;
27 }
28 if (uri_only) {
29 snprintf(dst->s, dst->len + 1, "<sip:%.*s:%.*s%s>",
30 m->rcv.bind_address->name.len, m->rcv.bind_address->name.s,
31 m->rcv.bind_address->port_no_str.len, m->rcv.bind_address->port_no_str.s,
32 tmp);
33 }
34 else {
35 snprintf(dst->s, dst->len + 1, "Contact: <sip:%.*s:%.*s%s>\r\n",
36 m->rcv.bind_address->name.len, m->rcv.bind_address->name.s,
37 m->rcv.bind_address->port_no_str.len, m->rcv.bind_address->port_no_str.s,
38 tmp);
39 }
40
41 return 0;
42 }
43
44 #endif
45