void resolve_host_argument_list(struct host_argument_list_s * n) { struct addrinfo * a = NULL, * i; struct addrinfo hints; int r; struct host_argument_list_s * list = NULL; struct host_argument_s * host = NULL; if (n->list) { resolve_host_argument_list(n->list); } if (n->arg) { memset(&hints, 0, sizeof(struct addrinfo)); /* any address family is good */ hints.ai_family = PF_UNSPEC; /* return hostname, though we don't use it, for debugging */ hints.ai_flags = AI_CANONNAME; /* limit so duplicate hosts aren't returned for each socktype */ hints.ai_socktype = SOCK_STREAM; if (n->arg->host) { r = getaddrinfo(n->arg->host, NULL, &hints, &a); switch (r) { case 0: /* replace the hostname with the IP */ free(n->arg->host); /* getnameinfo does no allocation. */ n->arg->host = malloc(NI_MAXHOST + 1); if (getnameinfo(a->ai_addr, a->ai_addrlen, n->arg->host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) { /* if there's more, create some more hosts */ for (i = a->ai_next; i; i = i->ai_next) { list = malloc(sizeof(struct host_argument_list_s)); host = malloc(sizeof(struct host_argument_s)); host->host = malloc(NI_MAXHOST + 1); if (getnameinfo(i->ai_addr, i->ai_addrlen, host->host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) { if (n->arg->mask) { host->mask = strdup(n->arg->mask); } /* insert the new node */ list->arg = host; list->list = n->list; n->list = list; } else { fprintf(stderr, "warning: %s\n", strerror(errno)); } } } else { fprintf(stderr, "warning: %s\n", strerror(errno)); } freeaddrinfo(a); break; default: fprintf(stderr, "warning: %s: %s\n", gai_strerror(r), n->arg->host); break; } } } }
void resolve_host_specifier(struct host_specifier_s * n) { if (n->list) { resolve_host_argument_list(n->list); } }
void resolve_host_specifier(struct host_specifier_s * n, struct filtergen_opts * o) { if (n->list) { resolve_host_argument_list(n->list, o); } }