コード例 #1
0
ファイル: gethostbyht.c プロジェクト: mysticTot/learn_c
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);
}
コード例 #2
0
static void
hostent_data_free(void *ptr)
{
	struct hostent_data *hed = ptr;

	if (hed == NULL)
		return;
	hed->stayopen = 0;
	_endhosthtent(hed);
	free(hed);
}
コード例 #3
0
ファイル: gethostbyht.c プロジェクト: mysticTot/learn_c
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);
}