buf= pointer to beginning of uri (sip:x@foo.bar:5060;a=b?h=i) * len= len of uri * returns: fills uri & returns <0 on error or 0 if ok */
| 305 | * returns: fills uri & returns <0 on error or 0 if ok |
| 306 | */ |
| 307 | int parse_uri(char* buf, int len, struct sip_uri* uri) |
| 308 | { |
| 309 | enum states { URI_INIT, URI_USER, URI_PASSWORD, URI_PASSWORD_ALPHA, |
| 310 | URI_HOST, URI_HOST_P, |
| 311 | URI_HOST6_P, URI_HOST6_END, URI_PORT, |
| 312 | URI_PARAM, URI_PARAM_P, URI_PARAM_VAL_P, |
| 313 | URI_VAL_P, URI_HEADERS, |
| 314 | /* param states */ |
| 315 | /* transport */ |
| 316 | PT_T, PT_R, PT_A, PT_N, PT_S, PT_P, PT_O, PT_R2, PT_T2, |
| 317 | PT_eq, |
| 318 | /* ttl */ |
| 319 | PTTL_T2, PTTL_L, PTTL_eq, |
| 320 | /* user */ |
| 321 | PU_U, PU_S, PU_E, PU_R, PU_eq, |
| 322 | /* method */ |
| 323 | PM_M, PM_E, PM_T, PM_H, PM_O, PM_D, PM_eq, |
| 324 | /* maddr */ |
| 325 | PMA_A, PMA_D, PMA_D2, PMA_R, PMA_eq, |
| 326 | /* lr */ |
| 327 | PLR_L, PLR_R_FIN, PLR_eq, |
| 328 | /* gr */ |
| 329 | PG_G, PG_G_FIN, PG_eq, |
| 330 | /* r2 */ |
| 331 | PR2_R, PR2_2_FIN, PR2_eq, |
| 332 | /* transport values */ |
| 333 | /* udp */ |
| 334 | VU_U, VU_D, VU_P_FIN, |
| 335 | /* tcp */ |
| 336 | VT_T, VT_C, VT_P_FIN, |
| 337 | /* tls */ |
| 338 | VTLS_L, VTLS_S_FIN, |
| 339 | /* sctp */ |
| 340 | VS_S, VS_C, VS_T, VS_P_FIN, |
| 341 | /* ws */ |
| 342 | VW_W, VW_S, VW_S_FIN, VWS_S_FIN, |
| 343 | |
| 344 | /* pn-{provider, prid, param, purr} (RFC 8599 - SIP PN) */ |
| 345 | PN_P, PN_N, PN_dash, PN_P2, PN_PR, |
| 346 | PN1_O, PN1_V, PN1_I, PN1_D, PN1_E, PN1_FIN, PN1_eq, |
| 347 | PN2_I, PN2_D, PN2_eq, |
| 348 | PN3_A, PN3_R, PN3_A2, PN3_M, PN3_eq, |
| 349 | PN4_U, PN4_R, PN4_R2, PN4_eq, |
| 350 | |
| 351 | }; |
| 352 | register enum states state; |
| 353 | char* s; |
| 354 | char* b; /* param start */ |
| 355 | char *v; /* value start */ |
| 356 | str* param; /* current param */ |
| 357 | str* param_val; /* current param val */ |
| 358 | str user; |
| 359 | str password; |
| 360 | unsigned int port_no; |
| 361 | register char* p; |
| 362 | char* end; |
| 363 | char* pass; |
| 364 | int found_user; |
no outgoing calls