-/*
- * 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. */
#include <arpa/inet.h>
#include <sys/un.h>
#include <netdb.h>
+#include <lopsub.h>
#include "para.h"
#include "error.h"
* 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)
{
PARA_INFO_LOG("shutting down %s on fd %d\n", sc->name, sc->fd);
free(sc->name);
- close(sc->fd);
- del_close_on_fork_list(sc->fd);
+ if (!process_is_command_handler()) {
+ close(sc->fd);
+ del_close_on_fork_list(sc->fd);
+ }
cq_destroy(sc->cq);
list_del(&sc->node);
free(sc->private_data);
* 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;
* \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)
acl_allow(scd->host, scd->netmask, &ss->acl, ss->default_deny);
}
+/**
+ * Empty the access control list of a sender.
+ *
+ * \param acl The access control list of the sender.
+ *
+ * This is called from the ->shutdown methods of the http and the dccp sender.
+ */
+void generic_acl_deplete(struct list_head *acl)
+{
+ /*
+ * Since default_deny is false, the ACL is considered a blacklist. A
+ * netmask of zero matches any IP address, so this call empties the ACL.
+ */
+ acl_allow("0.0.0.0", 0 /* netmask */, acl, 0 /* default_deny */);
+}
+
/**
* Deny connections from the given range of IP addresses.
*
* \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)
*
* \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)
{