aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-10-11 23:13:49 +0200
committerMax Kellermann <max@duempel.org>2009-10-11 23:13:49 +0200
commitaf92b1c2d815befec7bd9541e76c5402bcbf05c4 (patch)
treee4715e53cc1a17bfa617f2f428b4b54feb00eed8
parent016558093ba9fa7bd030367e50feca303fb012ca (diff)
downloadmpd-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).
-rw-r--r--NEWS2
-rw-r--r--src/input/curl_input_plugin.c42
2 files changed, 24 insertions, 20 deletions
diff --git a/NEWS b/NEWS
index 3847f0eda..9ece8b56b 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,6 @@
ver 0.15.5 (2009/??/??)
+* input:
+ - curl: don't abort if a packet has only metadata
ver 0.15.4 (2009/10/03)
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);