diff options
Diffstat (limited to 'contrib/fwd')
-rw-r--r-- | contrib/fwd/src/fwd.h | 35 | ||||
-rw-r--r-- | contrib/fwd/src/fwd_addr.c | 26 | ||||
-rw-r--r-- | contrib/fwd/src/fwd_addr.h | 12 | ||||
-rw-r--r-- | contrib/fwd/src/fwd_xtables.c | 5 | ||||
-rw-r--r-- | contrib/fwd/src/fwd_xtables.h | 4 |
5 files changed, 36 insertions, 46 deletions
diff --git a/contrib/fwd/src/fwd.h b/contrib/fwd/src/fwd.h index 0228daf7b..6de8b880c 100644 --- a/contrib/fwd/src/fwd.h +++ b/contrib/fwd/src/fwd.h @@ -25,13 +25,9 @@ #include <stdarg.h> #include <stdlib.h> #include <getopt.h> +#include <signal.h> #include <netinet/in.h> -#if 0 -#include "fwd_addr.h" -#include "fwd_rules.h" -#include "fwd_config.h" -#endif enum fwd_policy { FWD_P_UNSPEC = 0, @@ -83,12 +79,12 @@ struct fwd_icmptype { int code; }; -struct fwd_network_list { +struct fwd_network { char *name; char *ifname; int isalias; struct fwd_cidr *addr; - struct fwd_network_list *next; + struct fwd_network *next; }; struct fwd_defaults { @@ -103,7 +99,7 @@ struct fwd_defaults { struct fwd_zone { char *name; - struct fwd_network_list *networks; + struct fwd_network *networks; struct fwd_data *forwardings; struct fwd_data *redirects; struct fwd_data *rules; @@ -168,23 +164,11 @@ struct fwd_data { struct fwd_handle { int rtnl_socket; + int unix_socket; struct fwd_data *conf; - struct fwd_addr_list *addrs; }; -/* fwd_zmalloc(size_t) - * Allocates a zeroed buffer of the given size. */ -static void * fwd_zmalloc(size_t s) -{ - void *b = malloc(s); - - if( b != NULL ) - memset(b, 0, s); - - return b; -} - /* fwd_fatal(fmt, ...) * Prints message to stderr and termintes program. */ #define fwd_fatal(...) do { \ @@ -194,14 +178,5 @@ static void * fwd_zmalloc(size_t s) exit(1); \ } while(0) -/* fwd_alloc_ptr(type) - * Allocates a buffer with the size of the given datatype - * and returns a pointer to it. */ -#define fwd_alloc_ptr(t) (t *) fwd_zmalloc(sizeof(t)) - -/* fwd_free_ptr(void *) - * Frees the given pointer and sets it to NULL. - * Safe for NULL values. */ -#define fwd_free_ptr(x) do { if(x != NULL) free(x); x = NULL; } while(0) #endif diff --git a/contrib/fwd/src/fwd_addr.c b/contrib/fwd/src/fwd_addr.c index fd277e9e0..62e65aa62 100644 --- a/contrib/fwd/src/fwd_addr.c +++ b/contrib/fwd/src/fwd_addr.c @@ -19,8 +19,9 @@ #include "fwd.h" #include "fwd_addr.h" +#include "fwd_utils.h" -struct fwd_addr_list * fwd_get_addrs(int fd, int family) +struct fwd_addr * fwd_get_addrs(int fd, int family) { struct { struct nlmsghdr n; @@ -37,7 +38,7 @@ struct fwd_addr_list * fwd_get_addrs(int fd, int family) struct nlmsghdr *nlmp; struct ifaddrmsg *rtmp; - struct fwd_addr_list *head, *entry; + struct fwd_addr *head, *entry; /* Build request */ memset(&req, 0, sizeof(req)); @@ -83,7 +84,7 @@ struct fwd_addr_list * fwd_get_addrs(int fd, int family) rtmp = (struct ifaddrmsg *) NLMSG_DATA(nlmp); rtatp = (struct rtattr *) IFA_RTA(rtmp); - if( !(entry = fwd_alloc_ptr(struct fwd_addr_list)) ) + if( !(entry = fwd_alloc_ptr(struct fwd_addr)) ) goto error; entry->index = rtmp->ifa_index; @@ -124,9 +125,20 @@ struct fwd_addr_list * fwd_get_addrs(int fd, int family) return NULL; } -void fwd_free_addrs(struct fwd_addr_list *head) +struct fwd_cidr * fwd_lookup_addr(struct fwd_addr *head, const char *ifname) { - struct fwd_addr_list *entry = head; + struct fwd_addr *entry; + + for( entry = head; entry; entry = entry->next ) + if( !strncmp(entry->ifname, ifname, IFNAMSIZ) ) + return &entry->ipaddr; + + return NULL; +} + +void fwd_free_addrs(struct fwd_addr *head) +{ + struct fwd_addr *entry = head; while( entry != NULL ) { @@ -138,9 +150,9 @@ void fwd_free_addrs(struct fwd_addr_list *head) head = entry = NULL; } -struct fwd_addr_list * fwd_append_addrs(struct fwd_addr_list *head, struct fwd_addr_list *add) +struct fwd_addr * fwd_append_addrs(struct fwd_addr *head, struct fwd_addr *add) { - struct fwd_addr_list *entry = head; + struct fwd_addr *entry = head; while( entry->next != NULL ) entry = entry->next; diff --git a/contrib/fwd/src/fwd_addr.h b/contrib/fwd/src/fwd_addr.h index 44465705a..3cabe09a0 100644 --- a/contrib/fwd/src/fwd_addr.h +++ b/contrib/fwd/src/fwd_addr.h @@ -28,19 +28,21 @@ #include <arpa/inet.h> -struct fwd_addr_list { +struct fwd_addr { char ifname[IFNAMSIZ]; char label[IFNAMSIZ]; int family; int index; struct fwd_cidr ipaddr; - struct fwd_addr_list *next; + struct fwd_addr *next; }; -struct fwd_addr_list * fwd_get_addrs(int, int); -struct fwd_addr_list * fwd_append_addrs(struct fwd_addr_list *, struct fwd_addr_list *); -void fwd_free_addrs(struct fwd_addr_list *); +struct fwd_addr * fwd_get_addrs(int, int); +struct fwd_addr * fwd_append_addrs(struct fwd_addr *, struct fwd_addr *); +void fwd_free_addrs(struct fwd_addr *); + +struct fwd_cidr * fwd_lookup_addr(struct fwd_addr *, const char *); #define fwd_foreach_addrs(head, entry) for(entry = head; entry; entry = entry->next) diff --git a/contrib/fwd/src/fwd_xtables.c b/contrib/fwd/src/fwd_xtables.c index c0a3c582d..895715d92 100644 --- a/contrib/fwd/src/fwd_xtables.c +++ b/contrib/fwd/src/fwd_xtables.c @@ -19,6 +19,7 @@ #include "fwd.h" #include "fwd_xtables.h" +#include "fwd_utils.h" /* Required by certain extensions like SNAT and DNAT */ @@ -129,7 +130,7 @@ void fwd_xt_parse_proto( } void fwd_xt_parse_in( - struct fwd_xt_rule *r, struct fwd_network_list *n, int inv + struct fwd_xt_rule *r, struct fwd_network *n, int inv ) { if( n != NULL ) { @@ -141,7 +142,7 @@ void fwd_xt_parse_in( } void fwd_xt_parse_out( - struct fwd_xt_rule *r, struct fwd_network_list *n, int inv + struct fwd_xt_rule *r, struct fwd_network *n, int inv ) { if( n != NULL ) { diff --git a/contrib/fwd/src/fwd_xtables.h b/contrib/fwd/src/fwd_xtables.h index 45b638a05..1ac57bb0e 100644 --- a/contrib/fwd/src/fwd_xtables.h +++ b/contrib/fwd/src/fwd_xtables.h @@ -50,8 +50,8 @@ void fwd_xt_init(void); struct fwd_xt_rule * fwd_xt_init_rule(struct iptc_handle *h); void fwd_xt_parse_proto(struct fwd_xt_rule *r, struct fwd_proto *p, int inv); -void fwd_xt_parse_in(struct fwd_xt_rule *r, struct fwd_network_list *n, int inv); -void fwd_xt_parse_out(struct fwd_xt_rule *r, struct fwd_network_list *n, int inv); +void fwd_xt_parse_in(struct fwd_xt_rule *r, struct fwd_network *n, int inv); +void fwd_xt_parse_out(struct fwd_xt_rule *r, struct fwd_network *n, int inv); void fwd_xt_parse_src(struct fwd_xt_rule *r, struct fwd_cidr *c, int inv); void fwd_xt_parse_dest(struct fwd_xt_rule *r, struct fwd_cidr *c, int inv); void fwd_xt_parse_frag(struct fwd_xt_rule *r, int frag, int inv); |