Ejemplo n.º 1
0
/*
 * 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;
}
Ejemplo n.º 2
0
/*! \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 &params->value;
		}
		params = params->next;
    }
	
    return 0;
}