static int rtsp_get_answers(rtsp_t *s) { char *answer=NULL; unsigned int answer_seq; char **answer_ptr=s->answers; int code; int ans_count = 0; answer=rtsp_get(s); if (!answer) return 0; code=rtsp_get_code(s, answer); free(answer); rtsp_free_answers(s); do { /* while we get answer lines */ answer=rtsp_get(s); if (!answer) return 0; if (!strncasecmp(answer,"Cseq: ",6)) { sscanf(answer+6,"%u",&answer_seq); if (s->cseq != answer_seq) { lprintf("warning: Cseq mismatch. got %u, assumed %u", answer_seq, s->cseq); s->cseq=answer_seq; } } if (!strncasecmp(answer,"Server: ",8)) { free(s->server); s->server = strdup(answer + 8); } if (!strncasecmp(answer,"Session: ",9)) { char *tmp = answer + 9; if (s->session) { if (strcmp(tmp, s->session)) { xprintf(s->stream->xine, XINE_VERBOSITY_DEBUG, "rtsp: warning: setting NEW session: %s\n", tmp); s->session=strdup(tmp); } } else { lprintf("setting session id to: %s\n", tmp); s->session=strdup(tmp); } } *answer_ptr=answer; answer_ptr++; } while ((strlen(answer)!=0) && (++ans_count < MAX_FIELDS)); s->cseq++; *answer_ptr=NULL; rtsp_schedule_standard(s); return code; }
int rtsp_read_data( rtsp_client_t *rtsp, uint8_t *buffer, unsigned int size ) { int i, seq; if( size >= 4 ) { i = rtsp->pf_read( rtsp->p_userdata, (uint8_t*)buffer, (unsigned int) 4 ); if( i < 4 ) return i; if( buffer[0]=='S' && buffer[1]=='E' && buffer[2]=='T' && buffer[3]=='_' ) { char *rest = rtsp_get( rtsp ); if( !rest ) return -1; seq = -1; do { free( rest ); rest = rtsp_get( rtsp ); if( !rest ) return -1; if( !strncasecmp( rest, "CSeq:", 5 ) ) sscanf( rest, "%*s %u", &seq ); } while( *rest ); free( rest ); if( seq < 0 ) { //fprintf(stderr, "warning: cseq not recognized!\n"); seq = 1; } /* lets make the server happy */ rtsp_put( rtsp, "RTSP/1.0 451 Parameter Not Understood" ); rest = xmalloc(sizeof("Cseq: ") + 3 * sizeof(int)); sprintf( rest,"CSeq: %u", seq ); rtsp_put( rtsp, rest ); rtsp_put( rtsp, "" ); free( rest ); i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer, size ); } else { i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer + 4, size - 4 ); i += 4; } } else i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer, size ); //fprintf( stderr, "<< %d of %d bytes\n", i, size ); return i; }
int rtsp_read_data(rtsp_t *s, void *buffer_gen, unsigned int size) { uint8_t *buffer = buffer_gen; int i,seq; if (size>=4) { i=_x_io_tcp_read(s->stream, s->s, buffer, 4); if (i<4) return i; if ((buffer[0]=='S')&&(buffer[1]=='E')&&(buffer[2]=='T')&&(buffer[3]=='_')) { char *rest=rtsp_get(s); if (!rest) return -1; seq=-1; do { free(rest); rest=rtsp_get(s); if (!rest) return -1; if (!strncasecmp(rest,"Cseq:",5)) sscanf(rest,"%*s %u",&seq); } while (strlen(rest)!=0); free(rest); if (seq<0) { lprintf("warning: cseq not recognized!\n"); seq=1; } /* lets make the server happy */ rtsp_put(s, "RTSP/1.0 451 Parameter Not Understood"); rest = _x_asprintf("CSeq: %u", seq); rtsp_put(s, rest); free(rest); rtsp_put(s, ""); i=_x_io_tcp_read(s->stream, s->s, buffer, size); } else { i=_x_io_tcp_read(s->stream, s->s, buffer+4, size-4); i+=4; } } else i=_x_io_tcp_read(s->stream, s->s, buffer, size); lprintf("<< %d of %d bytes\n", i, size); return i; }
static int rtsp_get_answers( rtsp_client_t *rtsp ) { char *answer = NULL; unsigned int answer_seq; char **answer_ptr = rtsp->p_private->answers; int code; int ans_count = 0; answer = rtsp_get( rtsp ); if( !answer ) return 0; code = rtsp_get_status_code( rtsp, answer ); free( answer ); rtsp_free_answers( rtsp ); do { /* while we get answer lines */ answer = rtsp_get( rtsp ); if( !answer ) return 0; if( !strncasecmp( answer, "CSeq:", 5 ) ) { sscanf( answer, "%*s %u", &answer_seq ); if( rtsp->p_private->cseq != answer_seq ) { //fprintf( stderr, "warning: Cseq mismatch. got %u, assumed %u", // answer_seq, rtsp->p_private->cseq ); rtsp->p_private->cseq = answer_seq; } } if( !strncasecmp( answer, "Server:", 7 ) ) { char *buf = xmalloc( strlen(answer) ); sscanf( answer, "%*s %s", buf ); free( rtsp->p_private->server ); rtsp->p_private->server = buf; } if( !strncasecmp( answer, "Session:", 8 ) ) { char *buf = xmalloc( strlen(answer) ); sscanf( answer, "%*s %s", buf ); if( rtsp->p_private->session ) { if( strcmp( buf, rtsp->p_private->session ) ) { //fprintf( stderr, // "rtsp: warning: setting NEW session: %s\n", buf ); free( rtsp->p_private->session ); rtsp->p_private->session = strdup( buf ); } } else { //fprintf( stderr, "setting session id to: %s\n", buf ); rtsp->p_private->session = strdup( buf ); } free( buf ); } *answer_ptr = answer; answer_ptr++; } while( (strlen(answer) != 0) && (++ans_count < MAX_FIELDS) ); rtsp->p_private->cseq++; *answer_ptr = NULL; rtsp_schedule_standard( rtsp ); return code; }
static int rtsp_get_answers( rtsp_client_t *rtsp ) { access_t *p_access = (access_t*)rtsp->p_userdata; char *answer = NULL; unsigned int answer_seq; char **answer_ptr = rtsp->p_private->answers; int code; int ans_count = 0; answer = rtsp_get( rtsp ); if( !answer ) return 0; code = rtsp_get_status_code( rtsp, answer ); free( answer ); rtsp_free_answers( rtsp ); do { /* while we get answer lines */ answer = rtsp_get( rtsp ); if( !answer ) return 0; if( !strncasecmp( answer, "CSeq:", 5 ) ) { if (sscanf( answer, "%*s %u", &answer_seq ) == 1) { if( rtsp->p_private->cseq != answer_seq ) { msg_Warn (p_access, "Cseq mismatch, got %u, assumed %u", answer_seq, rtsp->p_private->cseq); rtsp->p_private->cseq = answer_seq; } } else { msg_Warn (p_access, "remote server sent CSeq without payload, ignoring."); } } if( !strncasecmp( answer, "Server:", 7 ) ) { char *buf = xmalloc( strlen(answer) ); if (sscanf( answer, "%*s %s", buf ) == 1) { free( rtsp->p_private->server ); rtsp->p_private->server = buf; } else { msg_Warn(p_access, "remote server sent Server without payload, ignoring."); } } if( !strncasecmp( answer, "Session:", 8 ) ) { char *buf = xmalloc( strlen(answer) ); if (sscanf( answer, "%*s %s", buf ) == 1) { // TODO: ignore attributes "Session: ${session-id};${attribute=value...}" if( rtsp->p_private->session ) { if( strcmp( buf, rtsp->p_private->session ) ) { msg_Warn (p_access, "setting NEW session: %s", buf); free( rtsp->p_private->session ); rtsp->p_private->session = strdup( buf ); } } else { msg_Dbg (p_access, "session id: '%s'", buf); rtsp->p_private->session = strdup( buf ); } } else { msg_Warn(p_access, "remote server sent Session without payload, ignoring."); } free( buf ); } *answer_ptr = answer; answer_ptr++; } while( (strlen(answer) != 0) && (++ans_count < MAX_FIELDS) ); rtsp->p_private->cseq++; if (ans_count != MAX_FIELDS) { *answer_ptr = NULL; } rtsp_schedule_standard( rtsp ); return code; }