示例#1
0
iovec
ACE_QoS::provider_specific (void) const
{
#if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
  return (iovec&) this->ProviderSpecific;
#else
  ACE_NOTSUP_RETURN (iovec ());
#endif /* ACE_HAS_WINSOCK2 */
}
std::size_t SocketUtils::sock_fd_write(int sock, void *buf, std::size_t buflen, int fd) {

    //Declaration
    auto msg = msghdr();
    auto iov = iovec();
    union {
        cmsghdr cmsgheader;
        char control[CMSG_SPACE(sizeof(int))];
    } cmsgu;
    struct cmsghdr *cmsg;

    //Definition
    iov.iov_base = buf;
    iov.iov_len = buflen;
    msg.msg_name = nullptr;
    msg.msg_namelen = 0;
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;

    //Passing file descriptor
    if (fd != -1) {
        msg.msg_control = cmsgu.control;
        msg.msg_controllen = sizeof(cmsgu.control);
        cmsg = CMSG_FIRSTHDR(&msg);
        cmsg->cmsg_len = CMSG_LEN(sizeof(int));
        cmsg->cmsg_level = SOL_SOCKET;
        cmsg->cmsg_type = SCM_RIGHTS;

        printf("passing fd %d\n", fd);
        *((int *) CMSG_DATA(cmsg)) = fd;
    }
        //Not passing file descriptor
    else {
        msg.msg_control = nullptr;
        msg.msg_controllen = 0;

        printf("not passing fd\n");
    }

    //Sending data
    auto size = sendmsg(sock, &msg, 0);
    if (size < 0) throw syscall_error("sock_fd_write: sendmsg");
    return static_cast<size_t>(size);
}
std::size_t SocketUtils::sock_fd_read(int sock, void *buf, std::size_t bufsize, int *fd) {
    //File descriptor received
    if (fd) {
        //Declaration
        auto msg = msghdr();
        auto iov = iovec();
        union {
            cmsghdr cmsgheader;
            char control[CMSG_SPACE(sizeof(int))];
        } cmsgu;
        struct cmsghdr *cmsg;

        //Definition
        iov.iov_base = buf;
        iov.iov_len = bufsize;
        msg.msg_name = nullptr;
        msg.msg_namelen = 0;
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
        msg.msg_control = cmsgu.control;
        msg.msg_controllen = sizeof(cmsgu.control);

        //receiving data
        auto size = recvmsg(sock, &msg, 0);
        if (size < 0) throw syscall_error("sock_fd_read: recvmsg");

        //Getting file descriptor
        cmsg = CMSG_FIRSTHDR(&msg);
        if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
            if (cmsg->cmsg_level != SOL_SOCKET) throw syscall_error("Invalid cmsg level");
            if (cmsg->cmsg_type != SCM_RIGHTS) throw syscall_error("Invalid cmsg rights");
            *fd = *((int *) CMSG_DATA(cmsg));
            printf("recieved fd %d\n", *fd);
        } else
            *fd = -1;

        return static_cast<size_t>(size);
    }

    //File descriptor is not received
    auto size = read(sock, buf, bufsize);
    if (size < 0) throw syscall_error("sock_fd_read: read");
    return static_cast<size_t>(size);
}
示例#4
0
iovec YGIRequest::REMOTE_ADDR() {
  return iovec();
}
示例#5
0
iovec YGIRequest::REMOTE_HOST() {
  return iovec();
}
示例#6
0
iovec YGIRequest::PATH_TRANSLATED() {
  return iovec();
}
示例#7
0
iovec YGIRequest::PATH_INFO() {
  return iovec();
}
示例#8
0
iovec YGIRequest::DOCUMENT_ROOT() {
  return iovec();
}
示例#9
0
iovec YGIRequest::SERVER_NAME() {
  return iovec();
}
示例#10
0
iovec YGIRequest::SCRIPT_NAME() {
  return iovec();
}