rtsp_client_t *rtsp_create_client_common (const char *url, int *perr) { int err; rtsp_client_t *info; info = malloc(sizeof(rtsp_client_t)); if (info == NULL) { *perr = ST_ERROR_NO_MEMORY; return (NULL); } memset(info, 0, sizeof(rtsp_client_t)); info->url = NULL; info->orig_url = NULL; info->server_name = NULL; info->cookie = NULL; info->recv_timeout = 2 * 1000; /* default timeout is 2 seconds.*/ info->server_socket = -1; info->next_cseq = 1; info->session = NULL; info->m_offset_on = 0; info->m_buffer_len = 0; info->m_resp_buffer[RECV_BUFF_DEFAULT_LEN] = '\0'; /* info->thread = NULL;*/ err = rtsp_dissect_url(info, url); if (err != 0) { printf("Couldn't decode url %d\n", err); *perr = err; free_rtsp_client(info); return (NULL); } return (info); }
/* * rtsp_setup_redirect() * Sets up URLs, does the connect for redirects. Need to handle * 300 case (multiple choices). Imagine that if we had that, we'd just * loop through the body until we found a server that we could connect * with. */ int rtsp_setup_redirect (rtsp_client_t *info) { rtsp_decode_t *decode; int ret; if (info->decode_response == NULL) return (-1); info->redirect_count++; if (info->redirect_count > 5) return (-1); decode = info->decode_response; if (decode->location == NULL) return (-1); if (info->orig_url == NULL) { info->orig_url = info->url; info->url = NULL; } else { CHECK_AND_FREE(info->url); } CHECK_AND_FREE(info->server_name); rtsp_close_socket(info); ret = rtsp_dissect_url(info, decode->location); if (ret != 0) return (ret); return (rtsp_create_socket(info)); }