xref: /third_party/mesa3d/src/util/os_socket.c (revision bf215546)
1/*
2 * Copyright 2019 Intel Corporation
3 * SPDX-License-Identifier: MIT
4 */
5
6#include <errno.h>
7
8#include "os_socket.h"
9
10#if defined(__linux__)
11
12#include <fcntl.h>
13#include <poll.h>
14#include <stddef.h>
15#include <string.h>
16#include <sys/socket.h>
17#include <sys/un.h>
18#include <unistd.h>
19
20int
21os_socket_listen_abstract(const char *path, int count)
22{
23   int s = socket(AF_UNIX, SOCK_STREAM, 0);
24   if (s < 0)
25      return -1;
26
27   struct sockaddr_un addr;
28   memset(&addr, 0, sizeof(addr));
29   addr.sun_family = AF_UNIX;
30   strncpy(addr.sun_path + 1, path, sizeof(addr.sun_path) - 2);
31
32   /* Create an abstract socket */
33   int ret = bind(s, (struct sockaddr*)&addr,
34                  offsetof(struct sockaddr_un, sun_path) +
35                  strlen(path) + 1);
36   if (ret < 0) {
37      close(s);
38      return -1;
39   }
40
41   if (listen(s, count) < 0) {
42      close(s);
43      return -1;
44   }
45
46   return s;
47}
48
49int
50os_socket_accept(int s)
51{
52   return accept(s, NULL, NULL);
53}
54
55ssize_t
56os_socket_recv(int socket, void *buffer, size_t length, int flags)
57{
58   return recv(socket, buffer, length, flags);
59}
60
61ssize_t
62os_socket_send(int socket, const void *buffer, size_t length, int flags)
63{
64   return send(socket, buffer, length, flags);
65}
66
67void
68os_socket_block(int s, bool block)
69{
70   int old = fcntl(s, F_GETFL, 0);
71   if (old == -1)
72      return;
73
74   /* TODO obey block */
75   if (block)
76      fcntl(s, F_SETFL, old & ~O_NONBLOCK);
77   else
78      fcntl(s, F_SETFL, old | O_NONBLOCK);
79}
80
81void
82os_socket_close(int s)
83{
84   close(s);
85}
86
87#else
88
89int
90os_socket_listen_abstract(const char *path, int count)
91{
92   errno = -ENOSYS;
93   return -1;
94}
95
96int
97os_socket_accept(int s)
98{
99   errno = -ENOSYS;
100   return -1;
101}
102
103ssize_t
104os_socket_recv(int socket, void *buffer, size_t length, int flags)
105{
106   errno = -ENOSYS;
107   return -1;
108}
109
110ssize_t
111os_socket_send(int socket, const void *buffer, size_t length, int flags)
112{
113   errno = -ENOSYS;
114   return -1;
115}
116
117void
118os_socket_block(int s, bool block)
119{
120}
121
122void
123os_socket_close(int s)
124{
125}
126
127#endif
128