static int _eXosip_register_build_register (eXosip_reg_t * jr, osip_message_t ** _reg) { osip_message_t *reg = NULL; int i; reg = NULL; *_reg = NULL; if (jr->r_last_tr != NULL) { if (jr->r_last_tr->state != NICT_TERMINATED && jr->r_last_tr->state != NICT_COMPLETED) return -1; else { osip_message_t *last_response = NULL; osip_transaction_t *tr; osip_message_clone (jr->r_last_tr->orig_request, ®); if (reg == NULL) return -1; /* reg = jr->r_last_tr->orig_request; */ if (jr->r_last_tr->last_response != NULL) { osip_message_clone (jr->r_last_tr->last_response, &last_response); if (last_response == NULL) { osip_message_free (reg); return -1; } } __eXosip_delete_jinfo (jr->r_last_tr); tr = jr->r_last_tr; jr->r_last_tr = NULL; osip_list_add (eXosip.j_transactions, tr, 0); /* modify the REGISTER request */ { int osip_cseq_num = osip_atoi (reg->cseq->number); int length = strlen (reg->cseq->number); osip_list_special_free(®->authorizations, (void *(*)(void *)) &osip_authorization_free); osip_list_special_free(®->proxy_authorizations, (void *(*)(void *)) &osip_proxy_authorization_free); if (-1 == eXosip_update_top_via (reg)) { osip_message_free (reg); if (last_response != NULL) osip_message_free (last_response); return -1; } osip_cseq_num++; osip_free (reg->cseq->number); reg->cseq->number = (char *) osip_malloc (length + 2); /* +2 like for 9 to 10 */ sprintf (reg->cseq->number, "%i", osip_cseq_num); { osip_header_t *exp; osip_message_header_get_byname (reg, "expires", 0, &exp); if (exp!=NULL) { if (exp->hvalue!=NULL) osip_free (exp->hvalue); exp->hvalue = (char *) osip_malloc (10); snprintf (exp->hvalue, 9, "%i", jr->r_reg_period); } } osip_message_force_update (reg); } if (last_response != NULL) { if (last_response->status_code==401 || last_response->status_code==407) { eXosip_add_authentication_information (reg, last_response); } else eXosip_add_authentication_information (reg, NULL); osip_message_free (last_response); } } } if (reg == NULL) { i = generating_register (jr, ®, eXosip.transport, jr->r_aor, jr->r_registrar, jr->r_contact, jr->r_reg_period); if (i != 0) { return -2; } } *_reg = reg; return 0; }
static int _eXosip_register_build_register(eXosip_reg_t * jr, osip_message_t ** _reg) { osip_message_t *reg = NULL; int i; *_reg = NULL; if (jr == NULL) return OSIP_BADPARAMETER; if (jr->r_last_tr != NULL) { if (jr->r_last_tr->state != NICT_TERMINATED && jr->r_last_tr->state != NICT_COMPLETED) return OSIP_WRONG_STATE; else { osip_message_t *last_response = NULL; osip_transaction_t *tr; i = osip_message_clone(jr->r_last_tr->orig_request, ®); if (i != 0) return i; if (jr->r_last_tr->last_response != NULL) { i = osip_message_clone(jr->r_last_tr->last_response, &last_response); if (i != 0) { osip_message_free(reg); return i; } } __eXosip_delete_jinfo(jr->r_last_tr); tr = jr->r_last_tr; jr->r_last_tr = NULL; osip_list_add(&eXosip.j_transactions, tr, 0); /* modify the REGISTER request */ { int osip_cseq_num = osip_atoi(reg->cseq->number); int length = strlen(reg->cseq->number); osip_list_special_free(®->authorizations, (void (*)(void *)) &osip_authorization_free); osip_list_special_free(®->proxy_authorizations, (void (*)(void *)) &osip_proxy_authorization_free); i = eXosip_update_top_via(reg); if (i != 0) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return i; } osip_cseq_num++; osip_free(reg->cseq->number); reg->cseq->number = (char *) osip_malloc(length + 2); /* +2 like for 9 to 10 */ if (reg->cseq->number == NULL) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return OSIP_NOMEM; } snprintf(reg->cseq->number, length + 2, "%i", osip_cseq_num); if (last_response != NULL && last_response->status_code == 423) { /* increase expires value to "min-expires" value */ osip_header_t *exp; osip_header_t *min_exp; osip_message_header_get_byname(reg, "expires", 0, &exp); osip_message_header_get_byname(last_response, "min-expires", 0, &min_exp); if (exp != NULL && exp->hvalue != NULL && min_exp != NULL && min_exp->hvalue != NULL) { osip_free(exp->hvalue); exp->hvalue = osip_strdup(min_exp->hvalue); jr->r_reg_period = atoi(min_exp->hvalue); } else { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); OSIP_TRACE(osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: missing Min-Expires or Expires in REGISTER\n")); return OSIP_SYNTAXERROR; } } else { osip_header_t *exp; osip_message_header_get_byname(reg, "expires", 0, &exp); if (exp != NULL) { if (exp->hvalue != NULL) osip_free(exp->hvalue); exp->hvalue = (char *) osip_malloc(10); if (exp->hvalue == NULL) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return OSIP_NOMEM; } snprintf(exp->hvalue, 9, "%i", jr->r_reg_period); } } osip_message_force_update(reg); } if (last_response != NULL) { if (last_response->status_code == 401 || last_response->status_code == 407) { eXosip_add_authentication_information(reg, last_response); } else eXosip_add_authentication_information(reg, NULL); osip_message_free(last_response); } } } if (reg == NULL) { i = generating_register(jr, ®, eXosip.transport, jr->r_aor, jr->r_registrar, jr->r_contact, jr->r_reg_period); if (i != 0) return i; } *_reg = reg; return OSIP_SUCCESS; }