net.h: add missing __printf_2_3 attribute to send_va_buffer()
[paraslash.git] / http_send.c
index 6aa82e448b558c4b4068daaed70c8930d1f1e9e3..c01c6c96e91df812a835fb83b84c0cb2122277f5 100644 (file)
@@ -1,19 +1,7 @@
 /*
- * Copyright (C) 2005-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2007 Andre Noll <maan@systemlinux.org>
  *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file http_send.c paraslash's http sender */
@@ -22,7 +10,7 @@
 #include "server.cmdline.h"
 #include "server.h"
 #include "http.h"
-#include "afs.h"
+#include "vss.h"
 #include "send.h"
 #include "list.h"
 #include "close_on_fork.h"
@@ -38,8 +26,6 @@
 #define HTTP_ERR_MSG "HTTP/1.0 400 Bad Request\n"
 /** \endcond */
 
-extern struct gengetopt_args_info conf;
-
 /** the possible states of a client from the server's POV */
 enum http_status {
        HTTP_CONNECTED,
@@ -100,7 +86,7 @@ struct access_info {
        /** the address to be black/whitelisted */
        struct in_addr addr;
        /** the netmask for this entry */
-       int netmask;
+       unsigned netmask;
        /** the position of this entry in the access_perm_list */
        struct list_head node;
 };
@@ -116,7 +102,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);
@@ -124,21 +110,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, "vss request");
 }
 
 static int http_send_msg(struct http_client *hc, const char *msg)
@@ -217,12 +195,12 @@ static void http_send( long unsigned current_chunk,
                                hc->status != HTTP_READY_TO_STREAM)
                        continue;
                if (hc->status == HTTP_READY_TO_STREAM) {
-                       int hlen;
-                       char *buf = afs_get_header(&hlen);
-                       if (buf && hlen > 0 && current_chunk) {
+                       unsigned hlen;
+                       char *hbuf = vss_get_header(&hlen);
+                       if (hbuf && hlen > 0 && current_chunk) {
                                /* need to send header */
                                PARA_INFO_LOG("queueing header: %d\n", hlen);
-                               if (queue_packet(hc, buf, hlen) < 0)
+                               if (queue_packet(hc, hbuf, hlen) < 0)
                                        continue;
                        } else
                                PARA_INFO_LOG("%s", "no need to queue header\n");
@@ -257,7 +235,7 @@ static int host_in_access_perm_list(struct http_client *hc)
 {
        struct access_info *ai, *tmp;
        list_for_each_entry_safe(ai, tmp, &access_perm_list, node) {
-               unsigned mask = ((~0) >> ai->netmask);
+               unsigned mask = ((~0U) >> ai->netmask);
                if ((hc->addr.sin_addr.s_addr & mask) == (ai->addr.s_addr & mask))
                        return 1;
        }
@@ -333,7 +311,9 @@ static void http_post_select(fd_set *rfds, fd_set *wfds)
        PARA_INFO_LOG("accepted client #%d: %s (fd %d)\n", numclients,
                CLIENT_ADDR(hc), hc->fd);
        numclients++;
-       list_add(&hc->node, &clients);
+       para_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",
@@ -368,7 +348,7 @@ static void http_pre_select(int *max_fileno, fd_set *rfds, fd_set *wfds)
                        hc->check_w = 1;
                        break;
                case HTTP_SENT_OK_MSG:
-                       if (!afs_playing())
+                       if (!vss_playing())
                                break; /* wait until server starts playing */
                        para_fd_set(hc->fd, wfds, max_fileno);
                        hc->check_w = 1;
@@ -379,12 +359,19 @@ static void http_pre_select(int *max_fileno, fd_set *rfds, fd_set *wfds)
 
 static int open_tcp_port(int port)
 {
+       int ret;
+
        server_fd = init_tcp_socket(port);
        if (server_fd < 0) {
-               http_shutdown_clients_real();
+               http_shutdown_clients();
                self->status = SENDER_OFF;
                return server_fd;
        }
+       ret = mark_fd_nonblock(server_fd);
+       if (ret < 0) {
+               PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+               exit(EXIT_FAILURE);
+       }
        self->status = SENDER_ON;
        add_close_on_fork_list(server_fd);
        return 1;
@@ -405,7 +392,7 @@ static int http_com_off(__a_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;
 }
 
@@ -433,7 +420,7 @@ static void add_perm_list_entry(struct sender_command_data *scd)
        ai->netmask = scd->netmask;
        PARA_INFO_LOG("adding %s/%i to access list\n", inet_ntoa(ai->addr),
                ai->netmask);
-       list_add(&ai->node, &access_perm_list);
+       para_list_add(&ai->node, &access_perm_list);
 }
 
 static int http_com_deny(struct sender_command_data *scd)