This commit is contained in:
Adam D. Ruppe 2019-07-08 11:13:36 -04:00
parent acb833d724
commit e5a2de115f
1 changed files with 47 additions and 32 deletions

15
cgi.d
View File

@ -6267,6 +6267,10 @@ ssize_t write_fd(int fd, void *ptr, size_t nbytes, int sendfd) {
msghdr msg; msghdr msg;
iovec[1] iov; iovec[1] iov;
version(OSX) {
msg.msg_accrights = cast(cattr_t) &sendfd;
msg.msg_accrightslen = int.sizeof;
} else {
union ControlUnion { union ControlUnion {
cmsghdr cm; cmsghdr cm;
char[CMSG_SPACE(int.sizeof)] control; char[CMSG_SPACE(int.sizeof)] control;
@ -6283,6 +6287,7 @@ ssize_t write_fd(int fd, void *ptr, size_t nbytes, int sendfd) {
cmptr.cmsg_level = SOL_SOCKET; cmptr.cmsg_level = SOL_SOCKET;
cmptr.cmsg_type = SCM_RIGHTS; cmptr.cmsg_type = SCM_RIGHTS;
*(cast(int *) CMSG_DATA(cmptr)) = sendfd; *(cast(int *) CMSG_DATA(cmptr)) = sendfd;
}
msg.msg_name = null; msg.msg_name = null;
msg.msg_namelen = 0; msg.msg_namelen = 0;
@ -6303,6 +6308,10 @@ ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd) {
ssize_t n; ssize_t n;
int newfd; int newfd;
version(OSX) {
msg.msg_accrights = cast(cattr_t) recvfd;
msg.msg_accrightslen = int.sizeof;
} else {
union ControlUnion { union ControlUnion {
cmsghdr cm; cmsghdr cm;
char[CMSG_SPACE(int.sizeof)] control; char[CMSG_SPACE(int.sizeof)] control;
@ -6312,6 +6321,7 @@ ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd) {
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,6 +6334,10 @@ 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;
version(OSX) {
if(msg.msg_accrightslen != int.sizeof)
*recvfd = -1;
} else {
if ( (cmptr = CMSG_FIRSTHDR(&msg)) != null && if ( (cmptr = CMSG_FIRSTHDR(&msg)) != null &&
cmptr.cmsg_len == CMSG_LEN(int.sizeof)) { cmptr.cmsg_len == CMSG_LEN(int.sizeof)) {
if (cmptr.cmsg_level != SOL_SOCKET) if (cmptr.cmsg_level != SOL_SOCKET)
@ -6333,6 +6347,7 @@ ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd) {
*recvfd = *(cast(int *) CMSG_DATA(cmptr)); *recvfd = *(cast(int *) CMSG_DATA(cmptr));
} else } else
*recvfd = -1; /* descriptor was not passed */ *recvfd = -1; /* descriptor was not passed */
}
return n; return n;
} }