void winsock_exit(void);
+// the equivalent of strerror(errno) for Windows sockets
+char *errnostrsocket(void);
+
+
// Winsock doesn't have recvmsg/sendmsg but offers the same functionality
// with WSARecvMsg/WSASendMsg, so we implement the former in terms of the
// latter.
static inline struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *m) {
WSAMSG wm;
wm.Control.len = m->msg_controllen;
- wm.Control.buf = m->msg_control;
+ wm.Control.buf = (char*)m->msg_control;
return WSA_CMSG_FIRSTHDR(&wm);
}
static inline struct cmsghdr *CMSG_NXTHDR(struct msghdr *m, struct cmsghdr *c) {
WSAMSG wm;
wm.Control.len = m->msg_controllen;
- wm.Control.buf = m->msg_control;
+ wm.Control.buf = (char*)m->msg_control;
return WSA_CMSG_NXTHDR(&wm, c);
}
// something to give to WSAPoll, so we fake it with a local TCP socket. (ugh)
int pipe(int pipefd[2]);
+// pipe(socket)-specific read/write/close equivalents
+#define closepipe closesocket
+#define writepipe(s,buf,len) send(s, buf, len, 0)
+#define readpipe(s,buf,len) recv(s, buf, len, 0)
+
// Windows logically doesn't have uname, so we supply a replacement.