equal
deleted
inserted
replaced
105 { |
105 { |
106 struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); |
106 struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); |
107 |
107 |
108 // implemented in sock_tcp_add_event |
108 // implemented in sock_tcp_add_event |
109 return sock_tcp_add_event(sock, mask); |
109 return sock_tcp_add_event(sock, mask); |
|
110 } |
|
111 |
|
112 static void sock_tcp_release (struct sock_stream *base_sock) |
|
113 { |
|
114 struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); |
|
115 |
|
116 // close and free |
|
117 sock_tcp_close(sock); |
|
118 sock_tcp_free(sock); |
110 } |
119 } |
111 |
120 |
112 /* |
121 /* |
113 * Our sock_stream_type |
122 * Our sock_stream_type |
114 */ |
123 */ |
116 .methods = { |
125 .methods = { |
117 .read = &sock_tcp_read, |
126 .read = &sock_tcp_read, |
118 .write = &sock_tcp_write, |
127 .write = &sock_tcp_write, |
119 .event_init = &sock_tcp_event_init, |
128 .event_init = &sock_tcp_event_init, |
120 .event_enable = &sock_tcp_event_enable, |
129 .event_enable = &sock_tcp_event_enable, |
|
130 .release = &sock_tcp_release, |
121 }, |
131 }, |
122 }; |
132 }; |
123 |
133 |
124 err_t sock_tcp_alloc (struct sock_tcp **sock_ptr) |
134 err_t sock_tcp_alloc (struct sock_tcp **sock_ptr) |
125 { |
135 { |
249 |
259 |
250 // ok |
260 // ok |
251 return SUCCESS; |
261 return SUCCESS; |
252 } |
262 } |
253 |
263 |
254 void sock_tcp_release (struct sock_tcp *sock) |
264 void sock_tcp_close (struct sock_tcp *sock) |
|
265 { |
|
266 // must be connected |
|
267 assert(sock->fd >= 0); |
|
268 |
|
269 // kill any events |
|
270 if (sock->ev_read) |
|
271 event_del(sock->ev_read); |
|
272 |
|
273 if (sock->ev_write) |
|
274 event_del(sock->ev_write); |
|
275 |
|
276 // close the socket itself |
|
277 // XXX: errors? |
|
278 close(sock->fd); |
|
279 |
|
280 // invalidate |
|
281 sock->fd = -1; |
|
282 } |
|
283 |
|
284 void sock_tcp_free (struct sock_tcp *sock) |
255 { |
285 { |
256 // must not be connected |
286 // must not be connected |
257 assert(sock->fd < 0); |
287 assert(sock->fd < 0); |
258 |
288 |
259 // free |
289 // free |
273 if ((err = sock_tcp_init_connect(sock, host, service))) { |
303 if ((err = sock_tcp_init_connect(sock, host, service))) { |
274 // copy error_info |
304 // copy error_info |
275 SET_ERROR_INFO(err_info, sock_stream_error(SOCK_TCP_BASE(sock))); |
305 SET_ERROR_INFO(err_info, sock_stream_error(SOCK_TCP_BASE(sock))); |
276 |
306 |
277 // cleanup |
307 // cleanup |
278 sock_tcp_release(sock); |
308 sock_tcp_free(sock); |
279 |
309 |
280 // return error code |
310 // return error code |
281 return err; |
311 return err; |
282 } |
312 } |
283 |
313 |