Skip to content

Commit 5937ad5

Browse files
committed
Cleanup IOCTL definitions in linux_like tree
1 parent 0fe1d45 commit 5937ad5

File tree

10 files changed

+179
-525
lines changed

10 files changed

+179
-525
lines changed

libc-test/build.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1986,6 +1986,8 @@ fn test_android(target: &str) {
19861986
// sigval is a struct in Rust, but a union in C:
19871987
"sigval" => format!("union sigval"),
19881988

1989+
"Ioctl" => "int".to_string(),
1990+
19891991
// put `struct` in front of all structs:.
19901992
t if is_struct => format!("struct {}", t),
19911993

libc-test/semver/android.txt

+5
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,8 @@ FF1
634634
FFDLY
635635
FF_CNT
636636
FF_MAX
637+
FICLONE
638+
FICLONERANGE
637639
FILE
638640
FILENAME_MAX
639641
FIOCLEX
@@ -750,6 +752,8 @@ IFF_DYNAMIC
750752
IFF_LOOPBACK
751753
IFF_MASTER
752754
IFF_MULTICAST
755+
IFF_NAPI
756+
IFF_NAPI_FRAGS
753757
IFF_NOARP
754758
IFF_NOTRAILERS
755759
IFF_NO_CARRIER
@@ -3321,6 +3325,7 @@ fgetpos
33213325
fgets
33223326
fgets_unlocked
33233327
fgetxattr
3328+
file_clone_range
33243329
fileno
33253330
flistxattr
33263331
flock

src/unix/linux_like/android/mod.rs

+9-151
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22
33
use crate::prelude::*;
44

5+
cfg_if! {
6+
if #[cfg(doc)] {
7+
pub(crate) type Ioctl = c_int;
8+
} else {
9+
#[doc(hidden)]
10+
pub type Ioctl = c_int;
11+
}
12+
}
13+
514
pub type clock_t = c_long;
615
pub type time_t = c_long;
716
pub type suseconds_t = c_long;
@@ -337,19 +346,6 @@ s! {
337346
pub dlpi_tls_data: *mut c_void,
338347
}
339348

340-
// linux/filter.h
341-
pub struct sock_filter {
342-
pub code: crate::__u16,
343-
pub jt: crate::__u8,
344-
pub jf: crate::__u8,
345-
pub k: crate::__u32,
346-
}
347-
348-
pub struct sock_fprog {
349-
pub len: c_ushort,
350-
pub filter: *mut sock_filter,
351-
}
352-
353349
// linux/seccomp.h
354350
pub struct seccomp_data {
355351
pub nr: c_int,
@@ -1656,27 +1652,6 @@ pub const FIONREAD: c_int = 0x541B;
16561652
pub const TIOCCONS: c_int = 0x541D;
16571653
pub const TIOCSBRK: c_int = 0x5427;
16581654
pub const TIOCCBRK: c_int = 0x5428;
1659-
cfg_if! {
1660-
if #[cfg(any(
1661-
target_arch = "x86",
1662-
target_arch = "x86_64",
1663-
target_arch = "arm",
1664-
target_arch = "aarch64",
1665-
target_arch = "riscv64",
1666-
target_arch = "s390x"
1667-
))] {
1668-
pub const FICLONE: c_int = 0x40049409;
1669-
pub const FICLONERANGE: c_int = 0x4020940D;
1670-
} else if #[cfg(any(
1671-
target_arch = "mips",
1672-
target_arch = "mips64",
1673-
target_arch = "powerpc",
1674-
target_arch = "powerpc64"
1675-
))] {
1676-
pub const FICLONE: c_int = 0x80049409;
1677-
pub const FICLONERANGE: c_int = 0x8020940D;
1678-
}
1679-
}
16801655

16811656
pub const ST_RDONLY: c_ulong = 1;
16821657
pub const ST_NOSUID: c_ulong = 2;
@@ -1858,38 +1833,6 @@ pub const BLKIOOPT: c_int = 0x1279;
18581833
pub const BLKSSZGET: c_int = 0x1268;
18591834
pub const BLKPBSZGET: c_int = 0x127B;
18601835

1861-
cfg_if! {
1862-
// Those type are constructed using the _IOC macro
1863-
// DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
1864-
// where D stands for direction (either None (00), Read (01) or Write (11))
1865-
// where S stands for size (int, long, struct...)
1866-
// where T stands for type ('f','v','X'...)
1867-
// where N stands for NR (NumbeR)
1868-
if #[cfg(any(target_arch = "x86", target_arch = "arm"))] {
1869-
pub const FS_IOC_GETFLAGS: c_int = 0x80046601;
1870-
pub const FS_IOC_SETFLAGS: c_int = 0x40046602;
1871-
pub const FS_IOC_GETVERSION: c_int = 0x80047601;
1872-
pub const FS_IOC_SETVERSION: c_int = 0x40047602;
1873-
pub const FS_IOC32_GETFLAGS: c_int = 0x80046601;
1874-
pub const FS_IOC32_SETFLAGS: c_int = 0x40046602;
1875-
pub const FS_IOC32_GETVERSION: c_int = 0x80047601;
1876-
pub const FS_IOC32_SETVERSION: c_int = 0x40047602;
1877-
} else if #[cfg(any(
1878-
target_arch = "x86_64",
1879-
target_arch = "riscv64",
1880-
target_arch = "aarch64"
1881-
))] {
1882-
pub const FS_IOC_GETFLAGS: c_int = 0x80086601;
1883-
pub const FS_IOC_SETFLAGS: c_int = 0x40086602;
1884-
pub const FS_IOC_GETVERSION: c_int = 0x80087601;
1885-
pub const FS_IOC_SETVERSION: c_int = 0x40087602;
1886-
pub const FS_IOC32_GETFLAGS: c_int = 0x80046601;
1887-
pub const FS_IOC32_SETFLAGS: c_int = 0x40046602;
1888-
pub const FS_IOC32_GETVERSION: c_int = 0x80047601;
1889-
pub const FS_IOC32_SETVERSION: c_int = 0x40047602;
1890-
}
1891-
}
1892-
18931836
pub const EAI_AGAIN: c_int = 2;
18941837
pub const EAI_BADFLAGS: c_int = 3;
18951838
pub const EAI_FAIL: c_int = 4;
@@ -2624,65 +2567,6 @@ pub const SND_CNT: usize = SND_MAX as usize + 1;
26242567
pub const UINPUT_VERSION: c_uint = 5;
26252568
pub const UINPUT_MAX_NAME_SIZE: usize = 80;
26262569

2627-
// bionic/libc/kernel/uapi/linux/if_tun.h
2628-
pub const IFF_TUN: c_int = 0x0001;
2629-
pub const IFF_TAP: c_int = 0x0002;
2630-
pub const IFF_NAPI: c_int = 0x0010;
2631-
pub const IFF_NAPI_FRAGS: c_int = 0x0020;
2632-
pub const IFF_NO_CARRIER: c_int = 0x0040;
2633-
pub const IFF_NO_PI: c_int = 0x1000;
2634-
pub const IFF_ONE_QUEUE: c_int = 0x2000;
2635-
pub const IFF_VNET_HDR: c_int = 0x4000;
2636-
pub const IFF_TUN_EXCL: c_int = 0x8000;
2637-
pub const IFF_MULTI_QUEUE: c_int = 0x0100;
2638-
pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
2639-
pub const IFF_DETACH_QUEUE: c_int = 0x0400;
2640-
pub const IFF_PERSIST: c_int = 0x0800;
2641-
pub const IFF_NOFILTER: c_int = 0x1000;
2642-
pub const TUN_TX_TIMESTAMP: c_int = 1;
2643-
// Features for GSO (TUNSETOFFLOAD)
2644-
pub const TUN_F_CSUM: c_uint = 0x01;
2645-
pub const TUN_F_TSO4: c_uint = 0x02;
2646-
pub const TUN_F_TSO6: c_uint = 0x04;
2647-
pub const TUN_F_TSO_ECN: c_uint = 0x08;
2648-
pub const TUN_F_UFO: c_uint = 0x10;
2649-
pub const TUN_F_USO4: c_uint = 0x20;
2650-
pub const TUN_F_USO6: c_uint = 0x40;
2651-
// Protocol info prepended to the packets (when IFF_NO_PI is not set)
2652-
pub const TUN_PKT_STRIP: c_int = 0x0001;
2653-
// Accept all multicast packets
2654-
pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
2655-
// Ioctl operation codes
2656-
const T_TYPE: u32 = b'T' as u32;
2657-
pub const TUNSETNOCSUM: c_int = _IOW::<c_int>(T_TYPE, 200);
2658-
pub const TUNSETDEBUG: c_int = _IOW::<c_int>(T_TYPE, 201);
2659-
pub const TUNSETIFF: c_int = _IOW::<c_int>(T_TYPE, 202);
2660-
pub const TUNSETPERSIST: c_int = _IOW::<c_int>(T_TYPE, 203);
2661-
pub const TUNSETOWNER: c_int = _IOW::<c_int>(T_TYPE, 204);
2662-
pub const TUNSETLINK: c_int = _IOW::<c_int>(T_TYPE, 205);
2663-
pub const TUNSETGROUP: c_int = _IOW::<c_int>(T_TYPE, 206);
2664-
pub const TUNGETFEATURES: c_int = _IOR::<c_int>(T_TYPE, 207);
2665-
pub const TUNSETOFFLOAD: c_int = _IOW::<c_int>(T_TYPE, 208);
2666-
pub const TUNSETTXFILTER: c_int = _IOW::<c_int>(T_TYPE, 209);
2667-
pub const TUNGETIFF: c_int = _IOR::<c_int>(T_TYPE, 210);
2668-
pub const TUNGETSNDBUF: c_int = _IOR::<c_int>(T_TYPE, 211);
2669-
pub const TUNSETSNDBUF: c_int = _IOW::<c_int>(T_TYPE, 212);
2670-
pub const TUNATTACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 213);
2671-
pub const TUNDETACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 214);
2672-
pub const TUNGETVNETHDRSZ: c_int = _IOR::<c_int>(T_TYPE, 215);
2673-
pub const TUNSETVNETHDRSZ: c_int = _IOW::<c_int>(T_TYPE, 216);
2674-
pub const TUNSETQUEUE: c_int = _IOW::<c_int>(T_TYPE, 217);
2675-
pub const TUNSETIFINDEX: c_int = _IOW::<c_int>(T_TYPE, 218);
2676-
pub const TUNGETFILTER: c_int = _IOR::<sock_fprog>(T_TYPE, 219);
2677-
pub const TUNSETVNETLE: c_int = _IOW::<c_int>(T_TYPE, 220);
2678-
pub const TUNGETVNETLE: c_int = _IOR::<c_int>(T_TYPE, 221);
2679-
pub const TUNSETVNETBE: c_int = _IOW::<c_int>(T_TYPE, 222);
2680-
pub const TUNGETVNETBE: c_int = _IOR::<c_int>(T_TYPE, 223);
2681-
pub const TUNSETSTEERINGEBPF: c_int = _IOR::<c_int>(T_TYPE, 224);
2682-
pub const TUNSETFILTEREBPF: c_int = _IOR::<c_int>(T_TYPE, 225);
2683-
pub const TUNSETCARRIER: c_int = _IOW::<c_int>(T_TYPE, 226);
2684-
pub const TUNGETDEVNETNS: c_int = _IO(T_TYPE, 227);
2685-
26862570
// start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h
26872571
// from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h
26882572
pub const ETH_ALEN: c_int = 6;
@@ -3716,7 +3600,6 @@ extern "C" {
37163600
pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int;
37173601
pub fn mlock2(addr: *const c_void, len: size_t, flags: c_int) -> c_int;
37183602
pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int;
3719-
pub fn ioctl(fd: c_int, request: c_int, ...) -> c_int;
37203603
pub fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int;
37213604
pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int;
37223605
pub fn recvfrom(
@@ -4257,28 +4140,3 @@ impl siginfo_t {
42574140
self.sifields().sigchld.si_stime
42584141
}
42594142
}
4260-
4261-
/// Build an ioctl number for an argumentless ioctl.
4262-
pub const fn _IO(ty: u32, nr: u32) -> c_int {
4263-
super::_IOC(super::_IOC_NONE, ty, nr, 0) as c_int
4264-
}
4265-
4266-
/// Build an ioctl number for an read-only ioctl.
4267-
pub const fn _IOR<T>(ty: u32, nr: u32) -> c_int {
4268-
super::_IOC(super::_IOC_READ, ty, nr, mem::size_of::<T>()) as c_int
4269-
}
4270-
4271-
/// Build an ioctl number for an write-only ioctl.
4272-
pub const fn _IOW<T>(ty: u32, nr: u32) -> c_int {
4273-
super::_IOC(super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int
4274-
}
4275-
4276-
/// Build an ioctl number for a read-write ioctl.
4277-
pub const fn _IOWR<T>(ty: u32, nr: u32) -> c_int {
4278-
super::_IOC(
4279-
super::_IOC_READ | super::_IOC_WRITE,
4280-
ty,
4281-
nr,
4282-
mem::size_of::<T>(),
4283-
) as c_int
4284-
}

src/unix/linux_like/linux/arch/generic/mod.rs

+1-45
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::prelude::*;
2-
use crate::{Ioctl, _IOR, _IOW};
2+
use crate::Ioctl;
33

44
s! {
55
pub struct termios2 {
@@ -158,9 +158,6 @@ pub const SO_DEVMEM_LINEAR: c_int = 78;
158158
pub const SO_DEVMEM_DMABUF: c_int = 79;
159159
pub const SO_DEVMEM_DONTNEED: c_int = 80;
160160

161-
pub const FICLONE: Ioctl = _IOW::<c_int>(0x94, 9) as Ioctl;
162-
pub const FICLONERANGE: Ioctl = _IOW::<crate::file_clone_range>(0x94, 13) as Ioctl;
163-
164161
// Defined in unix/linux_like/mod.rs
165162
// pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP;
166163
pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS;
@@ -251,47 +248,6 @@ pub const BLKIOMIN: Ioctl = 0x1278;
251248
pub const BLKIOOPT: Ioctl = 0x1279;
252249
pub const BLKSSZGET: Ioctl = 0x1268;
253250
pub const BLKPBSZGET: Ioctl = 0x127B;
254-
// linux/if_tun.h
255-
pub const TUNSETNOCSUM: Ioctl = 0x400454c8;
256-
pub const TUNSETDEBUG: Ioctl = 0x400454c9;
257-
pub const TUNSETIFF: Ioctl = 0x400454ca;
258-
pub const TUNSETPERSIST: Ioctl = 0x400454cb;
259-
pub const TUNSETOWNER: Ioctl = 0x400454cc;
260-
pub const TUNSETLINK: Ioctl = 0x400454cd;
261-
pub const TUNSETGROUP: Ioctl = 0x400454ce;
262-
pub const TUNGETFEATURES: Ioctl = 0x800454cf;
263-
pub const TUNSETOFFLOAD: Ioctl = 0x400454d0;
264-
pub const TUNSETTXFILTER: Ioctl = 0x400454d1;
265-
pub const TUNGETIFF: Ioctl = 0x800454d2;
266-
pub const TUNGETSNDBUF: Ioctl = 0x800454d3;
267-
pub const TUNSETSNDBUF: Ioctl = 0x400454d4;
268-
pub const TUNGETVNETHDRSZ: Ioctl = 0x800454d7;
269-
pub const TUNSETVNETHDRSZ: Ioctl = 0x400454d8;
270-
pub const TUNSETQUEUE: Ioctl = 0x400454d9;
271-
pub const TUNSETIFINDEX: Ioctl = 0x400454da;
272-
pub const TUNSETVNETLE: Ioctl = 0x400454dc;
273-
pub const TUNGETVNETLE: Ioctl = 0x800454dd;
274-
/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
275-
* little-endian hosts. Not all kernel configurations support them, but all
276-
* configurations that support SET also support GET.
277-
*/
278-
pub const TUNSETVNETBE: Ioctl = 0x400454de;
279-
pub const TUNGETVNETBE: Ioctl = 0x800454df;
280-
pub const TUNSETSTEERINGEBPF: Ioctl = 0x800454e0;
281-
pub const TUNSETFILTEREBPF: Ioctl = 0x800454e1;
282-
283-
pub const FS_IOC_GETFLAGS: Ioctl = _IOR::<c_long>('f' as u32, 1) as Ioctl;
284-
pub const FS_IOC_SETFLAGS: Ioctl = _IOW::<c_long>('f' as u32, 2) as Ioctl;
285-
pub const FS_IOC_GETVERSION: Ioctl = _IOR::<c_long>('v' as u32, 1) as Ioctl;
286-
pub const FS_IOC_SETVERSION: Ioctl = _IOW::<c_long>('v' as u32, 2) as Ioctl;
287-
pub const FS_IOC32_GETFLAGS: Ioctl = _IOR::<c_int>('f' as u32, 1) as Ioctl;
288-
pub const FS_IOC32_SETFLAGS: Ioctl = _IOW::<c_int>('f' as u32, 2) as Ioctl;
289-
pub const FS_IOC32_GETVERSION: Ioctl = _IOR::<c_int>('v' as u32, 1) as Ioctl;
290-
pub const FS_IOC32_SETVERSION: Ioctl = _IOW::<c_int>('v' as u32, 2) as Ioctl;
291-
292-
pub const TUNATTACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 213) as Ioctl;
293-
pub const TUNDETACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 214) as Ioctl;
294-
pub const TUNGETFILTER: Ioctl = _IOR::<crate::sock_fprog>('T' as u32, 219) as Ioctl;
295251

296252
cfg_if! {
297253
if #[cfg(any(target_arch = "arm", target_arch = "s390x"))] {

src/unix/linux_like/linux/arch/mips/mod.rs

-65
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ pub const SO_DEVMEM_LINEAR: c_int = 78;
131131
pub const SO_DEVMEM_DMABUF: c_int = 79;
132132
pub const SO_DEVMEM_DONTNEED: c_int = 80;
133133

134-
pub const FICLONE: c_ulong = 0x80049409;
135-
pub const FICLONERANGE: c_ulong = 0x8020940D;
136-
137134
// Defined in unix/linux_like/mod.rs
138135
// pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP;
139136
pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS;
@@ -223,68 +220,6 @@ pub const BLKIOMIN: Ioctl = 0x20001278;
223220
pub const BLKIOOPT: Ioctl = 0x20001279;
224221
pub const BLKSSZGET: Ioctl = 0x20001268;
225222
pub const BLKPBSZGET: Ioctl = 0x2000127B;
226-
// linux/if_tun.h
227-
pub const TUNSETNOCSUM: Ioctl = 0x800454c8;
228-
pub const TUNSETDEBUG: Ioctl = 0x800454c9;
229-
pub const TUNSETIFF: Ioctl = 0x800454ca;
230-
pub const TUNSETPERSIST: Ioctl = 0x800454cb;
231-
pub const TUNSETOWNER: Ioctl = 0x800454cc;
232-
pub const TUNSETLINK: Ioctl = 0x800454cd;
233-
pub const TUNSETGROUP: Ioctl = 0x800454ce;
234-
pub const TUNGETFEATURES: Ioctl = 0x400454cf;
235-
pub const TUNSETOFFLOAD: Ioctl = 0x800454d0;
236-
pub const TUNSETTXFILTER: Ioctl = 0x800454d1;
237-
pub const TUNGETIFF: Ioctl = 0x400454d2;
238-
pub const TUNGETSNDBUF: Ioctl = 0x400454d3;
239-
pub const TUNSETSNDBUF: Ioctl = 0x800454d4;
240-
pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7;
241-
pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8;
242-
pub const TUNSETQUEUE: Ioctl = 0x800454d9;
243-
pub const TUNSETIFINDEX: Ioctl = 0x800454da;
244-
pub const TUNSETVNETLE: Ioctl = 0x800454dc;
245-
pub const TUNGETVNETLE: Ioctl = 0x400454dd;
246-
/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
247-
* little-endian hosts. Not all kernel configurations support them, but all
248-
* configurations that support SET also support GET.
249-
*/
250-
pub const TUNSETVNETBE: Ioctl = 0x800454de;
251-
pub const TUNGETVNETBE: Ioctl = 0x400454df;
252-
pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0;
253-
pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1;
254-
255-
cfg_if! {
256-
// Those type are constructed using the _IOC macro
257-
// DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
258-
// where D stands for direction (either None (00), Read (01) or Write (11))
259-
// where S stands for size (int, long, struct...)
260-
// where T stands for type ('f','v','X'...)
261-
// where N stands for NR (NumbeR)
262-
if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] {
263-
pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601;
264-
pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602;
265-
pub const FS_IOC_GETVERSION: Ioctl = 0x40047601;
266-
pub const FS_IOC_SETVERSION: Ioctl = 0x80047602;
267-
pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
268-
pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
269-
pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
270-
pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
271-
pub const TUNATTACHFILTER: Ioctl = 0x800854d5;
272-
pub const TUNDETACHFILTER: Ioctl = 0x800854d6;
273-
pub const TUNGETFILTER: Ioctl = 0x400854db;
274-
} else if #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] {
275-
pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601;
276-
pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602;
277-
pub const FS_IOC_GETVERSION: Ioctl = 0x40087601;
278-
pub const FS_IOC_SETVERSION: Ioctl = 0x80087602;
279-
pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
280-
pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
281-
pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
282-
pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
283-
pub const TUNATTACHFILTER: Ioctl = 0x801054d5;
284-
pub const TUNDETACHFILTER: Ioctl = 0x801054d6;
285-
pub const TUNGETFILTER: Ioctl = 0x401054db;
286-
}
287-
}
288223

289224
cfg_if! {
290225
if #[cfg(target_env = "musl")] {

0 commit comments

Comments
 (0)