int osip_from_clone (const osip_from_t * from, osip_from_t ** dest) { int i; osip_from_t *fr; *dest = NULL; if (from == NULL) return -1; i = osip_from_init (&fr); if (i != 0) /* allocation failed */ return -1; if (from->displayname != NULL) fr->displayname = osip_strdup (from->displayname); if (from->url != NULL) { i = osip_uri_clone (from->url, &(fr->url)); if (i != 0) { osip_from_free (fr); return -1; } } i = osip_list_clone(&from->gen_params, &fr->gen_params, (int *(*)(void *, void *)) &osip_generic_param_clone); if (i != 0) { osip_from_free (fr); return -1; } *dest = fr; return 0; }
static int sip_login_do_login(SipSetupContext * ctx, const char *uri, const char *passwd){ LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); LinphoneCore *lc=linphone_proxy_config_get_core(cfg); LinphoneAuthInfo *auth; osip_from_t *parsed_uri; char *tmp; osip_from_init(&parsed_uri); osip_from_parse(parsed_uri,uri); if (parsed_uri->displayname==NULL || strlen(parsed_uri->displayname)==0){ guess_display_name(parsed_uri); } osip_from_to_str(parsed_uri,&tmp); linphone_proxy_config_set_identity(cfg,tmp); if (passwd ) { auth=linphone_auth_info_new(parsed_uri->url->username,NULL,passwd,NULL,NULL); linphone_core_add_auth_info(lc,auth); } linphone_proxy_config_enable_register(cfg,TRUE); linphone_proxy_config_done(cfg); osip_free(tmp); osip_from_free(parsed_uri); ms_message("SipLogin: done"); return 0; }
void linphone_proxy_config_set_identity(LinphoneProxyConfig *obj, const char *identity){ int err=0; osip_from_t *url; if (identity!=NULL && strlen(identity)>0){ osip_from_init(&url); err=osip_from_parse(url,identity); if (err<0 || url->url->host==NULL || url->url->username==NULL){ ms_warning("Could not parse %s",identity); osip_from_free(url); return; } osip_from_free(url); } else err=-2; if (obj->reg_identity!=NULL) { ms_free(obj->reg_identity); obj->reg_identity=NULL; } if (err==-2) obj->reg_identity=NULL; else obj->reg_identity=ms_strdup(identity); }
int main (int argc, char **argv) { FILE *froms_file; osip_from_t *from; char *a_from; char *dest; char *res; froms_file = fopen (argv[1], "r"); if (froms_file == NULL) { fprintf (stdout, "Failed to open %s file.\nUsage: tfrom froms.txt\n", argv[1]); exit (0); } a_from = (char *) osip_malloc (200); res = fgets (a_from, 200, froms_file); /* lines are under 200 */ while (res != NULL) { int errcode; /* remove the last '\n' before parsing */ strncpy (a_from + strlen (a_from) - 1, "\0", 1); if (0 != strncmp (a_from, "#", 1)) { /* allocate & init from */ osip_from_init (&from); printf ("=================================================\n"); printf ("FROM TO PARSE: |%s|\n", a_from); errcode = osip_from_parse (from, a_from); if (errcode != -1) { if (osip_from_to_str (from, &dest) != -1) { printf ("result: |%s|\n", dest); osip_free (dest); } } else printf ("Bad from format: %s\n", a_from); osip_from_free (from); printf ("=================================================\n"); } res = fgets (a_from, 200, froms_file); /* lines are under 200 */ } osip_free (a_from); return 0; }
int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd){ osip_from_t *from; osip_from_init(&from); osip_from_parse(from,uri); strncpy(ctx->domain,from->url->host,sizeof(ctx->domain)); strncpy(ctx->username,from->url->username,sizeof(ctx->username)); osip_from_free(from); if (ctx->funcs->login_account) return ctx->funcs->login_account(ctx,uri,passwd); return -1; }
void osip_message_free (osip_message_t * sip) { if (sip == NULL) return; osip_free (sip->sip_method); osip_free (sip->sip_version); if (sip->req_uri != NULL) osip_uri_free (sip->req_uri); osip_free (sip->reason_phrase); #ifndef MINISIZE osip_list_special_free (&sip->accepts, (void (*)(void *)) &osip_accept_free); #endif osip_list_special_free (&sip->authorizations, (void (*)(void *)) &osip_authorization_free); if (sip->call_id != NULL) osip_call_id_free (sip->call_id); #ifndef MINISIZE osip_list_special_free (&sip->accept_encodings, (void (*)(void *)) &osip_accept_encoding_free); osip_list_special_free (&sip->accept_languages, (void (*)(void *)) &osip_accept_language_free); osip_list_special_free (&sip->alert_infos, (void (*)(void *)) &osip_alert_info_free); osip_list_special_free (&sip->allows, (void (*)(void *)) &osip_allow_free); osip_list_special_free (&sip->authentication_infos, (void (*)(void *)) &osip_authentication_info_free); osip_list_special_free (&sip->content_encodings, (void (*)(void *)) &osip_content_encoding_free); osip_list_special_free (&sip->error_infos, (void (*)(void *)) &osip_error_info_free); osip_list_special_free (&sip->proxy_authentication_infos, (void (*)(void *)) &osip_proxy_authentication_info_free); #endif osip_list_special_free (&sip->call_infos, (void (*)(void *)) &osip_call_info_free); osip_list_special_free (&sip->contacts, (void (*)(void *)) &osip_contact_free); if (sip->content_length != NULL) osip_content_length_free (sip->content_length); if (sip->content_type != NULL) osip_content_type_free (sip->content_type); if (sip->cseq != NULL) osip_cseq_free (sip->cseq); if (sip->from != NULL) osip_from_free (sip->from); if (sip->mime_version != NULL) osip_mime_version_free (sip->mime_version); osip_list_special_free (&sip->proxy_authenticates, (void (*)(void *)) &osip_proxy_authenticate_free); osip_list_special_free (&sip->proxy_authorizations, (void (*)(void *)) &osip_proxy_authorization_free); osip_list_special_free (&sip->record_routes, (void (*)(void *)) &osip_record_route_free); osip_list_special_free (&sip->routes, (void (*)(void *)) &osip_route_free); if (sip->to != NULL) osip_to_free (sip->to); osip_list_special_free (&sip->vias, (void (*)(void *)) &osip_via_free); osip_list_special_free (&sip->www_authenticates, (void (*)(void *)) &osip_www_authenticate_free); osip_list_special_free (&sip->headers, (void (*)(void *)) &osip_header_free); osip_list_special_free (&sip->bodies, (void (*)(void *)) &osip_body_free); osip_free (sip->message); osip_free (sip); }
void osip_dialog_free (osip_dialog_t * dialog) { if (dialog == NULL) return; osip_contact_free (dialog->remote_contact_uri); osip_from_free (dialog->local_uri); osip_to_free (dialog->remote_uri); osip_list_special_free (&dialog->route_set, (void (*)(void *)) &osip_record_route_free); osip_free (dialog->line_param); osip_free (dialog->remote_tag); osip_free (dialog->local_tag); osip_free (dialog->call_id); osip_free (dialog); }
gchar *linphone_gtk_get_display_name(const char *sip_uri){ osip_from_t *from; gchar *ret=NULL; if (strchr(sip_uri,'@')){ osip_from_init(&from); if (osip_from_parse(from,sip_uri)==0){ if (from->displayname!=NULL && strlen(from->displayname)>0){ ret=g_strdup(from->displayname); } } osip_from_free(from); } if (ret==NULL) ret=g_strdup(sip_uri); return ret; }
int from_2char_without_params(osip_from_t *from,char **str) { osip_from_t *tmpfrom=NULL; osip_from_clone(from,&tmpfrom); if (tmpfrom!=NULL){ while(!osip_list_eol(&tmpfrom->gen_params,0)){ osip_generic_param_t *param=(osip_generic_param_t*)osip_list_get(&tmpfrom->gen_params,0); osip_generic_param_free(param); osip_list_remove(&tmpfrom->gen_params,0); } }else return -1; osip_from_to_str(tmpfrom,str); osip_from_free(tmpfrom); return 0; }
int linphone_proxy_config_set_server_addr(LinphoneProxyConfig *obj, const char *server_addr){ int err; osip_from_t *url; if (obj->reg_proxy!=NULL) ms_free(obj->reg_proxy); obj->reg_proxy=NULL; if (server_addr!=NULL && strlen(server_addr)>0){ osip_from_init(&url); err=osip_from_parse(url,server_addr); if (err==0 && url->url->host!=NULL){ obj->reg_proxy=ms_strdup(server_addr); }else{ ms_warning("Could not parse %s",server_addr); } osip_from_free(url); } return 0; }
phVLine * ph_find_matching_vline(const char *userid, int ignore) { osip_from_t *from; phVLine *vl; char *host; char hostport[256]; char *uname; hostport[0] = 0; from = ph_parse_from(userid); if (!from) return 0; if (from->url) uname = from->url->username; else uname = hostport; if (!(ignore & PHM_IGNORE_PORT) && from->url && from->url->port) { snprintf(hostport, sizeof(hostport), "%s:%s", from->url->host, from->url->port); host = hostport; } else if (ignore & PHM_IGNORE_HOST) host = 0; else if (from->url) { host = from->url->host; } else host = hostport; vl = ph_find_matching_vline2(uname, host, ignore); osip_from_free(from); return vl; }
/* returns -1 on error. */ int osip_message_set_from (osip_message_t * sip, const char *hvalue) { int i; if (hvalue == NULL || hvalue[0] == '\0') return 0; if (sip->from != NULL) return -1; i = osip_from_init (&(sip->from)); if (i != 0) return -1; sip->message_property = 2; i = osip_from_parse (sip->from, hvalue); if (i != 0) { osip_from_free (sip->from); sip->from = NULL; return -1; } return 0; }
/* INPUT : osip_record_route_t *record_route | record_route header. */ void osip_record_route_free(osip_record_route_t * record_route) { osip_from_free((osip_from_t *) record_route); }
int osip_dialog_init_as_uas (osip_dialog_t ** dialog, osip_message_t * invite, osip_message_t * response) { int i; int pos; osip_generic_param_t *tag; (*dialog) = (osip_dialog_t *) osip_malloc (sizeof (osip_dialog_t)); if (*dialog == NULL) return -1; (*dialog)->type = CALLEE; if (MSG_IS_STATUS_2XX (response)) (*dialog)->state = DIALOG_CONFIRMED; else /* 1XX */ (*dialog)->state = DIALOG_EARLY; i = osip_call_id_to_str (response->call_id, &((*dialog)->call_id)); if (i != 0) goto diau_error_0; i = osip_to_get_tag (response->to, &tag); if (i != 0) goto diau_error_1; (*dialog)->local_tag = osip_strdup (tag->gvalue); i = osip_from_get_tag (response->from, &tag); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a tag in response!\n")); (*dialog)->remote_tag = NULL; } else (*dialog)->remote_tag = osip_strdup (tag->gvalue); (*dialog)->route_set = (osip_list_t *) osip_malloc (sizeof (osip_list_t)); osip_list_init ((*dialog)->route_set); pos = 0; while (!osip_list_eol (response->record_routes, pos)) { osip_record_route_t *rr; osip_record_route_t *rr2; rr = (osip_record_route_t *) osip_list_get (response->record_routes, pos); i = osip_record_route_clone (rr, &rr2); if (i != 0) goto diau_error_2; osip_list_add ((*dialog)->route_set, rr2, -1); pos++; } /* local_cseq is set to response->cseq->number for better handling of bad UA */ (*dialog)->local_cseq = osip_atoi (response->cseq->number); (*dialog)->remote_cseq = osip_atoi (response->cseq->number); i = osip_from_clone (response->from, &((*dialog)->remote_uri)); if (i != 0) goto diau_error_3; i = osip_to_clone (response->to, &((*dialog)->local_uri)); if (i != 0) goto diau_error_4; { osip_contact_t *contact; if (!osip_list_eol (invite->contacts, 0)) { contact = osip_list_get (invite->contacts, 0); i = osip_contact_clone (contact, &((*dialog)->remote_contact_uri)); if (i != 0) goto diau_error_5; } else { (*dialog)->remote_contact_uri = NULL; OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a contact in response!\n")); } } (*dialog)->secure = -1; /* non secure */ return 0; diau_error_5: osip_from_free ((*dialog)->local_uri); diau_error_4: osip_from_free ((*dialog)->remote_uri); diau_error_3: diau_error_2: osip_list_special_free ((*dialog)->route_set, (void *(*)(void *)) &osip_record_route_free); osip_free ((*dialog)->remote_tag); osip_free ((*dialog)->local_tag); diau_error_1: osip_free ((*dialog)->call_id); diau_error_0: OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Could not establish dialog!\n")); osip_free (*dialog); *dialog = NULL; return -1; }
/* we don't have to compare remote_uri with from && local_uri with to. ----> we have both tag recognized, it's enough.. */ if (0 == strcmp (tag_param_remote->gvalue, dlg->remote_tag)) return 0; return -1; } int osip_dialog_init_as_uac (osip_dialog_t ** dialog, osip_message_t * response) { int i; int pos; osip_generic_param_t *tag; *dialog = NULL; i = osip_to_get_tag (response->to, &tag); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a tag in response!\n")); return -1; } (*dialog) = (osip_dialog_t *) osip_malloc (sizeof (osip_dialog_t)); if (*dialog == NULL) return -1; (*dialog)->type = CALLER; if (MSG_IS_STATUS_2XX (response)) (*dialog)->state = DIALOG_CONFIRMED; else /* 1XX */ (*dialog)->state = DIALOG_EARLY; i = osip_call_id_to_str (response->call_id, &((*dialog)->call_id)); if (i != 0) goto diau_error_0; i = osip_from_get_tag (response->from, &tag); if (i != 0) goto diau_error_1; (*dialog)->local_tag = osip_strdup (tag->gvalue); i = osip_to_get_tag (response->to, &tag); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a tag in response!\n")); (*dialog)->remote_tag = NULL; } else (*dialog)->remote_tag = osip_strdup (tag->gvalue); (*dialog)->route_set = (osip_list_t *) osip_malloc (sizeof (osip_list_t)); osip_list_init ((*dialog)->route_set); pos = 0; while (!osip_list_eol (response->record_routes, pos)) { osip_record_route_t *rr; osip_record_route_t *rr2; rr = (osip_record_route_t *) osip_list_get (response->record_routes, pos); i = osip_record_route_clone (rr, &rr2); if (i != 0) goto diau_error_2; osip_list_add ((*dialog)->route_set, rr2, -1); pos++; } (*dialog)->local_cseq = osip_atoi (response->cseq->number); (*dialog)->remote_cseq = -1; i = osip_to_clone (response->to, &((*dialog)->remote_uri)); if (i != 0) goto diau_error_3; i = osip_from_clone (response->from, &((*dialog)->local_uri)); if (i != 0) goto diau_error_4; { osip_contact_t *contact; if (!osip_list_eol (response->contacts, 0)) { contact = osip_list_get (response->contacts, 0); i = osip_contact_clone (contact, &((*dialog)->remote_contact_uri)); if (i != 0) goto diau_error_5; } else { (*dialog)->remote_contact_uri = NULL; OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a contact in response!\n")); } } (*dialog)->secure = -1; /* non secure */ return 0; diau_error_5: osip_from_free ((*dialog)->local_uri); diau_error_4: osip_from_free ((*dialog)->remote_uri); diau_error_3: diau_error_2: osip_list_special_free ((*dialog)->route_set, (void *(*)(void *)) &osip_record_route_free); osip_free ((*dialog)->remote_tag); osip_free ((*dialog)->local_tag); diau_error_1: osip_free ((*dialog)->call_id); diau_error_0: OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Could not establish dialog!\n")); osip_free (*dialog); *dialog = NULL; return -1; } #if 1 /* SIPIT13 */ int osip_dialog_init_as_uac_with_remote_request (osip_dialog_t ** dialog, osip_message_t *next_request, int local_cseq) { int i; osip_generic_param_t *tag; *dialog = NULL; i = osip_to_get_tag (next_request->from, &tag); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a tag in next request!\n")); return -1; } (*dialog) = (osip_dialog_t *) osip_malloc (sizeof (osip_dialog_t)); if (*dialog == NULL) return -1; (*dialog)->type = CALLER; #if 0 (*dialog)->state = DIALOG_CONFIRMED; #endif (*dialog)->state = DIALOG_EARLY; i = osip_call_id_to_str (next_request->call_id, &((*dialog)->call_id)); if (i != 0) goto diau_error_0; i = osip_from_get_tag (next_request->to, &tag); if (i != 0) goto diau_error_1; (*dialog)->local_tag = osip_strdup (tag->gvalue); i = osip_to_get_tag (next_request->from, &tag); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "Remote UA is not compliant: missing a tag in next request!\n")); (*dialog)->remote_tag = NULL; } else (*dialog)->remote_tag = osip_strdup (tag->gvalue); (*dialog)->route_set = (osip_list_t *) osip_malloc (sizeof (osip_list_t)); osip_list_init ((*dialog)->route_set); (*dialog)->local_cseq = local_cseq; /* -1 osip_atoi (xxx->cseq->number); */ (*dialog)->remote_cseq = osip_atoi (next_request->cseq->number); i = osip_to_clone (next_request->from, &((*dialog)->remote_uri)); if (i != 0) goto diau_error_3; i = osip_from_clone (next_request->to, &((*dialog)->local_uri)); if (i != 0) goto diau_error_4; (*dialog)->secure = -1; /* non secure */ return 0; diau_error_4: osip_from_free ((*dialog)->remote_uri); diau_error_3: osip_free ((*dialog)->remote_tag); osip_free ((*dialog)->local_tag); diau_error_1: osip_free ((*dialog)->call_id); diau_error_0: OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Could not establish dialog!\n")); osip_free (*dialog); *dialog = NULL; return -1; }
/* INPUT : osip_contact_t *| contact. */ void osip_contact_free(osip_contact_t * contact) { osip_from_free((osip_from_t *) contact); }
/* INPUT : osip_to_t *to | to header. */ void osip_to_free(osip_to_t * to) { osip_from_free((osip_from_t *) to); }
/* INPUT : osip_route_t *route | route header. */ void osip_route_free (osip_route_t * route) { osip_from_free ((osip_from_t *) route); }
void osip_message_free (osip_message_t * sip) { int pos = 0; if (sip == NULL) return; osip_free (sip->sip_method); osip_free (sip->sip_version); if (sip->req_uri != NULL) { osip_uri_free (sip->req_uri); } osip_free (sip->reason_phrase); { osip_accept_t *accept; while (!osip_list_eol (&sip->accepts, pos)) { accept = (osip_accept_t *) osip_list_get (&sip->accepts, pos); osip_list_remove (&sip->accepts, pos); osip_accept_free (accept); } } { osip_accept_encoding_t *accept_encoding; while (!osip_list_eol (&sip->accept_encodings, pos)) { accept_encoding = (osip_accept_encoding_t *) osip_list_get (&sip->accept_encodings, pos); osip_list_remove (&sip->accept_encodings, pos); osip_accept_encoding_free (accept_encoding); } } { osip_accept_language_t *accept_language; while (!osip_list_eol (&sip->accept_languages, pos)) { accept_language = (osip_accept_language_t *) osip_list_get (&sip->accept_languages, pos); osip_list_remove (&sip->accept_languages, pos); osip_accept_language_free (accept_language); } } { osip_alert_info_t *alert_info; while (!osip_list_eol (&sip->alert_infos, pos)) { alert_info = (osip_alert_info_t *) osip_list_get (&sip->alert_infos, pos); osip_list_remove (&sip->alert_infos, pos); osip_alert_info_free (alert_info); } } { osip_allow_t *al; while (!osip_list_eol (&sip->allows, pos)) { al = (osip_allow_t *) osip_list_get (&sip->allows, pos); osip_list_remove (&sip->allows, pos); osip_allow_free (al); } } { osip_authentication_info_t *al; while (!osip_list_eol (&sip->authentication_infos, pos)) { al = (osip_authentication_info_t *) osip_list_get (&sip-> authentication_infos, pos); osip_list_remove (&sip->authentication_infos, pos); osip_authentication_info_free (al); } } { osip_authorization_t *al; while (!osip_list_eol (&sip->authorizations, pos)) { al = (osip_authorization_t *) osip_list_get (&sip->authorizations, pos); osip_list_remove (&sip->authorizations, pos); osip_authorization_free (al); } } if (sip->call_id != NULL) { osip_call_id_free (sip->call_id); } { osip_call_info_t *call_info; while (!osip_list_eol (&sip->call_infos, pos)) { call_info = (osip_call_info_t *) osip_list_get (&sip->call_infos, pos); osip_list_remove (&sip->call_infos, pos); osip_call_info_free (call_info); } } { osip_contact_t *contact; while (!osip_list_eol (&sip->contacts, pos)) { contact = (osip_contact_t *) osip_list_get (&sip->contacts, pos); osip_list_remove (&sip->contacts, pos); osip_contact_free (contact); } } { osip_content_encoding_t *ce; while (!osip_list_eol (&sip->content_encodings, pos)) { ce = (osip_content_encoding_t *) osip_list_get (&sip->content_encodings, pos); osip_list_remove (&sip->content_encodings, pos); osip_content_encoding_free (ce); } } if (sip->content_length != NULL) { osip_content_length_free (sip->content_length); } if (sip->content_type != NULL) { osip_content_type_free (sip->content_type); } if (sip->cseq != NULL) { osip_cseq_free (sip->cseq); } { osip_error_info_t *error_info; while (!osip_list_eol (&sip->error_infos, pos)) { error_info = (osip_error_info_t *) osip_list_get (&sip->error_infos, pos); osip_list_remove (&sip->error_infos, pos); osip_error_info_free (error_info); } } if (sip->from != NULL) { osip_from_free (sip->from); } if (sip->mime_version != NULL) { osip_mime_version_free (sip->mime_version); } { osip_proxy_authenticate_t *al; while (!osip_list_eol (&sip->proxy_authenticates, pos)) { al = (osip_proxy_authenticate_t *) osip_list_get (&sip-> proxy_authenticates, pos); osip_list_remove (&sip->proxy_authenticates, pos); osip_proxy_authenticate_free (al); } } { osip_proxy_authentication_info_t *al; while (!osip_list_eol (&sip->proxy_authentication_infos, pos)) { al = (osip_proxy_authentication_info_t *) osip_list_get (&sip-> proxy_authentication_infos, pos); osip_list_remove (&sip->proxy_authentication_infos, pos); osip_proxy_authentication_info_free (al); } } { osip_proxy_authorization_t *proxy_authorization; while (!osip_list_eol (&sip->proxy_authorizations, pos)) { proxy_authorization = (osip_proxy_authorization_t *) osip_list_get (&sip-> proxy_authorizations, pos); osip_list_remove (&sip->proxy_authorizations, pos); osip_proxy_authorization_free (proxy_authorization); } } { osip_record_route_t *record_route; while (!osip_list_eol (&sip->record_routes, pos)) { record_route = (osip_record_route_t *) osip_list_get (&sip->record_routes, pos); osip_list_remove (&sip->record_routes, pos); osip_record_route_free (record_route); } } { osip_route_t *route; while (!osip_list_eol (&sip->routes, pos)) { route = (osip_route_t *) osip_list_get (&sip->routes, pos); osip_list_remove (&sip->routes, pos); osip_route_free (route); } } if (sip->to != NULL) { osip_to_free (sip->to); } { osip_via_t *via; while (!osip_list_eol (&sip->vias, pos)) { via = (osip_via_t *) osip_list_get (&sip->vias, pos); osip_list_remove (&sip->vias, pos); osip_via_free (via); } } { osip_www_authenticate_t *al; while (!osip_list_eol (&sip->www_authenticates, pos)) { al = (osip_www_authenticate_t *) osip_list_get (&sip->www_authenticates, pos); osip_list_remove (&sip->www_authenticates, pos); osip_www_authenticate_free (al); } } { osip_header_t *header; while (!osip_list_eol (&sip->headers, pos)) { header = (osip_header_t *) osip_list_get (&sip->headers, pos); osip_list_remove (&sip->headers, pos); osip_header_free (header); } } { osip_body_t *body; while (!osip_list_eol (&sip->bodies, pos)) { body = (osip_body_t *) osip_list_get (&sip->bodies, pos); osip_list_remove (&sip->bodies, pos); osip_body_free (body); } } osip_free (sip->message); osip_free (sip); }