annotate modules/socket.tp @ 370:57d78a0af132

Add code to socket module to allow listening for incoming connections
author Michael Pavone <pavone@retrodev.com>
date Wed, 12 Aug 2015 19:13:31 -0700
parents 4c96a393103e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #{
145
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
2 includeSystemHeader: "sys/types.h"
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
3 includeSystemHeader: "sys/socket.h"
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
4 includeSystemHeader: "netdb.h"
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
5
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 llMessage: AF_INET withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 intret <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 } andCode: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 intret num!: AF_INET
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 intret
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 llMessage: AF_UNIX withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 intret <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 } andCode: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 intret num!: AF_UNIX
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 intret
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 llMessage: STREAM withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 intret <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 } andCode: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 intret num!: SOCK_STREAM
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 intret
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 llMessage: DGRAM withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 intret <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 } andCode: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 intret num!: SOCK_DGRAM
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 intret
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 llMessage: socket withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 fd <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 domain <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 type <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 protocol <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 } andCode: :domain type protocol {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 fd <- make_object: (addr_of: obj_int32_meta) NULL 0
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 fd num!: (socket: (domain num) (type num) (protocol num))
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 fd
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 }
370
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
44
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
45 _sock_obj <- :sfd {
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 #{
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 fd <- {sfd}
147
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
48
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 llMessage: close withVars: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 sfd <- obj_int32 ptr
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 } andCode: {
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 sfd <- mcall: fd 1 self
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 close: (sfd num)
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 self
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
147
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
56
145
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
57 llMessage: send:withFlags withVars: {
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
58 odata <- object ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
59 flags <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
60 sdata <- string ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
61 sfd <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
62 res <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
63 } andCode: :odata :flags {
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
64 sdata <- mcall: string 1 odata
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
65 sfd <- mcall: fd 1 self
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
66 res <- make_object: (addr_of: obj_int32_meta) NULL 0
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
67 res num!: (send: (sfd num) (sdata data) (sdata bytes) (flags num))
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
68 res
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
69 }
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
70 send <- :data {
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
71 send: data withFlags: 0
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
72 }
147
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
73
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
74 llMessage: recv:withFlags withVars: {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
75 length <- obj_int32 ptr
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
76 flags <- obj_int32 ptr
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
77 sfd <- obj_int32 ptr
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
78 res <- int
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
79 buf <- char ptr
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
80 out <- string ptr
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
81 } andCode: :length :flags {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
82 sfd <- mcall: fd 1 self
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
83 buf <- GC_MALLOC_ATOMIC: (length num) + 1
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
84 res <- recv: (sfd num) buf (length num) (flags num)
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
85 if: res < 0 {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
86 length <- make_object: (addr_of: obj_int32_meta) NULL 0
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
87 length num!: res
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
88 length
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
89 } else: {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
90 out <- make_object: (addr_of: string_meta) NULL 0
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
91 out bytes!: res
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
92 out len!: res
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
93 out data!: buf
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
94 out
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
95 }
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
96 }
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
97 recv <- :length {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
98 recv: length withFlags: 0
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
99 }
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
100 recvAll <- :len {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
101 received <- ""
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
102 error <- false
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
103 while: { (not: error) && (received length) < len} do: {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
104 res <- recv: (len - (received length))
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
105 if: (res isInteger?) || (res length) = 0 {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
106 error <- true
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
107 } else: {
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
108 received <- received . res
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
109 }
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
110 }
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
111 received
4c96a393103e Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents: 145
diff changeset
112 }
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 }
370
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
115
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
116 _accept_sock <- :domain type protocol {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
117 sfd <- socket: domain type protocol
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
118 #{
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
119 fd <- {sfd}
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
120
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
121 llMessage: close withVars: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
122 sfd <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
123 } andCode: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
124 sfd <- mcall: fd 1 self
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
125 close: (sfd num)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
126 self
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
127 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
128
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
129 llMessage: accept withVars: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
130 sfd <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
131 newfd <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
132 } andCode: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
133 sfd <- mcall: fd 1 self
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
134 newfd <- make_object: (addr_of: obj_int32_meta) NULL 0
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
135 //TODO: expose peer address
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
136 newfd num!: (accept: (sfd num) NULL NULL)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
137 if: (newfd num) >= 0 {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
138 mcall: value 2 option (mcall: _sock_obj 2 socket newfd)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
139 } else: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
140 mcall: none 1 option
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
141 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
142 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
143 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
144 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
145
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
146 new <- :domain type protocol {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
147 sfd <- socket: domain type protocol
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
148 _sock_obj: sfd
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
149 }
145
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
150
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
151 llMessage: _connectTo:onPort withVars: {
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
152 host <- string ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
153 port <- string ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
154 hints <- struct: addrinfo
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
155 info <- (struct: addrinfo) ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
156 domain <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
157 type <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
158 protocol <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
159 sock <- object ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
160 sfd <- obj_int32 ptr
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
161 } andCode: :host :port {
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
162 memset: (addr_of: hints) 0 (sizeof: hints)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
163 hints ai_family!: AF_UNSPEC
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
164 hints ai_socktype!: SOCK_STREAM
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
165 getaddrinfo: (host data) (port data) (addr_of: hints) (addr_of: info)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
166
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
167 domain <- make_object: (addr_of: obj_int32_meta) NULL 0
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
168 domain num!: (info ai_family)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
169 type <- make_object: (addr_of: obj_int32_meta) NULL 0
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
170 type num!: (info ai_socktype)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
171 protocol <- make_object: (addr_of: obj_int32_meta) NULL 0
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
172 protocol num!: (info ai_protocol)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
173
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
174 sock <- mcall: new 4 self domain type protocol
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
175 sfd <- mcall: fd 1 sock
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
176
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
177 connect: (sfd num) (info ai_addr) (info ai_addrlen)
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
178
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
179 freeaddrinfo: info
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
180 sock
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
181 }
370
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
182
145
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
183
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 connectTo:onPort <- :host :port {
145
7db37f040a6f Basic socket support
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
185 _connectTo: host onPort: (string: port)
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 }
370
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
187 llMessage: listenAt:onPort withVars: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
188 ohost <- object ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
189 host <- string ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
190 oport <- object ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
191 port <- string ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
192 hints <- struct: addrinfo
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
193 info <- (struct: addrinfo) ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
194 curinfo <- (struct: addrinfo) ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
195 domain <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
196 type <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
197 protocol <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
198 sock <- object ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
199 sfd <- obj_int32 ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
200 result <- int32_t
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
201 hstr <- uint8_t ptr
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
202 } andCode: :ohost :oport {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
203 host <- (mcall: string 1 ohost) castTo: (string ptr)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
204 port <- (mcall: string 1 oport) castTo: (string ptr)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
205 memset: (addr_of: hints) 0 (sizeof: hints)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
206 hints ai_family!: AF_UNSPEC
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
207 hints ai_socktype!: SOCK_STREAM
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
208 hints ai_flags!: AI_PASSIVE
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
209 hints ai_protocol!: 0
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
210 hints ai_canonname!: NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
211 hints ai_addr!: NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
212 hints ai_next!: NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
213 result <- getaddrinfo
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
214 if: (host bytes) = 0 {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
215 hstr <- NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
216 } else: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
217 hstr <- host data
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
218 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
219 result <- getaddrinfo: hstr (port data) (addr_of: hints) (addr_of: info)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
220 if: result = 0 {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
221 curinfo <- info
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
222 domain <- make_object: (addr_of: obj_int32_meta) NULL 0
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
223 type <- make_object: (addr_of: obj_int32_meta) NULL 0
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
224 protocol <- make_object: (addr_of: obj_int32_meta) NULL 0
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
225 while: { curinfo != NULL } do: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
226 domain num!: (curinfo ai_family)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
227 type num!: (curinfo ai_socktype)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
228 protocol num!: (curinfo ai_protocol)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
229 sock <- mcall: _accept_sock 4 self domain type protocol
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
230 sfd <- (mcall: fd 1 sock) castTo: (obj_int32 ptr)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
231 if: (sfd num) != -1 {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
232 result <- bind: (sfd num) (curinfo ai_addr) (curinfo ai_addrlen)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
233 if: result = 0 {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
234 curinfo <- NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
235 } else: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
236 //failed to bind, close this socket so we can try again
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
237 close: (sfd num)
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
238 sock <- NULL
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
239 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
240 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
241 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
242 if: sock {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
243 listen: (sfd num) 8
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
244 mcall: value 2 option sock
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
245 } else: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
246 mcall: none 1 option
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
247 }
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
248 } else: {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
249 mcall: none 1 option
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
250 }
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
251 }
370
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
252
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
253 listenOnPort <- :port {
57d78a0af132 Add code to socket module to allow listening for incoming connections
Michael Pavone <pavone@retrodev.com>
parents: 147
diff changeset
254 listenAt: "" onPort: port
139
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
255 }
9bce890a7ff2 Old work on a socket module
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
256 }