From: Andre Noll Date: Sun, 23 May 2010 06:42:04 +0000 (+0200) Subject: Move send_chunk() from send_common.c to http_send.c. X-Git-Tag: v0.4.3~13^2~5 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=75c441f2f8de1733cfdaaae2acd8a8d5b7900a7d Move send_chunk() from send_common.c to http_send.c. Due to the previous changes, this function is no longer a generic function as it is only used by the http sender. So move it to http_send.c and make it static, along with the queue_chunk_or_shutdown() helper which is only called from send_chunk(). --- diff --git a/http_send.c b/http_send.c index a530a181..e8b22cf9 100644 --- a/http_send.c +++ b/http_send.c @@ -77,6 +77,66 @@ static void http_shutdown_clients(void) shutdown_clients(hss); } +static int queue_chunk_or_shutdown(struct sender_client *sc, + struct sender_status *ss, const char *buf, size_t num_bytes) +{ + int ret = cq_enqueue(sc->cq, buf, num_bytes); + if (ret < 0) + shutdown_client(sc, ss); + return ret; +} + +/** + * Send one chunk of audio data to a connected client. + * + * \param sc The client. + * \param ss The sender. + * \param current_chunk The number of the chunk to write. + * \param buf The data to write. + * \param len The number of bytes of \a buf. + * \param header_buf The audio file header. + * \param header_len The number of bytes of \a header_buf. + * + * On errors, the client is shut down. If only a part of the buffer could be + * written, the remainder is put into the chunk queue for that client. + */ +static void http_send_chunk(struct sender_client *sc, struct sender_status *ss, + long unsigned current_chunk, const char *buf, size_t len, + const char *header_buf, size_t header_len) +{ + int ret; + + if (!sc->header_sent && current_chunk) { + if (header_buf && header_len > 0) { + ret = queue_chunk_or_shutdown(sc, ss, header_buf, header_len); + if (ret < 0) + goto out; + } + } + sc->header_sent = 1; + ret = send_queued_chunks(sc->fd, sc->cq); + if (ret < 0) { + shutdown_client(sc, ss); + goto out; + } + if (!len) + goto out; + if (!ret) { /* still data left in the queue */ + ret = queue_chunk_or_shutdown(sc, ss, buf, len); + goto out; + } + ret = write_nonblock(sc->fd, buf, len); + if (ret < 0) { + shutdown_client(sc, ss); + goto out; + } + if (ret != len) + ret = queue_chunk_or_shutdown(sc, ss, buf + ret, len - ret); +out: + if (ret < 0) + PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); +} + static void http_send(long unsigned current_chunk, __a_unused long unsigned chunks_sent, const char *buf, size_t len, const char *header_buf, size_t header_len) @@ -87,7 +147,7 @@ static void http_send(long unsigned current_chunk, struct private_http_sender_data *phsd = sc->private_data; if (phsd->status == HTTP_STREAMING) - send_chunk(sc, hss, current_chunk, buf, len, + http_send_chunk(sc, hss, current_chunk, buf, len, header_buf, header_len); } } diff --git a/send.h b/send.h index 80a268bf..df0cd1cb 100644 --- a/send.h +++ b/send.h @@ -160,9 +160,6 @@ struct sender_status { void shutdown_client(struct sender_client *sc, struct sender_status *ss); void shutdown_clients(struct sender_status *ss); -void send_chunk(struct sender_client *sc, struct sender_status *ss, - long unsigned current_chunk, const char *buf, size_t len, - const char *header_buf, size_t header_len); void init_sender_status(struct sender_status *ss, char **access_arg, int num_access_args, int port, int max_clients, int default_deny); char *get_sender_info(struct sender_status *ss, const char *name); diff --git a/send_common.c b/send_common.c index cf1cd37b..dea96081 100644 --- a/send_common.c +++ b/send_common.c @@ -96,15 +96,6 @@ void shutdown_clients(struct sender_status *ss) shutdown_client(sc, ss); } -static int queue_chunk_or_shutdown(struct sender_client *sc, - struct sender_status *ss, const char *buf, size_t num_bytes) -{ - int ret = cq_enqueue(sc->cq, buf, num_bytes); - if (ret < 0) - shutdown_client(sc, ss); - return ret; -} - /** * Try to empty the chunk queue for this fd. * @@ -133,57 +124,6 @@ int send_queued_chunks(int fd, struct chunk_queue *cq) return 1; } -/** - * Send one chunk of audio data to a connected client. - * - * \param sc The client. - * \param ss The sender. - * \param current_chunk The number of the chunk to write. - * \param buf The data to write. - * \param len The number of bytes of \a buf. - * \param header_buf The audio file header. - * \param header_len The number of bytes of \a header_buf. - * - * On errors, the client is shut down. If only a part of the buffer could be - * written, the remainder is put into the chunk queue for that client. - */ -void send_chunk(struct sender_client *sc, struct sender_status *ss, - long unsigned current_chunk, const char *buf, size_t len, - const char *header_buf, size_t header_len) -{ - int ret; - - if (!sc->header_sent && current_chunk) { - if (header_buf && header_len > 0) { - ret = queue_chunk_or_shutdown(sc, ss, header_buf, header_len); - if (ret < 0) - goto out; - } - } - sc->header_sent = 1; - ret = send_queued_chunks(sc->fd, sc->cq); - if (ret < 0) { - shutdown_client(sc, ss); - goto out; - } - if (!len) - goto out; - if (!ret) { /* still data left in the queue */ - ret = queue_chunk_or_shutdown(sc, ss, buf, len); - goto out; - } - ret = write_nonblock(sc->fd, buf, len); - if (ret < 0) { - shutdown_client(sc, ss); - goto out; - } - if (ret != len) - ret = queue_chunk_or_shutdown(sc, ss, buf + ret, len - ret); -out: - if (ret < 0) - PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); -} - /** * Initialize a struct sender status. *