Пример #1
0
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;
            }
        }
    }
}
Пример #2
0
void resolve_host_specifier(struct host_specifier_s * n) {
    if (n->list) {
        resolve_host_argument_list(n->list);
    }
}
Пример #3
0
void resolve_host_specifier(struct host_specifier_s * n, struct filtergen_opts * o) {
    if (n->list) {
        resolve_host_argument_list(n->list, o);
    }
}