move rc4_send_key and rc4_recv_key to struct private_client_data
[paraslash.git] / http_send.c
index 276c0e416bb1218b2c24788bbe86f671da58731c..5eebba5612bd845190bc573fe3d73895e7c60c50 100644 (file)
@@ -29,6 +29,7 @@
 #include "error.h"
 #include "net.h"
 #include "string.h"
+#include "fd.h"
 
 /** \cond convert sock_addr_in to ascii */
 #define CLIENT_ADDR(hc) inet_ntoa((hc)->addr.sin_addr)
@@ -115,7 +116,7 @@ static void http_shutdown_client(struct http_client *hc, const char *msg)
                hc->fd, msg);
        numclients--;
        close(hc->fd);
-
+       del_close_on_fork_list(hc->fd);
        list_for_each_entry_safe(qp, tmp, &hc->packet_queue, node) {
                free(qp->packet);
                list_del(&qp->node);
@@ -123,21 +124,13 @@ static void http_shutdown_client(struct http_client *hc, const char *msg)
        }
        list_del(&hc->node);
        free(hc);
-       return;
 }
 
-static void http_shutdown_clients_real(void)
-{
-       struct http_client *hc, *tmp;
-       list_for_each_entry_safe(hc, tmp, &clients, node)
-               http_shutdown_client(hc, "afs request");
-}
 static void http_shutdown_clients(void)
 {
        struct http_client *hc, *tmp;
        list_for_each_entry_safe(hc, tmp, &clients, node)
-               if (hc->status == HTTP_STREAMING)
-                       http_shutdown_client(hc, "afs request");
+               http_shutdown_client(hc, "afs request");
 }
 
 static int http_send_msg(struct http_client *hc, const char *msg)
@@ -205,9 +198,8 @@ static int send_queued_packets(struct http_client *hc)
        return 1;
 }
 
-static void http_send(__unused struct audio_format *af,
-               long unsigned current_chunk,
-               __unused long unsigned chunks_sent, const char *buf, size_t len)
+static void http_send( long unsigned current_chunk,
+       __a_unused long unsigned chunks_sent, const char *buf, size_t len)
 {
        struct http_client *hc, *tmp;
        int ret;
@@ -217,12 +209,10 @@ static void http_send(__unused struct audio_format *af,
                                hc->status != HTTP_READY_TO_STREAM)
                        continue;
                if (hc->status == HTTP_READY_TO_STREAM) {
-                       if (af->get_header_info && current_chunk) {
+                       int hlen;
+                       char *buf = afs_get_header(&hlen);
+                       if (buf && hlen > 0 && current_chunk) {
                                /* need to send header */
-                               int hlen;
-                               char *buf = af->get_header_info(&hlen);
-                               if (!buf || hlen <= 0)
-                                       continue; /* header not yet available */
                                PARA_INFO_LOG("queueing header: %d\n", hlen);
                                if (queue_packet(hc, buf, hlen) < 0)
                                        continue;
@@ -266,8 +256,7 @@ static int host_in_access_perm_list(struct http_client *hc)
        return 0;
 }
 
-static void http_post_select(__unused struct audio_format *af, fd_set *rfds,
-               fd_set *wfds)
+static void http_post_select(fd_set *rfds, fd_set *wfds)
 {
        int i = -1, match;
        struct http_client *hc, *tmp;
@@ -337,6 +326,8 @@ static void http_post_select(__unused struct audio_format *af, fd_set *rfds,
                CLIENT_ADDR(hc), hc->fd);
        numclients++;
        list_add(&hc->node, &clients);
+       add_close_on_fork_list(hc->fd);
+       mark_fd_nonblock(hc->fd);
        return;
 err_out:
        PARA_WARNING_LOG("ignoring connect request from %s (%s)\n",
@@ -346,15 +337,13 @@ err_out:
        free(hc);
 }
 
-static void http_pre_select(struct audio_format *af, int *max_fileno, fd_set *rfds,
-               fd_set *wfds)
+static void http_pre_select(int *max_fileno, fd_set *rfds, fd_set *wfds)
 {
        struct http_client *hc, *tmp;
 
        if (server_fd < 0)
                return;
-       FD_SET(server_fd, rfds);
-       *max_fileno = MAX(*max_fileno, server_fd);
+       para_fd_set(server_fd, rfds, max_fileno);
        list_for_each_entry_safe(hc, tmp, &clients, node) {
                //PARA_DEBUG_LOG("hc %p on fd %d: status %d\n", hc, hc->fd, hc->status);
                hc->check_r = 0;
@@ -364,21 +353,18 @@ static void http_pre_select(struct audio_format *af, int *max_fileno, fd_set *rf
                case HTTP_READY_TO_STREAM:
                        break;
                case HTTP_CONNECTED: /* need to recv get request */
-                       FD_SET(hc->fd, rfds);
-                       *max_fileno = MAX(*max_fileno, hc->fd);
+                       para_fd_set(hc->fd, rfds, max_fileno);
                        hc->check_r = 1;
                        break;
                case HTTP_GOT_GET_REQUEST: /* need to send ok msg */
                case HTTP_INVALID_GET_REQUEST: /* need to send err msg */
-                       FD_SET(hc->fd, wfds);
-                       *max_fileno = MAX(*max_fileno, hc->fd);
+                       para_fd_set(hc->fd, wfds, max_fileno);
                        hc->check_w = 1;
                        break;
                case HTTP_SENT_OK_MSG:
-                       if (!af || !afs_playing())
+                       if (!afs_playing())
                                break; /* wait until server starts playing */
-                       FD_SET(hc->fd, wfds);
-                       *max_fileno = MAX(*max_fileno, hc->fd);
+                       para_fd_set(hc->fd, wfds, max_fileno);
                        hc->check_w = 1;
                        break;
                }
@@ -389,7 +375,7 @@ static int open_tcp_port(int port)
 {
        server_fd = init_tcp_socket(port);
        if (server_fd < 0) {
-               http_shutdown_clients_real();
+               http_shutdown_clients();
                self->status = SENDER_OFF;
                return server_fd;
        }
@@ -398,14 +384,14 @@ static int open_tcp_port(int port)
        return 1;
 }
 
-static int http_com_on(__unused struct sender_command_data *scd)
+static int http_com_on(__a_unused struct sender_command_data *scd)
 {
        if (self->status == SENDER_ON)
                return 1;
        return open_tcp_port(conf.http_port_arg);
 }
 
-static int http_com_off(__unused struct sender_command_data *scd)
+static int http_com_off(__a_unused struct sender_command_data *scd)
 {
        self->status = SENDER_OFF;
        if (server_fd > 0) {
@@ -413,7 +399,7 @@ static int http_com_off(__unused struct sender_command_data *scd)
                del_close_on_fork_list(server_fd);
                server_fd = -1;
        }
-       http_shutdown_clients_real();
+       http_shutdown_clients();
        return 1;
 }
 
@@ -564,6 +550,6 @@ void http_send_init(struct sender *s)
        self = s;
        init_access_control_list();
        if (!conf.http_no_autostart_given)
-               open_tcp_port(conf.http_port_arg);
+               open_tcp_port(conf.http_port_arg); /* ignore errors */
        PARA_DEBUG_LOG("%s", "http sender init complete\n");
 }