X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fmisc%2Ftcpwrapper.c;h=0ba856f9819d6af0593a0e47fe267120df33fd16;hp=977dfcaf5a11d0fa3dc9babe7fb849a32e8b015f;hb=ae8e7dbe9641dbc69c34bcede416f0d91612d3f1;hpb=6e3f696e788a56f30b5b3f8250647fe4cd63c884 diff --git a/support/misc/tcpwrapper.c b/support/misc/tcpwrapper.c index 977dfca..0ba856f 100644 --- a/support/misc/tcpwrapper.c +++ b/support/misc/tcpwrapper.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include "xlog.h" @@ -108,8 +108,8 @@ typedef struct _hash_head { TAILQ_HEAD(host_list, _haccess_t) h_head; } hash_head; hash_head haccess_tbl[HASH_TABLE_SIZE]; -static haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long, u_long); -static void haccess_add(struct sockaddr_in *addr, u_long, u_long, int); +static haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long); +static void haccess_add(struct sockaddr_in *addr, u_long, int); inline unsigned int strtoint(char *str) { @@ -122,15 +122,14 @@ inline unsigned int strtoint(char *str) return n; } -inline int hashint(unsigned int num) +static inline int hashint(unsigned int num) { return num % HASH_TABLE_SIZE; } -#define HASH(_addr, _proc, _prog) \ - hashint((strtoint((_addr))+(_proc)+(_prog))) +#define HASH(_addr, _prog) \ + hashint((strtoint((_addr))+(_prog))) -void haccess_add(struct sockaddr_in *addr, u_long proc, - u_long prog, int access) +void haccess_add(struct sockaddr_in *addr, u_long prog, int access) { hash_head *head; haccess_t *hptr; @@ -140,7 +139,7 @@ void haccess_add(struct sockaddr_in *addr, u_long proc, if (hptr == NULL) return; - hash = HASH(inet_ntoa(addr->sin_addr), proc, prog); + hash = HASH(inet_ntoa(addr->sin_addr), prog); head = &(haccess_tbl[hash]); hptr->access = access; @@ -151,13 +150,13 @@ void haccess_add(struct sockaddr_in *addr, u_long proc, else TAILQ_INSERT_TAIL(&head->h_head, hptr, list); } -haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long proc, u_long prog) +haccess_t *haccess_lookup(struct sockaddr_in *addr, u_long prog) { hash_head *head; haccess_t *hptr; int hash; - hash = HASH(inet_ntoa(addr->sin_addr), proc, prog); + hash = HASH(inet_ntoa(addr->sin_addr), prog); head = &(haccess_tbl[hash]); TAILQ_FOREACH(hptr, &head->h_head, list) { @@ -172,58 +171,15 @@ good_client(daemon, addr) char *daemon; struct sockaddr_in *addr; { - struct hostent *hp; - char **sp; - char *tmpname; - - /* First check the address. */ - if (hosts_ctl(daemon, "", inet_ntoa(addr->sin_addr), "") == DENY) - return DENY; - - /* Now do the hostname lookup */ - hp = gethostbyaddr ((const char *) &(addr->sin_addr), - sizeof (addr->sin_addr), AF_INET); - if (!hp) { - xlog(L_WARNING, - "Warning: Client IP address '%s' not found in host lookup", - inet_ntoa(addr->sin_addr)); - return DENY; /* never heard of it. misconfigured DNS? */ - } - - /* Make sure the hostent is authorative. */ - tmpname = strdup(hp->h_name); - if (!tmpname) { - xlog(L_WARNING, "Warning: No memory for Host access check"); - return DENY; - } - hp = gethostbyname(tmpname); - if (!hp) { - xlog(L_WARNING, - "Warning: Client hostname '%s' not found in host lookup", tmpname); - free(tmpname); - return DENY; /* never heard of it. misconfigured DNS? */ - } - free(tmpname); - - /* Now make sure the address is on the list */ - for (sp = hp->h_addr_list ; *sp ; sp++) { - if (memcmp(*sp, &(addr->sin_addr), hp->h_length) == 0) - break; - } - if (!*sp) - return DENY; /* it was a FAKE. */ + struct request_info req; - /* Check the official name and address. */ - if (hosts_ctl(daemon, hp->h_name, inet_ntoa(addr->sin_addr), "") == DENY) - return DENY; + request_init(&req, RQ_DAEMON, daemon, RQ_CLIENT_SIN, addr, 0); + sock_methods(&req); - /* Now check aliases. */ - for (sp = hp->h_aliases; *sp ; sp++) { - if (hosts_ctl(daemon, *sp, inet_ntoa(addr->sin_addr), "") == DENY) - return DENY; - } + if (hosts_access(&req)) + return ALLOW; - return ALLOW; + return DENY; } /* check_startup - additional startup code */ @@ -302,7 +258,7 @@ u_long prog; haccess_t *acc = NULL; int changed = check_files(); - acc = haccess_lookup(addr, proc, prog); + acc = haccess_lookup(addr, prog); if (acc && changed == 0) return (acc->access); @@ -311,7 +267,7 @@ u_long prog; if (acc) acc->access = FALSE; else - haccess_add(addr, proc, prog, FALSE); + haccess_add(addr, prog, FALSE); return (FALSE); } if (verboselog) @@ -320,7 +276,7 @@ u_long prog; if (acc) acc->access = TRUE; else - haccess_add(addr, proc, prog, TRUE); + haccess_add(addr, prog, TRUE); return (TRUE); }