diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-12-21 08:03:02 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-12-21 08:03:02 +0100 |
| commit | 646d97f28c2891d634e3066535524fa28e297045 (patch) | |
| tree | d8db79bd9f0a6a4fabf1a9327cf847d7a9c02da1 /include/ocl | |
| parent | fd3a0815365150db49f00f3285e84203e9ae77ea (diff) | |
feat! remove unique_sockets from `core` modules.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'include/ocl')
| -rw-r--r-- | include/ocl/detail/posix/.keep | 0 | ||||
| -rw-r--r-- | include/ocl/detail/posix/net_config.hpp | 22 | ||||
| -rw-r--r-- | include/ocl/posix/unique_socket.hpp | 214 | ||||
| -rw-r--r-- | include/ocl/smart_socket.hpp | 21 |
4 files changed, 0 insertions, 257 deletions
diff --git a/include/ocl/detail/posix/.keep b/include/ocl/detail/posix/.keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/include/ocl/detail/posix/.keep diff --git a/include/ocl/detail/posix/net_config.hpp b/include/ocl/detail/posix/net_config.hpp deleted file mode 100644 index 671d4ba..0000000 --- a/include/ocl/detail/posix/net_config.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * File: detail/net_config.hpp - * Purpose: Network Config file of the OCL.CORE library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#ifndef __OCL_NET_CONFIG -#define __OCL_NET_CONFIG - -#include <stdexcept> -#include <arpa/inet.h> -#include <sys/socket.h> -#include <string> -#include <cstddef> -#include <cstring> - -#ifdef OCL_WINDOWS -#error !!! "Windows is not supported yet for <unique_socket>" !!! -#endif // OCL_WINDOWS - -#endif // __OCL_NET_CONFIG
\ No newline at end of file diff --git a/include/ocl/posix/unique_socket.hpp b/include/ocl/posix/unique_socket.hpp deleted file mode 100644 index f094e54..0000000 --- a/include/ocl/posix/unique_socket.hpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * File: unique_socket.hpp - * Purpose: RAII socket concept in modern C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#ifndef __OCL_CORE_SOCKET -#define __OCL_CORE_SOCKET - -#include <ocl/detail/config.hpp> -#include <ocl/detail/posix/net_config.hpp> - -namespace ocl -{ - class unique_socket; - - inline constexpr auto socket_null = 0; - - class unique_socket final - { - public: - using socket_type = int; - using error_type = bool; - using condition_type = bool; - using socket_state = int; - - private: - socket_type socket_{}; - condition_type is_server_{false}; - error_type bad_{false}; - - public: - unique_socket() = default; - - ~unique_socket() - { - this->destroy(); - } - - unique_socket& operator=(const unique_socket&) = delete; - unique_socket(const unique_socket&) = delete; - - unique_socket& operator=(unique_socket&& other) noexcept - { - if (this != &other) - { - this->destroy(); - - socket_ = other.socket_; - is_server_ = other.is_server_; - bad_ = other.bad_; - - other.socket_ = 0; - other.bad_ = true; - } - - return *this; - } - - unique_socket(unique_socket&& other) noexcept - : socket_(other.socket_), is_server_(other.is_server_), bad_(other.bad_) - { - other.socket_ = 0; - other.bad_ = true; - } - - static constexpr auto any_address = "0.0.0.0"; - static constexpr auto backlog_count = 20U; - - const error_type& bad() - { - return bad_; - } - - unique_socket::socket_state state() noexcept - { - socket_state error = 0; - socklen_t len = sizeof(error); - getsockopt(socket_, SOL_SOCKET, SO_ERROR, &error, &len); - - return error; - } - - unique_socket accept() noexcept - { - socket_type cl_{-1}; - - if (this->is_server_) - cl_ = ::accept(socket_, nullptr, nullptr); - - unique_socket ret_sock; - ret_sock.socket_ = cl_; - - return std::move(ret_sock); - } - - unique_socket read_server_buffer(char* in, std::size_t len) - { - if (!in || !len) - return {}; - - if (!is_server_) - return {}; - - auto ret_sock = accept(); - - if (ret_sock.socket_ == -1) - throw std::invalid_argument("no connection to accept."); - - auto ret = ::recv(ret_sock.socket_, in, len, 0); - ret_sock.bad_ = ret < 0L; - - return ret_sock; - } - - void read_client_buffer(char* in, std::size_t len) - { - if (!in || !len) - return; - - if (is_server_) - return; - - auto ret = ::recv(this->socket_, in, len, 0); - this->bad_ = ret < 0L; - } - - void write_from_buffer(const char* out, std::size_t len) - { - if (!out) - return; - - if (!len) - return; - - auto ret = ::send(this->socket_, out, len, 0); - this->bad_ = ret < 0L; - } - - template <uint16_t port> - static unique_socket make_socket(const std::string& address, const bool is_server) - { - if (unique_socket sock; sock.construct<AF_INET, SOCK_STREAM, port>(address.c_str(), is_server)) - return sock; - - throw std::invalid_argument("invalid socket argument"); - } - - private: - template <uint16_t af, uint16_t kind, uint16_t port> - bool construct(const char* addr = unique_socket::any_address, const bool& is_server = false) noexcept - { - static_assert(af != 0, "Address family is zero"); - static_assert(kind != 0, "Kind is zero"); - - socket_ = ::socket(af, kind, 0); - is_server_ = is_server; - - if (socket_ == -1) - return false; - - struct sockaddr_in addr_; - std::memset(&addr_, 0, sizeof(struct sockaddr_in)); - - if (addr == unique_socket::any_address) - addr_.sin_addr.s_addr = INADDR_ANY; - else - addr_.sin_addr.s_addr = ::inet_addr(addr); - - addr_.sin_port = htons(port); - addr_.sin_family = af; - - if (!is_server) - { - const auto ret = ::connect(socket_, reinterpret_cast<struct sockaddr*>(&addr_), sizeof(addr_)); - bad_ = ret == -1; - return bad_ == false; - } - - int ret = ::bind(socket_, (struct sockaddr*)&addr_, sizeof(addr_)); - - bad_ = ret == -1; - - if (bad_) - return false; - - ret = ::listen(socket_, unique_socket::backlog_count); - - bad_ = ret == -1; - - return bad_ == false; - } - - bool destroy() noexcept - { - if (!socket_) - return false; - - ::close(socket_); - - socket_ = 0L; - - return true; - } - }; - - template <typename TS> - concept IsValidSocket = requires(TS& sock) { - { !sock.bad() }; - }; -} // namespace ocl - -#endif
\ No newline at end of file diff --git a/include/ocl/smart_socket.hpp b/include/ocl/smart_socket.hpp deleted file mode 100644 index 331f86d..0000000 --- a/include/ocl/smart_socket.hpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * File: smart_socket.hpp - * Purpose: Smart Socket helpers. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. Licensed under the BSL 1.0 license - */ - -#ifndef __OCL_SMART_SOCKET -#define __OCL_SMART_SOCKET - -#include <ocl/detail/config.hpp> - -#ifndef __OCL_FREESTANDING -#include <boost/asio.hpp> - -#ifdef OCL_POSIX -#include <ocl/posix/unique_socket.hpp> -#endif -#endif // !__OCL_FREESTANDING - -#endif // __OCL_SMART_SOCKET
\ No newline at end of file |
