1 use crate::prelude::*;
2 
3 // The following definitions are correct for arm and i686,
4 // but may be wrong for mips
5 
6 pub type mode_t = u16;
7 pub type off64_t = c_longlong;
8 pub type sigset_t = c_ulong;
9 pub type socklen_t = i32;
10 pub type time64_t = i64;
11 pub type __u64 = c_ulonglong;
12 pub type __s64 = c_longlong;
13 
14 s! {
15     pub struct sigaction {
16         pub sa_sigaction: crate::sighandler_t,
17         pub sa_mask: crate::sigset_t,
18         pub sa_flags: c_int,
19         pub sa_restorer: Option<extern "C" fn()>,
20     }
21 
22     pub struct rlimit64 {
23         pub rlim_cur: u64,
24         pub rlim_max: u64,
25     }
26 
27     pub struct stat {
28         pub st_dev: c_ulonglong,
29         __pad0: [c_uchar; 4],
30         __st_ino: crate::ino_t,
31         pub st_mode: c_uint,
32         pub st_nlink: crate::nlink_t,
33         pub st_uid: crate::uid_t,
34         pub st_gid: crate::gid_t,
35         pub st_rdev: c_ulonglong,
36         __pad3: [c_uchar; 4],
37         pub st_size: c_longlong,
38         pub st_blksize: crate::blksize_t,
39         pub st_blocks: c_ulonglong,
40         pub st_atime: c_long,
41         pub st_atime_nsec: c_long,
42         pub st_mtime: c_long,
43         pub st_mtime_nsec: c_long,
44         pub st_ctime: c_long,
45         pub st_ctime_nsec: c_long,
46         pub st_ino: c_ulonglong,
47     }
48 
49     pub struct stat64 {
50         pub st_dev: c_ulonglong,
51         __pad0: [c_uchar; 4],
52         __st_ino: crate::ino_t,
53         pub st_mode: c_uint,
54         pub st_nlink: crate::nlink_t,
55         pub st_uid: crate::uid_t,
56         pub st_gid: crate::gid_t,
57         pub st_rdev: c_ulonglong,
58         __pad3: [c_uchar; 4],
59         pub st_size: c_longlong,
60         pub st_blksize: crate::blksize_t,
61         pub st_blocks: c_ulonglong,
62         pub st_atime: c_long,
63         pub st_atime_nsec: c_long,
64         pub st_mtime: c_long,
65         pub st_mtime_nsec: c_long,
66         pub st_ctime: c_long,
67         pub st_ctime_nsec: c_long,
68         pub st_ino: c_ulonglong,
69     }
70 
71     pub struct statfs64 {
72         pub f_type: u32,
73         pub f_bsize: u32,
74         pub f_blocks: u64,
75         pub f_bfree: u64,
76         pub f_bavail: u64,
77         pub f_files: u64,
78         pub f_ffree: u64,
79         pub f_fsid: crate::__fsid_t,
80         pub f_namelen: u32,
81         pub f_frsize: u32,
82         pub f_flags: u32,
83         pub f_spare: [u32; 4],
84     }
85 
86     pub struct statvfs64 {
87         pub f_bsize: c_ulong,
88         pub f_frsize: c_ulong,
89         pub f_blocks: c_ulong,
90         pub f_bfree: c_ulong,
91         pub f_bavail: c_ulong,
92         pub f_files: c_ulong,
93         pub f_ffree: c_ulong,
94         pub f_favail: c_ulong,
95         pub f_fsid: c_ulong,
96         pub f_flag: c_ulong,
97         pub f_namemax: c_ulong,
98     }
99 
100     pub struct pthread_attr_t {
101         pub flags: u32,
102         pub stack_base: *mut c_void,
103         pub stack_size: size_t,
104         pub guard_size: size_t,
105         pub sched_policy: i32,
106         pub sched_priority: i32,
107     }
108 
109     pub struct pthread_mutex_t {
110         value: c_int,
111     }
112 
113     pub struct pthread_cond_t {
114         value: c_int,
115     }
116 
117     pub struct pthread_rwlock_t {
118         lock: pthread_mutex_t,
119         cond: pthread_cond_t,
120         numLocks: c_int,
121         writerThreadId: c_int,
122         pendingReaders: c_int,
123         pendingWriters: c_int,
124         attr: i32,
125         __reserved: [c_char; 12],
126     }
127 
128     pub struct pthread_barrier_t {
129         __private: [i32; 8],
130     }
131 
132     pub struct pthread_spinlock_t {
133         __private: [i32; 2],
134     }
135 
136     pub struct passwd {
137         pub pw_name: *mut c_char,
138         pub pw_passwd: *mut c_char,
139         pub pw_uid: crate::uid_t,
140         pub pw_gid: crate::gid_t,
141         pub pw_dir: *mut c_char,
142         pub pw_shell: *mut c_char,
143     }
144 
145     pub struct statfs {
146         pub f_type: u32,
147         pub f_bsize: u32,
148         pub f_blocks: u64,
149         pub f_bfree: u64,
150         pub f_bavail: u64,
151         pub f_files: u64,
152         pub f_ffree: u64,
153         pub f_fsid: crate::__fsid_t,
154         pub f_namelen: u32,
155         pub f_frsize: u32,
156         pub f_flags: u32,
157         pub f_spare: [u32; 4],
158     }
159 
160     pub struct sysinfo {
161         pub uptime: c_long,
162         pub loads: [c_ulong; 3],
163         pub totalram: c_ulong,
164         pub freeram: c_ulong,
165         pub sharedram: c_ulong,
166         pub bufferram: c_ulong,
167         pub totalswap: c_ulong,
168         pub freeswap: c_ulong,
169         pub procs: c_ushort,
170         pub pad: c_ushort,
171         pub totalhigh: c_ulong,
172         pub freehigh: c_ulong,
173         pub mem_unit: c_uint,
174         pub _f: [c_char; 8],
175     }
176 }
177 
178 s_no_extra_traits! {
179     pub struct sigset64_t {
180         __bits: [c_ulong; 2],
181     }
182 }
183 
184 cfg_if! {
185     if #[cfg(feature = "extra_traits")] {
186         impl fmt::Debug for sigset64_t {
187             fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
188                 f.debug_struct("sigset64_t")
189                     .field("__bits", &self.__bits)
190                     .finish()
191             }
192         }
193     }
194 }
195 
196 // These constants must be of the same type of sigaction.sa_flags
197 pub const SA_NOCLDSTOP: c_int = 0x00000001;
198 pub const SA_NOCLDWAIT: c_int = 0x00000002;
199 pub const SA_NODEFER: c_int = 0x40000000;
200 pub const SA_ONSTACK: c_int = 0x08000000;
201 pub const SA_RESETHAND: c_int = 0x80000000;
202 pub const SA_RESTART: c_int = 0x10000000;
203 pub const SA_SIGINFO: c_int = 0x00000004;
204 
205 pub const RTLD_GLOBAL: c_int = 2;
206 pub const RTLD_NOW: c_int = 0;
207 pub const RTLD_DEFAULT: *mut c_void = -1isize as *mut c_void;
208 
209 pub const PTRACE_GETFPREGS: c_int = 14;
210 pub const PTRACE_SETFPREGS: c_int = 15;
211 
212 pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { value: 0 };
213 pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { value: 0 };
214 pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
215     lock: PTHREAD_MUTEX_INITIALIZER,
216     cond: PTHREAD_COND_INITIALIZER,
217     numLocks: 0,
218     writerThreadId: 0,
219     pendingReaders: 0,
220     pendingWriters: 0,
221     attr: 0,
222     __reserved: [0; 12],
223 };
224 pub const PTHREAD_STACK_MIN: size_t = 4096 * 2;
225 pub const CPU_SETSIZE: size_t = 32;
226 pub const __CPU_BITS: size_t = 32;
227 
228 pub const UT_LINESIZE: usize = 8;
229 pub const UT_NAMESIZE: usize = 8;
230 pub const UT_HOSTSIZE: usize = 16;
231 
232 pub const SIGSTKSZ: size_t = 8192;
233 pub const MINSIGSTKSZ: size_t = 2048;
234 
235 extern "C" {
236     pub fn timegm64(tm: *const crate::tm) -> crate::time64_t;
237 }
238 
239 cfg_if! {
240     if #[cfg(target_arch = "x86")] {
241         mod x86;
242         pub use self::x86::*;
243     } else if #[cfg(target_arch = "arm")] {
244         mod arm;
245         pub use self::arm::*;
246     } else {
247         // Unknown target_arch
248     }
249 }
250