1 //! 32-bit specific definitions for linux-like values
2 
3 use crate::prelude::*;
4 use crate::pthread_mutex_t;
5 
6 pub type clock_t = i32;
7 
8 pub type shmatt_t = c_ulong;
9 pub type msgqnum_t = c_ulong;
10 pub type msglen_t = c_ulong;
11 pub type nlink_t = u32;
12 pub type __u64 = c_ulonglong;
13 pub type __s64 = c_longlong;
14 pub type __fsword_t = i32;
15 pub type fsblkcnt64_t = u64;
16 pub type fsfilcnt64_t = u64;
17 pub type __syscall_ulong_t = c_ulong;
18 
19 cfg_if! {
20     if #[cfg(target_arch = "riscv32")] {
21         pub type time_t = i64;
22         pub type suseconds_t = i64;
23         pub type ino_t = u64;
24         pub type off_t = i64;
25         pub type blkcnt_t = i64;
26         pub type fsblkcnt_t = u64;
27         pub type fsfilcnt_t = u64;
28         pub type rlim_t = u64;
29         pub type blksize_t = i64;
30     } else {
31         pub type time_t = i32;
32         pub type suseconds_t = i32;
33         pub type ino_t = u32;
34         pub type off_t = i32;
35         pub type blkcnt_t = i32;
36         pub type fsblkcnt_t = c_ulong;
37         pub type fsfilcnt_t = c_ulong;
38         pub type rlim_t = c_ulong;
39         pub type blksize_t = i32;
40     }
41 }
42 
43 cfg_if! {
44     if #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] {
45         s! {
46             pub struct stat {
47                 pub st_dev: crate::dev_t,
48 
49                 __pad1: c_short,
50                 pub st_ino: crate::ino_t,
51                 pub st_mode: crate::mode_t,
52                 pub st_nlink: crate::nlink_t,
53                 pub st_uid: crate::uid_t,
54                 pub st_gid: crate::gid_t,
55                 pub st_rdev: crate::dev_t,
56                 __pad2: c_short,
57                 pub st_size: off_t,
58                 pub st_blksize: crate::blksize_t,
59                 pub st_blocks: crate::blkcnt_t,
60                 pub st_atime: crate::time_t,
61                 pub st_atime_nsec: c_long,
62                 pub st_mtime: crate::time_t,
63                 pub st_mtime_nsec: c_long,
64                 pub st_ctime: crate::time_t,
65                 pub st_ctime_nsec: c_long,
66                 __unused4: c_long,
67                 __unused5: c_long,
68             }
69         }
70     }
71 }
72 
73 s! {
74     pub struct statvfs {
75         pub f_bsize: c_ulong,
76         pub f_frsize: c_ulong,
77         pub f_blocks: crate::fsblkcnt_t,
78         pub f_bfree: crate::fsblkcnt_t,
79         pub f_bavail: crate::fsblkcnt_t,
80         pub f_files: crate::fsfilcnt_t,
81         pub f_ffree: crate::fsfilcnt_t,
82         pub f_favail: crate::fsfilcnt_t,
83         pub f_fsid: c_ulong,
84         __f_unused: c_int,
85         pub f_flag: c_ulong,
86         pub f_namemax: c_ulong,
87         __f_spare: [c_int; 6],
88     }
89 
90     pub struct pthread_attr_t {
91         __size: [u32; 9],
92     }
93 
94     pub struct sigset_t {
95         __val: [c_ulong; 32],
96     }
97 
98     pub struct sysinfo {
99         pub uptime: c_long,
100         pub loads: [c_ulong; 3],
101         pub totalram: c_ulong,
102         pub freeram: c_ulong,
103         pub sharedram: c_ulong,
104         pub bufferram: c_ulong,
105         pub totalswap: c_ulong,
106         pub freeswap: c_ulong,
107         pub procs: c_ushort,
108         #[deprecated(
109             since = "0.2.58",
110             note = "This padding field might become private in the future"
111         )]
112         pub pad: c_ushort,
113         pub totalhigh: c_ulong,
114         pub freehigh: c_ulong,
115         pub mem_unit: c_uint,
116         pub _f: [c_char; 8],
117     }
118 
119     pub struct semid_ds {
120         pub sem_perm: ipc_perm,
121         #[cfg(target_arch = "powerpc")]
122         __reserved: crate::__syscall_ulong_t,
123         pub sem_otime: crate::time_t,
124         #[cfg(not(any(
125             target_arch = "mips",
126             target_arch = "mips32r6",
127             target_arch = "powerpc"
128         )))]
129         __reserved: crate::__syscall_ulong_t,
130         #[cfg(target_arch = "powerpc")]
131         __reserved2: crate::__syscall_ulong_t,
132         pub sem_ctime: crate::time_t,
133         #[cfg(not(any(
134             target_arch = "mips",
135             target_arch = "mips32r6",
136             target_arch = "powerpc"
137         )))]
138         __reserved2: crate::__syscall_ulong_t,
139         pub sem_nsems: crate::__syscall_ulong_t,
140         __glibc_reserved3: crate::__syscall_ulong_t,
141         __glibc_reserved4: crate::__syscall_ulong_t,
142     }
143 }
144 
145 pub const POSIX_FADV_DONTNEED: c_int = 4;
146 pub const POSIX_FADV_NOREUSE: c_int = 5;
147 
148 pub const F_OFD_GETLK: c_int = 36;
149 pub const F_OFD_SETLK: c_int = 37;
150 pub const F_OFD_SETLKW: c_int = 38;
151 
152 pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
153 pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
154 pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
155 pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20;
156 pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
157 pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8;
158 pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4;
159 
160 cfg_if! {
161     if #[cfg(target_arch = "sparc")] {
162         pub const O_NOATIME: c_int = 0x200000;
163         pub const O_PATH: c_int = 0x1000000;
164         pub const O_TMPFILE: c_int = 0x2000000 | O_DIRECTORY;
165 
166         pub const SA_ONSTACK: c_int = 1;
167 
168         pub const PTRACE_DETACH: c_uint = 11;
169 
170         pub const F_SETLK: c_int = 8;
171         pub const F_SETLKW: c_int = 9;
172 
173         pub const F_RDLCK: c_int = 1;
174         pub const F_WRLCK: c_int = 2;
175         pub const F_UNLCK: c_int = 3;
176 
177         pub const SFD_CLOEXEC: c_int = 0x400000;
178 
179         pub const NCCS: usize = 17;
180 
181         pub const O_TRUNC: c_int = 0x400;
182         pub const O_CLOEXEC: c_int = 0x400000;
183 
184         pub const EBFONT: c_int = 109;
185         pub const ENOSTR: c_int = 72;
186         pub const ENODATA: c_int = 111;
187         pub const ETIME: c_int = 73;
188         pub const ENOSR: c_int = 74;
189         pub const ENONET: c_int = 80;
190         pub const ENOPKG: c_int = 113;
191         pub const EREMOTE: c_int = 71;
192         pub const ENOLINK: c_int = 82;
193         pub const EADV: c_int = 83;
194         pub const ESRMNT: c_int = 84;
195         pub const ECOMM: c_int = 85;
196         pub const EPROTO: c_int = 86;
197         pub const EDOTDOT: c_int = 88;
198 
199         pub const SA_NODEFER: c_int = 0x20;
200         pub const SA_RESETHAND: c_int = 0x4;
201         pub const SA_RESTART: c_int = 0x2;
202         pub const SA_NOCLDSTOP: c_int = 0x00000008;
203 
204         pub const EPOLL_CLOEXEC: c_int = 0x400000;
205 
206         pub const EFD_CLOEXEC: c_int = 0x400000;
207     } else {
208         pub const O_NOATIME: c_int = 0o1000000;
209         pub const O_PATH: c_int = 0o10000000;
210         pub const O_TMPFILE: c_int = 0o20000000 | O_DIRECTORY;
211 
212         pub const SA_ONSTACK: c_int = 0x08000000;
213 
214         pub const PTRACE_DETACH: c_uint = 17;
215 
216         pub const F_SETLK: c_int = 6;
217         pub const F_SETLKW: c_int = 7;
218 
219         pub const F_RDLCK: c_int = 0;
220         pub const F_WRLCK: c_int = 1;
221         pub const F_UNLCK: c_int = 2;
222 
223         pub const SFD_CLOEXEC: c_int = 0x080000;
224 
225         pub const NCCS: usize = 32;
226 
227         pub const O_TRUNC: c_int = 512;
228         pub const O_CLOEXEC: c_int = 0x80000;
229         pub const EBFONT: c_int = 59;
230         pub const ENOSTR: c_int = 60;
231         pub const ENODATA: c_int = 61;
232         pub const ETIME: c_int = 62;
233         pub const ENOSR: c_int = 63;
234         pub const ENONET: c_int = 64;
235         pub const ENOPKG: c_int = 65;
236         pub const EREMOTE: c_int = 66;
237         pub const ENOLINK: c_int = 67;
238         pub const EADV: c_int = 68;
239         pub const ESRMNT: c_int = 69;
240         pub const ECOMM: c_int = 70;
241         pub const EPROTO: c_int = 71;
242         pub const EDOTDOT: c_int = 73;
243 
244         pub const SA_NODEFER: c_int = 0x40000000;
245         pub const SA_RESETHAND: c_int = 0x80000000;
246         pub const SA_RESTART: c_int = 0x10000000;
247         pub const SA_NOCLDSTOP: c_int = 0x00000001;
248 
249         pub const EPOLL_CLOEXEC: c_int = 0x80000;
250 
251         pub const EFD_CLOEXEC: c_int = 0x80000;
252     }
253 }
254 
255 #[cfg(target_endian = "little")]
256 pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
257     size: [
258         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
259     ],
260 };
261 #[cfg(target_endian = "little")]
262 pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
263     size: [
264         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265     ],
266 };
267 #[cfg(target_endian = "little")]
268 pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
269     size: [
270         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
271     ],
272 };
273 #[cfg(target_endian = "big")]
274 pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
275     size: [
276         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
277     ],
278 };
279 #[cfg(target_endian = "big")]
280 pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
281     size: [
282         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
283     ],
284 };
285 #[cfg(target_endian = "big")]
286 pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: crate::pthread_mutex_t = pthread_mutex_t {
287     size: [
288         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
289     ],
290 };
291 
292 pub const PTRACE_GETFPREGS: c_uint = 14;
293 pub const PTRACE_SETFPREGS: c_uint = 15;
294 pub const PTRACE_GETREGS: c_uint = 12;
295 pub const PTRACE_SETREGS: c_uint = 13;
296 
297 extern "C" {
298     pub fn sysctl(
299         name: *mut c_int,
300         namelen: c_int,
301         oldp: *mut c_void,
302         oldlenp: *mut size_t,
303         newp: *mut c_void,
304         newlen: size_t,
305     ) -> c_int;
306 }
307 
308 cfg_if! {
309     if #[cfg(target_arch = "x86")] {
310         mod x86;
311         pub use self::x86::*;
312     } else if #[cfg(target_arch = "arm")] {
313         mod arm;
314         pub use self::arm::*;
315     } else if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] {
316         mod mips;
317         pub use self::mips::*;
318     } else if #[cfg(target_arch = "m68k")] {
319         mod m68k;
320         pub use self::m68k::*;
321     } else if #[cfg(target_arch = "powerpc")] {
322         mod powerpc;
323         pub use self::powerpc::*;
324     } else if #[cfg(target_arch = "sparc")] {
325         mod sparc;
326         pub use self::sparc::*;
327     } else if #[cfg(target_arch = "riscv32")] {
328         mod riscv32;
329         pub use self::riscv32::*;
330     } else if #[cfg(target_arch = "csky")] {
331         mod csky;
332         pub use self::csky::*;
333     } else {
334         // Unknown target_arch
335     }
336 }
337