diff options
author | Max Kellermann <max@duempel.org> | 2009-10-11 23:13:49 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-10-11 23:13:49 +0200 |
commit | af92b1c2d815befec7bd9541e76c5402bcbf05c4 (patch) | |
tree | e4715e53cc1a17bfa617f2f428b4b54feb00eed8 /src/input | |
parent | 016558093ba9fa7bd030367e50feca303fb012ca (diff) | |
download | mpd-af92b1c2d815befec7bd9541e76c5402bcbf05c4.tar.gz mpd-af92b1c2d815befec7bd9541e76c5402bcbf05c4.tar.xz mpd-af92b1c2d815befec7bd9541e76c5402bcbf05c4.zip |
input/curl: don't abort if a packet has only metadata
When a received chunk of data has only icy-metadata, there was no
usable data left for input_curl_read() to return, and thus it returned
0 bytes. "0" however is a special value for "end of file" or
"error". This patch makes input_curl_read() read more data from the
socket, until the read request can be fulfilled (or until there's
really EOF).
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/curl_input_plugin.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/src/input/curl_input_plugin.c b/src/input/curl_input_plugin.c index 4ed8e5b5b..b83bcd918 100644 --- a/src/input/curl_input_plugin.c +++ b/src/input/curl_input_plugin.c @@ -443,31 +443,33 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size) } #endif - /* fill the buffer */ + do { + /* fill the buffer */ - success = fill_buffer(is); - if (!success) - return 0; + success = fill_buffer(is); + if (!success) + return 0; - /* send buffer contents */ + /* send buffer contents */ - if (c->rewind != NULL && - (!g_queue_is_empty(c->rewind) || is->offset == 0)) - /* at the beginning or already writing the rewind - buffer list */ - rewind_buffers = c->rewind; - else - /* we don't need the rewind buffers anymore */ - rewind_buffers = NULL; + if (c->rewind != NULL && + (!g_queue_is_empty(c->rewind) || is->offset == 0)) + /* at the beginning or already writing the rewind + buffer list */ + rewind_buffers = c->rewind; + else + /* we don't need the rewind buffers anymore */ + rewind_buffers = NULL; - while (size > 0 && !g_queue_is_empty(c->buffers)) { - size_t copy = read_from_buffer(&c->icy_metadata, c->buffers, - dest + nbytes, size, - rewind_buffers); + while (size > 0 && !g_queue_is_empty(c->buffers)) { + size_t copy = read_from_buffer(&c->icy_metadata, c->buffers, + dest + nbytes, size, + rewind_buffers); - nbytes += copy; - size -= copy; - } + nbytes += copy; + size -= copy; + } + } while (nbytes == 0); if (icy_defined(&c->icy_metadata)) copy_icy_tag(c); |