1
0
Fork 0
forked from fun/fun

Bug fixes. (0.21.1)

This commit is contained in:
Johannes Findeisen 2025-10-04 03:07:51 +02:00
commit 696906d67e
5 changed files with 75 additions and 1 deletions

68
examples/unix_socket_echo.fun Executable file
View file

@ -0,0 +1,68 @@
#!/usr/bin/env fun
/**
* This file is part of the Fun programming language.
* https://hanez.org/project/fun/
*
* Copyright 2025 Johannes Findeisen <you@hanez.org>
* Licensed under the terms of the Apache-2.0 license.
* https://opensource.org/license/apache-2-0
*
* Added: 2025-10-04
*/
/*
* UNIX domain socket echo demo.
* - On Unix-like systems: demonstrates unix_listen + tcp_accept + unix_connect + sock_send/recv.
* - On Windows: prints a friendly message and exits (since AF_UNIX is not available here).
*/
fun server_thread(listen_fd)
// Accept a single client, read message, echo back, close.
cfd = tcp_accept(to_number(listen_fd))
if (cfd <= 0)
// accept failed
return 0
msg = sock_recv(cfd, 4096)
// Simple echo prefix
_ = sock_send(cfd, join(["echo:", msg], ""))
_ = sock_close(cfd)
return 1
// Cross-platform guard: Windows sets OS=Windows_NT
os = env("OS")
if (os == "Windows_NT")
print("UNIX domain sockets are not supported on Windows in this build. Skipping demo.")
else
// Path for the UNIX socket
path = "/tmp/fun_unix_echo.sock"
// Start a UNIX listening socket
lfd = unix_listen(path, 1)
if (lfd <= 0)
print(join(["unix_listen failed at ", path], ""))
else
// Spawn the server thread which will accept exactly one client
tid = thread_spawn(server_thread, lfd)
// Small delay to ensure the server is accepting
sleep(50)
// Create a client using raw built-ins (no stdlib dependency)
cfd = unix_connect(path)
if (cfd <= 0)
print("unix_connect failed")
else
// Send a message and read the reply
_ = sock_send(cfd, "hello over AF_UNIX")
reply = sock_recv(cfd, 4096)
print(reply)
_ = sock_close(cfd)
// Join the server thread and close the listening socket
_ = thread_join(tid)
_ = sock_close(lfd)
/* Expected output:
echo:hello over AF_UNIX
*/