Mesa (master): virgl/vtest: add utilities for receiving fds

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 18 22:45:16 UTC 2019


Module: Mesa
Branch: master
Commit: 9881733e328e3b9cb15bdfa9105fd33001cd7182
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9881733e328e3b9cb15bdfa9105fd33001cd7182

Author: Gurchetan Singh <gurchetansingh at chromium.org>
Date:   Tue Dec 11 17:01:34 2018 -0800

virgl/vtest: add utilities for receiving fds

v2: recieve --> receive (airlied@)

Signed-off-by: Gurchetan Singh <gurchetansingh at chromium.org>
Reviewed-By: Gert Wollny <gert.wollny at collabora.com>
Reviewed-By: Piotr Rak <p.rak at samsung.com>

---

 .../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];




More information about the mesa-commit mailing list