--- access_old.c 2007-11-10 15:47:51.644148816 +1100 +++ access.c 2007-11-10 15:51:49.369009144 +1100 @@ -211,6 +211,46 @@ static int match_address(char *addr, cha return ret; } +static int match_hostlookup(char *addr, char *tok) +{ + struct hostent *hp; + char *p; + unsigned int len; + + + p = strchr(tok,'/'); + if (p) { + *p = '\0'; + len = p - tok; + } else + len = strlen(tok); + + /* Fail quietly if tok is a an address) */ + if (strspn(tok, ".0123456789") != len +#ifdef INET6 + && strchr(tok, ':') == NULL +#endif + ) + ; + else { + return 0; + } + + hp = gethostbyname(tok); + if (hp == NULL) { + return 0; + } else { + unsigned int i; + for (i=0; hp -> h_addr_list[i] != NULL; i++) { + char *tok = inet_ntoa( *( struct in_addr*)( hp -> h_addr_list[i])); + if (match_address(addr, tok)) + return 1; + } + } + return 0; +} + + static int access_match(char *list, char *addr, char *host) { char *tok; @@ -224,7 +264,7 @@ static int access_match(char *list, char strlower(host); for (tok = strtok(list2, " ,\t"); tok; tok = strtok(NULL, " ,\t")) { - if (match_hostname(host, tok) || match_address(addr, tok)) { + if (match_hostname(host, tok) || match_address(addr, tok) || match_hostlookup(addr, tok)) { free(list2); return 1; }