From 9881733e328e3b9cb15bdfa9105fd33001cd7182 Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Tue, 11 Dec 2018 17:01:34 -0800 Subject: [PATCH] virgl/vtest: add utilities for receiving fds v2: recieve --> receive (airlied@) Signed-off-by: Gurchetan Singh Reviewed-By: Gert Wollny Reviewed-By: Piotr Rak --- .../winsys/virgl/vtest/virgl_vtest_socket.c | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c index 410cfa2cc04..5baeaf4c952 100644 --- a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c +++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c @@ -72,6 +72,49 @@ static int virgl_block_read(int fd, void *buf, int size) return size; } +static int virgl_vtest_receive_fd(int socket_fd) +{ + struct cmsghdr *cmsgh; + struct msghdr msgh = { 0 }; + char buf[CMSG_SPACE(sizeof(int))], c; + struct iovec iovec; + + iovec.iov_base = &c; + iovec.iov_len = sizeof(char); + + msgh.msg_name = NULL; + msgh.msg_namelen = 0; + msgh.msg_iov = &iovec; + msgh.msg_iovlen = 1; + msgh.msg_control = buf; + msgh.msg_controllen = sizeof(buf); + msgh.msg_flags = 0; + + int size = recvmsg(socket_fd, &msgh, 0); + if (size < 0) { + fprintf(stderr, "Failed with %s\n", strerror(errno)); + return -1; + } + + cmsgh = CMSG_FIRSTHDR(&msgh); + if (!cmsgh) { + fprintf(stderr, "No headers available\n"); + return -1; + } + + if (cmsgh->cmsg_level != SOL_SOCKET) { + fprintf(stderr, "invalid cmsg_level %d\n", cmsgh->cmsg_level); + return -1; + } + + if (cmsgh->cmsg_type != SCM_RIGHTS) { + fprintf(stderr, "invalid cmsg_type %d\n", cmsgh->cmsg_type); + return -1; + } + + return *((int *) CMSG_DATA(cmsgh)); +} + static int virgl_vtest_send_init(struct virgl_vtest_winsys *vws) { uint32_t buf[VTEST_HDR_SIZE]; -- 2.30.2