Mercurial > repos > tabletprog
annotate modules/socket.tp @ 372:e857104bd183
Added reverse method to arrays
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 12 Aug 2015 19:16:41 -0700 |
parents | 57d78a0af132 |
children |
rev | line source |
---|---|
139 | 1 #{ |
145 | 2 includeSystemHeader: "sys/types.h" |
3 includeSystemHeader: "sys/socket.h" | |
4 includeSystemHeader: "netdb.h" | |
5 | |
139 | 6 llMessage: AF_INET withVars: { |
7 intret <- obj_int32 ptr | |
8 } andCode: { | |
9 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
10 intret num!: AF_INET | |
11 intret | |
12 } | |
13 llMessage: AF_UNIX withVars: { | |
14 intret <- obj_int32 ptr | |
15 } andCode: { | |
16 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
17 intret num!: AF_UNIX | |
18 intret | |
19 } | |
20 llMessage: STREAM withVars: { | |
21 intret <- obj_int32 ptr | |
22 } andCode: { | |
23 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
24 intret num!: SOCK_STREAM | |
25 intret | |
26 } | |
27 llMessage: DGRAM withVars: { | |
28 intret <- obj_int32 ptr | |
29 } andCode: { | |
30 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
31 intret num!: SOCK_DGRAM | |
32 intret | |
33 } | |
34 llMessage: socket withVars: { | |
35 fd <- obj_int32 ptr | |
36 domain <- obj_int32 ptr | |
37 type <- obj_int32 ptr | |
38 protocol <- obj_int32 ptr | |
39 } andCode: :domain type protocol { | |
40 fd <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
41 fd num!: (socket: (domain num) (type num) (protocol num)) | |
42 fd | |
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 | 46 #{ |
47 fd <- {sfd} | |
147
4c96a393103e
Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents:
145
diff
changeset
|
48 |
139 | 49 llMessage: close withVars: { |
50 sfd <- obj_int32 ptr | |
51 } andCode: { | |
52 sfd <- mcall: fd 1 self | |
53 close: (sfd num) | |
54 self | |
55 } | |
147
4c96a393103e
Add support for receiving data from a socket
Mike Pavone <pavone@retrodev.com>
parents:
145
diff
changeset
|
56 |
145 | 57 llMessage: send:withFlags withVars: { |
58 odata <- object ptr | |
59 flags <- obj_int32 ptr | |
60 sdata <- string ptr | |
61 sfd <- obj_int32 ptr | |
62 res <- obj_int32 ptr | |
63 } andCode: :odata :flags { | |
64 sdata <- mcall: string 1 odata | |
65 sfd <- mcall: fd 1 self | |
66 res <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
67 res num!: (send: (sfd num) (sdata data) (sdata bytes) (flags num)) | |
68 res | |
69 } | |
70 send <- :data { | |
71 send: data withFlags: 0 | |
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 | 113 } |
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 | 150 |
151 llMessage: _connectTo:onPort withVars: { | |
152 host <- string ptr | |
153 port <- string ptr | |
154 hints <- struct: addrinfo | |
155 info <- (struct: addrinfo) ptr | |
156 domain <- obj_int32 ptr | |
157 type <- obj_int32 ptr | |
158 protocol <- obj_int32 ptr | |
159 sock <- object ptr | |
160 sfd <- obj_int32 ptr | |
161 } andCode: :host :port { | |
162 memset: (addr_of: hints) 0 (sizeof: hints) | |
163 hints ai_family!: AF_UNSPEC | |
164 hints ai_socktype!: SOCK_STREAM | |
165 getaddrinfo: (host data) (port data) (addr_of: hints) (addr_of: info) | |
166 | |
167 domain <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
168 domain num!: (info ai_family) | |
169 type <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
170 type num!: (info ai_socktype) | |
171 protocol <- make_object: (addr_of: obj_int32_meta) NULL 0 | |
172 protocol num!: (info ai_protocol) | |
173 | |
174 sock <- mcall: new 4 self domain type protocol | |
175 sfd <- mcall: fd 1 sock | |
176 | |
177 connect: (sfd num) (info ai_addr) (info ai_addrlen) | |
178 | |
179 freeaddrinfo: info | |
180 sock | |
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 | 183 |
139 | 184 connectTo:onPort <- :host :port { |
145 | 185 _connectTo: host onPort: (string: port) |
139 | 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 | 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 | 255 } |
256 } |