static struct hostent *my_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *hostp, char *buffer, int buflen, int *h_errnop) { struct hostent dest; struct hostent *src; struct hostent *rval = NULL; /* FIXME this should have been done in 'erl'_init()? */ if (!ei_resolve_initialized) ei_init_resolve(); #ifdef _REENTRANT /* === BEGIN critical section === */ if (ei_mutex_lock(ei_gethost_sem,0) != 0) { *h_errnop = NO_RECOVERY; return NULL; } #endif /* _REENTRANT */ /* lookup the data */ if ((src = ei_gethostbyaddr(addr,length,type))) { /* copy to caller's buffer */ if (!copy_hostent(&dest,src,buffer,buflen)) { /* success */ *hostp = dest; *h_errnop = 0; rval = hostp; } else { /* failure - buffer size */ #ifdef __WIN32__ SetLastError(ERROR_INSUFFICIENT_BUFFER); #else errno = ERANGE; #endif *h_errnop = 0; } } else { /* failure - lookup */ #ifdef __WIN32__ *h_errnop = WSAGetLastError(); #else *h_errnop = h_errno; #endif } #ifdef _REENTRANT /* === END critical section === */ ei_mutex_unlock(ei_gethost_sem); #endif /* _REENTRANT */ return rval; }
/* NOTE: don't call this directly - please use erl_init() macro defined in ei_locking.h! */ void erl_init(void *hp,long heap_size) { erl_init_malloc(hp, heap_size); erl_init_marshal(); ei_init_resolve(); }