Skip to content
78 changes: 78 additions & 0 deletions ListTalk/networking/Socket.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/* SPDX-License-Identifier: MIT */
#ifndef H__ListTalk__networking__Socket__
#define H__ListTalk__networking__Socket__

#include <ListTalk/classes/ByteVector.h>
#include <ListTalk/classes/String.h>
#include <ListTalk/macros/decl_macros.h>

LT__BEGIN_DECLS

LT_DECLARE_CLASS(LT_Socket);
LT_DECLARE_CLASS(LT_DatagramSocket);
LT_DECLARE_CLASS(LT_StreamSocket);
LT_DECLARE_CLASS(LT_ServerSocket);
LT_DECLARE_CLASS(LT_IPSocket);
LT_DECLARE_CLASS(LT_UDPSocket);
LT_DECLARE_CLASS(LT_TCPSocket);
LT_DECLARE_CLASS(LT_TCPServerSocket);
LT_DECLARE_CLASS(LT_UnixSocket);
LT_DECLARE_CLASS(LT_UnixDatagramSocket);
LT_DECLARE_CLASS(LT_UnixStreamSocket);
LT_DECLARE_CLASS(LT_UnixServerSocket);

int LT_IPSocket_closed(LT_IPSocket* socket);
int LT_IPSocket_descriptor(LT_IPSocket* socket);
void LT_IPSocket_close(LT_IPSocket* socket);

LT_UDPSocket* LT_UDPSocket_bind(const char* host, uint16_t port);
LT_UDPSocket* LT_UDPSocket_connect(const char* host, uint16_t port);
size_t LT_UDPSocket_send(LT_UDPSocket* socket, LT_ByteVector* bytes);
LT_ByteVector* LT_UDPSocket_receive(LT_UDPSocket* socket,
size_t maximum_length);

LT_TCPSocket* LT_TCPSocket_connect(const char* host, uint16_t port);
size_t LT_TCPSocket_read(LT_TCPSocket* socket,
void* buffer, size_t length);
LT_Value LT_TCPSocket_readLine(LT_TCPSocket* socket);
void LT_TCPSocket_write(LT_TCPSocket* socket,
const void* buffer, size_t length);
void LT_TCPSocket_shutdown_write(LT_TCPSocket* socket);

LT_TCPServerSocket* LT_TCPServerSocket_new(const char* host,
uint16_t port,
int backlog);
LT_TCPSocket* LT_TCPServerSocket_accept(LT_TCPServerSocket* socket);

int LT_UnixSocket_closed(LT_UnixSocket* socket);
int LT_UnixSocket_descriptor(LT_UnixSocket* socket);
void LT_UnixSocket_close(LT_UnixSocket* socket);

LT_UnixDatagramSocket* LT_UnixDatagramSocket_bind(const char* path);
LT_UnixDatagramSocket* LT_UnixDatagramSocket_connect(const char* path);
size_t LT_UnixDatagramSocket_send(LT_UnixDatagramSocket* socket,
LT_ByteVector* bytes);
LT_ByteVector* LT_UnixDatagramSocket_receive(
LT_UnixDatagramSocket* socket,
size_t maximum_length
);

LT_UnixStreamSocket* LT_UnixStreamSocket_connect(const char* path);
void LT_UnixStreamSocket_pair(LT_UnixStreamSocket** first,
LT_UnixStreamSocket** second);
size_t LT_UnixStreamSocket_read(LT_UnixStreamSocket* socket,
void* buffer,
size_t length);
LT_Value LT_UnixStreamSocket_readLine(LT_UnixStreamSocket* socket);
void LT_UnixStreamSocket_write(LT_UnixStreamSocket* socket,
const void* buffer,
size_t length);
void LT_UnixStreamSocket_shutdown_write(LT_UnixStreamSocket* socket);

LT_UnixServerSocket* LT_UnixServerSocket_new(const char* path, int backlog);
LT_UnixStreamSocket* LT_UnixServerSocket_accept(
LT_UnixServerSocket* socket
);

LT__END_DECLS
#endif
5 changes: 4 additions & 1 deletion ListTalk/vm/eval.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ LT__BEGIN_DECLS

typedef struct LT_TailCallUnwindMarker_s LT_TailCallUnwindMarker;

/* Run and clear the current thread's pending ListTalk signal, if any. */
extern void LT_check_pending_signal(void);

extern LT_Value LT_eval(
LT_Value expression,
LT_Environment* environment,
Expand Down Expand Up @@ -93,4 +96,4 @@ extern LT_Value LT_super_send(

LT__END_DECLS

#endif
#endif
55 changes: 55 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,28 @@ debugger_lib = library(
install : true
)

networking_lib = library(
'ListTalkNetworking',
[
'src/networking/Socket.c',
'src/networking/IPSocket.c',
'src/networking/SocketBuffer.c',
'src/networking/UnixSocket.c',
],
link_with : [vm_lib],
dependencies : listtalk_deps,
install : true
)

pkg.generate(
networking_lib,
filebase : 'ListTalkNetworking',
name : 'ListTalkNetworking',
description : 'ListTalk high-level socket networking library',
subdirs : '.',
requires : ['ListTalkVM']
)

pkg.generate(
debugger_lib,
filebase : 'ListTalkDebugger',
Expand Down Expand Up @@ -326,6 +348,17 @@ ini_module = shared_module(
install_dir : listtalk_native_module_dir
)

socket_module = shared_module(
'socket',
'src/modules/socket.c',
name_prefix : '',
name_suffix : 'ltm',
link_with : [vm_lib, networking_lib],
dependencies : listtalk_deps,
install : true,
install_dir : listtalk_native_module_dir
)

if md4c_dep.found() and md4c_html_dep.found()
markdown_config = configuration_data()
markdown_config.set10(
Expand Down Expand Up @@ -517,6 +550,13 @@ message_queue_test_exe = executable(
dependencies : [bdwgc]
)

networking_test_exe = executable(
'networking_test',
'tests/networking_test.c',
link_with : [vm_lib, networking_lib],
dependencies : [bdwgc]
)

test(
'reader_test',
reader_test_exe
Expand Down Expand Up @@ -545,6 +585,16 @@ test(
depends : [os_module, gc_module, cmdopts_module, json_module, ini_module]
)

test(
'eval_socket',
listtalk_exe,
args : [
'-L', meson.current_build_dir(),
meson.current_source_dir() / 'tests' / 'eval-socket.lt'
],
depends : [socket_module]
)

if md4c_dep.found() and md4c_html_dep.found()
test(
'eval_markdown',
Expand Down Expand Up @@ -683,6 +733,11 @@ test(
message_queue_test_exe
)

test(
'networking_test',
networking_test_exe
)

install_subdir(
'ListTalk',
install_dir: get_option('includedir')
Expand Down
22 changes: 22 additions & 0 deletions src/modules/socket.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* SPDX-License-Identifier: MIT */
#include <ListTalk/ListTalk.h>
#include <ListTalk/networking/Socket.h>

void ListTalk_socket_load(LT_Environment* environment){
LT_Package* package = LT_Package_new("ListTalk:Socket");
#define BIND_CLASS(name) LT_Environment_bind(environment, LT_Symbol_new_in(package, #name), LT_STATIC_CLASS(LT_##name), LT_ENV_BINDING_FLAG_CONSTANT)
BIND_CLASS(Socket);
BIND_CLASS(DatagramSocket);
BIND_CLASS(StreamSocket);
BIND_CLASS(ServerSocket);
BIND_CLASS(IPSocket);
BIND_CLASS(UDPSocket);
BIND_CLASS(TCPSocket);
BIND_CLASS(TCPServerSocket);
BIND_CLASS(UnixSocket);
BIND_CLASS(UnixDatagramSocket);
BIND_CLASS(UnixStreamSocket);
BIND_CLASS(UnixServerSocket);
#undef BIND_CLASS
LT_loader_provide(environment, "socket");
}
Loading