| 1 | #include <wasi/api.h> |
| 2 | #include <wasi/libc.h> |
| 3 | #include <errno.h> |
| 4 | #include <unistd.h> |
| 5 | |
| 6 | int __wasilibc_fd_renumber(int fd, int newfd) { |
| 7 | // Scan the preopen fds before making any changes. |
| 8 | __wasilibc_populate_preopens(); |
| 9 | |
| 10 | __wasi_errno_t error = __wasi_fd_renumber(fd, newfd); |
| 11 | if (error != 0) { |
| 12 | errno = error; |
| 13 | return -1; |
| 14 | } |
| 15 | return 0; |
| 16 | } |
| 17 | |
| 18 | #ifdef __wasilibc_use_wasip2 |
| 19 | #include <wasi/descriptor_table.h> |
| 20 | |
| 21 | void drop_tcp_socket(tcp_socket_t socket) { |
| 22 | switch (socket.state.tag) { |
| 23 | case TCP_SOCKET_STATE_UNBOUND: |
| 24 | case TCP_SOCKET_STATE_BOUND: |
| 25 | case TCP_SOCKET_STATE_CONNECTING: |
| 26 | case TCP_SOCKET_STATE_LISTENING: |
| 27 | case TCP_SOCKET_STATE_CONNECT_FAILED: |
| 28 | // No additional resources to drop. |
| 29 | break; |
| 30 | case TCP_SOCKET_STATE_CONNECTED: { |
| 31 | tcp_socket_state_connected_t connection = socket.state.connected; |
| 32 | |
| 33 | poll_pollable_drop_own(connection.input_pollable); |
| 34 | poll_pollable_drop_own(connection.output_pollable); |
| 35 | streams_input_stream_drop_own(connection.input); |
| 36 | streams_output_stream_drop_own(connection.output); |
| 37 | break; |
| 38 | } |
| 39 | default: /* unreachable */ abort(); |
| 40 | } |
| 41 | |
| 42 | poll_pollable_drop_own(socket.socket_pollable); |
| 43 | tcp_tcp_socket_drop_own(socket.socket); |
| 44 | } |
| 45 | |
| 46 | void drop_udp_socket_streams(udp_socket_streams_t streams) { |
| 47 | poll_pollable_drop_own(streams.incoming_pollable); |
| 48 | poll_pollable_drop_own(streams.outgoing_pollable); |
| 49 | udp_incoming_datagram_stream_drop_own(streams.incoming); |
| 50 | udp_outgoing_datagram_stream_drop_own(streams.outgoing); |
| 51 | } |
| 52 | |
| 53 | void drop_udp_socket(udp_socket_t socket) { |
| 54 | switch (socket.state.tag) { |
| 55 | case UDP_SOCKET_STATE_UNBOUND: |
| 56 | case UDP_SOCKET_STATE_BOUND_NOSTREAMS: |
| 57 | // No additional resources to drop. |
| 58 | break; |
| 59 | case UDP_SOCKET_STATE_BOUND_STREAMING: |
| 60 | drop_udp_socket_streams(socket.state.bound_streaming.streams); |
| 61 | break; |
| 62 | case UDP_SOCKET_STATE_CONNECTED: { |
| 63 | drop_udp_socket_streams(socket.state.connected.streams); |
| 64 | break; |
| 65 | } |
| 66 | default: /* unreachable */ abort(); |
| 67 | } |
| 68 | |
| 69 | poll_pollable_drop_own(socket.socket_pollable); |
| 70 | udp_udp_socket_drop_own(socket.socket); |
| 71 | } |
| 72 | #endif // __wasilibc_use_wasip2 |