Skip to content

Commit 6b02e62

Browse files
authored
Use linux_raw_sys's open_how instead of a manual copy. (#698)
While here, reorganize and tidy up src/backend/linux_raw/c.rs.
1 parent a896ec5 commit 6b02e62

File tree

3 files changed

+86
-84
lines changed

3 files changed

+86
-84
lines changed

src/backend/libc/fs/syscalls.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,9 +1480,11 @@ pub(crate) fn openat2(
14801480
mode: Mode,
14811481
resolve: ResolveFlags,
14821482
) -> io::Result<OwnedFd> {
1483+
use linux_raw_sys::general::open_how;
1484+
14831485
let oflags: i32 = oflags.bits();
1484-
let open_how = OpenHow {
1485-
oflag: u64::from(oflags as u32),
1486+
let open_how = open_how {
1487+
flags: u64::from(oflags as u32),
14861488
mode: u64::from(mode.bits()),
14871489
resolve: resolve.bits(),
14881490
};
@@ -1493,7 +1495,7 @@ pub(crate) fn openat2(
14931495
borrowed_fd(dirfd),
14941496
c_str(path),
14951497
&open_how,
1496-
SIZEOF_OPEN_HOW,
1498+
size_of::<open_how>(),
14971499
))
14981500
}
14991501
}
@@ -1502,17 +1504,6 @@ const SYS_OPENAT2: i32 = 437;
15021504
#[cfg(all(linux_kernel, target_pointer_width = "64"))]
15031505
const SYS_OPENAT2: i64 = 437;
15041506

1505-
#[cfg(linux_kernel)]
1506-
#[repr(C)]
1507-
#[derive(Debug)]
1508-
struct OpenHow {
1509-
oflag: u64,
1510-
mode: u64,
1511-
resolve: u64,
1512-
}
1513-
#[cfg(linux_kernel)]
1514-
const SIZEOF_OPEN_HOW: usize = size_of::<OpenHow>();
1515-
15161507
#[cfg(target_os = "linux")]
15171508
pub(crate) fn sendfile(
15181509
out_fd: BorrowedFd<'_>,

src/backend/linux_raw/c.rs

Lines changed: 73 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -7,91 +7,94 @@
77
#![allow(non_camel_case_types)]
88

99
pub type size_t = usize;
10-
#[cfg(feature = "net")]
11-
pub(crate) use linux_raw_sys::cmsg_macros::*;
1210
pub(crate) use linux_raw_sys::ctypes::*;
1311
pub(crate) use linux_raw_sys::errno::EINVAL;
14-
pub(crate) use linux_raw_sys::general::__kernel_pid_t as pid_t;
15-
pub(crate) use linux_raw_sys::general::__kernel_time64_t as time_t;
16-
pub(crate) use linux_raw_sys::general::__kernel_timespec as timespec;
17-
#[cfg(feature = "net")]
18-
pub(crate) use linux_raw_sys::general::{O_CLOEXEC as SOCK_CLOEXEC, O_NONBLOCK as SOCK_NONBLOCK};
19-
// Replace Linux's old `TIMEO` constants with its new ones.
12+
// Import the kernel's `uid_t` and `gid_t` if they're 32-bit.
2013
#[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))]
2114
pub(crate) use linux_raw_sys::general::{__kernel_gid_t as gid_t, __kernel_uid_t as uid_t};
22-
23-
#[cfg(feature = "termios")]
24-
pub(crate) use linux_raw_sys::general::{
25-
cc_t, speed_t, tcflag_t, termios, winsize, B0, B1000000, B110, B115200, B1152000, B1200, B134,
26-
B150, B1500000, B1800, B19200, B200, B2000000, B230400, B2400, B2500000, B300, B3000000,
27-
B3500000, B38400, B4000000, B460800, B4800, B50, B500000, B57600, B576000, B600, B75, B921600,
28-
B9600, BOTHER, BRKINT, BS0, BS1, BSDLY, CBAUD, CBAUDEX, CIBAUD, CLOCAL, CMSPAR, CR0, CR1, CR2,
29-
CR3, CRDLY, CREAD, CRTSCTS, CS5, CS6, CS7, CS8, CSIZE, CSTOPB, ECHO, ECHOCTL, ECHOE, ECHOK,
30-
ECHOKE, ECHONL, ECHOPRT, EXTA, EXTB, EXTPROC, FF0, FF1, FFDLY, FLUSHO, HUPCL, IBSHIFT, ICANON,
31-
ICRNL, IEXTEN, IGNBRK, IGNCR, IGNPAR, IMAXBEL, INLCR, INPCK, ISIG, ISTRIP, IUCLC, IUTF8, IXANY,
32-
IXOFF, IXON, NCCS, NL0, NL1, NLDLY, NOFLSH, OCRNL, OFDEL, OFILL, OLCUC, ONLCR, ONLRET, ONOCR,
33-
OPOST, PARENB, PARMRK, PARODD, PENDIN, TAB0, TAB1, TAB2, TAB3, TABDLY, TCIFLUSH, TCIOFF,
34-
TCIOFLUSH, TCION, TCOFLUSH, TCOOFF, TCOON, TCSADRAIN, TCSAFLUSH, TCSANOW, TOSTOP, VDISCARD,
35-
VEOF, VEOL, VEOL2, VERASE, VINTR, VKILL, VLNEXT, VMIN, VQUIT, VREPRINT, VSTART, VSTOP, VSUSP,
36-
VSWTC, VT0, VT1, VTDLY, VTIME, VWERASE, XCASE, XTABS,
37-
};
38-
// On PowerPC, the regular `termios` has the `termios2` fields.
39-
#[cfg(feature = "termios")]
40-
pub(crate) use {
41-
linux_raw_sys::general::termios2,
42-
linux_raw_sys::ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2},
43-
};
44-
// On MIPS, `TCSANOW` et al have `TCSETS` added to them, so we need it to
45-
// subtract it out.
46-
#[cfg(all(feature = "termios", any(target_arch = "mips", target_arch = "mips64")))]
47-
pub(crate) use linux_raw_sys::ioctl::TCSETS;
48-
4915
pub(crate) use linux_raw_sys::general::{
50-
iovec, siginfo_t, CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED,
51-
O_CLOEXEC, O_NONBLOCK, O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PID, P_PIDFD,
16+
__kernel_pid_t as pid_t, __kernel_time64_t as time_t, __kernel_timespec as timespec, iovec,
17+
O_CLOEXEC, O_NOCTTY, O_NONBLOCK, O_RDWR,
5218
};
53-
pub(crate) use linux_raw_sys::general::{AT_FDCWD, O_NOCTTY, O_RDWR};
5419

5520
#[cfg(feature = "event")]
5621
#[cfg(test)]
5722
pub(crate) use linux_raw_sys::general::epoll_event;
5823

5924
#[cfg(feature = "fs")]
60-
pub(crate) use linux_raw_sys::general::{NFS_SUPER_MAGIC, PROC_SUPER_MAGIC, UTIME_NOW, UTIME_OMIT};
61-
#[cfg(feature = "fs")]
62-
pub(crate) use linux_raw_sys::general::{XATTR_CREATE, XATTR_REPLACE};
63-
#[cfg(feature = "net")]
64-
pub(crate) use linux_raw_sys::if_ether::*;
65-
#[cfg(feature = "net")]
66-
pub(crate) use linux_raw_sys::net::{
67-
AF_DECnet, __kernel_sa_family_t as sa_family_t, __kernel_sockaddr_storage as sockaddr_storage,
68-
cmsghdr, in6_addr, in_addr, ip_mreq, ipv6_mreq, linger, msghdr, sockaddr, sockaddr_in,
69-
sockaddr_in6, sockaddr_un, socklen_t, AF_APPLETALK, AF_ASH, AF_ATMPVC, AF_ATMSVC, AF_AX25,
70-
AF_BLUETOOTH, AF_BRIDGE, AF_CAN, AF_ECONET, AF_IEEE802154, AF_INET, AF_INET6, AF_IPX, AF_IRDA,
71-
AF_ISDN, AF_IUCV, AF_KEY, AF_LLC, AF_NETBEUI, AF_NETLINK, AF_NETROM, AF_PACKET, AF_PHONET,
72-
AF_PPPOX, AF_RDS, AF_ROSE, AF_RXRPC, AF_SECURITY, AF_SNA, AF_TIPC, AF_UNIX, AF_UNSPEC,
73-
AF_WANPIPE, AF_X25, IPPROTO_AH, IPPROTO_BEETPH, IPPROTO_COMP, IPPROTO_DCCP, IPPROTO_EGP,
74-
IPPROTO_ENCAP, IPPROTO_ESP, IPPROTO_ETHERNET, IPPROTO_FRAGMENT, IPPROTO_GRE, IPPROTO_ICMP,
75-
IPPROTO_ICMPV6, IPPROTO_IDP, IPPROTO_IGMP, IPPROTO_IP, IPPROTO_IPIP, IPPROTO_IPV6, IPPROTO_MH,
76-
IPPROTO_MPLS, IPPROTO_MPTCP, IPPROTO_MTP, IPPROTO_PIM, IPPROTO_PUP, IPPROTO_RAW,
77-
IPPROTO_ROUTING, IPPROTO_RSVP, IPPROTO_SCTP, IPPROTO_TCP, IPPROTO_TP, IPPROTO_UDP,
78-
IPPROTO_UDPLITE, IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_MULTICAST_HOPS,
79-
IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,
80-
IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_TTL, MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE,
81-
MSG_DONTWAIT, MSG_EOR, MSG_ERRQUEUE, MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC,
82-
MSG_WAITALL, SCM_CREDENTIALS, SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW,
83-
SOCK_RDM, SOCK_SEQPACKET, SOCK_STREAM, SOL_SOCKET, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE,
84-
SO_LINGER, SO_PASSCRED, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_OLD, SO_REUSEADDR, SO_SNDBUF,
85-
SO_SNDTIMEO_NEW, SO_SNDTIMEO_OLD, SO_TYPE, TCP_NODELAY,
25+
pub(crate) use linux_raw_sys::general::{
26+
AT_FDCWD, NFS_SUPER_MAGIC, PROC_SUPER_MAGIC, UTIME_NOW, UTIME_OMIT, XATTR_CREATE, XATTR_REPLACE,
8627
};
28+
29+
#[cfg(feature = "io_uring")]
30+
pub(crate) use linux_raw_sys::{general::open_how, io_uring::*};
31+
8732
#[cfg(feature = "net")]
88-
pub(crate) use linux_raw_sys::net::{
89-
SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_SNDTIMEO_NEW as SO_SNDTIMEO,
33+
pub(crate) use linux_raw_sys::{
34+
cmsg_macros::*,
35+
general::{O_CLOEXEC as SOCK_CLOEXEC, O_NONBLOCK as SOCK_NONBLOCK},
36+
if_ether::*,
37+
net::{
38+
AF_DECnet, __kernel_sa_family_t as sa_family_t,
39+
__kernel_sockaddr_storage as sockaddr_storage, cmsghdr, in6_addr, in_addr, ip_mreq,
40+
ipv6_mreq, linger, msghdr, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un, socklen_t,
41+
AF_APPLETALK, AF_ASH, AF_ATMPVC, AF_ATMSVC, AF_AX25, AF_BLUETOOTH, AF_BRIDGE, AF_CAN,
42+
AF_ECONET, AF_IEEE802154, AF_INET, AF_INET6, AF_IPX, AF_IRDA, AF_ISDN, AF_IUCV, AF_KEY,
43+
AF_LLC, AF_NETBEUI, AF_NETLINK, AF_NETROM, AF_PACKET, AF_PHONET, AF_PPPOX, AF_RDS, AF_ROSE,
44+
AF_RXRPC, AF_SECURITY, AF_SNA, AF_TIPC, AF_UNIX, AF_UNSPEC, AF_WANPIPE, AF_X25, IPPROTO_AH,
45+
IPPROTO_BEETPH, IPPROTO_COMP, IPPROTO_DCCP, IPPROTO_EGP, IPPROTO_ENCAP, IPPROTO_ESP,
46+
IPPROTO_ETHERNET, IPPROTO_FRAGMENT, IPPROTO_GRE, IPPROTO_ICMP, IPPROTO_ICMPV6, IPPROTO_IDP,
47+
IPPROTO_IGMP, IPPROTO_IP, IPPROTO_IPIP, IPPROTO_IPV6, IPPROTO_MH, IPPROTO_MPLS,
48+
IPPROTO_MPTCP, IPPROTO_MTP, IPPROTO_PIM, IPPROTO_PUP, IPPROTO_RAW, IPPROTO_ROUTING,
49+
IPPROTO_RSVP, IPPROTO_SCTP, IPPROTO_TCP, IPPROTO_TP, IPPROTO_UDP, IPPROTO_UDPLITE,
50+
IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_LOOP,
51+
IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_MULTICAST_LOOP,
52+
IP_MULTICAST_TTL, IP_TTL, MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT,
53+
MSG_EOR, MSG_ERRQUEUE, MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL,
54+
SCM_CREDENTIALS, SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW, SOCK_RDM,
55+
SOCK_SEQPACKET, SOCK_STREAM, SOL_SOCKET, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_LINGER,
56+
SO_PASSCRED, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_RCVTIMEO_OLD,
57+
SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, SO_SNDTIMEO_OLD,
58+
SO_TYPE, TCP_NODELAY,
59+
},
60+
netlink::*,
9061
};
91-
#[cfg(feature = "net")]
92-
pub(crate) use linux_raw_sys::netlink::*;
93-
#[cfg(feature = "io_uring")]
94-
pub(crate) use {linux_raw_sys::general::open_how, linux_raw_sys::io_uring::*};
62+
63+
#[cfg(any(feature = "process", feature = "runtime"))]
64+
pub(crate) use linux_raw_sys::general::siginfo_t;
65+
66+
#[cfg(feature = "process")]
67+
pub(crate) use linux_raw_sys::general::{
68+
CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED,
69+
O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PID, P_PIDFD,
70+
};
71+
72+
#[cfg(feature = "termios")]
73+
pub(crate) use linux_raw_sys::{
74+
general::{
75+
cc_t, speed_t, tcflag_t, termios, termios2, winsize, B0, B1000000, B110, B115200, B1152000,
76+
B1200, B134, B150, B1500000, B1800, B19200, B200, B2000000, B230400, B2400, B2500000, B300,
77+
B3000000, B3500000, B38400, B4000000, B460800, B4800, B50, B500000, B57600, B576000, B600,
78+
B75, B921600, B9600, BOTHER, BRKINT, BS0, BS1, BSDLY, CBAUD, CBAUDEX, CIBAUD, CLOCAL,
79+
CMSPAR, CR0, CR1, CR2, CR3, CRDLY, CREAD, CRTSCTS, CS5, CS6, CS7, CS8, CSIZE, CSTOPB, ECHO,
80+
ECHOCTL, ECHOE, ECHOK, ECHOKE, ECHONL, ECHOPRT, EXTA, EXTB, EXTPROC, FF0, FF1, FFDLY,
81+
FLUSHO, HUPCL, IBSHIFT, ICANON, ICRNL, IEXTEN, IGNBRK, IGNCR, IGNPAR, IMAXBEL, INLCR,
82+
INPCK, ISIG, ISTRIP, IUCLC, IUTF8, IXANY, IXOFF, IXON, NCCS, NL0, NL1, NLDLY, NOFLSH,
83+
OCRNL, OFDEL, OFILL, OLCUC, ONLCR, ONLRET, ONOCR, OPOST, PARENB, PARMRK, PARODD, PENDIN,
84+
TAB0, TAB1, TAB2, TAB3, TABDLY, TCIFLUSH, TCIOFF, TCIOFLUSH, TCION, TCOFLUSH, TCOOFF,
85+
TCOON, TCSADRAIN, TCSAFLUSH, TCSANOW, TOSTOP, VDISCARD, VEOF, VEOL, VEOL2, VERASE, VINTR,
86+
VKILL, VLNEXT, VMIN, VQUIT, VREPRINT, VSTART, VSTOP, VSUSP, VSWTC, VT0, VT1, VTDLY, VTIME,
87+
VWERASE, XCASE, XTABS,
88+
},
89+
ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2},
90+
};
91+
92+
// On MIPS, `TCSANOW` et al have `TCSETS` added to them, so we need it to
93+
// subtract it out.
94+
#[cfg(all(feature = "termios", any(target_arch = "mips", target_arch = "mips64")))]
95+
pub(crate) use linux_raw_sys::ioctl::TCSETS;
96+
97+
// Define our own `uid_t` and `gid_t` if the kernel's versions are not 32-bit.
9598
#[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))]
9699
pub(crate) type uid_t = u32;
97100
#[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))]

src/ugid.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,11 @@ pub(crate) fn translate_fchown_args(owner: Option<Uid>, group: Option<Gid>) -> (
9191

9292
(ow, gr)
9393
}
94+
95+
#[test]
96+
fn test_sizes() {
97+
use core::mem::size_of;
98+
99+
assert_eq!(size_of::<RawUid>(), size_of::<u32>());
100+
assert_eq!(size_of::<RawGid>(), size_of::<u32>());
101+
}

0 commit comments

Comments
 (0)