return (n);
}
+#if defined(HAVE_SYS_UIO_H)
+#define USE_IOVEC_IMPL
+#endif
+
+#ifdef USE_IOVEC_IMPL
+
+#ifdef HAVE_SYS_UIO_H
+/* number of iovec we use for writev, fragmentation is going to determine
+ * how much we end up writing */
+#define NUM_IOVEC 128
+#define IOV_TYPE struct iovec
+#define IOV_PTR_FIELD iov_base
+#define IOV_LEN_FIELD iov_len
+#else
+#define NUM_IOVEC 16
+#define IOV_TYPE WSABUF
+#define IOV_PTR_FIELD buf
+#define IOV_LEN_FIELD len
+#endif
+#endif
+
int
evbuffer_write_atmost(struct evbuffer *buffer, evutil_socket_t fd,
ssize_t howmuch)
howmuch = buffer->total_len;
{
-#ifndef WIN32
- #ifdef HAVE_SYS_UIO_H
- struct iovec iov[NUM_IOVEC];
- struct evbuffer_chain *chain = buffer->first;
- int i = 0;
- /* XXX make this top out at some maximal data length? if the buffer has
- * (say) 1MB in it, split over 128 chains, there's no way it all gets
- * written in one go. */
- while (chain != NULL && i < NUM_IOVEC && howmuch) {
- iov[i].iov_base = chain->buffer + chain->misalign;
- if (howmuch >= chain->off) {
- iov[i++].iov_len = chain->off;
- howmuch -= chain->off;
- } else {
- iov[i++].iov_len = howmuch;
- break;
+#ifdef USE_IOVEC_IMPL
+ IOV_TYPE iov[NUM_IOVEC];
+ struct evbuffer_chain *chain = buffer->first;
+ int i = 0;
+ /* XXX make this top out at some maximal data length? if the buffer has
+ * (say) 1MB in it, split over 128 chains, there's no way it all gets
+ * written in one go. */
+ while (chain != NULL && i < NUM_IOVEC && howmuch) {
+ iov[i].IOV_PTR_FIELD = chain->buffer + chain->misalign;
+ if (howmuch >= chain->off) {
+ iov[i++].IOV_LEN_FIELD = chain->off;
+ howmuch -= chain->off;
+ } else {
+ iov[i++].IOV_LEN_FIELD = howmuch;
+ break;
+ }
+ chain = chain->next;
}
- chain = chain->next;
- }
- n = writev(fd, iov, i);
- #else /* !HAVE_SYS_UIO_H */
- void *p = evbuffer_pullup(buffer, howmuch);
- n = write(fd, p, howmuch, 0);
- #endif
-#elif 0
- const int N_BUFFERS = 8;
- WSABUF buffers[N_BUFFERS];
- struct evbuffer_chain *chain = buffer->first;
- int i = 0;
- DWORD bytesSent;
- /* XXX make this top out at some maximal data length? if the buffer has
- * (say) 1MB in it, split over 128 chains, there's no way it all gets
- * written in one go. */
- while (chain != NULL && i < N_BUFFERS && howmuch) {
- buffers[i].buf = chain->buffer + chain->misalign;
- if (howmuch >= chain->off) {
- buffers[i++].len = chain->off;
- howmuch -= chain->off;
- } else {
- buffers[i++].len = howmuch;
- break;
+ #ifdef WIN32
+ {
+ DWORD byteSent;
+ if (WSASend(fd, buffers, i, &bytesSent, 0, NULL, NULL))
+ n = -1;
+ else
+ n = bytesSent;
}
- chain = chain->next;
- }
-
- if (WSASend(fd, buffers, i, &bytesSent, 0, NULL, NULL))
- n = -1;
- else
- n = bytesSent;
+ #else
+ n = writev(fd, iov, i);
+ #endif
+#elif defined(WIN32)
+ /* XXX(nickm) Don't disable this code until we know if the WSARecv
+ * code above works. */
+ void *p = evbuffer_pullup(buffer, howmuch);
+ n = send(fd, p, howmuch, 0);
#else
- /* XXX(nickm) Don't disable this code until we know if the WSARecv
- * code above works. */
- void *p = evbuffer_pullup(buffer, howmuch);
- n = send(fd, p, howmuch, 0);
+ void *p = evbuffer_pullup(buffer, howmuch);
+ n = write(fd, p, howmuch);
#endif
}