Port c-ares to z/OS.

Fix By: Dhrumil Rana (@dhrumilrana)
pull/394/head
dhrumilrana 4 years ago committed by GitHub
parent 44fbc81368
commit 3c0bc079b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      CMakeLists.txt
  2. 9
      configure.ac
  3. 2
      include/ares.h
  4. 51
      src/lib/ares_init.c
  5. 5
      src/lib/ares_setup.h
  6. 4
      src/lib/ares_strsplit.c

@ -138,7 +138,7 @@ return 0;
MACOS_V1012)
ENDIF ()
IF ((IOS OR APPLE) AND HAVE_LIBRESOLV)
IF ((IOS OR APPLE OR ZOS) AND HAVE_LIBRESOLV)
SET (CARES_USE_LIBRESOLV 1)
ENDIF()

@ -386,6 +386,15 @@ AS_IF([test "x$host_vendor" = "xapple"], [
])
])
dnl resolv lib for z/OS
AS_IF([test "x$host_vendor" = "xibm" -a "x$host_os" = "xopenedition" ], [
AC_SEARCH_LIBS([res_init], [resolv], [
AC_DEFINE([CARES_USE_LIBRESOLV], [1], [Use resolver library to configure cares])
], [
AC_MSG_ERROR([Unable to find libresolv which is required for z/OS])
])
])
dnl resolve lib?
AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ])

@ -39,7 +39,7 @@
#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
defined(__QNXNTO__)
defined(__QNXNTO__) || defined(__MVS__)
#include <sys/select.h>
#endif
#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))

@ -1472,7 +1472,58 @@ static int init_by_resolv_conf(ares_channel channel)
/* Catch the case when all the above checks fail (which happens when there
is no network card or the cable is unplugged) */
status = ARES_EFILE;
#elif defined(__MVS__)
struct __res_state *res = 0;
int count4, count6;
__STATEEXTIPV6 *v6;
struct server_state *pserver
if (0 == res) {
int rc = res_init();
while (rc == -1 && h_errno == TRY_AGAIN) {
rc = res_init();
}
if (rc == -1) {
return ARES_ENOMEM;
}
res = __res();
}
v6 = res->__res_extIPv6;
count4 = res->nscount;
if (v6) {
count6 = v6->__stat_nscount;
} else {
count6 = 0;
}
nservers = count4 + count6;
servers = ares_malloc(nservers * sizeof(struct server_state));
if (!servers)
return ARES_ENOMEM;
memset(servers, 0, nservers * sizeof(struct server_state));
pserver = servers;
for (int i = 0; i < count4; ++i, ++pserver) {
struct sockaddr_in *addr_in = &(res->nsaddr_list[i]);
pserver->addr.addrV4.s_addr = addr_in->sin_addr.s_addr;
pserver->addr.family = AF_INET;
pserver->addr.udp_port = addr_in->sin_port;
pserver->addr.tcp_port = addr_in->sin_port;
}
for (int j = 0; j < count6; ++j, ++pserver) {
struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[j]);
memcpy(&(pserver->addr.addr.addr6), &(addr_in->sin6_addr),
sizeof(addr_in->sin6_addr));
pserver->addr.family = AF_INET6;
pserver->addr.udp_port = addr_in->sin6_port;
pserver->addr.tcp_port = addr_in->sin6_port;
}
status = ARES_EOF;
#elif defined(__riscos__)
/* Under RISC OS, name servers are listed in the

@ -178,8 +178,11 @@
/*
* Android does have the arpa/nameser.h header which is detected by configure
* but it appears to be empty with recent NDK r7b / r7c, so we undefine here.
* z/OS does have the arpa/nameser.h header which is detected by configure
* but it is not fully implemented and missing identifiers, so udefine here.
*/
#if (defined(ANDROID) || defined(__ANDROID__)) && defined(HAVE_ARPA_NAMESER_H)
#if (defined(ANDROID) || defined(__ANDROID__) || defined(__MVS__)) && \
defined(HAVE_ARPA_NAMESER_H)
# undef HAVE_ARPA_NAMESER_H
#endif

@ -13,6 +13,10 @@
* without express or implied warranty.
*/
#if defined(__MVS__)
#include <strings.h>
#endif
#include "ares_setup.h"
#include "ares_strsplit.h"
#include "ares.h"

Loading…
Cancel
Save