ncpfs was forgetting to update iovec's iov_base field whenever partial
transmission occured. This was causing data corruption during large
(60kB) writes.
The code now also passes copy of iovec to the sock_sendmsg, so it does
not rely on network stack updating (or not updating) passed iovec in
case of success (or failure).
struct ncp_request_reply *rq;
struct msghdr msg;
struct iovec* iov;
+ struct iovec iovc[3];
int result;
rq = server->tx.creq;
return;
}
+ /* sock_sendmsg updates iov pointers for us :-( */
+ memcpy(iovc, rq->tx_ciov, rq->tx_iovlen * sizeof(iov[0]));
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_control = NULL;
- msg.msg_iov = rq->tx_ciov;
+ msg.msg_iov = iovc;
msg.msg_iovlen = rq->tx_iovlen;
msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT;
result = sock_sendmsg(server->ncp_sock, &msg, rq->tx_totallen);
iov++;
rq->tx_iovlen--;
}
+ iov->iov_base += result;
iov->iov_len -= result;
rq->tx_ciov = iov;
}