/* * Get number and domain from Diversion header * param msg SIP message * param user User part of Diversion header * param userbufsize Size of user buffer * param host Host part of Diversion header * param hostbufsize Size of host buffer * return 0 success, 1 without Diversion, -1 failure */ int ospGetDiversion( struct sip_msg* msg, char* user, int userbufsize, char* host, int hostbufsize) { struct to_body* diversion; struct sip_uri uri; int result = -1; if (((user != NULL) && (userbufsize > 0)) && ((host != NULL) && (hostbufsize > 0))){ user[0] = '\0'; host[0] = '\0'; if (msg->diversion != NULL) { if (parse_diversion_header(msg) == 0) { diversion = get_diversion(msg); if (parse_uri(diversion->uri.s, diversion->uri.len, &uri) == 0) { ospCopyStrToBuffer(&uri.user, user, userbufsize); ospSkipUserParam(user); if (uri.port_no != 0) { snprintf(host, hostbufsize, "%.*s:%d", uri.host.len, uri.host.s, uri.port_no); host[hostbufsize - 1] = '\0'; } else { ospCopyStrToBuffer(&uri.host, host, hostbufsize); } result = 0; } else { LM_ERR("failed to parse Diversion uri\n"); } } else { LM_ERR("failed to parse Diversion header\n"); } } else { LM_DBG("without Diversion header\n"); result = 1; } } else { LM_ERR("bad paraneters to parse number from Diversion\n"); } return result; }
/*! \brief * Get the value of a given diversion parameter */ str *get_diversion_param(struct sip_msg *msg, str* name) { struct to_param *params; if (parse_diversion_header(msg) < 0) { ERR("could not get diversion parameter\n"); return 0; } params = ((struct to_body*)(msg->diversion->parsed))->param_lst; while (params) { if ((params->name.len == name->len) && (strncmp(params->name.s, name->s, name->len) == 0)) { return ¶ms->value; } params = params->next; } return 0; }