mirror of https://github.com/adamdruppe/arsd.git
mac
This commit is contained in:
parent
acb833d724
commit
e5a2de115f
79
cgi.d
79
cgi.d
|
@ -6267,23 +6267,28 @@ ssize_t write_fd(int fd, void *ptr, size_t nbytes, int sendfd) {
|
||||||
msghdr msg;
|
msghdr msg;
|
||||||
iovec[1] iov;
|
iovec[1] iov;
|
||||||
|
|
||||||
union ControlUnion {
|
version(OSX) {
|
||||||
cmsghdr cm;
|
msg.msg_accrights = cast(cattr_t) &sendfd;
|
||||||
char[CMSG_SPACE(int.sizeof)] control;
|
msg.msg_accrightslen = int.sizeof;
|
||||||
|
} else {
|
||||||
|
union ControlUnion {
|
||||||
|
cmsghdr cm;
|
||||||
|
char[CMSG_SPACE(int.sizeof)] control;
|
||||||
|
}
|
||||||
|
|
||||||
|
ControlUnion control_un;
|
||||||
|
cmsghdr* cmptr;
|
||||||
|
|
||||||
|
msg.msg_control = control_un.control.ptr;
|
||||||
|
msg.msg_controllen = control_un.control.length;
|
||||||
|
|
||||||
|
cmptr = CMSG_FIRSTHDR(&msg);
|
||||||
|
cmptr.cmsg_len = CMSG_LEN(int.sizeof);
|
||||||
|
cmptr.cmsg_level = SOL_SOCKET;
|
||||||
|
cmptr.cmsg_type = SCM_RIGHTS;
|
||||||
|
*(cast(int *) CMSG_DATA(cmptr)) = sendfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlUnion control_un;
|
|
||||||
cmsghdr* cmptr;
|
|
||||||
|
|
||||||
msg.msg_control = control_un.control.ptr;
|
|
||||||
msg.msg_controllen = control_un.control.length;
|
|
||||||
|
|
||||||
cmptr = CMSG_FIRSTHDR(&msg);
|
|
||||||
cmptr.cmsg_len = CMSG_LEN(int.sizeof);
|
|
||||||
cmptr.cmsg_level = SOL_SOCKET;
|
|
||||||
cmptr.cmsg_type = SCM_RIGHTS;
|
|
||||||
*(cast(int *) CMSG_DATA(cmptr)) = sendfd;
|
|
||||||
|
|
||||||
msg.msg_name = null;
|
msg.msg_name = null;
|
||||||
msg.msg_namelen = 0;
|
msg.msg_namelen = 0;
|
||||||
|
|
||||||
|
@ -6303,15 +6308,20 @@ ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd) {
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
int newfd;
|
int newfd;
|
||||||
|
|
||||||
union ControlUnion {
|
version(OSX) {
|
||||||
cmsghdr cm;
|
msg.msg_accrights = cast(cattr_t) recvfd;
|
||||||
char[CMSG_SPACE(int.sizeof)] control;
|
msg.msg_accrightslen = int.sizeof;
|
||||||
}
|
} else {
|
||||||
ControlUnion control_un;
|
union ControlUnion {
|
||||||
cmsghdr* cmptr;
|
cmsghdr cm;
|
||||||
|
char[CMSG_SPACE(int.sizeof)] control;
|
||||||
|
}
|
||||||
|
ControlUnion control_un;
|
||||||
|
cmsghdr* cmptr;
|
||||||
|
|
||||||
msg.msg_control = control_un.control.ptr;
|
msg.msg_control = control_un.control.ptr;
|
||||||
msg.msg_controllen = control_un.control.length;
|
msg.msg_controllen = control_un.control.length;
|
||||||
|
}
|
||||||
|
|
||||||
msg.msg_name = null;
|
msg.msg_name = null;
|
||||||
msg.msg_namelen = 0;
|
msg.msg_namelen = 0;
|
||||||
|
@ -6324,15 +6334,20 @@ ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd) {
|
||||||
if ( (n = recvmsg(fd, &msg, 0)) <= 0)
|
if ( (n = recvmsg(fd, &msg, 0)) <= 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
if ( (cmptr = CMSG_FIRSTHDR(&msg)) != null &&
|
version(OSX) {
|
||||||
cmptr.cmsg_len == CMSG_LEN(int.sizeof)) {
|
if(msg.msg_accrightslen != int.sizeof)
|
||||||
if (cmptr.cmsg_level != SOL_SOCKET)
|
*recvfd = -1;
|
||||||
throw new Exception("control level != SOL_SOCKET");
|
} else {
|
||||||
if (cmptr.cmsg_type != SCM_RIGHTS)
|
if ( (cmptr = CMSG_FIRSTHDR(&msg)) != null &&
|
||||||
throw new Exception("control type != SCM_RIGHTS");
|
cmptr.cmsg_len == CMSG_LEN(int.sizeof)) {
|
||||||
*recvfd = *(cast(int *) CMSG_DATA(cmptr));
|
if (cmptr.cmsg_level != SOL_SOCKET)
|
||||||
} else
|
throw new Exception("control level != SOL_SOCKET");
|
||||||
*recvfd = -1; /* descriptor was not passed */
|
if (cmptr.cmsg_type != SCM_RIGHTS)
|
||||||
|
throw new Exception("control type != SCM_RIGHTS");
|
||||||
|
*recvfd = *(cast(int *) CMSG_DATA(cmptr));
|
||||||
|
} else
|
||||||
|
*recvfd = -1; /* descriptor was not passed */
|
||||||
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue