int allow_access(const union sockaddr_u *su) { /* A host not in the allow set is denied, but only if the --allow or --allowfile option was given. */ if (o.allow && !addrset_contains(&o.allowset, &su->sockaddr)) return 0; if (addrset_contains(&o.denyset, &su->sockaddr)) return 0; return 1; }
int main(int argc, char *argv[]) { struct addrset *set; char line[1024]; int i; #ifdef WIN32 win_init(); #endif set = addrset_new(); options_init(); for (i = 1; i < argc; i++) { if (!addrset_add_spec(set, argv[i], o.af, !o.nodns)) { fprintf(stderr, "Error adding spec \"%s\".\n", argv[i]); exit(1); } } while (fgets(line, sizeof(line), stdin) != NULL) { char *s, *hostname; struct addrinfo *addrs; s = line; while ((hostname = strtok(s, " \t\n")) != NULL) { int rc; s = NULL; rc = resolve_name(hostname, &addrs); if (rc != 0) { fprintf(stderr, "Error resolving \"%s\": %s.\n", hostname, gai_strerror(rc)); continue; } if (addrs == NULL) { fprintf(stderr, "No addresses found for \"%s\".\n", hostname); continue; } /* Check just the first address returned. */ if (addrset_contains(set, addrs->ai_addr)) printf("%s\n", hostname); freeaddrinfo(addrs); } } addrset_free(set); return 0; }