Implement two suggestions by Jonathan Giddy: (1) in AIX, clear the
data struct before calling gethostby{name,addr}_r(); (2) ignore the 3/5/6 args determinations made by the configure script and switch on platform identifiers instead: AIX, OSF have 3 args Sun, SGI have 5 args Linux has 6 args On all other platforms, undef HAVE_GETHOSTBYNAME_R altogether.
This commit is contained in:
parent
7b6c71f5a4
commit
e7de2061b4
|
@ -87,6 +87,22 @@ Socket methods:
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
|
||||||
|
#undef HAVE_GETHOSTBYNAME_R_3_ARG
|
||||||
|
#undef HAVE_GETHOSTBYNAME_R_5_ARG
|
||||||
|
#undef HAVE_GETHOSTBYNAME_R_6_ARG
|
||||||
|
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R
|
||||||
|
#if defined(_AIX) || defined(__osf__)
|
||||||
|
#define HAVE_GETHOSTBYNAME_R_3_ARG
|
||||||
|
#elif defined(__sun__) || defined(__sgi)
|
||||||
|
#define HAVE_GETHOSTBYNAME_R_5_ARG
|
||||||
|
#elif defined(linux)
|
||||||
|
#define HAVE_GETHOSTBYNAME_R_6_ARG
|
||||||
|
#else
|
||||||
|
#undef HAVE_GETHOSTBYNAME_R
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
|
#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
|
||||||
#define USE_GETHOSTBYNAME_LOCK
|
#define USE_GETHOSTBYNAME_LOCK
|
||||||
#endif
|
#endif
|
||||||
|
@ -373,6 +389,7 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
|
||||||
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
|
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
|
||||||
hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
|
hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
|
||||||
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
||||||
|
memset((void *) &data, '\0', sizeof(data));
|
||||||
result = gethostbyname_r(name, &hp_allocated, &data);
|
result = gethostbyname_r(name, &hp_allocated, &data);
|
||||||
hp = (result != 0) ? NULL : &hp_allocated;
|
hp = (result != 0) ? NULL : &hp_allocated;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1451,6 +1468,7 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
|
||||||
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
|
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
|
||||||
h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
|
h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
|
||||||
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
||||||
|
memset((void *) &data, '\0', sizeof(data));
|
||||||
result = gethostbyname_r(name, &hp_allocated, &data);
|
result = gethostbyname_r(name, &hp_allocated, &data);
|
||||||
h = (result != 0) ? NULL : &hp_allocated;
|
h = (result != 0) ? NULL : &hp_allocated;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1516,6 +1534,7 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
|
||||||
AF_INET,
|
AF_INET,
|
||||||
&hp_allocated, buf, buf_len, &errnop);
|
&hp_allocated, buf, buf_len, &errnop);
|
||||||
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
|
||||||
|
memset((void *) &data, '\0', sizeof(data));
|
||||||
result = gethostbyaddr_r((char *)&addr.sin_addr,
|
result = gethostbyaddr_r((char *)&addr.sin_addr,
|
||||||
sizeof(addr.sin_addr),
|
sizeof(addr.sin_addr),
|
||||||
AF_INET, &hp_allocated, &data);
|
AF_INET, &hp_allocated, &data);
|
||||||
|
|
Loading…
Reference in New Issue