diff options
Diffstat (limited to 'contrib/fwd/src/fwd.c')
-rw-r--r-- | contrib/fwd/src/fwd.c | 320 |
1 files changed, 0 insertions, 320 deletions
diff --git a/contrib/fwd/src/fwd.c b/contrib/fwd/src/fwd.c deleted file mode 100644 index 662524e35..000000000 --- a/contrib/fwd/src/fwd.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * fwd - OpenWrt firewall daemon - main part - * - * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org> - * - * The fwd program is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * The fwd 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 the fwd program. If not, see http://www.gnu.org/licenses/. - */ - - -#include "fwd.h" -#include "fwd_addr.h" -#include "fwd_rules.h" -#include "fwd_config.h" -#include "fwd_xtables.h" -#include "fwd_ipc.h" -#include "fwd_utils.h" - - -static void fwd_foreach_network( - struct fwd_handle *h, - void (*cb)(struct fwd_handle *h, struct fwd_network *net) -) { - struct fwd_data *data; - struct fwd_network *net; - - for( data = h->conf; data; data = data->next ) - { - if( data->type != FWD_S_ZONE ) - continue; - - for( net = data->section.zone.networks; net; net = net->next ) - cb(h, net); - } -} - -static void fwd_addif_all_cb(struct fwd_handle *h, struct fwd_network *net) -{ - fwd_ipt_addif(h, net->name); -} - -static void fwd_delif_all_cb(struct fwd_handle *h, struct fwd_network *net) -{ - fwd_ipt_delif(h, net->name); -} - -#define fwd_addif_all(h) fwd_foreach_network(h, fwd_addif_all_cb) -#define fwd_delif_all(h) fwd_foreach_network(h, fwd_delif_all_cb) - - -static int fwd_server_main(int argc, const char *argv[]) -{ - struct fwd_handle *h; - struct fwd_network *net; - struct fwd_addr *addrs; - struct fwd_data *data; - struct fwd_cidr *addr_old, *addr_new; - struct sigaction sa; - int unix_client; - - sa.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &sa, NULL); - - if( getuid() > 0 ) - fwd_fatal("Need root permissions!"); - - if( !(h = fwd_alloc_ptr(struct fwd_handle)) ) - fwd_fatal("Out of memory"); - - if( (h->rtnl_socket = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1 ) - fwd_fatal("Failed to create AF_NETLINK socket (%m)"); - - if( (h->unix_socket = fwd_ipc_listen()) == -1 ) - fwd_fatal("Failed to create AF_UNIX socket (%m)"); - - if( !(h->conf = fwd_read_config(h)) ) - fwd_fatal("Failed to read configuration"); - - fwd_log_init(); - - fwd_ipt_build_ruleset(h); - fwd_addif_all(h); - - while(1) - { - if( (addrs = fwd_get_addrs(h->rtnl_socket, AF_INET)) != NULL ) - { - for( data = h->conf; data; data = data->next ) - { - if( data->type != FWD_S_ZONE ) - continue; - - for( net = data->section.zone.networks; net; net = net->next ) - { - addr_new = fwd_lookup_addr(addrs, net->ifname); - addr_old = net->addr; - - if( !fwd_empty_cidr(addr_new) && fwd_empty_cidr(addr_old) ) - { - fwd_log_info( - "Interface %s brought up - adding rules", - net->ifname - ); - - fwd_update_cidr(addr_old, addr_new); - fwd_ipt_addif(h, net->name); - } - else if( fwd_empty_cidr(addr_new) && !fwd_empty_cidr(addr_old) ) - { - fwd_log_info( - "Interface %s went down - removing rules", - net->ifname - ); - - fwd_update_cidr(addr_old, NULL); - fwd_ipt_delif(h, net->name); - } - else if( ! fwd_equal_cidr(addr_old, addr_new) ) - { - fwd_log_info( - "Interface %s changed IP - rebuilding rules", - net->ifname - ); - - fwd_update_cidr(addr_old, addr_new); - fwd_ipt_chgif(h, net->name); - } - } - } - - fwd_free_addrs(addrs); - } - - - if( (unix_client = fwd_ipc_accept(h->unix_socket)) > -1 ) - { - struct fwd_ipc_msg msg; - memset(&msg, 0, sizeof(struct fwd_ipc_msg)); - - while( fwd_ipc_recvmsg(unix_client, &msg, sizeof(struct fwd_ipc_msg)) > 0 ) - { - fwd_log_info("Got message [%i]", msg.type); - - switch(msg.type) - { - case FWD_IPC_FLUSH: - fwd_log_info("Flushing rules ..."); - fwd_ipt_clear_ruleset(h); - fwd_ipc_sendtype(unix_client, FWD_IPC_OK); - break; - - case FWD_IPC_BUILD: - fwd_log_info("Building rules ..."); - fwd_ipt_clear_ruleset(h); - fwd_ipt_build_ruleset(h); - fwd_addif_all(h); - fwd_ipc_sendtype(unix_client, FWD_IPC_OK); - break; - - case FWD_IPC_RELOAD: - if( (data = fwd_read_config(h)) != NULL ) - { - fwd_log_info("Flushing rules ..."); - fwd_ipt_clear_ruleset(h); - fwd_free_config(h->conf); - h->conf = data; - fwd_log_info("Building rules ..."); - fwd_ipt_build_ruleset(h); - fwd_addif_all(h); - fwd_ipc_sendtype(unix_client, FWD_IPC_OK); - } - else - { - fwd_log_err("Cannot reload configuration!"); - fwd_ipc_sendtype(unix_client, FWD_IPC_ERROR); - } - break; - - case FWD_IPC_ADDIF: - case FWD_IPC_DELIF: - if( strlen(msg.data.network) > 0 ) - { - fwd_ipt_delif(h, msg.data.network); - - if( msg.type == FWD_IPC_ADDIF ) - fwd_ipt_addif(h, msg.data.network); - - fwd_ipc_sendtype(unix_client, FWD_IPC_OK); - } - else - { - fwd_log_err("No network name provided!"); - fwd_ipc_sendtype(unix_client, FWD_IPC_ERROR); - } - break; - - case FWD_IPC_OK: - case FWD_IPC_ERROR: - break; - } - } - - fwd_ipc_shutdown(unix_client); - } - - - sleep(1); - } - - fwd_delif_all(h); - fwd_ipt_clear_ruleset(h); - - close(h->rtnl_socket); - fwd_free_config(h->conf); - fwd_free_ptr(h); - - return 0; -} - -static void fwd_client_usage(const char *msg) -{ - printf( - "%s\n\n" - "Usage:\n" - " fw flush\n" - " Flush all rules in the firewall and reset policy\n\n" - " fw build\n" - " Rebuild firewall rules\n\n" - " fw reload\n" - " Reload configuration and rebuild firewall rules\n\n" - " fw addif {network}\n" - " Add rules for given network\n\n" - " fw delif {network}\n" - " Remove rules for given network\n\n" - "", msg - ); - - exit(1); -} - -static int fwd_client_main(int argc, const char *argv[]) -{ - int unix_server; - struct fwd_ipc_msg msg; - enum fwd_ipc_msgtype type; - - if( argc < 2 ) - fwd_client_usage("Command required"); - - if( (unix_server = fwd_ipc_connect()) < 0 ) - fwd_fatal("Cannot connect to server instance (%m)"); - - - memset(&msg, 0, sizeof(struct fwd_ipc_msg)); - - if( !strcmp(argv[1], "flush") ) - type = FWD_IPC_FLUSH; - - else if( !strcmp(argv[1], "build") ) - type = FWD_IPC_BUILD; - - else if( !strcmp(argv[1], "reload") ) - type = FWD_IPC_RELOAD; - - else if( !strcmp(argv[1], "addif") || !strcmp(argv[1], "delif") ) - { - if( argc < 3 ) - fwd_client_usage("The command requires a parameter."); - - type = strcmp(argv[1], "addif") ? FWD_IPC_DELIF : FWD_IPC_ADDIF; - strncpy(msg.data.network, argv[2], sizeof(msg.data.network)); - } - - else - fwd_client_usage("Invalid command given."); - - msg.type = type; - fwd_ipc_sendmsg(unix_server, &msg, sizeof(struct fwd_ipc_msg)); - - memset(&msg, 0, sizeof(struct fwd_ipc_msg)); - - while( fwd_ipc_recvmsg(unix_server, &msg, sizeof(struct fwd_ipc_msg)) == 0 ) - continue; - - switch(msg.type) - { - case FWD_IPC_OK: - printf("Success\n"); - break; - - case FWD_IPC_ERROR: - printf("The server reported an error, check logread!\n"); - break; - - default: - fwd_fatal("Unexpected response type %i", msg.type); - } - - fwd_ipc_shutdown(unix_server); - - return 0; -} - -int main(int argc, const char *argv[]) -{ - if( strstr(argv[0], "fwd") ) - return fwd_server_main(argc, argv); - else - return fwd_client_main(argc, argv); -} - |