/* helper function for reading data from a client */ int client_read_bytes (client_t *client, void *buf, unsigned len) { int bytes; if (client->refbuf && client->refbuf->len) { /* we have data to read from a refbuf first */ if (client->refbuf->len < len) len = client->refbuf->len; memcpy (buf, client->refbuf->data, len); if (len < client->refbuf->len) { char *ptr = client->refbuf->data; memmove (ptr, ptr+len, client->refbuf->len - len); } client->refbuf->len -= len; return len; } bytes = sock_read_bytes (client->con->sock, buf, len); if (bytes > 0) return bytes; if (bytes < 0) { if (sock_recoverable (sock_error())) return -1; WARN0 ("source connection has died"); } client->con->error = 1; return -1; }
/* handlers (default) for reading and writing a connection_t, no encrpytion * used just straight access to the socket */ int connection_read (connection_t *con, void *buf, size_t len) { int bytes = sock_read_bytes (con->sock, buf, len); if (bytes == 0) con->error = 1; if (bytes == -1 && !sock_recoverable (sock_error())) con->error = 1; return bytes; }
/* main plugin handler for getting a buffer for the queue. In here we * just add an incoming page to the codecs and process it until either * more data is needed or we prodice a buffer for the queue. */ static refbuf_t *ogg_get_buffer (source_t *source) { ogg_state_t *ogg_info = source->format->_state; char *data = NULL; int bytes; while (1) { while (1) { ogg_page page; refbuf_t *refbuf; ogg_codec_t *codec = ogg_info->current; /* if a codec has just been given a page then process it */ if (codec && codec->process) { refbuf = codec->process (ogg_info, codec); if (refbuf) return complete_buffer (source, refbuf); ogg_info->current = NULL; } if (ogg_sync_pageout (&ogg_info->oy, &page) > 0) { if (ogg_page_bos (&page)) { process_initial_page (source->format, &page); continue; } ogg_info->bos_completed = 1; refbuf = process_ogg_page (ogg_info, &page); if (ogg_info->error) { ERROR0 ("Problem processing stream"); source->running = 0; return NULL; } if (refbuf) return complete_buffer (source, refbuf); continue; } /* need more stream data */ break; } /* we need more data to continue getting pages */ data = ogg_sync_buffer (&ogg_info->oy, 4096); bytes = sock_read_bytes (source->con->sock, data, 4096); if (bytes < 0) { if (sock_recoverable (sock_error())) return NULL; WARN0 ("source connection has died"); ogg_sync_wrote (&ogg_info->oy, 0); source->running = 0; return NULL; } if (bytes == 0) { INFO1 ("End of Stream %s", source->mount); ogg_sync_wrote (&ogg_info->oy, 0); source->running = 0; return NULL; } ogg_sync_wrote (&ogg_info->oy, bytes); } }