diff options
Diffstat (limited to 'libs/libcurl/src/rtsp.c')
-rw-r--r-- | libs/libcurl/src/rtsp.c | 74 |
1 files changed, 35 insertions, 39 deletions
diff --git a/libs/libcurl/src/rtsp.c b/libs/libcurl/src/rtsp.c index cc649b67db..d625c539c3 100644 --- a/libs/libcurl/src/rtsp.c +++ b/libs/libcurl/src/rtsp.c @@ -40,6 +40,7 @@ #include "connect.h"
#include "cfilters.h"
#include "strdup.h"
+#include "strparse.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -129,14 +130,19 @@ const struct Curl_handler Curl_handler_rtsp = { static CURLcode rtsp_setup_connection(struct Curl_easy *data,
struct connectdata *conn)
{
+ struct rtsp_conn *rtspc = &conn->proto.rtspc;
struct RTSP *rtsp;
(void)conn;
+ if(!rtspc->initialised) {
+ Curl_dyn_init(&rtspc->buf, MAX_RTP_BUFFERSIZE);
+ rtspc->initialised = TRUE;
+ }
+
data->req.p.rtsp = rtsp = calloc(1, sizeof(struct RTSP));
if(!rtsp)
return CURLE_OUT_OF_MEMORY;
- Curl_dyn_init(&conn->proto.rtspc.buf, MAX_RTP_BUFFERSIZE);
return CURLE_OK;
}
@@ -181,9 +187,13 @@ static CURLcode rtsp_connect(struct Curl_easy *data, bool *done) static CURLcode rtsp_disconnect(struct Curl_easy *data,
struct connectdata *conn, bool dead)
{
+ struct rtsp_conn *rtspc = &conn->proto.rtspc;
(void) dead;
(void) data;
- Curl_dyn_free(&conn->proto.rtspc.buf);
+ if(rtspc->initialised) {
+ Curl_dyn_free(&conn->proto.rtspc.buf);
+ rtspc->initialised = FALSE;
+ }
return CURLE_OK;
}
@@ -345,8 +355,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) if(rtspreq == RTSPREQ_SETUP && !p_transport) {
/* New Transport: setting? */
if(data->set.str[STRING_RTSP_TRANSPORT]) {
- Curl_safefree(data->state.aptr.rtsp_transport);
-
+ free(data->state.aptr.rtsp_transport);
data->state.aptr.rtsp_transport =
aprintf("Transport: %s\r\n",
data->set.str[STRING_RTSP_TRANSPORT]);
@@ -372,7 +381,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) /* Accept-Encoding header */
if(!Curl_checkheaders(data, STRCONST("Accept-Encoding")) &&
data->set.str[STRING_ENCODING]) {
- Curl_safefree(data->state.aptr.accept_encoding);
+ free(data->state.aptr.accept_encoding);
data->state.aptr.accept_encoding =
aprintf("Accept-Encoding: %s\r\n", data->set.str[STRING_ENCODING]);
@@ -426,7 +435,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) /* Check to see if there is a range set in the custom headers */
if(!Curl_checkheaders(data, STRCONST("Range")) && data->state.range) {
- Curl_safefree(data->state.aptr.rangeline);
+ free(data->state.aptr.rangeline);
data->state.aptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
p_range = data->state.aptr.rangeline;
}
@@ -627,7 +636,7 @@ static CURLcode rtp_write_body_junk(struct Curl_easy *data, if(body_remain) {
if((curl_off_t)blen > body_remain)
blen = (size_t)body_remain;
- return Curl_client_write(data, CLIENTWRITE_BODY, (char *)buf, blen);
+ return Curl_client_write(data, CLIENTWRITE_BODY, buf, blen);
}
return CURLE_OK;
}
@@ -674,8 +683,7 @@ static CURLcode rtsp_filter_rtp(struct Curl_easy *data, /* possible start of an RTP message, buffer */
if(skip_len) {
/* end of junk/BODY bytes, flush */
- result = rtp_write_body_junk(data,
- (char *)(buf - skip_len), skip_len);
+ result = rtp_write_body_junk(data, buf - skip_len, skip_len);
skip_len = 0;
if(result)
goto out;
@@ -791,7 +799,7 @@ static CURLcode rtsp_filter_rtp(struct Curl_easy *data, }
out:
if(!result && skip_len)
- result = rtp_write_body_junk(data, (char *)(buf - skip_len), skip_len);
+ result = rtp_write_body_junk(data, buf - skip_len, skip_len);
return result;
}
@@ -865,8 +873,7 @@ static CURLcode rtsp_rtp_write_resp(struct Curl_easy *data, data->req.size));
if(!result && (is_eos || blen)) {
result = Curl_client_write(data, CLIENTWRITE_BODY|
- (is_eos ? CLIENTWRITE_EOS : 0),
- (char *)buf, blen);
+ (is_eos ? CLIENTWRITE_EOS : 0), buf, blen);
}
out:
@@ -906,7 +913,7 @@ CURLcode rtp_client_write(struct Curl_easy *data, const char *ptr, size_t len) }
Curl_set_in_callback(data, TRUE);
- wrote = writeit((char *)ptr, 1, len, user_ptr);
+ wrote = writeit((char *)CURL_UNCONST(ptr), 1, len, user_ptr);
Curl_set_in_callback(data, FALSE);
if(CURL_WRITEFUNC_PAUSE == wrote) {
@@ -925,21 +932,16 @@ CURLcode rtp_client_write(struct Curl_easy *data, const char *ptr, size_t len) CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, const char *header)
{
if(checkprefix("CSeq:", header)) {
- long CSeq = 0;
- char *endp;
+ curl_off_t CSeq = 0;
+ struct RTSP *rtsp = data->req.p.rtsp;
const char *p = &header[5];
- while(ISBLANK(*p))
- p++;
- CSeq = strtol(p, &endp, 10);
- if(p != endp) {
- struct RTSP *rtsp = data->req.p.rtsp;
- rtsp->CSeq_recv = CSeq; /* mark the request */
- data->state.rtsp_CSeq_recv = CSeq; /* update the handle */
- }
- else {
+ Curl_str_passblanks(&p);
+ if(Curl_str_number(&p, &CSeq, LONG_MAX)) {
failf(data, "Unable to read the CSeq header: [%s]", header);
return CURLE_RTSP_CSEQ_ERROR;
}
+ rtsp->CSeq_recv = (long)CSeq; /* mark the request */
+ data->state.rtsp_CSeq_recv = (long)CSeq; /* update the handle */
}
else if(checkprefix("Session:", header)) {
const char *start, *end;
@@ -947,8 +949,7 @@ CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, const char *header) /* Find the first non-space letter */
start = header + 8;
- while(*start && ISBLANK(*start))
- start++;
+ Curl_str_passblanks(&start);
if(!*start) {
failf(data, "Got a blank Session ID");
@@ -962,7 +963,7 @@ CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, const char *header) * gstreamer does url-encoded session ID's not covered by the standard.
*/
end = start;
- while(*end && *end != ';' && !ISSPACE(*end))
+ while((*end > ' ') && (*end != ';'))
end++;
idlen = end - start;
@@ -1006,29 +1007,24 @@ CURLcode rtsp_parse_transport(struct Curl_easy *data, const char *transport) const char *start, *end;
start = transport;
while(start && *start) {
- while(*start && ISBLANK(*start) )
- start++;
+ Curl_str_passblanks(&start);
end = strchr(start, ';');
if(checkprefix("interleaved=", start)) {
- long chan1, chan2, chan;
- char *endp;
+ curl_off_t chan1, chan2, chan;
const char *p = start + 12;
- chan1 = strtol(p, &endp, 10);
- if(p != endp && chan1 >= 0 && chan1 <= 255) {
+ if(!Curl_str_number(&p, &chan1, 255)) {
unsigned char *rtp_channel_mask = data->state.rtp_channel_mask;
chan2 = chan1;
- if(*endp == '-') {
- p = endp + 1;
- chan2 = strtol(p, &endp, 10);
- if(p == endp || chan2 < 0 || chan2 > 255) {
+ if(!Curl_str_single(&p, '-')) {
+ if(Curl_str_number(&p, &chan2, 255)) {
infof(data, "Unable to read the interleaved parameter from "
"Transport header: [%s]", transport);
chan2 = chan1;
}
}
for(chan = chan1; chan <= chan2; chan++) {
- long idx = chan / 8;
- long off = chan % 8;
+ int idx = (int)chan / 8;
+ int off = (int)chan % 8;
rtp_channel_mask[idx] |= (unsigned char)(1 << off);
}
}
|