X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=send_common.c;h=90242d5c9b5ccb125617004e16fbf9b64d5484f6;hb=0b0434f3debae3fc5cd768f5de32f84f05e79761;hp=f7770a01394e9b0089ff4b5dc20b2befcf54e5bb;hpb=4fbe16430b4776814128d7110682c69d1b047c57;p=paraslash.git diff --git a/send_common.c b/send_common.c index f7770a01..90242d5c 100644 --- a/send_common.c +++ b/send_common.c @@ -44,10 +44,12 @@ */ 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); + if (!process_is_command_handler()) { + PARA_INFO_LOG("shutting down %s on fd %d\n", sc->name, sc->fd); + close(sc->fd); + del_close_on_fork_list(sc->fd); + } free(sc->name); - close(sc->fd); - del_close_on_fork_list(sc->fd); cq_destroy(sc->cq); list_del(&sc->node); free(sc->private_data); @@ -134,9 +136,9 @@ void init_sender_status(struct sender_status *ss, } ss->default_port = default_port; - INIT_LIST_HEAD(&ss->client_list); + init_list_head(&ss->client_list); /* Initialize an access control list */ - INIT_LIST_HEAD(&ss->acl); + 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]; @@ -152,6 +154,25 @@ void init_sender_status(struct sender_status *ss, ss->default_deny = default_deny; } +/** + * Deallocate all resources allocated in \ref init_sender_status(). + * + * \param ss The structure whose components should be freed. + * + * This frees the dynamically allocated parts of the structure which was + * initialized by an earlier call to \ref init_sender_status(). It does *not* + * call free(ss), though. + */ +void free_sender_status(const struct sender_status *ss) +{ + int i; + + free(ss->listen_fds); + FOR_EACH_LISTEN_FD(i, ss) + free(ss->listen_addresses[i]); + free(ss->listen_addresses); +} + /** * Return a string containing the current status of a sender. * @@ -217,6 +238,22 @@ void generic_com_allow(struct sender_command_data *scd, 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. *