+ 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) )
+ {
+ printf("IFUP[%s]\n", 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) )
+ {
+ printf("IFDOWN[%s]\n", net->ifname);
+ fwd_update_cidr(addr_old, NULL);
+ fwd_ipt_delif(h, net->name);
+ }
+ else if( ! fwd_equal_cidr(addr_old, addr_new) )
+ {
+ printf("IFCHANGE[%s]\n", 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;