aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/net/alg/server.ey13
-rw-r--r--elymas/lib/net/tcp.ey23
-rw-r--r--elymas/lib/sys/linux.ey16
3 files changed, 41 insertions, 11 deletions
diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey
index 2b291a7..882b46f 100644
--- a/elymas/lib/net/alg/server.ey
+++ b/elymas/lib/net/alg/server.ey
@@ -4,11 +4,16 @@
{ ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd
{ <
+ sys .linux "+" via +epoll "++" via
+ sys .asm "+!" via
+ net .tcp "+:" via
+
<
{ 1 } /running deffst
{ 1000000 } /interval deffst
{ "unconfigured accept (of epollServer)" die } /accept deffst
{ "unconfigured port (of epollServer)" die } /port deffst
+ { 1 -01 +setsockopt .reuseAddr +??io.net.setsockopt -- } /reuseAddr deffst
{ = }' /set deffst
{ scope keys }' /setters deffst
@@ -19,14 +24,12 @@
{ deffst }' ::installSetters
- sys .linux "+" via +epoll "++" via
- sys .asm "+!" via
- net .tcp "+:" via
-
< > ==:noHandler
{
- ::port +:listenFd ==listenFd
+ ::port { # ==s
+ ::reuseAddr
+ } +:listenOptFd ==listenFd
[ ] ==allEventHandlers
{ ==fd ==handler
diff --git a/elymas/lib/net/tcp.ey b/elymas/lib/net/tcp.ey
index 7fcc194..18b0a3e 100644
--- a/elymas/lib/net/tcp.ey
+++ b/elymas/lib/net/tcp.ey
@@ -19,6 +19,12 @@
0 <-un64
} /sockaddrIpv4 deffd
+ # 0 <- new tcp socket fd
+ {
+ +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket
+ } _ /socketFd deffd
+ /socket deffd
+
# 0 -> "host:port"
# 0 <- connected socket fd
{ "^([^:]+):(\\d+)$" regex not { "host:port expected" die } rep
@@ -36,16 +42,23 @@
connectFd sys .fdToFile
} /connect deffd
- # 0 -> port
+ # 0 -> function to execute before bind ({ ==socket ... })
+ # 1 -> port
# 0 <- listening socket fd
- { # ==port
+ { =*opts # ==port
0 <=un32 -01 sockaddrIpv4
- +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s
+ +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket -000 ==s
+ opts
-01 +bind +??io.net.bind --
s 256 +listen +??io.net.listen --
s
- } _ /listenFd deffd
- /listen deffd
+ } _ /listenOptFd deffd
+ /listenOpt deffd
+
+ # 0 -> port
+ # 0 <- listening socket fd
+ { { } listenOptFd } _ /listenFd deffd
+ /listen deffd
# 0 -> listening socket fd
# 0 <- newly accepted connection fd
diff --git a/elymas/lib/sys/linux.ey b/elymas/lib/sys/linux.ey
index d16a483..a155d9a 100644
--- a/elymas/lib/sys/linux.ey
+++ b/elymas/lib/sys/linux.ey
@@ -245,7 +245,7 @@
# 113 ==:SETREUID
# 160 ==:SETRLIMIT
# 112 ==:SETSID
- # 54 ==:SETSOCKOPT
+ 54 ==:SETSOCKOPT
# 164 ==:SETTIMEOFDAY
# 105 ==:SETUID
# 188 ==:SETXATTR
@@ -662,6 +662,20 @@
{ 0 0 0 READ } /read defStdSyscall
+ <
+ 1 ==:SOLSOCKET
+
+ # TODO: support more options
+ 2 ==:SOREUSEADDR
+
+ # 0 -> socket fd
+ # 1 -> turn it on (1) or off (0)
+ # 0 <- raw return value
+ { ==fd ==value
+ fd SOLSOCKET SOREUSEADDR "" value <-u32 4 0 SETSOCKOPT sys .asm .syscall =errno
+ } /reuseAddr deffd
+ > /setsockopt defvd
+
# 0 <- raw return value
# 1 <- returned status
{ ==options ==pid