rearrange to allow internal/private use of ares_writev to any system
that lacks the writev function.
This commit is contained in:
parent
ee5f13cb6b
commit
aa41743ebd
@ -5,12 +5,12 @@ ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c \
|
|||||||
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
||||||
ares_expand_name.c ares_parse_a_reply.c windows_port.c ares_strdup.c \
|
ares_expand_name.c ares_parse_a_reply.c windows_port.c ares_strdup.c \
|
||||||
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
|
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
|
||||||
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c \
|
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c ares_writev.c \
|
||||||
ares_parse_ns_reply.c ares_llist.c ares__timeval.c ares_strcasecmp.c
|
ares_parse_ns_reply.c ares_llist.c ares__timeval.c ares_strcasecmp.c
|
||||||
|
|
||||||
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
|
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
|
||||||
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h \
|
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h setup_once.h \
|
||||||
setup_once.h ares_llist.h ares_strdup.h ares_strcasecmp.h
|
ares_llist.h ares_strdup.h ares_strcasecmp.h ares_writev.h
|
||||||
|
|
||||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||||
|
@ -74,6 +74,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
|||||||
$(OBJ_DIR)\windows_port.obj \
|
$(OBJ_DIR)\windows_port.obj \
|
||||||
$(OBJ_DIR)\ares_expand_string.obj \
|
$(OBJ_DIR)\ares_expand_string.obj \
|
||||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
||||||
|
$(OBJ_DIR)\ares_writev.obj \
|
||||||
$(OBJ_DIR)\bitncmp.obj \
|
$(OBJ_DIR)\bitncmp.obj \
|
||||||
$(OBJ_DIR)\inet_net_pton.obj \
|
$(OBJ_DIR)\inet_net_pton.obj \
|
||||||
$(OBJ_DIR)\inet_ntop.obj
|
$(OBJ_DIR)\inet_ntop.obj
|
||||||
@ -246,3 +247,6 @@ $(OBJ_DIR)\ares_getopt.obj: ares_getopt.c ares_getopt.h
|
|||||||
|
|
||||||
$(OBJ_DIR)\ares_llist.obj: ares_llist.c setup.h setup_once.h ares.h \
|
$(OBJ_DIR)\ares_llist.obj: ares_llist.c setup.h setup_once.h ares.h \
|
||||||
ares_private.h ares_llist.h
|
ares_private.h ares_llist.h
|
||||||
|
|
||||||
|
$(OBJ_DIR)\ares_writev.obj: ares_writev.c setup.h setup_once.h ares.h \
|
||||||
|
ares_writev.h
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
#undef closesocket
|
#undef closesocket
|
||||||
#define closesocket(s) close_s(s)
|
#define closesocket(s) close_s(s)
|
||||||
#define writev(s,v,c) writev_s(s,v,c)
|
#define writev(s,v,c) writev_s(s,v,c)
|
||||||
|
#define HAVE_WRITEV 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NETWARE
|
#ifdef NETWARE
|
||||||
@ -109,6 +110,11 @@
|
|||||||
# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n)
|
# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_WRITEV
|
||||||
|
# include "ares_writev.h"
|
||||||
|
# define writev(s,ptr,cnt) ares_writev(s,ptr,cnt)
|
||||||
|
#endif
|
||||||
|
|
||||||
struct query;
|
struct query;
|
||||||
|
|
||||||
struct send_request {
|
struct send_request {
|
||||||
|
77
ares/ares_writev.c
Normal file
77
ares/ares_writev.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_WRITEV
|
||||||
|
ssize_t ares_writev(ares_socket_t s, const struct iovec *iov, int iovcnt)
|
||||||
|
{
|
||||||
|
char *buffer, *bp;
|
||||||
|
int i;
|
||||||
|
size_t bytes = 0;
|
||||||
|
ssize_t result;
|
||||||
|
|
||||||
|
/* Validate iovcnt */
|
||||||
|
if (iovcnt <= 0)
|
||||||
|
{
|
||||||
|
SET_ERRNO(EINVAL);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Validate and find the sum of the iov_len values in the iov array */
|
||||||
|
for (i = 0; i < iovcnt; i++)
|
||||||
|
{
|
||||||
|
if (iov[i].iov_len > INT_MAX - bytes)
|
||||||
|
{
|
||||||
|
SET_ERRNO(EINVAL);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
bytes += iov[i].iov_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes == 0)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* Allocate a temporary buffer to hold the data */
|
||||||
|
buffer = malloc(bytes);
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
SET_ERRNO(ENOMEM);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the data into buffer */
|
||||||
|
for (bp = buffer, i = 0; i < iovcnt; ++i)
|
||||||
|
{
|
||||||
|
memcpy (bp, iov[i].iov_base, iov[i].iov_len);
|
||||||
|
bp += iov[i].iov_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send buffer contents */
|
||||||
|
result = swrite(s, buffer, bytes);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
37
ares/ares_writev.h
Normal file
37
ares/ares_writev.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#ifndef HEADER_CARES_WRITEV_H
|
||||||
|
#define HEADER_CARES_WRITEV_H
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
#include "ares.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_WRITEV
|
||||||
|
|
||||||
|
/* Structure for scatter/gather I/O. */
|
||||||
|
struct iovec
|
||||||
|
{
|
||||||
|
void *iov_base; /* Pointer to data. */
|
||||||
|
size_t iov_len; /* Length of data. */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern ssize_t ares_writev(ares_socket_t s, const struct iovec *iov, int iovcnt);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HEADER_CARES_WRITEV_H */
|
@ -545,6 +545,7 @@ AC_CHECK_HEADERS(
|
|||||||
sys/socket.h \
|
sys/socket.h \
|
||||||
sys/ioctl.h \
|
sys/ioctl.h \
|
||||||
sys/param.h \
|
sys/param.h \
|
||||||
|
sys/uio.h \
|
||||||
netdb.h \
|
netdb.h \
|
||||||
netinet/in.h \
|
netinet/in.h \
|
||||||
netinet/tcp.h \
|
netinet/tcp.h \
|
||||||
@ -651,6 +652,7 @@ CARES_CHECK_FUNC_STRICMP
|
|||||||
CARES_CHECK_FUNC_STRNCASECMP
|
CARES_CHECK_FUNC_STRNCASECMP
|
||||||
CARES_CHECK_FUNC_STRNCMPI
|
CARES_CHECK_FUNC_STRNCMPI
|
||||||
CARES_CHECK_FUNC_STRNICMP
|
CARES_CHECK_FUNC_STRNICMP
|
||||||
|
CARES_CHECK_FUNC_WRITEV
|
||||||
|
|
||||||
|
|
||||||
dnl check for AF_INET6
|
dnl check for AF_INET6
|
||||||
|
@ -43,6 +43,27 @@ cares_includes_string="\
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CARES_INCLUDES_SYS_UIO
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Set up variable with list of headers that must be
|
||||||
|
dnl included when sys/uio.h is to be included.
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_INCLUDES_SYS_UIO], [
|
||||||
|
cares_includes_sys_uio="\
|
||||||
|
/* includes start */
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_UIO_H
|
||||||
|
# include <sys/uio.h>
|
||||||
|
#endif
|
||||||
|
/* includes end */"
|
||||||
|
AC_CHECK_HEADERS(
|
||||||
|
sys/types.h sys/uio.h,
|
||||||
|
[], [], [$cares_includes_sys_uio])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl CARES_CHECK_FUNC_STRCASECMP
|
dnl CARES_CHECK_FUNC_STRCASECMP
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Verify if strcasecmp is available, prototyped, and
|
dnl Verify if strcasecmp is available, prototyped, and
|
||||||
@ -636,3 +657,88 @@ AC_DEFUN([CARES_CHECK_FUNC_STRNICMP], [
|
|||||||
ac_cv_func_strnicmp="no"
|
ac_cv_func_strnicmp="no"
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CARES_CHECK_FUNC_WRITEV
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Verify if writev is available, prototyped, and
|
||||||
|
dnl can be compiled. If all of these are true, and
|
||||||
|
dnl usage has not been previously disallowed with
|
||||||
|
dnl shell variable cares_disallow_writev, then
|
||||||
|
dnl HAVE_WRITEV will be defined.
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_CHECK_FUNC_WRITEV], [
|
||||||
|
AC_REQUIRE([CARES_INCLUDES_SYS_UIO])dnl
|
||||||
|
#
|
||||||
|
tst_links_writev="unknown"
|
||||||
|
tst_proto_writev="unknown"
|
||||||
|
tst_compi_writev="unknown"
|
||||||
|
tst_allow_writev="unknown"
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if writev can be linked])
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_FUNC_LINK_TRY([writev])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_links_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_links_writev="no"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$tst_links_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev is prototyped])
|
||||||
|
AC_EGREP_CPP([writev],[
|
||||||
|
$cares_includes_sys_uio
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_proto_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_proto_writev="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$tst_proto_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev is compilable])
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([[
|
||||||
|
$cares_includes_sys_uio
|
||||||
|
]],[[
|
||||||
|
if(0 != writev(0, 0, 0))
|
||||||
|
return 1;
|
||||||
|
]])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_compi_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_compi_writev="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$tst_compi_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev usage allowed])
|
||||||
|
if test "x$cares_disallow_writev" != "xyes"; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_allow_writev="yes"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_allow_writev="no"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if writev might be used])
|
||||||
|
if test "$tst_links_writev" = "yes" &&
|
||||||
|
test "$tst_proto_writev" = "yes" &&
|
||||||
|
test "$tst_compi_writev" = "yes" &&
|
||||||
|
test "$tst_allow_writev" = "yes"; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WRITEV, 1,
|
||||||
|
[Define to 1 if you have the writev function.])
|
||||||
|
ac_cv_func_writev="yes"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
ac_cv_func_writev="no"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
@ -13,20 +13,10 @@
|
|||||||
|
|
||||||
#ifndef NETWARE
|
#ifndef NETWARE
|
||||||
|
|
||||||
/* Structure for scatter/gather I/O. */
|
|
||||||
struct iovec
|
|
||||||
{
|
|
||||||
void *iov_base; /* Pointer to data. */
|
|
||||||
size_t iov_len; /* Length of data. */
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef __WATCOMC__
|
#ifndef __WATCOMC__
|
||||||
#define getpid() _getpid()
|
#define getpid() _getpid()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
|
||||||
#define writev(s,vect,count) ares_writev(s,vect,count)
|
|
||||||
|
|
||||||
#endif /* !NETWARE */
|
#endif /* !NETWARE */
|
||||||
|
|
||||||
#define NS_CMPRSFLGS 0xc0
|
#define NS_CMPRSFLGS 0xc0
|
||||||
@ -94,6 +84,8 @@ typedef enum __ns_type {
|
|||||||
ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
|
ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
|
||||||
ns_t_sink = 40, /* Kitchen sink (experimentatl) */
|
ns_t_sink = 40, /* Kitchen sink (experimentatl) */
|
||||||
ns_t_opt = 41, /* EDNS0 option (meta-RR) */
|
ns_t_opt = 41, /* EDNS0 option (meta-RR) */
|
||||||
|
ns_t_apl = 42, /* Address prefix list (RFC3123) */
|
||||||
|
ns_t_tkey = 249, /* Transaction key */
|
||||||
ns_t_tsig = 250, /* Transaction signature. */
|
ns_t_tsig = 250, /* Transaction signature. */
|
||||||
ns_t_ixfr = 251, /* Incremental zone transfer. */
|
ns_t_ixfr = 251, /* Incremental zone transfer. */
|
||||||
ns_t_axfr = 252, /* Transfer zone of authority. */
|
ns_t_axfr = 252, /* Transfer zone of authority. */
|
||||||
|
@ -197,6 +197,10 @@ SOURCE=..\..\ares_version.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_writev.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\bitncmp.c
|
SOURCE=..\..\bitncmp.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@ -245,6 +249,10 @@ SOURCE=..\..\ares_version.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_writev.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\bitncmp.h
|
SOURCE=..\..\bitncmp.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@ -34,36 +34,5 @@ WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
|
||||||
ares_writev (ares_socket_t s, const struct iovec *vector, size_t count)
|
|
||||||
{
|
|
||||||
char *buffer, *bp;
|
|
||||||
size_t i, bytes = 0;
|
|
||||||
|
|
||||||
/* Find the total number of bytes to write
|
|
||||||
*/
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
bytes += vector[i].iov_len;
|
|
||||||
|
|
||||||
if (bytes == 0) /* not an error */
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/* Allocate a temporary buffer to hold the data
|
|
||||||
*/
|
|
||||||
buffer = bp = (char*) alloca (bytes);
|
|
||||||
if (!buffer)
|
|
||||||
{
|
|
||||||
SET_ERRNO(ENOMEM);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the data into buffer.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
memcpy (bp, vector[i].iov_base, vector[i].iov_len);
|
|
||||||
bp += vector[i].iov_len;
|
|
||||||
}
|
|
||||||
return (int)swrite(s, buffer, bytes);
|
|
||||||
}
|
|
||||||
#endif /* WIN32 builds only */
|
#endif /* WIN32 builds only */
|
||||||
|
@ -1900,6 +1900,7 @@ AC_CHECK_HEADERS(
|
|||||||
sys/select.h \
|
sys/select.h \
|
||||||
sys/socket.h \
|
sys/socket.h \
|
||||||
sys/ioctl.h \
|
sys/ioctl.h \
|
||||||
|
sys/uio.h \
|
||||||
assert.h \
|
assert.h \
|
||||||
unistd.h \
|
unistd.h \
|
||||||
stdlib.h \
|
stdlib.h \
|
||||||
@ -2051,6 +2052,7 @@ CURL_CHECK_FUNC_STRNCMPI
|
|||||||
CURL_CHECK_FUNC_STRNICMP
|
CURL_CHECK_FUNC_STRNICMP
|
||||||
CURL_CHECK_FUNC_STRTOK_R
|
CURL_CHECK_FUNC_STRTOK_R
|
||||||
CURL_CHECK_FUNC_STRTOLL
|
CURL_CHECK_FUNC_STRTOLL
|
||||||
|
CURL_CHECK_FUNC_WRITEV
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
dnl AC_PROG_GCC_TRADITIONAL
|
dnl AC_PROG_GCC_TRADITIONAL
|
||||||
|
@ -112,6 +112,27 @@ curl_includes_string="\
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_INCLUDES_SYS_UIO
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Set up variable with list of headers that must be
|
||||||
|
dnl included when sys/uio.h is to be included.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_INCLUDES_SYS_UIO], [
|
||||||
|
curl_includes_sys_uio="\
|
||||||
|
/* includes start */
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_UIO_H
|
||||||
|
# include <sys/uio.h>
|
||||||
|
#endif
|
||||||
|
/* includes end */"
|
||||||
|
AC_CHECK_HEADERS(
|
||||||
|
sys/types.h sys/uio.h,
|
||||||
|
[], [], [$curl_includes_sys_uio])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl CURL_INCLUDES_TIME
|
dnl CURL_INCLUDES_TIME
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Set up variable with list of headers that must be
|
dnl Set up variable with list of headers that must be
|
||||||
@ -1722,3 +1743,86 @@ AC_DEFUN([CURL_CHECK_FUNC_STRTOLL], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_FUNC_WRITEV
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Verify if writev is available, prototyped, and
|
||||||
|
dnl can be compiled. If all of these are true, and
|
||||||
|
dnl usage has not been previously disallowed with
|
||||||
|
dnl shell variable curl_disallow_writev, then
|
||||||
|
dnl HAVE_WRITEV will be defined.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_FUNC_WRITEV], [
|
||||||
|
AC_REQUIRE([CURL_INCLUDES_SYS_UIO])dnl
|
||||||
|
#
|
||||||
|
tst_links_writev="unknown"
|
||||||
|
tst_proto_writev="unknown"
|
||||||
|
tst_compi_writev="unknown"
|
||||||
|
tst_allow_writev="unknown"
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if writev can be linked])
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_FUNC_LINK_TRY([writev])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_links_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_links_writev="no"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$tst_links_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev is prototyped])
|
||||||
|
AC_EGREP_CPP([writev],[
|
||||||
|
$curl_includes_sys_uio
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_proto_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_proto_writev="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$tst_proto_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev is compilable])
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([[
|
||||||
|
$curl_includes_sys_uio
|
||||||
|
]],[[
|
||||||
|
if(0 != writev(0, 0, 0))
|
||||||
|
return 1;
|
||||||
|
]])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_compi_writev="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_compi_writev="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$tst_compi_writev" = "yes"; then
|
||||||
|
AC_MSG_CHECKING([if writev usage allowed])
|
||||||
|
if test "x$curl_disallow_writev" != "xyes"; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
tst_allow_writev="yes"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
tst_allow_writev="no"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if writev might be used])
|
||||||
|
if test "$tst_links_writev" = "yes" &&
|
||||||
|
test "$tst_proto_writev" = "yes" &&
|
||||||
|
test "$tst_compi_writev" = "yes" &&
|
||||||
|
test "$tst_allow_writev" = "yes"; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WRITEV, 1,
|
||||||
|
[Define to 1 if you have the writev function.])
|
||||||
|
ac_cv_func_writev="yes"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
ac_cv_func_writev="no"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user