diff options
author | Rafael Antognolli <[email protected]> | 2019-12-11 15:01:11 -0800 |
---|---|---|
committer | Rafael Antognolli <[email protected]> | 2019-12-13 20:53:44 +0000 |
commit | ef5266ebd50e7fa65c56bdb623e12ca8c233b470 (patch) | |
tree | 1062691faa9a327023d4f65036e11eb57a393dd2 | |
parent | c327245257b1ecb155026f811da9dd985a7751a8 (diff) |
util/os_socket: Add socket related functions.
v3:
- Add os_socket.c/h into Makefile.sources (Lionel)
- Add empty non-linux implementation to public functions.
Reviewed-by: Lionel Landwerlin <[email protected]>
-rw-r--r-- | src/util/Makefile.sources | 2 | ||||
-rw-r--r-- | src/util/meson.build | 2 | ||||
-rw-r--r-- | src/util/os_socket.c | 122 | ||||
-rw-r--r-- | src/util/os_socket.h | 32 |
4 files changed, 158 insertions, 0 deletions
diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources index cce28db005e..71fe06a0096 100644 --- a/src/util/Makefile.sources +++ b/src/util/Makefile.sources @@ -57,6 +57,8 @@ MESA_UTIL_FILES := \ os_time.h \ os_file.c \ os_file.h \ + os_socket.c \ + os_socket.h \ os_misc.c \ os_misc.h \ u_process.c \ diff --git a/src/util/meson.build b/src/util/meson.build index 540e4e9ce43..88c6ab2d2a8 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -62,6 +62,8 @@ files_mesa_util = files( 'os_file.c', 'os_misc.c', 'os_misc.h', + 'os_socket.c', + 'os_socket.h', 'u_process.c', 'u_process.h', 'sha1/sha1.c', diff --git a/src/util/os_socket.c b/src/util/os_socket.c new file mode 100644 index 00000000000..98ef013205e --- /dev/null +++ b/src/util/os_socket.c @@ -0,0 +1,122 @@ +/* + * Copyright 2019 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include <errno.h> + +#include "os_socket.h" + +#if defined(__linux__) + +#include <fcntl.h> +#include <poll.h> +#include <stddef.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <unistd.h> + +int +os_socket_listen_abstract(const char *path, int count) +{ + int s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) + return -1; + + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path + 1, path, sizeof(addr.sun_path) - 2); + + /* Create an abstract socket */ + int ret = bind(s, (struct sockaddr*)&addr, + offsetof(struct sockaddr_un, sun_path) + + strlen(path) + 1); + if (ret < 0) + return -1; + + listen(s, count); + + return s; +} + +int +os_socket_accept(int s) +{ + return accept(s, NULL, NULL); +} + +ssize_t +os_socket_recv(int socket, void *buffer, size_t length, int flags) +{ + return recv(socket, buffer, length, flags); +} + +ssize_t +os_socket_send(int socket, const void *buffer, size_t length, int flags) +{ + return send(socket, buffer, length, flags); +} + +void +os_socket_block(int s, bool block) +{ + int old = fcntl(s, F_GETFL, 0); + if (old == -1) + return; + + /* TODO obey block */ + if (block) + fcntl(s, F_SETFL, old & ~O_NONBLOCK); + else + fcntl(s, F_SETFL, old | O_NONBLOCK); +} + +void +os_socket_close(int s) +{ + close(s); +} + +#else + +int +os_socket_listen_abstract(const char *path, int count) +{ + errno = -ENOSYS; + return -1; +} + +int +os_socket_accept(int s) +{ + errno = -ENOSYS; + return -1; +} + +ssize_t +os_socket_recv(int socket, void *buffer, size_t length, int flags) +{ + errno = -ENOSYS; + return -1; +} + +ssize_t +os_socket_send(int socket, const void *buffer, size_t length, int flags) +{ + errno = -ENOSYS; + return -1; +} + +void +os_socket_block(int s, bool block) +{ +} + +void +os_socket_close(int s) +{ +} + +#endif diff --git a/src/util/os_socket.h b/src/util/os_socket.h new file mode 100644 index 00000000000..0e413ef353e --- /dev/null +++ b/src/util/os_socket.h @@ -0,0 +1,32 @@ +/* + * Copyright 2019 Intel Corporation + * SPDX-License-Identifier: MIT + * + * Socket operations helpers + */ + +#ifndef _OS_SOCKET_H_ +#define _OS_SOCKET_H_ + +#include <stdio.h> +#include <stdbool.h> + +#ifdef __cplusplus +extern "C" { +#endif + +int os_socket_accept(int s); + +int os_socket_listen_abstract(const char *path, int count); + +ssize_t os_socket_recv(int socket, void *buffer, size_t length, int flags); +ssize_t os_socket_send(int socket, const void *buffer, size_t length, int flags); + +void os_socket_block(int s, bool block); +void os_socket_close(int s); + +#ifdef __cplusplus +} +#endif + +#endif /* _OS_SOCKET_H_ */ |