int osip_body_clone (const osip_body_t * body, osip_body_t ** dest) { int pos; int i; osip_body_t *copy; if (body == NULL || body->length<=0) return -1; i = osip_body_init (©); if (i != 0) return -1; copy->body = (char*)osip_malloc(body->length+2); copy->length = body->length; memcpy(copy->body,body->body,body->length); copy->body[body->length]='\0'; if (body->content_type != NULL) { i = osip_content_type_clone (body->content_type, &(copy->content_type)); if (i != 0) goto bc_error1; } { osip_header_t *header; osip_header_t *header2; pos = 0; while (!osip_list_eol (body->headers, pos)) { header = (osip_header_t *) osip_list_get (body->headers, pos); i = osip_header_clone (header, &header2); if (i != 0) goto bc_error1; osip_list_add (copy->headers, header2, -1); /* insert as last element */ pos++; } } *dest = copy; return 0; bc_error1: osip_body_free (copy); return -1; }
int _eXosip_build_response_default (osip_message_t ** dest, osip_dialog_t * dialog, int status, osip_message_t * request) { osip_generic_param_t *tag; osip_message_t *response; int pos; int i; *dest = NULL; if (request == NULL) return -1; i = osip_message_init (&response); if (i != 0) return -1; /* initialise osip_message_t structure */ /* yet done... */ response->sip_version = (char *) osip_malloc (8 * sizeof (char)); sprintf (response->sip_version, "SIP/2.0"); osip_message_set_status_code (response, status); /* handle some internal reason definitions. */ if (MSG_IS_NOTIFY (request) && status == 481) { response->reason_phrase = osip_strdup ("Subcription Does Not Exist"); } else if (MSG_IS_SUBSCRIBE (request) && status == 202) { response->reason_phrase = osip_strdup ("Accepted subscription"); } else { response->reason_phrase = osip_strdup (osip_message_get_reason (status)); if (response->reason_phrase == NULL) { if (response->status_code == 101) response->reason_phrase = osip_strdup ("Dialog Establishement"); else response->reason_phrase = osip_strdup ("Unknown code"); } response->req_uri = NULL; response->sip_method = NULL; } i = osip_to_clone (request->to, &(response->to)); if (i != 0) goto grd_error_1; i = osip_to_get_tag (response->to, &tag); if (i != 0) { /* we only add a tag if it does not already contains one! */ if ((dialog != NULL) && (dialog->local_tag != NULL)) /* it should contain the local TAG we created */ { osip_to_set_tag (response->to, osip_strdup (dialog->local_tag)); } else { if (status != 100) osip_to_set_tag (response->to, osip_to_tag_new_random ()); } } i = osip_from_clone (request->from, &(response->from)); if (i != 0) goto grd_error_1; pos = 0; while (!osip_list_eol (request->vias, pos)) { osip_via_t *via; osip_via_t *via2; via = (osip_via_t *) osip_list_get (request->vias, pos); i = osip_via_clone (via, &via2); if (i != -0) goto grd_error_1; osip_list_add (response->vias, via2, -1); pos++; } i = osip_call_id_clone (request->call_id, &(response->call_id)); if (i != 0) goto grd_error_1; i = osip_cseq_clone (request->cseq, &(response->cseq)); if (i != 0) goto grd_error_1; if (MSG_IS_SUBSCRIBE (request)) { osip_header_t *exp; osip_header_t *evt_hdr; osip_message_header_get_byname (request, "event", 0, &evt_hdr); if (evt_hdr != NULL && evt_hdr->hvalue != NULL) osip_message_set_header (response, "Event", evt_hdr->hvalue); else osip_message_set_header (response, "Event", "presence"); i = osip_message_get_expires (request, 0, &exp); if (exp == NULL) { osip_header_t *cp; i = osip_header_clone (exp, &cp); if (cp != NULL) osip_list_add (response->headers, cp, 0); } } osip_message_set_allow (response, "INVITE"); osip_message_set_allow (response, "ACK"); osip_message_set_allow (response, "OPTIONS"); osip_message_set_allow (response, "CANCEL"); osip_message_set_allow (response, "BYE"); osip_message_set_allow (response, "SUBSCRIBE"); osip_message_set_allow (response, "NOTIFY"); osip_message_set_allow (response, "MESSAGE"); osip_message_set_allow (response, "INFO"); osip_message_set_allow (response, "REFER"); osip_message_set_allow (response, "UPDATE"); *dest = response; return 0; grd_error_1: osip_message_free (response); return -1; }
int _eXosip_call_retry_request (eXosip_call_t * jc, eXosip_dialog_t * jd, osip_transaction_t * out_tr) { osip_transaction_t *tr = NULL; osip_message_t *msg = NULL; osip_event_t *sipevent; int cseq; osip_via_t *via; osip_contact_t *co; int pos; int i; int protocol = IPPROTO_UDP; if (jc == NULL) return OSIP_BADPARAMETER; if (jd != NULL) { if (jd->d_out_trs == NULL) return OSIP_BADPARAMETER; } if (out_tr == NULL || out_tr->orig_request == NULL || out_tr->last_response == NULL) return OSIP_BADPARAMETER; i = osip_message_clone (out_tr->orig_request, &msg); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: could not clone msg for authentication\n")); return i; } via = (osip_via_t *) osip_list_get (&msg->vias, 0); if (via == NULL || msg->cseq == NULL || msg->cseq->number == NULL) { osip_message_free (msg); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: missing via or cseq header\n")); return OSIP_SYNTAXERROR; } if (MSG_IS_STATUS_3XX (out_tr->last_response)) { co = NULL; pos = 0; while (!osip_list_eol (&out_tr->last_response->contacts, pos)) { co = (osip_contact_t *) osip_list_get (&out_tr->last_response->contacts, pos); if (co != NULL && co->url != NULL) { /* check tranport? Only allow UDP, right now */ osip_uri_param_t *u_param; int pos2; u_param = NULL; pos2 = 0; while (!osip_list_eol (&co->url->url_params, pos2)) { u_param = (osip_uri_param_t *) osip_list_get (&co->url->url_params, pos2); if (u_param == NULL || u_param->gname == NULL || u_param->gvalue == NULL) { u_param = NULL; /* skip */ } else if (0 == osip_strcasecmp (u_param->gname, "transport")) { if (0 == osip_strcasecmp (u_param->gvalue, "udp")) { u_param = NULL; protocol = IPPROTO_UDP; break; /* ok */ } else if (0 == osip_strcasecmp (u_param->gvalue, "tcp")) { protocol = IPPROTO_TCP; u_param = NULL; } break; } pos2++; } if (u_param == NULL || u_param->gname == NULL || u_param->gvalue == NULL) { break; /* default is udp! */ } } pos++; co = NULL; } if (co == NULL || co->url == NULL) { osip_message_free (msg); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: contact header\n")); return OSIP_SYNTAXERROR; } /* TODO: remove extra parameter from new request-uri check usual parameter like "transport" */ if (msg->req_uri != NULL && msg->req_uri->host != NULL && co->url->host != NULL && 0 == osip_strcasecmp (co->url->host, msg->req_uri->host)) { osip_uri_param_t *maddr_param = NULL; osip_uri_uparam_get_byname (co->url, "maddr", &maddr_param); if (maddr_param != NULL && maddr_param->gvalue != NULL) { /* This is a redirect server, the route should probably be removed? */ osip_route_t *route = NULL; osip_generic_param_t *tag = NULL; osip_message_get_route (msg, 0, &route); if (route != NULL) { osip_to_get_tag (msg->to, &tag); if (tag == NULL && route != NULL && route->url != NULL) { osip_list_remove (&msg->routes, 0); osip_route_free (route); } } } } /* replace request-uri with NEW contact address */ osip_uri_free (msg->req_uri); msg->req_uri = NULL; osip_uri_clone (co->url, &msg->req_uri); /* support for diversions headers/draft! */ { int count = 0; pos = 0; while (!osip_list_eol (&out_tr->last_response->headers, pos)) { osip_header_t *copy = NULL; osip_header_t *head = osip_list_get (&out_tr->last_response->headers, pos); if (head != NULL && 0 == osip_strcasecmp (head->hname, "diversion")) { i = osip_header_clone (head, ©); if (i == 0) { osip_list_add (&msg->headers, copy, count); count++; } } pos++; } } } /* remove all previous authentication headers */ osip_list_special_free (&msg->authorizations, (void *(*)(void *)) &osip_authorization_free); osip_list_special_free (&msg->proxy_authorizations, (void *(*)(void *)) &osip_proxy_authorization_free); /* increment cseq */ cseq = atoi (msg->cseq->number); osip_free (msg->cseq->number); msg->cseq->number = strdup_printf ("%i", cseq + 1); if (jd != NULL && jd->d_dialog != NULL) { jd->d_dialog->local_cseq++; } i = eXosip_update_top_via (msg); if (i != 0) { osip_message_free (msg); return i; } if (out_tr->last_response->status_code == 401 || out_tr->last_response->status_code == 407) eXosip_add_authentication_information (msg, out_tr->last_response); else eXosip_add_authentication_information (msg, NULL); osip_message_force_update (msg); if (0 != osip_strcasecmp (msg->sip_method, "INVITE")) { i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, msg); } else { i = _eXosip_transaction_init (&tr, ICT, eXosip.j_osip, msg); } if (i != 0) { osip_message_free (msg); return i; } if (out_tr == jc->c_out_tr) { /* replace with the new tr */ osip_list_add (&eXosip.j_transactions, jc->c_out_tr, 0); jc->c_out_tr = tr; /* fix dialog issue */ if (jd != NULL) { REMOVE_ELEMENT (jc->c_dialogs, jd); eXosip_dialog_free (jd); jd = NULL; } } else { /* add the new tr for the current dialog */ osip_list_add (jd->d_out_trs, tr, 0); } sipevent = osip_new_outgoing_sipmessage (msg); #ifndef MINISIZE osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (jc, jd, NULL, NULL)); #else osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (jc, jd)); #endif osip_transaction_add_event (tr, sipevent); eXosip_update (); /* fixed? */ __eXosip_wakeup (); return OSIP_SUCCESS; }
int _eXosip_subscribe_automatic_refresh (struct eXosip_t *excontext, eXosip_subscribe_t * js, eXosip_dialog_t * jd, osip_transaction_t * out_tr) { osip_message_t *sub = NULL; osip_header_t *expires; int i; if (js == NULL || jd == NULL || out_tr == NULL || out_tr->orig_request == NULL) return OSIP_BADPARAMETER; i = eXosip_subscribe_build_refresh_request (excontext, jd->d_id, &sub); if (i != 0) return i; i = osip_message_get_expires (out_tr->orig_request, 0, &expires); if (expires != NULL && expires->hvalue != NULL) { osip_message_set_expires (sub, expires->hvalue); } { int pos = 0; osip_accept_t *_accept = NULL; i = osip_message_get_accept (out_tr->orig_request, pos, &_accept); while (i >= 0 && _accept != NULL) { osip_accept_t *_accept2; i = osip_accept_clone (_accept, &_accept2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Accept header\n")); break; } osip_list_add (&sub->accepts, _accept2, -1); _accept = NULL; pos++; i = osip_message_get_accept (out_tr->orig_request, pos, &_accept); } } { int pos = 0; osip_header_t *_event = NULL; pos = osip_message_header_get_byname (out_tr->orig_request, "Event", 0, &_event); while (pos >= 0 && _event != NULL) { osip_header_t *_event2; i = osip_header_clone (_event, &_event2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Event header\n")); break; } osip_list_add (&sub->headers, _event2, -1); _event = NULL; pos++; pos = osip_message_header_get_byname (out_tr->orig_request, "Event", pos, &_event); } } i = eXosip_subscribe_send_refresh_request (excontext, jd->d_id, sub); return i; }
int eXosip_subscribe_build_refresh_request (struct eXosip_t *excontext, int did, osip_message_t ** sub) { eXosip_dialog_t *jd = NULL; eXosip_subscribe_t *js = NULL; osip_transaction_t *transaction; char *transport; int i; *sub = NULL; if (did <= 0) return OSIP_BADPARAMETER; if (did > 0) { _eXosip_subscribe_dialog_find (excontext, did, &js, &jd); } if (jd == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No subscribe here?\n")); return OSIP_NOTFOUND; } transaction = NULL; transaction = _eXosip_find_last_out_subscribe (js, jd); if (transaction != NULL) { if (transaction->state != NICT_TERMINATED && transaction->state != NIST_TERMINATED && transaction->state != NICT_COMPLETED && transaction->state != NIST_COMPLETED) return OSIP_WRONG_STATE; } transport = NULL; if (transaction != NULL && transaction->orig_request != NULL) transport = _eXosip_transport_protocol (transaction->orig_request); if (transport == NULL) i = _eXosip_build_request_within_dialog (excontext, sub, "SUBSCRIBE", jd->d_dialog, "UDP"); else i = _eXosip_build_request_within_dialog (excontext, sub, "SUBSCRIBE", jd->d_dialog, transport); if (i != 0) return i; if (transaction != NULL && transaction->orig_request != NULL) { int pos = 0; osip_header_t *_header = NULL; osip_call_info_t *_call_info_header = NULL; pos = osip_message_get_supported (transaction->orig_request, pos, &_header); while (pos >= 0 && _header != NULL) { osip_header_t *_header2; i = osip_header_clone (_header, &_header2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Supported header\n")); break; } osip_list_add (&(*sub)->headers, _header2, -1); _header = NULL; pos++; pos = osip_message_get_supported (transaction->orig_request, pos, &_header); } pos = 0; pos = osip_message_get_call_info (transaction->orig_request, pos, &_call_info_header); while (pos >= 0 && _call_info_header != NULL) { osip_call_info_t *_header2; i = osip_call_info_clone (_call_info_header, &_header2); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Error in Call-Info header\n")); break; } osip_list_add (&(*sub)->call_infos, _header2, -1); _call_info_header = NULL; pos++; pos = osip_message_get_call_info (transaction->orig_request, pos, &_call_info_header); } } _eXosip_add_authentication_information (excontext, *sub, NULL); return OSIP_SUCCESS; }
int _eXosip_build_response_default (struct eXosip_t *excontext, osip_message_t ** dest, osip_dialog_t * dialog, int status, osip_message_t * request) { osip_generic_param_t *tag; osip_message_t *response; int i; *dest = NULL; if (request == NULL) return OSIP_BADPARAMETER; i = osip_message_init (&response); if (i != 0) return i; /* initialise osip_message_t structure */ /* yet done... */ response->sip_version = (char *) osip_malloc (8 * sizeof (char)); if (response->sip_version == NULL) { osip_message_free (response); return OSIP_NOMEM; } sprintf (response->sip_version, "SIP/2.0"); osip_message_set_status_code (response, status); #ifndef MINISIZE /* handle some internal reason definitions. */ if (MSG_IS_NOTIFY (request) && status == 481) { response->reason_phrase = osip_strdup ("Subscription Does Not Exist"); } else if (MSG_IS_SUBSCRIBE (request) && status == 202) { response->reason_phrase = osip_strdup ("Accepted subscription"); } else { response->reason_phrase = osip_strdup (osip_message_get_reason (status)); if (response->reason_phrase == NULL) { if (response->status_code == 101) response->reason_phrase = osip_strdup ("Dialog Establishement"); else response->reason_phrase = osip_strdup ("Unknown code"); } response->req_uri = NULL; response->sip_method = NULL; } #else response->reason_phrase = osip_strdup (osip_message_get_reason (status)); if (response->reason_phrase == NULL) { if (response->status_code == 101) response->reason_phrase = osip_strdup ("Dialog Establishement"); else response->reason_phrase = osip_strdup ("Unknown code"); } response->req_uri = NULL; response->sip_method = NULL; #endif if (response->reason_phrase == NULL) { osip_message_free (response); return OSIP_NOMEM; } i = osip_to_clone (request->to, &(response->to)); if (i != 0) { osip_message_free (response); return i; } i = osip_to_get_tag (response->to, &tag); if (i != 0) { /* we only add a tag if it does not already contains one! */ if ((dialog != NULL) && (dialog->local_tag != NULL)) /* it should contain the local TAG we created */ { osip_to_set_tag (response->to, osip_strdup (dialog->local_tag)); } else { if (status != 100) osip_to_set_tag (response->to, _eXosip_malloc_new_random ()); } } i = osip_from_clone (request->from, &(response->from)); if (i != 0) { osip_message_free (response); return i; } { osip_list_iterator_t it; osip_via_t *via = (osip_via_t*)osip_list_get_first(&request->vias, &it); while (via != NULL) { osip_via_t *via2; i = osip_via_clone (via, &via2); if (i != 0) { osip_message_free (response); return i; } osip_list_add (&response->vias, via2, -1); via = (osip_via_t *)osip_list_get_next(&it); } } i = osip_call_id_clone (request->call_id, &(response->call_id)); if (i != 0) { osip_message_free (response); return i; } i = osip_cseq_clone (request->cseq, &(response->cseq)); if (i != 0) { osip_message_free (response); return i; } #ifndef MINISIZE if (MSG_IS_SUBSCRIBE (request)) { osip_header_t *exp; osip_header_t *evt_hdr; osip_message_header_get_byname (request, "event", 0, &evt_hdr); if (evt_hdr != NULL && evt_hdr->hvalue != NULL) osip_message_set_header (response, "Event", evt_hdr->hvalue); else osip_message_set_header (response, "Event", "presence"); i = osip_message_get_expires (request, 0, &exp); if (exp == NULL) { osip_header_t *cp; i = osip_header_clone (exp, &cp); if (cp != NULL) osip_list_add (&response->headers, cp, 0); } } #endif osip_message_set_user_agent (response, excontext->user_agent); *dest = response; return OSIP_SUCCESS; }
int osip_message_clone (const osip_message_t * sip, osip_message_t ** dest) { osip_message_t *copy; int pos = 0; int i; if (sip == NULL) return -1; *dest = NULL; i = osip_message_init (©); if (i != 0) return -1; copy->sip_method = osip_strdup (sip->sip_method); copy->sip_version = osip_strdup (sip->sip_version); copy->status_code = sip->status_code; copy->reason_phrase = osip_strdup (sip->reason_phrase); if (sip->req_uri != NULL) { i = osip_uri_clone (sip->req_uri, &(copy->req_uri)); if (i != 0) goto mc_error1; } { osip_accept_t *accept; osip_accept_t *accept2; pos = 0; while (!osip_list_eol (&sip->accepts, pos)) { accept = (osip_accept_t *) osip_list_get (&sip->accepts, pos); i = osip_accept_clone (accept, &accept2); if (i != 0) goto mc_error1; osip_list_add (©->accepts, accept2, -1); /* insert as last element */ pos++; } } { osip_accept_encoding_t *accept_encoding; osip_accept_encoding_t *accept_encoding2; pos = 0; while (!osip_list_eol (&sip->accept_encodings, pos)) { accept_encoding = (osip_accept_encoding_t *) osip_list_get (&sip->accept_encodings, pos); i = osip_accept_encoding_clone (accept_encoding, &accept_encoding2); if (i != 0) goto mc_error1; osip_list_add (©->accept_encodings, accept_encoding2, -1); pos++; } } { osip_accept_language_t *accept_language; osip_accept_language_t *accept_language2; pos = 0; while (!osip_list_eol (&sip->accept_languages, pos)) { accept_language = (osip_accept_language_t *) osip_list_get (&sip->accept_languages, pos); i = osip_accept_language_clone (accept_language, &accept_language2); if (i != 0) goto mc_error1; osip_list_add (©->accept_languages, accept_language2, -1); pos++; } } { osip_alert_info_t *alert_info; osip_alert_info_t *alert_info2; pos = 0; while (!osip_list_eol (&sip->alert_infos, pos)) { alert_info = (osip_alert_info_t *) osip_list_get (&sip->alert_infos, pos); i = osip_alert_info_clone (alert_info, &alert_info2); if (i != 0) goto mc_error1; osip_list_add (©->alert_infos, alert_info2, -1); pos++; } } { osip_allow_t *allow; osip_allow_t *allow2; pos = 0; while (!osip_list_eol (&sip->allows, pos)) { allow = (osip_allow_t *) osip_list_get (&sip->allows, pos); i = osip_allow_clone (allow, &allow2); if (i != 0) goto mc_error1; osip_list_add (©->allows, allow2, -1); pos++; } } { osip_authentication_info_t *authentication_info; osip_authentication_info_t *authentication_info2; pos = 0; while (!osip_list_eol (&sip->authentication_infos, pos)) { authentication_info = (osip_authentication_info_t *) osip_list_get (&sip-> authentication_infos, pos); i = osip_authentication_info_clone (authentication_info, &authentication_info2); if (i != 0) goto mc_error1; osip_list_add (©->authentication_infos, authentication_info2, -1); pos++; } } { osip_authorization_t *authorization; osip_authorization_t *authorization2; pos = 0; while (!osip_list_eol (&sip->authorizations, pos)) { authorization = (osip_authorization_t *) osip_list_get (&sip->authorizations, pos); i = osip_authorization_clone (authorization, &authorization2); if (i != 0) goto mc_error1; osip_list_add (©->authorizations, authorization2, -1); pos++; } } if (sip->call_id != NULL) { i = osip_call_id_clone (sip->call_id, &(copy->call_id)); if (i != 0) goto mc_error1; } { osip_call_info_t *call_info; osip_call_info_t *call_info2; pos = 0; while (!osip_list_eol (&sip->call_infos, pos)) { call_info = (osip_call_info_t *) osip_list_get (&sip->call_infos, pos); i = osip_call_info_clone (call_info, &call_info2); if (i != 0) goto mc_error1; osip_list_add (©->call_infos, call_info2, -1); pos++; } } { osip_contact_t *contact; osip_contact_t *contact2; pos = 0; while (!osip_list_eol (&sip->contacts, pos)) { contact = (osip_contact_t *) osip_list_get (&sip->contacts, pos); i = osip_contact_clone (contact, &contact2); if (i != 0) goto mc_error1; osip_list_add (©->contacts, contact2, -1); pos++; } } { osip_content_encoding_t *content_encoding; osip_content_encoding_t *content_encoding2; pos = 0; while (!osip_list_eol (&sip->content_encodings, pos)) { content_encoding = (osip_content_encoding_t *) osip_list_get (&sip->content_encodings, pos); i = osip_content_encoding_clone (content_encoding, &content_encoding2); if (i != 0) goto mc_error1; osip_list_add (©->content_encodings, content_encoding2, -1); pos++; } } if (sip->content_length != NULL) { i = osip_content_length_clone (sip->content_length, &(copy->content_length)); if (i != 0) goto mc_error1; } if (sip->content_type != NULL) { i = osip_content_type_clone (sip->content_type, &(copy->content_type)); if (i != 0) goto mc_error1; } if (sip->cseq != NULL) { i = osip_cseq_clone (sip->cseq, &(copy->cseq)); if (i != 0) goto mc_error1; } { osip_error_info_t *error_info; osip_error_info_t *error_info2; pos = 0; while (!osip_list_eol (&sip->error_infos, pos)) { error_info = (osip_error_info_t *) osip_list_get (&sip->error_infos, pos); i = osip_error_info_clone (error_info, &error_info2); if (i != 0) goto mc_error1; osip_list_add (©->error_infos, error_info2, -1); pos++; } } if (sip->from != NULL) { i = osip_from_clone (sip->from, &(copy->from)); if (i != 0) goto mc_error1; } if (sip->mime_version != NULL) { i = osip_mime_version_clone (sip->mime_version, &(copy->mime_version)); if (i != 0) goto mc_error1; } { osip_proxy_authenticate_t *proxy_authenticate; osip_proxy_authenticate_t *proxy_authenticate2; pos = 0; while (!osip_list_eol (&sip->proxy_authenticates, pos)) { proxy_authenticate = (osip_proxy_authenticate_t *) osip_list_get (&sip-> proxy_authenticates, pos); i = osip_proxy_authenticate_clone (proxy_authenticate, &proxy_authenticate2); if (i != 0) goto mc_error1; osip_list_add (©->proxy_authenticates, proxy_authenticate2, -1); pos++; } } { osip_proxy_authentication_info_t *proxy_authentication_info; osip_proxy_authentication_info_t *proxy_authentication_info2; pos = 0; while (!osip_list_eol (&sip->proxy_authentication_infos, pos)) { proxy_authentication_info = (osip_proxy_authentication_info_t *) osip_list_get (&sip-> proxy_authentication_infos, pos); i = osip_proxy_authentication_info_clone (proxy_authentication_info, &proxy_authentication_info2); if (i != 0) goto mc_error1; osip_list_add (©->proxy_authentication_infos, proxy_authentication_info2, -1); pos++; } } { osip_proxy_authorization_t *proxy_authorization; osip_proxy_authorization_t *proxy_authorization2; pos = 0; while (!osip_list_eol (&sip->proxy_authorizations, pos)) { proxy_authorization = (osip_proxy_authorization_t *) osip_list_get (&sip-> proxy_authorizations, pos); i = osip_proxy_authorization_clone (proxy_authorization, &proxy_authorization2); if (i != 0) goto mc_error1; osip_list_add (©->proxy_authorizations, proxy_authorization2, -1); pos++; } } { osip_record_route_t *record_route; osip_record_route_t *record_route2; pos = 0; while (!osip_list_eol (&sip->record_routes, pos)) { record_route = (osip_record_route_t *) osip_list_get (&sip->record_routes, pos); i = osip_record_route_clone (record_route, &record_route2); if (i != 0) goto mc_error1; osip_list_add (©->record_routes, record_route2, -1); pos++; } } { osip_route_t *route; osip_route_t *route2; pos = 0; while (!osip_list_eol (&sip->routes, pos)) { route = (osip_route_t *) osip_list_get (&sip->routes, pos); i = osip_route_clone (route, &route2); if (i != 0) goto mc_error1; osip_list_add (©->routes, route2, -1); pos++; } } if (sip->to != NULL) { i = osip_to_clone (sip->to, &(copy->to)); if (i != 0) goto mc_error1; } { osip_via_t *via; osip_via_t *via2; pos = 0; while (!osip_list_eol (&sip->vias, pos)) { via = (osip_via_t *) osip_list_get (&sip->vias, pos); i = osip_via_clone (via, &via2); if (i != 0) goto mc_error1; osip_list_add (©->vias, via2, -1); pos++; } } { osip_www_authenticate_t *www_authenticate; osip_www_authenticate_t *www_authenticate2; pos = 0; while (!osip_list_eol (&sip->www_authenticates, pos)) { www_authenticate = (osip_www_authenticate_t *) osip_list_get (&sip->www_authenticates, pos); i = osip_www_authenticate_clone (www_authenticate, &www_authenticate2); if (i != 0) goto mc_error1; osip_list_add (©->www_authenticates, www_authenticate2, -1); pos++; } } { osip_header_t *header; osip_header_t *header2; pos = 0; while (!osip_list_eol (&sip->headers, pos)) { header = (osip_header_t *) osip_list_get (&sip->headers, pos); i = osip_header_clone (header, &header2); if (i != 0) goto mc_error1; osip_list_add (©->headers, header2, -1); pos++; } } { osip_body_t *body; osip_body_t *body2; pos = 0; while (!osip_list_eol (&sip->bodies, pos)) { body = (osip_body_t *) osip_list_get (&sip->bodies, pos); i = osip_body_clone (body, &body2); if (i != 0) goto mc_error1; osip_list_add (©->bodies, body2, -1); pos++; } } copy->message_length = sip->message_length; copy->message = osip_strdup (sip->message); copy->message_property = sip->message_property; *dest = copy; return 0; mc_error1: osip_message_free (copy); return -1; }