+#if defined(HAVE_GETHOSTBYNAME) && wxUSE_THREADS
+static wxMutex addrLock;
+#endif
+struct hostent * wxGethostbyaddr_r(const char *addr_buf, int buf_size,
+ int proto, struct hostent *h,
+ void *buffer, int size, int *err)
+{
+ struct hostent *he = NULL;
+ *err = 0;
+#if defined(HAVE_FUNC_GETHOSTBYNAME_R_6)
+ if (gethostbyaddr_r(addr_buf, buf_size, proto, h,
+ (char*)buffer, size, &he, err))
+ he = NULL;
+#elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5)
+ he = gethostbyaddr_r(addr_buf, buf_size, proto, h, (char*)buffer, size, err);
+#elif defined(HAVE_FUNC_GETHOSTBYNAME_R_3)
+ if (gethostbyaddr_r(addr_buf, buf_size, proto, h,
+ (struct hostent_data*) buffer))
+ {
+ he = NULL;
+ *err = h_errno;
+ }
+ else
+ he = h;
+#elif defined(HAVE_GETHOSTBYNAME)
+#if wxUSE_THREADS
+ wxMutexLocker locker(addrLock);
+#endif
+ he = gethostbyaddr(addr_buf, buf_size, proto);
+ if (!he)
+ *err = h_errno;
+ else
+ he = deepCopyHostent(h, he, (char*)buffer, size, err);
+#endif
+ return he;