aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/net/tcp.ey
blob: 01d1c1c6c9f3348de2f9cd66278ac82db94bb6e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Provide nice ways to do TCP/IP networking

<
  { ==err _ 0 lt { err ?? } rep } "+??" deffd
  { ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd

  bin .scan  "->" via
  bin .print "<-" via
  bin .produce "<=" via
  sys .linux "+" via

  # 0 -> port
  # 1 -> host (as network byte ordered string)
  # 0 <- string representing the sockaddr_in 
  { ==port ==host
    +AFINET <=u16
    port <-un16
    host cat
    0 <-un64
  } /sockaddrIpv4 deffd

  # TODO: use this in the code below (and test)
  # 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
    net .dns .resolveIpv4
    -01 txt .consume .u
    sockaddrIpv4
    +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s
    -01 +connect +??io.net.connect --
    s
  } /connectFd deffd

  # 0 -> "host:port"
  # 0 <- connected socket as file
  {
    connectFd sys .fdToFile
  } /connect deffd

  # 0 -> function to execute before bind ({ ==socket ... })
  # 1 -> port
  # 0 <- listening socket fd
  { =*opts # ==port
    0 <=un32 -01 sockaddrIpv4
    +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket -000 ==s
    opts
    -01 +bind +??io.net.bind --
    s 256 +listen +??io.net.listen --
    s
  } _ /listenOptFd deffd
      /listenOpt   deffd

  # 0 -> port
  # 0 <- listening socket fd
  { { } listenOptFd } _ /listenFd deffd
                        /listen   deffd

  # 0 -> listening socket fd
  # 0 <- newly accepted connection fd
  { # ==fd
    +accept +??io.net.accept
  } /acceptFd deffd

  # 0 -> listening socket fd
  # 0 <- newly accepted connection as file
  { # ==fd
    acceptFd sys .fdToFile
  } /accept deffd
> /tcp net .defv

# vim: syn=elymas