Module: sip-router Branch: master Commit: df088fb86adaf8f10bbdfebd5502ea9590341bc8 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=df088fb8...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@iptel.org Date: Mon Jul 20 13:00:37 2009 +0200
core: parse_phostport split for k compatibility
parse_phostport in sr and ser returned a list of pkg_malloc'ed addresses belonging to the same multi-homed "group". For example sctp:(1.2.3.4, 5.6.7.8):5080 is a valid address and it means that this sctp listening socket must use multi-homing on the 2 IPs. However several kamailio modules use parse_phostport and expect the old integer returning version. In this case it was easier to split the function in the core into parse_phostport() (old behaviour) and parse_phostport_mh() (returns list of MH addresses) and make the core command line parser use the MH supporting version.
---
main.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++------- socket_info.h | 2 +- 2 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/main.c b/main.c index 8d7bc57..23455e7 100644 --- a/main.c +++ b/main.c @@ -963,7 +963,21 @@ error: * returns fills proto, port, host and returns list of addresses on success * (pkg malloc'ed) and 0 on failure */ -struct name_lst* parse_phostport(char* s, char** host, int* hlen, +/** get protocol host and port from a string representation. + * parses [proto:]host[:port] or + * [proto:](host_1, host_2, ... host_n)[:port] + * where proto= udp|tcp|tls|sctp + * @param s - string (like above) + * @param host - will be filled with the host part + * Note: for multi-homing it wil contain all the addresses + * (e.g.: "sctp:(1.2.3.4, 5.6.7.8)" => host="(1.2.3.4, 5.6.7.8)") + * @param hlen - will be filled with the length of the host part. + * @param port - will be filled with the port if present or 0 if it's not. + * @param proto - will be filled with the protocol if present or PROTO_NONE + * if it's not. + * @return fills proto, port, host and returns 0 on success and -1 on failure. + */ +int parse_phostport(char* s, char** host, int* hlen, int* port, int* proto) { char* first; /* first ':' occurrence */ @@ -997,7 +1011,7 @@ struct name_lst* parse_phostport(char* s, char** host, int* hlen, break; } } - if (p==s) return 0; + if (p==s) return -1; if (*(p-1)==':') goto error_colons;
if (first==0){ /* no ':' => only host */ @@ -1030,22 +1044,48 @@ struct name_lst* parse_phostport(char* s, char** host, int* hlen, *hlen=(int)(first-*host); } end: - return parse_name_lst(*host, *hlen); + return 0; error_brackets: LOG(L_ERR, "ERROR: parse_phostport: too many brackets in %s\n", s); - return 0; + return -1; error_colons: LOG(L_ERR, "ERROR: parse_phostport: too many colons in %s\n", s); - return 0; + return -1; error_proto: LOG(L_ERR, "ERROR: parse_phostport: bad protocol in %s\n", s); - return 0; + return -1; error_port: LOG(L_ERR, "ERROR: parse_phostport: bad port number in %s\n", s); + return -1; +} + + + +/** get protocol host, port and MH addresses list from a string representation. + * parses [proto:]host[:port] or + * [proto:](host_1, host_2, ... host_n)[:port] + * where proto= udp|tcp|tls|sctp + * @param s - string (like above) + * @param host - will be filled with the host part + * Note: for multi-homing it wil contain all the addresses + * (e.g.: "sctp:(1.2.3.4, 5.6.7.8)" => host="(1.2.3.4, 5.6.7.8)") + * @param hlen - will be filled with the length of the host part. + * @param port - will be filled with the port if present or 0 if it's not. + * @param proto - will be filled with the protocol if present or PROTO_NONE + * if it's not. + * @return fills proto, port, host and returns list of addresses on success + * (pkg malloc'ed) and 0 on failure + */ +static struct name_lst* parse_phostport_mh(char* s, char** host, int* hlen, + int* port, int* proto) +{ + if (parse_phostport(s, host, hlen, port, proto)==0) + return parse_name_lst(*host, *hlen); return 0; }
+ /** Update \c cfg_file variable to contain full pathname. The function updates * the value of \c cfg_file global variable to contain full absolute pathname * to the main configuration file of SER. The function uses CFG_FILE macro to @@ -1712,7 +1752,7 @@ try_again: } break; case 'l': - if ((n_lst=parse_phostport(optarg, &tmp, &tmp_len, + if ((n_lst=parse_phostport_mh(optarg, &tmp, &tmp_len, &port, &proto))==0){ fprintf(stderr, "bad -l address specifier: %s\n", optarg); diff --git a/socket_info.h b/socket_info.h index 4179869..6da9437 100644 --- a/socket_info.h +++ b/socket_info.h @@ -97,7 +97,7 @@ struct socket_info* find_si(struct ip_addr* ip, unsigned short port,
struct socket_info** get_sock_info_list(unsigned short proto);
-struct name_lst* parse_phostport(char* s, char** host, int* hlen, +int parse_phostport(char* s, char** host, int* hlen, int* port, int* proto);
/* helper function: