1 /* Copyright 1998 - Transarc Corporation */
4 /* NT does not have uio structs, so we roll our own sendmsg and recvmsg.
6 * The dangerous part of this code is that it assumes that iovecs 0 and 1
7 * are contiguous and that all of 0 is used before any of 1.
8 * This is true if rx_packets are being sent, so we should be ok.
11 #include <afs/param.h>
17 #include "rx_packet.h"
18 #include "rx_globals.h"
19 #include "rx_xmit_nt.h"
23 int recvmsg(int socket, struct msghdr *msgP, int flags)
25 char rbuf[RX_MAX_PACKET_SIZE];
32 size = rx_maxJumboRecvSize;
33 code = recvfrom((SOCKET)socket, rbuf, size, flags,
34 (struct sockaddr*)(msgP->msg_name),
35 &(msgP->msg_namelen));
40 for (off = i = 0; size > 0 && i<msgP->msg_iovlen; i++) {
41 if (msgP->msg_iov[i].iov_len) {
42 if (msgP->msg_iov[i].iov_len < size) {
43 n = msgP->msg_iov[i].iov_len;
48 memcpy(msgP->msg_iov[i].iov_base, &rbuf[off], n);
54 /* Accounts for any we didn't copy in to iovecs. */
64 int sendmsg(int socket, struct msghdr *msgP, int flags)
66 char buf[RX_MAX_PACKET_SIZE];
73 for (size = i = 0; i<msgP->msg_iovlen; i++)
74 size += msgP->msg_iov[i].iov_len;
76 if (msgP->msg_iovlen <= 2) {
77 sbuf = msgP->msg_iov[0].iov_base;
80 /* Pack data into array from iovecs */
82 for (off = i = 0; tmp > 0 && i<msgP->msg_iovlen; i++) {
83 if (msgP->msg_iov[i].iov_len > 0 ) {
84 if (tmp > msgP->msg_iov[i].iov_len)
85 n = msgP->msg_iov[i].iov_len;
88 memcpy(&sbuf[off], msgP->msg_iov[i].iov_base, n);
95 code = sendto((SOCKET)socket, sbuf, size, flags,
96 (struct sockaddr*)(msgP->msg_name), msgP->msg_namelen);
98 if (code == SOCKET_ERROR) {
99 code = WSAGetLastError();