00001
00002
00003 #include "ace/OS_NS_sys_uio.h"
00004
00005 ACE_RCSID(ace, OS_NS_sys_uio, "$Id: OS_NS_sys_uio.cpp 73483 2006-07-13 10:43:30Z olli $")
00006
00007 #if !defined (ACE_HAS_INLINED_OSCALLS)
00008 # include "ace/OS_NS_sys_uio.inl"
00009 #endif
00010
00011 #include "ace/OS_Memory.h"
00012 #include "ace/OS_NS_string.h"
00013 #include "ace/OS_NS_unistd.h"
00014
00015 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00016
00017 # if defined (ACE_LACKS_READV)
00018
00019
00020
00021
00022 ssize_t
00023 ACE_OS::readv_emulation (ACE_HANDLE handle,
00024 const iovec *iov,
00025 int n)
00026 {
00027 ACE_OS_TRACE ("ACE_OS::readv_emulation");
00028
00029
00030 if (1 == n)
00031 return ACE_OS::read (handle, iov[0].iov_base, iov[0].iov_len);
00032
00033 ssize_t length = 0;
00034 int i;
00035
00036 for (i = 0; i < n; ++i)
00037 if (static_cast<int> (iov[i].iov_len) < 0)
00038 return -1;
00039 else
00040 length += iov[i].iov_len;
00041
00042 char *buf;
00043 # if defined (ACE_HAS_ALLOCA)
00044 buf = (char *) alloca (length);
00045 # else
00046 ACE_NEW_RETURN (buf,
00047 char[length],
00048 -1);
00049 # endif
00050
00051 length = ACE_OS::read (handle, buf, length);
00052
00053 if (length != -1)
00054 {
00055 char *ptr = buf;
00056 ssize_t copyn = length;
00057
00058 for (i = 0;
00059 i < n && copyn > 0;
00060 ++i)
00061 {
00062 ACE_OS::memcpy (iov[i].iov_base, ptr,
00063
00064 copyn > (int) iov[i].iov_len
00065 ? (size_t) iov[i].iov_len
00066 : (size_t) copyn);
00067 ptr += iov[i].iov_len;
00068 copyn -= iov[i].iov_len;
00069 }
00070 }
00071
00072 # if !defined (ACE_HAS_ALLOCA)
00073 delete [] buf;
00074 # endif
00075 return length;
00076 }
00077 # endif
00078
00079 # if defined (ACE_LACKS_WRITEV)
00080
00081
00082
00083
00084 ssize_t
00085 ACE_OS::writev_emulation (ACE_HANDLE handle, const iovec *iov, int n)
00086 {
00087 ACE_OS_TRACE ("ACE_OS::writev_emulation");
00088
00089
00090
00091
00092
00093 ssize_t bytes_sent = 0;
00094
00095 for (int i = 0; i < n; ++i)
00096 {
00097 const ssize_t result =
00098 ACE_OS::write (handle, iov[i].iov_base, iov[i].iov_len);
00099
00100 if (result == -1)
00101 {
00102
00103
00104
00105
00106
00107 if (bytes_sent > 0)
00108 break;
00109 else
00110 return -1;
00111 }
00112 else
00113 {
00114 bytes_sent += result;
00115
00116
00117
00118
00119
00120
00121 if (static_cast<size_t> (result) < iov[i].iov_len)
00122 break;
00123 }
00124 }
00125
00126 return bytes_sent;
00127 }
00128 # endif
00129
00130 ACE_END_VERSIONED_NAMESPACE_DECL