Move send_chunk() from send_common.c to http_send.c.
authorAndre Noll <maan@systemlinux.org>
Sun, 23 May 2010 06:42:04 +0000 (08:42 +0200)
committerAndre Noll <maan@systemlinux.org>
Wed, 9 Jun 2010 17:53:26 +0000 (19:53 +0200)
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().

http_send.c
send.h
send_common.c

index a530a181e5bdc566d731adf4ef268a4fac17bd2f..e8b22cf9958959b48d3d84855aeaf45cb1a5cf62 100644 (file)
@@ -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 80a268bf3d824bf2a60e4de9426715629420d898..df0cd1cb0612c1f3e52078e1d3478423566c8152 100644 (file)
--- 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);
index cf1cd37b7863ec438af70e246ca41538d4638408..dea96081d43a51209a0d667cbf8f73a9ff11e08d 100644 (file)
@@ -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.
  *