send_common: Combine generic_com_on() and open_sender().
[paraslash.git] / send_common.c
index ec7ab67108334c85085b46b84ada1db45eb91a82..4bb50ce58d7198c4aaf6bdf456b2c5c04aaed442 100644 (file)
@@ -1,8 +1,4 @@
-/*
- * Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file send_common.c Functions used by more than one paraslash sender. */
 
@@ -13,6 +9,7 @@
 #include <arpa/inet.h>
 #include <sys/un.h>
 #include <netdb.h>
+#include <lopsub.h>
 
 #include "para.h"
 #include "error.h"
 /** Clients will be kicked if there are more than that many bytes pending. */
 #define MAX_CQ_BYTES 40000
 
-/**
- * Open a passive socket of given layer4 type.
- *
- * Set the resulting file descriptor to nonblocking mode and add it to the list
- * of fds that are being closed in the child process when the server calls
- * fork().
- *
- * \param l4type The transport-layer protocol.
- * \param port The port number.
- *
- * \return The listening fd on success, negative on errors.
- */
-static int open_sender(unsigned l4type, int port)
-{
-       int fd, ret = para_listen_simple(l4type, port);
-
-       if (ret < 0)
-               return ret;
-       fd = ret;
-       ret = mark_fd_nonblocking(fd);
-       if (ret < 0) {
-               close(fd);
-               return ret;
-       }
-       add_close_on_fork_list(fd);
-       return fd;
-}
-
 /**
  * Shut down a client connected to a paraslash sender.
  *
@@ -71,7 +40,7 @@ static int open_sender(unsigned l4type, int port)
  * list, destroy the chunk queue of this client, delete the client from the
  * list of connected clients and free the sender_client struct.
  *
- * \sa shutdown_clients().
+ * \sa \ref shutdown_clients().
  */
 void shutdown_client(struct sender_client *sc, struct sender_status *ss)
 {
@@ -133,19 +102,33 @@ int send_queued_chunks(int fd, struct chunk_queue *cq)
  * Initialize a struct sender status.
  *
  * \param ss The struct to initialize.
- * \param access_arg The array of access arguments given at the command line.
- * \param num_access_args The number of elements in \a access_arg.
+ * \param acl_opt_result Contains array of --{http|dccp}-access arguments.
  * \param port The tcp or dccp port to listen on.
  * \param max_clients The maximal number of simultaneous connections.
  * \param default_deny Whether a blacklist should be used for access control.
  */
-void init_sender_status(struct sender_status *ss, char **access_arg,
-       int num_access_args, int port, int max_clients, int default_deny)
+void init_sender_status(struct sender_status *ss,
+               const struct lls_opt_result *acl_opt_result, int port,
+               int max_clients, int default_deny)
 {
+       int i;
+
        ss->listen_fd = -1;
        INIT_LIST_HEAD(&ss->client_list);
        ss->port = port;
-       acl_init(&ss->acl, access_arg, num_access_args);
+
+       /* Initialize an access control list */
+       INIT_LIST_HEAD(&ss->acl);
+       for (i = 0; i < lls_opt_given(acl_opt_result); i++) {
+               const char *arg = lls_string_val(i, acl_opt_result);
+               char addr[16];
+               int mask;
+               if (!parse_cidr(arg, addr, sizeof(addr), &mask))
+                       PARA_WARNING_LOG("ACL syntax error: %s, ignoring\n",
+                               arg);
+               else
+                       acl_add_entry(&ss->acl, addr, mask);
+       }
        ss->num_clients = 0;
        ss->max_clients = max_clients;
        ss->default_deny = default_deny;
@@ -197,7 +180,7 @@ char *generic_sender_status(struct sender_status *ss, const char *name)
  * \param scd Contains the IP and the netmask.
  * \param ss The sender.
  *
- * \sa generic_com_deny().
+ * \sa \ref generic_com_deny().
  */
 void generic_com_allow(struct sender_command_data *scd,
                struct sender_status *ss)
@@ -211,7 +194,7 @@ void generic_com_allow(struct sender_command_data *scd,
  * \param scd see \ref generic_com_allow().
  * \param ss see \ref generic_com_allow().
  *
- * \sa generic_com_allow().
+ * \sa \ref generic_com_allow().
  */
 void generic_com_deny(struct sender_command_data *scd,
                struct sender_status *ss)
@@ -229,13 +212,20 @@ void generic_com_deny(struct sender_command_data *scd,
  */
 int generic_com_on(struct sender_status *ss, unsigned protocol)
 {
-       int ret;
+       int fd, ret;
 
        if (ss->listen_fd >= 0)
                return 1;
-       ret = open_sender(protocol, ss->port);
+       ret = para_listen_simple(protocol, ss->port);
        if (ret < 0)
                return ret;
+       fd = ret;
+       ret = mark_fd_nonblocking(fd);
+       if (ret < 0) {
+               close(fd);
+               return ret;
+       }
+       add_close_on_fork_list(fd);
        ss->listen_fd = ret;
        return 1;
 }
@@ -247,7 +237,7 @@ int generic_com_on(struct sender_status *ss, unsigned protocol)
  *
  * \param ss The sender to deactivate.
  *
- * \sa \ref del_close_on_fork_list(), shutdown_clients().
+ * \sa \ref del_close_on_fork_list(), \ref shutdown_clients().
  */
 void generic_com_off(struct sender_status *ss)
 {
@@ -266,9 +256,8 @@ void generic_com_off(struct sender_status *ss)
  * \param ss The sender whose listening fd is ready for reading.
  * \param rfds Passed to para_accept(),
  *
- * This must be called only if the socket fd of \a ss is ready for reading.  It
- * calls para_accept() to accept the connection and performs the following
- * actions on the resulting file descriptor \a fd:
+ * This calls para_accept() and performs the following actions on the resulting
+ * file descriptor fd:
  *
  *     - Checks whether the maximal number of connections are exceeded.
  *     - Sets \a fd to nonblocking mode.