/* * sipsdp_free() * * Frees the SIP SDP structure, the contained common SDP structure, * and each stream structure in the linked stream list. * * sip_sdp is set to NULL after being freed. */ void sipsdp_free (cc_sdp_t **sip_sdp) { const char *fname = "sipsdp_free: "; sdp_result_e sdp_ret; if (!*sip_sdp) { return; } if ((*sip_sdp)->src_sdp) { sdp_ret = sdp_free_description((*sip_sdp)->src_sdp); if (sdp_ret != SDP_SUCCESS) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"%d while freeing src_sdp\n", fname, sdp_ret); } } if ((*sip_sdp)->dest_sdp) { sdp_ret = sdp_free_description((*sip_sdp)->dest_sdp); if (sdp_ret != SDP_SUCCESS) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"%d while freeing dest_sdp\n", fname, sdp_ret); } } SDP_FREE(*sip_sdp); }
/* Function: sdp_free_description * Description: Free an SDP description and all memory associated with it. * Parameters: sdp_p The SDP handle returned by sdp_init_description * Returns: A result value indicating if the free was successful and * if not, what type of error was encountered - e.g., sdp_p * was invalid and didn't point to an SDP structure. */ sdp_result_e sdp_free_description (sdp_t *sdp_p) { sdp_timespec_t *time_p, *next_time_p; sdp_attr_t *attr_p, *next_attr_p; sdp_mca_t *mca_p, *next_mca_p; sdp_bw_t *bw_p; sdp_bw_data_t *bw_data_p; if (sdp_verify_sdp_ptr(sdp_p) == FALSE) { return (SDP_INVALID_SDP_PTR); } /* Free the config structure */ if (sdp_p->conf_p) { SDP_FREE(sdp_p->conf_p); } /* Free any timespec structures - should be only one since * this is all we currently support. */ time_p = sdp_p->timespec_p; while (time_p != NULL) { next_time_p = time_p->next_p; SDP_FREE(time_p); time_p = next_time_p; } bw_p = &(sdp_p->bw); bw_data_p = bw_p->bw_data_list; while (bw_data_p != NULL) { bw_p->bw_data_list = bw_data_p->next_p; SDP_FREE(bw_data_p); bw_data_p = bw_p->bw_data_list; } /* Free any session attr structures */ attr_p = sdp_p->sess_attrs_p; while (attr_p != NULL) { next_attr_p = attr_p->next_p; sdp_free_attr(attr_p); attr_p = next_attr_p; } /* Free any mca structures */ mca_p = sdp_p->mca_p; while (mca_p != NULL) { next_mca_p = mca_p->next_p; /* Free any media attr structures */ attr_p = mca_p->media_attrs_p; while (attr_p != NULL) { next_attr_p = attr_p->next_p; sdp_free_attr(attr_p); attr_p = next_attr_p; } /* Free the media profiles struct if allocated. */ if (mca_p->media_profiles_p != NULL) { SDP_FREE(mca_p->media_profiles_p); } bw_p = &(mca_p->bw); bw_data_p = bw_p->bw_data_list; while (bw_data_p != NULL) { bw_p->bw_data_list = bw_data_p->next_p; SDP_FREE(bw_data_p); bw_data_p = bw_p->bw_data_list; } SDP_FREE(mca_p); mca_p = next_mca_p; } SDP_FREE(sdp_p); return (SDP_SUCCESS); }