xref: /relibc/src/platform/linux/socket.rs (revision ed19381547d66b76981ea1e4ff942c5a4da45ab7)
1 use super::{
2     super::{types::*, PalSocket},
3     e, Sys,
4 };
5 use crate::header::sys_socket::{sockaddr, socklen_t};
6 
7 impl PalSocket for Sys {
8     unsafe fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int {
9         e(syscall!(ACCEPT, socket, address, address_len)) as c_int
10     }
11 
12     unsafe fn bind(socket: c_int, address: *const sockaddr, address_len: socklen_t) -> c_int {
13         e(syscall!(BIND, socket, address, address_len)) as c_int
14     }
15 
16     unsafe fn connect(socket: c_int, address: *const sockaddr, address_len: socklen_t) -> c_int {
17         e(syscall!(CONNECT, socket, address, address_len)) as c_int
18     }
19 
20     unsafe fn getpeername(
21         socket: c_int,
22         address: *mut sockaddr,
23         address_len: *mut socklen_t,
24     ) -> c_int {
25         e(syscall!(GETPEERNAME, socket, address, address_len)) as c_int
26     }
27 
28     unsafe fn getsockname(
29         socket: c_int,
30         address: *mut sockaddr,
31         address_len: *mut socklen_t,
32     ) -> c_int {
33         e(syscall!(GETSOCKNAME, socket, address, address_len)) as c_int
34     }
35 
36     fn getsockopt(
37         socket: c_int,
38         level: c_int,
39         option_name: c_int,
40         option_value: *mut c_void,
41         option_len: *mut socklen_t,
42     ) -> c_int {
43         e(unsafe {
44             syscall!(
45                 GETSOCKOPT,
46                 socket,
47                 level,
48                 option_name,
49                 option_value,
50                 option_len
51             )
52         }) as c_int
53     }
54 
55     fn listen(socket: c_int, backlog: c_int) -> c_int {
56         e(unsafe { syscall!(LISTEN, socket, backlog) }) as c_int
57     }
58 
59     unsafe fn recvfrom(
60         socket: c_int,
61         buf: *mut c_void,
62         len: size_t,
63         flags: c_int,
64         address: *mut sockaddr,
65         address_len: *mut socklen_t,
66     ) -> ssize_t {
67         e(syscall!(
68             RECVFROM,
69             socket,
70             buf,
71             len,
72             flags,
73             address,
74             address_len
75         )) as ssize_t
76     }
77 
78     unsafe fn sendto(
79         socket: c_int,
80         buf: *const c_void,
81         len: size_t,
82         flags: c_int,
83         dest_addr: *const sockaddr,
84         dest_len: socklen_t,
85     ) -> ssize_t {
86         e(syscall!(
87             SENDTO, socket, buf, len, flags, dest_addr, dest_len
88         )) as ssize_t
89     }
90 
91     fn setsockopt(
92         socket: c_int,
93         level: c_int,
94         option_name: c_int,
95         option_value: *const c_void,
96         option_len: socklen_t,
97     ) -> c_int {
98         e(unsafe {
99             syscall!(
100                 SETSOCKOPT,
101                 socket,
102                 level,
103                 option_name,
104                 option_value,
105                 option_len
106             )
107         }) as c_int
108     }
109 
110     fn shutdown(socket: c_int, how: c_int) -> c_int {
111         e(unsafe { syscall!(SHUTDOWN, socket, how) }) as c_int
112     }
113 
114     unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
115         e(syscall!(SOCKET, domain, kind, protocol)) as c_int
116     }
117 
118     fn socketpair(domain: c_int, kind: c_int, protocol: c_int, sv: &mut [c_int; 2]) -> c_int {
119         e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, sv.as_mut_ptr()) }) as c_int
120     }
121 }
122