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