Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7a7177f
#75: Add socket library API stubs
sgn4sangar Sep 29, 2026
5f0b5d1
#75: Implement socket descriptor ownership
sgn4sangar Sep 29, 2026
871c26a
#75: Implement Unix socket connection and listener
sgn4sangar Sep 29, 2026
2634830
#75: Implement Unix socket stream operations
sgn4sangar Sep 29, 2026
5648402
#75: Add Unix socket tests and fuzzing
sgn4sangar Sep 29, 2026
c3bdcd3
#75: Group socket library files
sgn4sangar Oct 2, 2026
6ce6314
#75: Fix socket clang-tidy findings
sgn4sangar Oct 2, 2026
f4ee0d7
#75: Extend socket mutation coverage
sgn4sangar Oct 2, 2026
c24a3cc
#75: Rename the development Lima template
sgn4sangar Oct 3, 2026
2590e45
#75: Exclude socket tests from Mull
sgn4sangar Oct 5, 2026
cc4654e
#75: Address socket Sonar findings
sgn4sangar Oct 5, 2026
4873bc7
#75: Format socket Sonar suppression
sgn4sangar Oct 5, 2026
25b581c
#75: Resolve remaining socket Sonar findings
sgn4sangar Oct 5, 2026
f4f46c8
#75: Move socket sources out of public headers
sgn4sangar Oct 5, 2026
faa6427
#75: Group socket sources in a module folder
sgn4sangar Oct 5, 2026
789c365
#75: Use short secure socket test paths
sgn4sangar Oct 7, 2026
9496da5
#75: Keep socket corpus changes untracked
sgn4sangar Oct 7, 2026
706a115
add more corpus files for test
sgn4sangar Oct 7, 2026
ed77d36
#75: Split socket classes into public headers
sgn4sangar Oct 8, 2026
da8f14a
unit tests for unix domain sockets
sgn4sangar Oct 9, 2026
dc71239
address comments
sgn4sangar Oct 9, 2026
4df8cec
fix formatting
sgn4sangar Oct 9, 2026
6aac287
addressing all review comments
sgn4sangar Oct 12, 2026
b97544a
adding doxygen comments
sgn4sangar Oct 12, 2026
b6a7865
clang format and tidy
sgn4sangar Oct 12, 2026
2b1c52f
fix the stale issue
sgn4sangar Oct 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ unreleased changelog, so update it before the PR is merged.
## Tool availability and Lima

- When a required development tool is unavailable on the host, use the
repository's `docker-udf-client` Lima VM instead of installing a host-wide
repository's `udf-runner-cpp-dev` Lima VM instead of installing a host-wide
package.
- Start the VM with
`limactl start ./ext/lima_vm_templates/docker-udf-client.yaml` and run
commands in it with `limactl shell docker-udf-client <command>`.
`limactl start ./ext/lima_vm_templates/udf-runner-cpp-dev.yaml` and run
commands in it with `limactl shell udf-runner-cpp-dev <command>`.
- If a required tool is missing in the VM, install it there and add its package
to the provisioning list in
[`ext/lima_vm_templates/docker-udf-client.yaml`](ext/lima_vm_templates/docker-udf-client.yaml)
[`ext/lima_vm_templates/udf-runner-cpp-dev.yaml`](ext/lima_vm_templates/udf-runner-cpp-dev.yaml)
so future VMs provide it automatically.
1 change: 1 addition & 0 deletions doc/changes/unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ n/a
- #70: Added the v2 UDF protocol design and validation artifacts
- #61: Added stacktrace-aware exceptions and assertions to v2
- #54: Added v2 socket-library interface design
- #75: Added the v2 Unix-domain stream socket library
- #32: Added clang tidy to v2
- #36: Added developer guide for clang-tidy and clang-format
- #38: Added Sonar Qube Public
Expand Down
8 changes: 5 additions & 3 deletions doc/design/v2/runner/socket_library_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ Public types belong to `exasol::udf::v2::socket`. The implementation should prov
small public header surface, for example:

```
include/exasol/udf/v2/socket.hpp
include/exasol/udf/v2/unix_socket.hpp
include/exasol/udf/v2/socket/owned_file_descriptor.hpp
include/exasol/udf/v2/socket/socket.hpp
include/exasol/udf/v2/socket/unix_socket.hpp
include/exasol/udf/v2/socket/unix_socket_listener.hpp
```

The core header must not expose a TLS implementation or a TCP address type.
Expand All @@ -62,7 +64,7 @@ This keeps the contract usable by TLS, whose I/O does not map one-for-one to
```cpp
namespace exasol::udf::v2::socket {

enum class Shutdown { receive, send, both };
enum class Shutdown { Receive, Send, Both };

class OwnedFileDescriptor {
public:
Expand Down
4 changes: 2 additions & 2 deletions doc/developer_guide/slc.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ If no Docker daemon is available on the host, use the repository’s Lima
instance:

```bash
limactl start ./ext/lima_vm_templates/docker-udf-client.yaml
export DOCKER_HOST="$(limactl list docker-udf-client \
limactl start ./ext/lima_vm_templates/udf-runner-cpp-dev.yaml
export DOCKER_HOST="$(limactl list udf-runner-cpp-dev \
--format 'unix://{{.Dir}}/sock/docker.sock')"
```

Expand Down
2 changes: 1 addition & 1 deletion doc/developer_guide/v2/v2_code_quality.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ alias(

Mutation testing for the functional v2 C++ tests uses [Mull](https://mull-project.com/)
with the pinned Mull 0.34.1 release and matching LLVM 22 toolchain. The
`docker-udf-client` Lima template provisions these tools automatically; on
`udf-runner-cpp-dev` Lima template provisions these tools automatically; on
other environments install the LLVM 22 compiler and `mull-22`, then verify
that `mull-runner-22` and `/usr/lib/mull-ir-frontend-22` are available.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
# Also, it sets all environment variables needed to build the UDF client for Python and Java
# TODO: Add R dependencies
# Start this VM when the host has no Docker daemon:
# $ limactl start ./ext/lima_vm_templates/docker-udf-client.yaml
# $ limactl start ./ext/lima_vm_templates/udf-runner-cpp-dev.yaml
#
# Connect Docker and exaslct to the Lima Docker daemon:
# $ export DOCKER_HOST=$(limactl list docker-udf-client --format 'unix://{{.Dir}}/sock/docker.sock')
# $ export DOCKER_HOST=$(limactl list udf-runner-cpp-dev --format 'unix://{{.Dir}}/sock/docker.sock')
# cd ./exaudfclient
# $ limactl shell docker-udf-client bazel build --config no-tty --config optimize --config python --config fast-binary
# $ limactl shell udf-runner-cpp-dev bazel build --config no-tty --config optimize --config python --config fast-binary

# To build the SLC Docker images/stages only, run
# $ exaslct build --flavor-path ./flavors/<flavor-name>
Expand Down
53 changes: 53 additions & 0 deletions udf-runner-cpp/v2/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,59 @@ cc_library(
target_compatible_with = ["@platforms//os:linux"],
)

cc_library(
name = "socket",
srcs = [
"socket/socket.cc",
"socket/unix_socket.cc",
],
hdrs = [
"include/exasol/udf/v2/socket/owned_file_descriptor.hpp",
"include/exasol/udf/v2/socket/socket.hpp",
"include/exasol/udf/v2/socket/unix_socket.hpp",
"include/exasol/udf/v2/socket/unix_socket_listener.hpp",
],
includes = ["include"],
copts = ["-std=c++23"],
target_compatible_with = ["@platforms//os:linux"],
)

cc_test(
name = "socket_test",
srcs = ["socket/socket_test.cc"],
copts = ["-std=c++23"],
# Socket behavior remains covered by the normal Bazel test suite. Exclude
# this target from Mull until its mutation coverage is expanded.
tags = ["no-mull"],
deps = [
":socket",
"@googletest//:gtest_main",
],
target_compatible_with = ["@platforms//os:linux"],
)

cc_test(
name = "unix_socket_test",
srcs = ["socket/unix_socket_test.cc"],
copts = ["-std=c++23"],
tags = ["no-mull"],
deps = [
":socket",
"@googletest//:gtest_main",
],
target_compatible_with = ["@platforms//os:linux"],
)

cc_fuzz_test(
Comment thread
sgn4sangar marked this conversation as resolved.
name = "socket_fuzz_test",
srcs = ["socket/socket_fuzz_test.cc"],
corpus = glob(["fuzz/corpus/socket/**"]),
copts = ["-std=c++23"],
deps = [":socket"],
tags = ["fuzz-test"],
target_compatible_with = ["@platforms//os:linux"],
)

cc_library(
name = "linux_event_fd",
srcs = ["linux_event_fd.cc"],
Expand Down
Binary file added udf-runner-cpp/v2/fuzz/corpus/socket/binary_bytes
Binary file not shown.
Empty file.
1 change: 1 addition & 0 deletions udf-runner-cpp/v2/fuzz/corpus/socket/exact_4k
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
1 change: 1 addition & 0 deletions udf-runner-cpp/v2/fuzz/corpus/socket/more_than_4k
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2 changes: 2 additions & 0 deletions udf-runner-cpp/v2/fuzz/corpus/socket/one_byte
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
e

1 change: 1 addition & 0 deletions udf-runner-cpp/v2/fuzz/corpus/socket/only_ascii
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
this is for testing ASCII only content
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once

namespace exasol::udf::v2::socket
{

/** Owns a native file descriptor and closes it on destruction. */
class OwnedFileDescriptor
{
public:
/** Creates an empty descriptor that does not own a native handle. */
OwnedFileDescriptor() noexcept;

/** Closes the owned descriptor, if any. */
~OwnedFileDescriptor();

/** Takes ownership of an open native file descriptor.
*
* @throws std::invalid_argument if @p owned_fd is negative.
*/
[[nodiscard]] static OwnedFileDescriptor adopt_native_handle(int owned_fd);

OwnedFileDescriptor(const OwnedFileDescriptor&) = delete;
OwnedFileDescriptor& operator=(const OwnedFileDescriptor&) = delete;
OwnedFileDescriptor(OwnedFileDescriptor&& other) noexcept;
OwnedFileDescriptor& operator=(OwnedFileDescriptor&& other) noexcept;

/** Returns the owned native descriptor, or -1 when empty. */
[[nodiscard]] int native_handle() const noexcept;

/** Returns whether this object owns a native descriptor. */
[[nodiscard]] bool is_open() const noexcept;

/** Closes the owned descriptor and becomes empty. */
void close() noexcept;

/** Releases ownership and returns the native descriptor without closing it. */
[[nodiscard]] int release_native_handle() noexcept;

private:
explicit OwnedFileDescriptor(int owned_fd) noexcept;

int file_descriptor = -1;
};

} // namespace exasol::udf::v2::socket
72 changes: 72 additions & 0 deletions udf-runner-cpp/v2/include/exasol/udf/v2/socket/socket.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#pragma once

#include <cstddef>
#include <span>

#include <exasol/udf/v2/socket/owned_file_descriptor.hpp>

namespace exasol::udf::v2::socket
{

/** Direction used when shutting down part or all of a socket connection. */
enum class Shutdown
{
Receive,
Send,
Both,
};

/** Common interface for owned stream sockets. */
class Socket
{
public:
/** Destroys the socket and releases its native descriptor. */
virtual ~Socket() = default;

Socket(const Socket&) = delete;
Socket& operator=(const Socket&) = delete;

/** Returns the native socket descriptor, or -1 when closed. */
[[nodiscard]] virtual int native_handle() const noexcept = 0;

/** Returns whether the socket owns an open native descriptor. */
[[nodiscard]] virtual bool is_open() const noexcept = 0;

/** Closes the socket. This operation is idempotent. */
virtual void close() noexcept = 0;

/** Releases the native descriptor without closing it. */
[[nodiscard]] virtual OwnedFileDescriptor release_native_handle() noexcept = 0;

/** Shuts down the selected direction of the connection.
*
* @throws std::system_error if the operating-system shutdown fails.
*/
virtual void shutdown(Shutdown how) = 0;

/** Reads up to the capacity described by the buffers.
*
* A successful call may read fewer bytes than requested. A return value of
* zero indicates end-of-file.
*/
virtual std::size_t read_some(std::span<const std::span<std::byte>> buffers) = 0;

/** Writes up to the size described by the buffers.
*
* A successful call may write fewer bytes than requested.
*/
virtual std::size_t write_some(std::span<const std::span<const std::byte>> buffers) = 0;

/** Reads into one contiguous buffer. */
std::size_t read_some(std::span<std::byte> buffer);

/** Writes from one contiguous buffer. */
std::size_t write_some(std::span<const std::byte> buffer);

protected:
Socket() = default;
Socket(Socket&&) = default;
Socket& operator=(Socket&&) = default;
};

} // namespace exasol::udf::v2::socket
52 changes: 52 additions & 0 deletions udf-runner-cpp/v2/include/exasol/udf/v2/socket/unix_socket.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include <filesystem>

#include <exasol/udf/v2/socket/socket.hpp>

namespace exasol::udf::v2::socket
{

/** Owns one connected Unix-domain stream socket. */
class UnixSocket final : public Socket
{
public:
using Socket::read_some;
using Socket::write_some;

UnixSocket() noexcept;
~UnixSocket() override;

UnixSocket(const UnixSocket&) = delete;
UnixSocket& operator=(const UnixSocket&) = delete;
UnixSocket(UnixSocket&& other) noexcept;
UnixSocket& operator=(UnixSocket&& other) noexcept;

/** Connects to a Unix-domain socket at @p path.
*
* @throws std::system_error if socket creation or connection fails.
* @throws std::invalid_argument if @p path is not a valid Unix socket path.
*/
[[nodiscard]] static UnixSocket connect(const std::filesystem::path& path);

/** Takes ownership of an open Unix stream socket descriptor.
*
* @throws std::system_error if @p owned_fd is closed or is not a Unix stream socket.
*/
[[nodiscard]] static UnixSocket adopt_native_handle(OwnedFileDescriptor owned_fd);

[[nodiscard]] int native_handle() const noexcept override;
[[nodiscard]] bool is_open() const noexcept override;
void close() noexcept override;
[[nodiscard]] OwnedFileDescriptor release_native_handle() noexcept override;
void shutdown(Shutdown how) override;
std::size_t read_some(std::span<const std::span<std::byte>> buffers) override;
std::size_t write_some(std::span<const std::span<const std::byte>> buffers) override;

private:
explicit UnixSocket(OwnedFileDescriptor owned_fd) noexcept;

OwnedFileDescriptor file_descriptor;
};

} // namespace exasol::udf::v2::socket
Loading
Loading