int decode_uri (str uri, char separator, str * result) { char *pos; struct uri_format format; int foo; result->s = NULL; result->len = 0; if ((uri.len <= 0) || (uri.s == NULL)) { LM_ERR("invalid value for uri\n"); return -1; } foo = decode2format (uri, separator, &format); if (foo < 0) { LM_ERR("failed to decode Contact uri .Error code %d\n",foo); return foo - 20; } /* sanity check */ if (format.ip.len <= 0) { LM_ERR("unable to decode host address \n"); return -2;/* should I quit or ignore ? */ } if ((format.password.len > 0) && (format.username.len <= 0)) { LM_ERR("password decoded but no username available\n"); return -3; } /* a complete uri would be sip:username:password@ip:port;transport=protocol goes to * sip:enc_pref#username#password#ip#port#protocol@public_ip */ result->len = format.first + (uri.len - format.second); /* not NULL terminated */ if (format.username.len > 0) result->len += format.username.len + 1; //: or @ if (format.password.len > 0) result->len += format.password.len + 1; //@ /* if (format.ip.len > 0) */ result->len += format.ip.len; if (format.port.len > 0) result->len += 1 + format.port.len; //: if (format.protocol.len > 0) result->len += 1 + 10 + format.protocol.len; //;transport= #ifdef DEBUG fprintf (stdout, "Result size is %d.Original Uri size is %d\n",result->len, uri.len); #endif /* adding one comes from * */ result->s = pkg_malloc (result->len); if (result->s == NULL) { LM_ERR("unable to allocate pkg memory\n"); return -4; } pos = result->s; #ifdef DEBUG fprintf (stdout, "Adding [%d] ->%.*s\n", format.first, format.first,uri.s);fflush (stdout); #endif memcpy (pos, uri.s, format.first); /* till sip: */ pos = pos + format.first; if (format.username.len > 0) { memcpy (pos, format.username.s, format.username.len); pos = pos + format.username.len; if (format.password.len > 0) memcpy (pos, ":", 1); else memcpy (pos, "@", 1); pos = pos + 1; } if (format.password.len > 0) { memcpy (pos, format.password.s, format.password.len); pos = pos + format.password.len; memcpy (pos, "@", 1); pos = pos + 1; } /* if (format.ip.len > 0) */ memcpy (pos, format.ip.s, format.ip.len); pos = pos + format.ip.len; if (format.port.len > 0) { memcpy (pos, ":", 1); pos = pos + 1; memcpy (pos, format.port.s, format.port.len); pos = pos + format.port.len; } if (format.protocol.len > 0) { memcpy (pos, ";transport=", 11); pos = pos + 11; memcpy (pos, format.protocol.s, format.protocol.len); pos = pos + format.protocol.len; } #ifdef DEBUG fprintf (stdout, "Adding2 [%d] ->%.*s\n", uri.len - format.second,uri.len - format.second, uri.s + format.second);fflush (stdout); #endif memcpy (pos, uri.s + format.second, uri.len - format.second); /* till end: */ #ifdef DEBUG fprintf (stdout, "New decoded uri is->[%.*s]\n", result->len,result->s); #endif return 0; }
int decode_uri (str* uri, char separator, str * result, str* dst_uri) { char *pos; struct uri_format format; int foo; result->s = NULL; result->len = 0; if (dst_uri){ dst_uri->s=0; dst_uri->len=0; } if ((uri->len <= 0) || (uri->s == NULL)) { LOG(L_ERR,"ERROR: decode_uri: Invalid value for uri\n"); return -1; } foo = decode2format (uri, separator, &format); if (foo < 0) { LOG(L_ERR,"ERROR: decode_uri: Error decoding Contact uri .Error code %d\n",foo); return foo - 20; } /* sanity check */ if (format.ip.len <= 0) { LOG(L_ERR,"ERROR: decode_uri: Unable to decode host address \n"); return -2;/* should I quit or ignore ? */ } if ((format.password.len > 0) && (format.username.len <= 0)) { LOG(L_ERR,"ERROR: decode_uri: Password decoded but no username available\n"); return -3; } /* a complete uri would be sip:username:password@ip:port;transport=protocol goes to * sip:enc_pref#username#password#ip#port#protocol@public_ip */ result->len = format.first + (uri->len - format.second); /* not NULL terminated */ if (format.username.len > 0) result->len += format.username.len + 1; //: or @ if (format.password.len > 0) result->len += format.password.len + 1; //@ /* if (format.ip.len > 0) */ result->len += format.ip.len; if (format.port.len > 0) result->len += 1 + format.port.len; //: if (format.protocol.len > 0) result->len += 1 + 10 + format.protocol.len; //;transport= /* adding one comes from * */ result->s = pkg_malloc (result->len); if (result->s == NULL) { LOG(L_ERR,"ERROR: decode_contact: Unable to allocate memory\n"); return -4; } pos = result->s; memcpy (pos, uri->s, format.first); /* till sip: */ pos = pos + format.first; if (format.username.len > 0) { memcpy (pos, format.username.s, format.username.len); pos = pos + format.username.len; if (format.password.len > 0) memcpy (pos, ":", 1); else memcpy (pos, "@", 1); pos = pos + 1; } if (format.password.len > 0) { memcpy (pos, format.password.s, format.password.len); pos = pos + format.password.len; memcpy (pos, "@", 1); pos = pos + 1; } /* if (format.ip.len > 0) */ memcpy (pos, format.ip.s, format.ip.len); pos = pos + format.ip.len; if (format.port.len > 0) { memcpy (pos, ":", 1); pos = pos + 1; memcpy (pos, format.port.s, format.port.len); pos = pos + format.port.len; } if (format.protocol.len > 0) { memcpy (pos, ";transport=", 11); pos = pos + 11; memcpy (pos, format.protocol.s, format.protocol.len); pos = pos + format.protocol.len; } memcpy (pos, uri->s + format.second, uri->len - format.second); /* till end: */ /* dst_uri */ if (dst_uri && format.rcv_ip.s){ dst_uri->len=4 /* sip: */ + format.rcv_ip.len; if (format.rcv_port.len){ dst_uri->len+=1 /* : */+format.rcv_port.len; } if (format.rcv_proto.len){ dst_uri->len+=TRANSPORT_PARAM_LEN+format.rcv_proto.len; } dst_uri->s=pkg_malloc(dst_uri->len); if (dst_uri->s==0){ LOG(L_ERR,"ERROR: decode_contact: dst_uri: memory allocation" " failed\n"); dst_uri->len=0; pkg_free(result->s); result->s=0; result->len=0; return -4; } pos=dst_uri->s; memcpy(pos, SIP_SCH, SIP_SCH_LEN); pos+=SIP_SCH_LEN; memcpy(pos, format.rcv_ip.s, format.rcv_ip.len); pos+=format.rcv_ip.len; if (format.rcv_port.len){ *pos=':'; pos++; memcpy(pos, format.rcv_port.s, format.rcv_port.len); pos+=format.rcv_port.len; } if (format.rcv_proto.len){ memcpy(pos, TRANSPORT_PARAM, TRANSPORT_PARAM_LEN); pos+=TRANSPORT_PARAM_LEN; memcpy(pos, format.rcv_proto.s, format.rcv_proto.len); } } return 0; }