Exemplo n.º 1
0
int
gethostent_r(struct hostent* hptr, char* buffer, size_t buflen,
             struct hostent** result, int* h_errnop) {
    struct hostent_data* hed;
    struct hostent he;
    res_state statp;
    statp = __res_state();

    if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) {
        RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
        *h_errnop = statp->res_h_errno;
        return (-1);
    }

    if ((hed = __hostent_data_init()) == NULL) {
        RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
        *h_errnop = statp->res_h_errno;
        return (-1);
    }

    if (gethostent_p(&he, hed, statp->options & RES_USE_INET6, statp) != 0) {
        return (-1);
    }

    if (__copy_hostent(&he, hptr, buffer, buflen) != 0) {
        return (-1);
    }

    *result = hptr;
    return (0);
}
Exemplo n.º 2
0
struct hostent *
_gethostbynisaddr(const void *addr, socklen_t len, int af)
{
#ifdef YP
	struct hostent *he;
	struct hostent_data *hed;
	u_long oresopt;
	int error;
	res_state statp;

	statp = __res_state();
	if ((he = __hostent_init()) == NULL ||
	    (hed = __hostent_data_init()) == NULL) {
		RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
		return (NULL);
	}

	oresopt = statp->options;
	statp->options &= ~RES_USE_INET6;
	error = _gethostbynisaddr_r(addr, len, af, he, hed);
	statp->options = oresopt;
	return (error == 0) ? he : NULL;
#else
	return (NULL);
#endif
}
Exemplo n.º 3
0
int
_ht_gethostbyaddr(void* rval, void* cb_data, va_list ap) {
    const void* addr;
    socklen_t len;
    int af;
    char* buffer;
    size_t buflen;
    int* errnop, *h_errnop;
    struct hostent* hptr, he;
    struct hostent_data* hed;
    res_state statp;
    int error;
    addr = va_arg(ap, const void*);
    len = va_arg(ap, socklen_t);
    af = va_arg(ap, int);
    hptr = va_arg(ap, struct hostent*);
    buffer = va_arg(ap, char*);
    buflen = va_arg(ap, size_t);
    errnop = va_arg(ap, int*);
    h_errnop = va_arg(ap, int*);
    *((struct hostent**)rval) = NULL;
    statp = __res_state();

    if ((hed = __hostent_data_init()) == NULL) {
        RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
        *h_errnop = statp->res_h_errno;
        return (NS_NOTFOUND);
    }

    _sethosthtent(0, hed);

    while ((error = gethostent_p(&he, hed, 0, statp)) == 0)
        if (he.h_addrtype == af && !bcmp(he.h_addr, addr, len)) {
            if (he.h_addrtype == AF_INET &&
                    statp->options & RES_USE_INET6) {
                _map_v4v6_address(he.h_addr, he.h_addr);
                he.h_length = IN6ADDRSZ;
                he.h_addrtype = AF_INET6;
            }

            break;
        }

    _endhosthtent(hed);

    if (error != 0) {
        return (NS_NOTFOUND);
    }

    if (__copy_hostent(&he, hptr, buffer, buflen) != 0) {
        *h_errnop = statp->res_h_errno;
        return (NS_NOTFOUND);
    }

    *((struct hostent**)rval) = hptr;
    return (NS_SUCCESS);
}
Exemplo n.º 4
0
int
_nis_gethostbyaddr(void *rval, void *cb_data, va_list ap)
{
#ifdef YP
	const void *addr;
	socklen_t len;
	int af;
	char *buffer;
	size_t buflen;
	int *errnop, *h_errnop;
	struct hostent *hptr, he;
	struct hostent_data *hed;
	res_state statp;

	addr = va_arg(ap, const void *);
	len = va_arg(ap, socklen_t);
	af = va_arg(ap, int);
	hptr = va_arg(ap, struct hostent *);
	buffer = va_arg(ap, char *);
	buflen = va_arg(ap, size_t);
	errnop = va_arg(ap, int *);
	h_errnop = va_arg(ap, int *);

	*((struct hostent **)rval) = NULL;

	statp = __res_state();
	if ((hed = __hostent_data_init()) == NULL) {
		RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
		*h_errnop = statp->res_h_errno;
		return (NS_NOTFOUND);
	}

	if (_gethostbynisaddr_r(addr, len, af, &he, hed) != 0) {
		*h_errnop = statp->res_h_errno;
		return (NS_NOTFOUND);
	}
	if (__copy_hostent(&he, hptr, buffer, buflen) != 0) {
		*errnop = errno;
		RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
		*h_errnop = statp->res_h_errno;
		return (NS_RETURN);
	}
	*((struct hostent **)rval) = hptr;
	return (NS_SUCCESS);
#else
	*((struct hostent **)rval) = NULL;
	return (NS_UNAVAIL);
#endif
}
Exemplo n.º 5
0
int
_ht_gethostbyname(void* rval, void* cb_data, va_list ap) {
    const char* name;
    int af;
    char* buffer;
    size_t buflen;
    int* errnop, *h_errnop;
    struct hostent* hptr, he;
    struct hostent_data* hed;
    char** cp;
    res_state statp;
    int error;
    name = va_arg(ap, const char*);
    af = va_arg(ap, int);
    hptr = va_arg(ap, struct hostent*);
    buffer = va_arg(ap, char*);
    buflen = va_arg(ap, size_t);
    errnop = va_arg(ap, int*);
    h_errnop = va_arg(ap, int*);
    *((struct hostent**)rval) = NULL;
    statp = __res_state();

    if ((hed = __hostent_data_init()) == NULL) {
        RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
        *h_errnop = statp->res_h_errno;
        return (NS_NOTFOUND);
    }

    _sethosthtent(0, hed);

    while ((error = gethostent_p(&he, hed, 0, statp)) == 0) {
        if (he.h_addrtype != af) {
            continue;
        }

        if (he.h_addrtype == AF_INET &&
                statp->options & RES_USE_INET6) {
            _map_v4v6_address(he.h_addr, he.h_addr);
            he.h_length = IN6ADDRSZ;
            he.h_addrtype = AF_INET6;
        }

        if (strcasecmp(he.h_name, name) == 0) {
            break;
        }

        for (cp = he.h_aliases; *cp != 0; cp++)
            if (strcasecmp(*cp, name) == 0) {
                goto found;
            }
    }

found:
    _endhosthtent(hed);

    if (error != 0) {
        *h_errnop = statp->res_h_errno;
        return (NS_NOTFOUND);
    }

    if (__copy_hostent(&he, hptr, buffer, buflen) != 0) {
        *h_errnop = statp->res_h_errno;
        return (NS_NOTFOUND);
    }

    *((struct hostent**)rval) = hptr;
    return (NS_SUCCESS);
}