From ef5266ebd50e7fa65c56bdb623e12ca8c233b470 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Wed, 11 Dec 2019 15:01:11 -0800 Subject: 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 --- src/util/Makefile.sources | 2 + src/util/meson.build | 2 + src/util/os_socket.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++ src/util/os_socket.h | 32 ++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 src/util/os_socket.c create mode 100644 src/util/os_socket.h 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 + +#include "os_socket.h" + +#if defined(__linux__) + +#include +#include +#include +#include +#include +#include +#include + +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 +#include + +#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_ */ -- cgit v1.2.3