diff options
Diffstat (limited to 'channels/sip')
-rw-r--r-- | channels/sip/dialplan_functions.c | 31 | ||||
-rw-r--r-- | channels/sip/include/dialog.h | 2 | ||||
-rw-r--r-- | channels/sip/include/globals.h | 2 | ||||
-rw-r--r-- | channels/sip/include/reqresp_parser.h | 14 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 27 | ||||
-rw-r--r-- | channels/sip/reqresp_parser.c | 244 |
6 files changed, 149 insertions, 171 deletions
diff --git a/channels/sip/dialplan_functions.c b/channels/sip/dialplan_functions.c index d09627ed8..6e1f65b84 100644 --- a/channels/sip/dialplan_functions.c +++ b/channels/sip/dialplan_functions.c @@ -62,9 +62,9 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p } if (!strcasecmp(args.param, "peerip")) { - ast_copy_string(buf, p->sa.sin_addr.s_addr ? ast_inet_ntoa(p->sa.sin_addr) : "", buflen); + ast_copy_string(buf, ast_sockaddr_isnull(&p->sa) ? "" : ast_sockaddr_stringify_addr(&p->sa), buflen); } else if (!strcasecmp(args.param, "recvip")) { - ast_copy_string(buf, p->recv.sin_addr.s_addr ? ast_inet_ntoa(p->recv.sin_addr) : "", buflen); + ast_copy_string(buf, ast_sockaddr_isnull(&p->recv) ? "" : ast_sockaddr_stringify_addr(&p->recv), buflen); } else if (!strcasecmp(args.param, "from")) { ast_copy_string(buf, p->from, buflen); } else if (!strcasecmp(args.param, "uri")) { @@ -76,7 +76,7 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p } else if (!strcasecmp(args.param, "t38passthrough")) { ast_copy_string(buf, (p->t38.state == T38_DISABLED) ? "0" : "1", buflen); } else if (!strcasecmp(args.param, "rtpdest")) { - struct sockaddr_in sin; + struct ast_sockaddr addr; struct ast_rtp_instance *stream; if (ast_strlen_zero(args.type)) @@ -96,10 +96,10 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p return 0; } - ast_rtp_instance_get_remote_address(stream, &sin); - snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + ast_rtp_instance_get_remote_address(stream, &addr); + snprintf(buf, buflen, "%s", ast_sockaddr_stringify(&addr)); } else if (!strcasecmp(args.param, "rtpsource")) { - struct sockaddr_in sin; + struct ast_sockaddr sa; struct ast_rtp_instance *stream; if (ast_strlen_zero(args.type)) @@ -119,15 +119,15 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p return 0; } - ast_rtp_instance_get_local_address(stream, &sin); + ast_rtp_instance_get_local_address(stream, &sa); - if (!sin.sin_addr.s_addr) { - struct sockaddr_in dest_sin; - ast_rtp_instance_get_remote_address(stream, &dest_sin); - ast_ouraddrfor(&dest_sin.sin_addr, &sin.sin_addr); + if (ast_sockaddr_isnull(&sa)) { + struct ast_sockaddr dest_sa; + ast_rtp_instance_get_remote_address(stream, &dest_sa); + ast_ouraddrfor(&dest_sa, &sa); } - snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + snprintf(buf, buflen, "%s", ast_sockaddr_stringify(&sa)); } else if (!strcasecmp(args.param, "rtpqos")) { struct ast_rtp_instance *rtp = NULL; @@ -225,7 +225,7 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p } #ifdef TEST_FRAMEWORK -static int test_sip_rtpqos_1_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct sockaddr_in *sin, void *data) +static int test_sip_rtpqos_1_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct ast_sockaddr *addr, void *data) { /* Needed to pass sanity checks */ ast_rtp_instance_set_data(instance, data); @@ -268,7 +268,7 @@ AST_TEST_DEFINE(test_sip_rtpqos_1) .write = test_sip_rtpqos_1_write, .get_stat = test_sip_rtpqos_1_get_stat, }; - struct sockaddr_in sin = { .sin_port = 31337, .sin_addr = { .s_addr = 4 * 16777216 + 3 * 65536 + 2 * 256 + 1 } }; + struct ast_sockaddr sa = { {0, } }; struct ast_rtp_instance_stats mine = { 0, }; struct sip_pvt *p = NULL; struct ast_channel *chan = NULL; @@ -331,11 +331,12 @@ AST_TEST_DEFINE(test_sip_rtpqos_1) res = AST_TEST_NOT_RUN; goto done; } + if (!(p->rtp = ast_rtp_instance_new("test", sched, &bindaddr, &mine))) { res = AST_TEST_NOT_RUN; goto done; } - ast_rtp_instance_set_remote_address(p->rtp, &sin); + ast_rtp_instance_set_remote_address(p->rtp, &sa); if (!(chan = ast_dummy_channel_alloc())) { res = AST_TEST_NOT_RUN; goto done; diff --git a/channels/sip/include/dialog.h b/channels/sip/include/dialog.h index 8972c02d9..ed31b7774 100644 --- a/channels/sip/include/dialog.h +++ b/channels/sip/include/dialog.h @@ -34,7 +34,7 @@ struct sip_pvt *dialog_ref_debug(struct sip_pvt *p, char *tag, char *file, int line, const char *func); struct sip_pvt *dialog_unref_debug(struct sip_pvt *p, char *tag, char *file, int line, const char *func); -struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *sin, +struct sip_pvt *sip_alloc(ast_string_field callid, struct ast_sockaddr *sin, int useglobal_nat, const int intended_method, struct sip_request *req); void sip_scheddestroy_final(struct sip_pvt *p, int ms); void sip_scheddestroy(struct sip_pvt *p, int ms); diff --git a/channels/sip/include/globals.h b/channels/sip/include/globals.h index 0d7131d87..414d2189b 100644 --- a/channels/sip/include/globals.h +++ b/channels/sip/include/globals.h @@ -24,7 +24,7 @@ #ifndef _SIP_GLOBALS_H #define _SIP_GLOBALS_H -extern struct sockaddr_in bindaddr; /*!< UDP: The address we bind to */ +extern struct ast_sockaddr bindaddr; /*!< UDP: The address we bind to */ extern struct sched_context *sched; /*!< The scheduling context */ /*! \brief Definition of this channel for PBX channel registration */ diff --git a/channels/sip/include/reqresp_parser.h b/channels/sip/include/reqresp_parser.h index 58784a621..d8631c982 100644 --- a/channels/sip/include/reqresp_parser.h +++ b/channels/sip/include/reqresp_parser.h @@ -28,7 +28,7 @@ * \note * - Multiple scheme's can be specified ',' delimited. ex: "sip:,sips:" * - If a component is not requested, do not split around it. This means - * that if we don't have domain, we cannot split name:pass and domain:port. + * that if we don't have domain, we cannot split name:pass. * - It is safe to call with ret_name, pass, domain, port pointing all to * the same place. * - If no secret parameter is provided, ret_name will return with both parts, user:secret @@ -42,7 +42,8 @@ * general form we are expecting is sip:user:password;user-parameters@host:port;uri-parameters?headers * \endverbatim */ -int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass, char **domain, char **port, char **transport); +int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass, + char **domain, char **transport); /*! * \brief parses a URI in to all of its components and any trailing residue @@ -51,7 +52,9 @@ int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass, char * \retval -1 on error. * */ -int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue); +int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, + char **domain, struct uriparams *params, char **headers, + char **residue); /*! * \brief Get caller id name from SIP headers, copy into output buffer @@ -100,7 +103,10 @@ int get_in_brackets_full(char *tmp, char **out, char **residue); * \retval 0 success * \retval -1 failure */ -int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **remander); +int parse_name_andor_addr(char *uri, const char *scheme, char **name, + char **user, char **pass, char **domain, + struct uriparams *params, char **headers, + char **remander); /*! \brief Parse all contact header contacts * \retval 0 success diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index 13527517f..92fa68e82 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -646,7 +646,8 @@ enum sip_tcptls_alert { */ struct sip_proxy { char name[MAXHOSTNAMELEN]; /*!< DNS name of domain/host or IP */ - struct sockaddr_in ip; /*!< Currently used IP address and port */ + struct ast_sockaddr ip; /*!< Currently used IP address and port */ + int port; time_t last_dnsupdate; /*!< When this was resolved */ enum sip_transport transport; int force; /*!< If it's an outbound proxy, Force use of this outbound proxy for all outbound requests */ @@ -702,6 +703,7 @@ struct sip_settings { char default_subscribecontext[AST_MAX_CONTEXT]; struct ast_ha *contact_ha; /*! \brief Global list of addresses dynamic peers are not allowed to use */ format_t capability; /*!< Supported codecs */ + int tcp_enabled; }; /*! \brief The SIP socket definition */ @@ -1008,16 +1010,16 @@ struct sip_pvt { long invite_branch; /*!< The branch used when we sent the initial INVITE */ int64_t sessionversion_remote; /*!< Remote UA's SDP Session Version */ unsigned int portinuri:1; /*!< Non zero if a port has been specified, will also disable srv lookups */ - struct sockaddr_in sa; /*!< Our peer */ - struct sockaddr_in redirip; /*!< Where our RTP should be going if not to us */ - struct sockaddr_in vredirip; /*!< Where our Video RTP should be going if not to us */ - struct sockaddr_in tredirip; /*!< Where our Text RTP should be going if not to us */ + struct ast_sockaddr sa; /*!< Our peer */ + struct ast_sockaddr redirip; /*!< Where our RTP should be going if not to us */ + struct ast_sockaddr vredirip; /*!< Where our Video RTP should be going if not to us */ + struct ast_sockaddr tredirip; /*!< Where our Text RTP should be going if not to us */ time_t lastrtprx; /*!< Last RTP received */ time_t lastrtptx; /*!< Last RTP sent */ int rtptimeout; /*!< RTP timeout time */ struct ast_ha *directmediaha; /*!< Which IPs are allowed to interchange direct media with this peer - copied from sip_peer */ - struct sockaddr_in recv; /*!< Received as */ - struct sockaddr_in ourip; /*!< Our IP (as seen from the outside) */ + struct ast_sockaddr recv; /*!< Received as */ + struct ast_sockaddr ourip; /*!< Our IP (as seen from the outside) */ enum transfermodes allowtransfer; /*!< REFER: restriction scheme */ struct ast_channel *owner; /*!< Who owns us (if we have an owner) */ struct sip_route *route; /*!< Head of linked list of routing steps (fm Record-Route) */ @@ -1209,7 +1211,7 @@ struct sip_peer { ast_group_t pickupgroup; /*!< Pickup group */ struct sip_proxy *outboundproxy;/*!< Outbound proxy for this peer */ struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */ - struct sockaddr_in addr; /*!< IP address of peer */ + struct ast_sockaddr addr; /*!< IP address of peer */ unsigned int portinuri:1; /*!< Whether the port should be included in the URI */ struct sip_pvt *call; /*!< Call pointer */ int pokeexpire; /*!< Qualification: When to expire poke (qualify= checking) */ @@ -1217,7 +1219,7 @@ struct sip_peer { int maxms; /*!< Qualification: Max ms we will accept for the host to be up, 0 to not monitor */ int qualifyfreq; /*!< Qualification: Qualification: How often to check for the host to be up */ struct timeval ps; /*!< Qualification: Time for sending SIP OPTION in sip_pke_peer() */ - struct sockaddr_in defaddr; /*!< Default IP address, used until registration */ + struct ast_sockaddr defaddr; /*!< Default IP address, used until registration */ struct ast_ha *ha; /*!< Access control list */ struct ast_ha *contactha; /*!< Restrict what IPs are allowed in the Contact header (for registration) */ struct ast_ha *directmediaha; /*!< Restrict what IPs are allowed to interchange direct media with */ @@ -1281,7 +1283,7 @@ struct sip_registry { int callid_valid; /*!< 0 means we haven't chosen callid for this registry yet. */ unsigned int ocseq; /*!< Sequence number we got to for REGISTERs for this registry */ struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager for register */ - struct sockaddr_in us; /*!< Who the server thinks we are */ + struct ast_sockaddr us; /*!< Who the server thinks we are */ int noncecount; /*!< Nonce-count */ char lastmsg[256]; /*!< Last Message sent/received */ }; @@ -1321,7 +1323,7 @@ struct sip_subscription_mwi { unsigned int subscribed:1; /*!< Whether we are currently subscribed or not */ struct sip_pvt *call; /*!< Outbound subscription dialog */ struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager for subscription */ - struct sockaddr_in us; /*!< Who the server thinks we are */ + struct ast_sockaddr us; /*!< Who the server thinks we are */ }; /*! @@ -1697,8 +1699,7 @@ struct contact { char *name; char *user; char *pass; - char *host; - char *port; + char *domain; struct uriparams params; char *headers; char *expires; diff --git a/channels/sip/reqresp_parser.c b/channels/sip/reqresp_parser.c index bf35bc226..59cefaa46 100644 --- a/channels/sip/reqresp_parser.c +++ b/channels/sip/reqresp_parser.c @@ -28,7 +28,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "include/reqresp_parser.h" /*! \brief * parses a URI in its components.*/ -int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue) +int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, + char **domain, struct uriparams *params, char **headers, + char **residue) { char *userinfo = NULL; char *parameters = NULL; @@ -58,31 +60,24 @@ int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char } } - if (!host) { - /* if we don't want to split around host, keep everything as a userinfo - cos thats how old parse_uri operated*/ + if (!domain) { + /* if we don't want to split around domain, keep everything as a + * userinfo - cos thats how old parse_uri operated*/ userinfo = uri; } else { - char *hostport; + char *dom = ""; if ((c = strchr(uri, '@'))) { *c++ = '\0'; - hostport = c; + dom = c; userinfo = uri; - uri = hostport; /* userinfo can contain ? and ; chars so step forward before looking for params and headers */ + uri = c; /* userinfo can contain ? and ; chars so step forward before looking for params and headers */ } else { /* domain-only URI, according to the SIP RFC. */ - hostport = uri; + dom = uri; userinfo = ""; } - if (port && (c = strchr(hostport, ':'))) { /* Remove :port */ - *c++ = '\0'; - *port = c; - uri = c; - } else if (port) { - *port = ""; - } - - *host = hostport; + *domain = dom; } if (pass && (c = strchr(userinfo, ':'))) { /* user:password */ @@ -201,7 +196,7 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) { int res = AST_TEST_PASS; char uri[1024]; - char *user, *pass, *host, *port, *headers, *residue; + char *user, *pass, *domain, *headers, *residue; struct uriparams params; struct testdata { @@ -209,15 +204,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) char *uri; char **userptr; char **passptr; - char **hostptr; - char **portptr; + char **domainptr; char **headersptr; char **residueptr; struct uriparams *paramsptr; char *user; char *pass; - char *host; - char *port; + char *domain; char *headers; char *residue; struct uriparams params; @@ -234,17 +227,15 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;param=discard;transport=tcp;param2=residue", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", - .residue = "param2=residue", + .residue = "param2=residue", .params.transport = "tcp", .params.lr = 0, .params.user = "" @@ -255,15 +246,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;param=discard;transport=tcp;param2=discard2?header=blah&header2=blah2;param3=residue", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "header=blah&header2=blah2", .residue = "param3=residue", .params.transport = "tcp", @@ -276,15 +265,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:-_.!~*'()&=+$,;?/:secret@host:5060;transport=tcp", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "-_.!~*'()&=+$,;?/", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "", .params.transport = "tcp", @@ -297,15 +284,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:-_.!~*'()&=+$,@host:5060;transport=tcp", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "-_.!~*'()&=+$,", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "", .params.transport = "tcp", @@ -318,15 +303,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@1-1.a-1.:5060;transport=tcp", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "1-1.a-1.", - .port = "5060", + .domain = "1-1.a-1.:5060", .headers = "", .residue = "", .params.transport = "tcp", @@ -339,15 +322,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;-_.!~*'()[]/:&+$=-_.!~*'()[]/:&+$;transport=tcp", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "", .params.transport = "tcp", @@ -360,15 +341,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;-_.!~*'()[]/:&+$=-_.!~*'()[]/:&+$?header=blah&header2=blah2;-_.!~*'()[]/:&+$=residue", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "header=blah&header2=blah2", .residue = "-_.!~*'()[]/:&+$=residue", .params.transport = "", @@ -381,15 +360,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;param=discard;lr?header=blah", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "header=blah", .residue = "", .params.transport = "", @@ -402,15 +379,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;param=discard;lr=yes?header=blah", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "header=blah", .residue = "", .params.transport = "", @@ -423,15 +398,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) .uri = "sip:user:secret@host:5060;paramlr=lr;lr=no;lr=off;lr=0;lr=;=lr;lrextra;lrparam2=lr?header=blah", .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "header=blah", .residue = "", .params.transport = "", @@ -466,16 +439,19 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) } AST_LIST_TRAVERSE(&testdatalist, testdataptr, list) { - user = pass = host = port = headers = residue = NULL; + user = pass = domain = headers = residue = NULL; params.transport = params.user = params.method = params.ttl = params.maddr = NULL; params.lr = 0; ast_copy_string(uri,testdataptr->uri,sizeof(uri)); - if (parse_uri_full(uri, "sip:,sips:", testdataptr->userptr, testdataptr->passptr, testdataptr->hostptr, testdataptr->portptr, testdataptr->paramsptr, testdataptr->headersptr, testdataptr->residueptr) || + if (parse_uri_full(uri, "sip:,sips:", testdataptr->userptr, + testdataptr->passptr, testdataptr->domainptr, + testdataptr->paramsptr, + testdataptr->headersptr, + testdataptr->residueptr) || ((testdataptr->userptr) && strcmp(testdataptr->user, user)) || ((testdataptr->passptr) && strcmp(testdataptr->pass, pass)) || - ((testdataptr->hostptr) && strcmp(testdataptr->host, host)) || - ((testdataptr->portptr) && strcmp(testdataptr->port, port)) || + ((testdataptr->domainptr) && strcmp(testdataptr->domain, domain)) || ((testdataptr->headersptr) && strcmp(testdataptr->headers, headers)) || ((testdataptr->residueptr) && strcmp(testdataptr->residue, residue)) || ((testdataptr->paramsptr) && strcmp(testdataptr->params.transport,params.transport)) || @@ -492,13 +468,14 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test) } -int parse_uri(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, char **transport) { +int parse_uri(char *uri, const char *scheme, char **user, char **pass, + char **domain, char **transport) { int ret; char *headers; struct uriparams params; headers = NULL; - ret = parse_uri_full(uri, scheme, user, pass, host, port, ¶ms, &headers, NULL); + ret = parse_uri_full(uri, scheme, user, pass, domain, ¶ms, &headers, NULL); if (transport) { *transport=params.transport; } @@ -508,7 +485,7 @@ int parse_uri(char *uri, const char *scheme, char **user, char **pass, char **ho AST_TEST_DEFINE(sip_parse_uri_test) { int res = AST_TEST_PASS; - char *name, *pass, *domain, *port, *transport; + char *name, *pass, *domain, *transport; char uri1[] = "sip:name@host"; char uri2[] = "sip:name@host;transport=tcp"; char uri3[] = "sip:name:secret@host;transport=tcp"; @@ -535,70 +512,66 @@ AST_TEST_DEFINE(sip_parse_uri_test) } /* Test 1, simple URI */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri1, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri1, "sip:,sips:", &name, &pass, &domain, &transport) || strcmp(name, "name") || !ast_strlen_zero(pass) || strcmp(domain, "host") || - !ast_strlen_zero(port) || !ast_strlen_zero(transport)) { ast_test_status_update(test, "Test 1: simple uri failed. \n"); res = AST_TEST_FAIL; } /* Test 2, add tcp transport */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri2, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri2, "sip:,sips:", &name, &pass, &domain, &transport) || strcmp(name, "name") || !ast_strlen_zero(pass) || strcmp(domain, "host") || - !ast_strlen_zero(port) || strcmp(transport, "tcp")) { ast_test_status_update(test, "Test 2: uri with addtion of tcp transport failed. \n"); res = AST_TEST_FAIL; } /* Test 3, add secret */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri3, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri3, "sip:,sips:", &name, &pass, &domain, &transport) || strcmp(name, "name") || strcmp(pass, "secret") || strcmp(domain, "host") || - !ast_strlen_zero(port) || strcmp(transport, "tcp")) { ast_test_status_update(test, "Test 3: uri with addition of secret failed.\n"); res = AST_TEST_FAIL; } /* Test 4, add port and unparsed header field*/ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri4, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri4, "sip:,sips:", &name, &pass, &domain, &transport) || strcmp(name, "name") || strcmp(pass, "secret") || - strcmp(domain, "host") || - strcmp(port, "port") || + strcmp(domain, "host:port") || strcmp(transport, "tcp")) { ast_test_status_update(test, "Test 4: add port and unparsed header field failed.\n"); res = AST_TEST_FAIL; } /* Test 5, verify parse_uri does not crash when given a NULL uri */ - name = pass = domain = port = transport = NULL; - if (!parse_uri(NULL, "sip:,sips:", &name, &pass, &domain, &port, &transport)) { + name = pass = domain = transport = NULL; + if (!parse_uri(NULL, "sip:,sips:", &name, &pass, &domain, &transport)) { ast_test_status_update(test, "Test 5: passing a NULL uri failed.\n"); res = AST_TEST_FAIL; } /* Test 6, verify parse_uri does not crash when given a NULL output parameters */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri6, "sip:,sips:", NULL, NULL, NULL, NULL, NULL)) { + name = pass = domain = transport = NULL; + if (parse_uri(uri6, "sip:,sips:", NULL, NULL, NULL, NULL)) { ast_test_status_update(test, "Test 6: passing NULL output parameters failed.\n"); res = AST_TEST_FAIL; } - /* Test 7, verify parse_uri returns user:secret and domain:port when no port or secret output parameters are supplied. */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri7, "sip:,sips:", &name, NULL, &domain, NULL, NULL) || + /* Test 7, verify parse_uri returns user:secret and domain when no port or secret output parameters are supplied. */ + name = pass = domain = transport = NULL; + if (parse_uri(uri7, "sip:,sips:", &name, NULL, &domain, NULL) || strcmp(name, "name:secret") || strcmp(domain, "host:port")) { @@ -607,8 +580,8 @@ AST_TEST_DEFINE(sip_parse_uri_test) } /* Test 8, verify parse_uri can handle a domain only uri */ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri8, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri8, "sip:,sips:", &name, &pass, &domain, &transport) || strcmp(domain, "host") || !ast_strlen_zero(name)) { ast_test_status_update(test, "Test 8: add port and unparsed header field failed.\n"); @@ -616,12 +589,11 @@ AST_TEST_DEFINE(sip_parse_uri_test) } /* Test 9, add port and unparsed header field with domain only uri*/ - name = pass = domain = port = transport = NULL; - if (parse_uri(uri9, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (parse_uri(uri9, "sip:,sips:", &name, &pass, &domain, &transport) || !ast_strlen_zero(name) || !ast_strlen_zero(pass) || strcmp(domain, "host") || - strcmp(port, "port") || strcmp(transport, "tcp")) { ast_test_status_update(test, "Test 9: domain only uri failed \n"); res = AST_TEST_FAIL; @@ -630,12 +602,11 @@ AST_TEST_DEFINE(sip_parse_uri_test) /* Test 10, handle invalid/missing "sip:,sips:" scheme * we expect parse_uri to return an error, but still parse * the results correctly here */ - name = pass = domain = port = transport = NULL; - if (!parse_uri(uri10, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (!parse_uri(uri10, "sip:,sips:", &name, &pass, &domain, &transport) || !ast_strlen_zero(name) || !ast_strlen_zero(pass) || strcmp(domain, "host") || - strcmp(port, "port") || strcmp(transport, "tcp")) { ast_test_status_update(test, "Test 10: missing \"sip:sips:\" scheme failed\n"); res = AST_TEST_FAIL; @@ -644,12 +615,11 @@ AST_TEST_DEFINE(sip_parse_uri_test) /* Test 11, simple domain only URI with missing scheme * we expect parse_uri to return an error, but still parse * the results correctly here */ - name = pass = domain = port = transport = NULL; - if (!parse_uri(uri11, "sip:,sips:", &name, &pass, &domain, &port, &transport) || + name = pass = domain = transport = NULL; + if (!parse_uri(uri11, "sip:,sips:", &name, &pass, &domain, &transport) || !ast_strlen_zero(name) || !ast_strlen_zero(pass) || strcmp(domain, "host") || - !ast_strlen_zero(port) || !ast_strlen_zero(transport)) { ast_test_status_update(test, "Test 11: simple uri with missing scheme failed. \n"); res = AST_TEST_FAIL; @@ -871,7 +841,7 @@ int get_name_and_number(const char *hdr, char **name, char **number) tmp_number = get_in_brackets(header); /* parse out the number here */ - if (parse_uri(tmp_number, "sip:,sips:", &tmp_number, &dummy, &domain, &dummy, NULL) || ast_strlen_zero(tmp_number)) { + if (parse_uri(tmp_number, "sip:,sips:", &tmp_number, &dummy, &domain, NULL) || ast_strlen_zero(tmp_number)) { ast_log(LOG_ERROR, "can not parse name and number from sip header.\n"); return -1; } @@ -1149,7 +1119,10 @@ AST_TEST_DEFINE(get_in_brackets_test) } -int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue) +int parse_name_andor_addr(char *uri, const char *scheme, char **name, + char **user, char **pass, char **domain, + struct uriparams *params, char **headers, + char **residue) { static char buf[1024]; char **residue2=residue; @@ -1164,14 +1137,15 @@ int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **use residue2 = NULL; } - return parse_uri_full(uri, scheme, user, pass, host, port, params, headers, residue2); + return parse_uri_full(uri, scheme, user, pass, domain, params, headers, + residue2); } AST_TEST_DEFINE(parse_name_andor_addr_test) { int res = AST_TEST_PASS; char uri[1024]; - char *name, *user, *pass, *host, *port, *headers, *residue; + char *name, *user, *pass, *domain, *headers, *residue; struct uriparams params; struct testdata { @@ -1180,16 +1154,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) char **nameptr; char **userptr; char **passptr; - char **hostptr; - char **portptr; + char **domainptr; char **headersptr; char **residueptr; struct uriparams *paramsptr; char *name; char *user; char *pass; - char *host; - char *port; + char *domain; char *headers; char *residue; struct uriparams params; @@ -1206,16 +1178,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) .nameptr = &name, .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .name = "name :@ ", .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "tag=tag", .params.transport = "tcp", @@ -1229,16 +1199,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) .nameptr = &name, .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .name = "givenname familyname", .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "expires=3600", .params.transport = "tcp", @@ -1252,16 +1220,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) .nameptr = &name, .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .name = "", .user = "user", .pass = "secret", - .host = "host", - .port = "5060", + .domain = "host:5060", .headers = "", .residue = "q=1", .params.transport = "tcp", @@ -1275,16 +1241,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) .nameptr = &name, .userptr = &user, .passptr = &pass, - .hostptr = &host, - .portptr = &port, + .domainptr = &domain, .headersptr = &headers, .residueptr = &residue, .paramsptr = ¶ms, .name = "", .user = "", .pass = "", - .host = "host", - .port = "", + .domain = "host", .headers = "", .residue = "", .params.transport = "", @@ -1313,16 +1277,22 @@ AST_TEST_DEFINE(parse_name_andor_addr_test) } AST_LIST_TRAVERSE(&testdatalist, testdataptr, list) { - name = user = pass = host = port = headers = residue = NULL; + name = user = pass = domain = headers = residue = NULL; params.transport = params.user = params.method = params.ttl = params.maddr = NULL; params.lr = 0; ast_copy_string(uri,testdataptr->uri,sizeof(uri)); - if (parse_name_andor_addr(uri, "sip:,sips:", testdataptr->nameptr, testdataptr->userptr, testdataptr->passptr, testdataptr->hostptr, testdataptr->portptr, testdataptr->paramsptr, testdataptr->headersptr, testdataptr->residueptr) || + if (parse_name_andor_addr(uri, "sip:,sips:", + testdataptr->nameptr, + testdataptr->userptr, + testdataptr->passptr, + testdataptr->domainptr, + testdataptr->paramsptr, + testdataptr->headersptr, + testdataptr->residueptr) || ((testdataptr->nameptr) && strcmp(testdataptr->name, name)) || ((testdataptr->userptr) && strcmp(testdataptr->user, user)) || ((testdataptr->passptr) && strcmp(testdataptr->pass, pass)) || - ((testdataptr->hostptr) && strcmp(testdataptr->host, host)) || - ((testdataptr->portptr) && strcmp(testdataptr->port, port)) || + ((testdataptr->domainptr) && strcmp(testdataptr->domain, domain)) || ((testdataptr->headersptr) && strcmp(testdataptr->headers, headers)) || ((testdataptr->residueptr) && strcmp(testdataptr->residue, residue)) || ((testdataptr->paramsptr) && strcmp(testdataptr->params.transport,params.transport)) || @@ -1391,7 +1361,11 @@ int parse_contact_header(char *contactheader, struct contactliststruct *contactl AST_LIST_HEAD_SET_NOLOCK(contactlist, contact); while ((last = get_comma(contactheader,&comma)) != -1) { - res = parse_name_andor_addr(contactheader,"sip:,sips:",&contact->name,&contact->user,&contact->pass,&contact->host,&contact->port,&contact->params,&contact->headers,&residue); + res = parse_name_andor_addr(contactheader, "sip:,sips:", + &contact->name, &contact->user, + &contact->pass, &contact->domain, + &contact->params, &contact->headers, + &residue); if (res == -1) { return res; } @@ -1462,8 +1436,7 @@ AST_TEST_DEFINE(parse_contact_header_test) .name = "name :@;?&,", .user = "user", .pass = "secret", - .host = "host", - .port = "5082", + .domain = "host:5082", .params.transport = "tcp", .params.ttl = "", .params.lr = 0, @@ -1482,8 +1455,7 @@ AST_TEST_DEFINE(parse_contact_header_test) .name = "", .user = ",user1,", .pass = ",secret1,", - .host = "host1", - .port = "", + .domain = "host1", .params.transport = "", .params.ttl = "7", .params.lr = 0, @@ -1495,8 +1467,7 @@ AST_TEST_DEFINE(parse_contact_header_test) .name = "", .user = "", .pass = "", - .host = "host2", - .port = "", + .domain = "host2", .params.transport = "", .params.ttl = "", .params.lr = 0, @@ -1552,8 +1523,7 @@ AST_TEST_DEFINE(parse_contact_header_test) strcmp(tdcontactptr->name, contactptr->name) || strcmp(tdcontactptr->user, contactptr->user) || strcmp(tdcontactptr->pass, contactptr->pass) || - strcmp(tdcontactptr->host, contactptr->host) || - strcmp(tdcontactptr->port, contactptr->port) || + strcmp(tdcontactptr->domain, contactptr->domain) || strcmp(tdcontactptr->headers, contactptr->headers) || strcmp(tdcontactptr->expires, contactptr->expires) || strcmp(tdcontactptr->q, contactptr->q) || |