1
- #![ allow ( non_camel_case_types, unused ) ]
1
+ #![ expect ( non_camel_case_types) ]
2
2
3
- use libc:: { c_int , c_void , size_t} ;
3
+ use libc:: size_t;
4
4
5
+ use crate :: ffi:: { c_char, c_int, c_void} ;
5
6
use crate :: io;
6
- use crate :: mem:: MaybeUninit ;
7
- use crate :: os:: raw:: c_char;
8
7
9
- pub type zx_handle_t = u32 ;
10
- pub type zx_vaddr_t = usize ;
11
- pub type zx_rights_t = u32 ;
12
- pub type zx_status_t = i32 ;
13
-
14
- pub const ZX_HANDLE_INVALID : zx_handle_t = 0 ;
8
+ //////////
9
+ // Time //
10
+ //////////
15
11
16
12
pub type zx_time_t = i64 ;
17
- pub const ZX_TIME_INFINITE : zx_time_t = i64:: MAX ;
18
-
19
- pub type zx_signals_t = u32 ;
20
-
21
- pub const ZX_OBJECT_SIGNAL_3 : zx_signals_t = 1 << 3 ;
22
13
23
- pub const ZX_TASK_TERMINATED : zx_signals_t = ZX_OBJECT_SIGNAL_3 ;
14
+ pub const ZX_TIME_INFINITE : zx_time_t = i64 :: MAX ;
24
15
25
- pub const ZX_RIGHT_SAME_RIGHTS : zx_rights_t = 1 << 31 ;
16
+ unsafe extern "C" {
17
+ pub safe fn zx_clock_get_monotonic ( ) -> zx_time_t ;
18
+ }
26
19
27
- // The upper four bits gives the minor version.
28
- pub type zx_object_info_topic_t = u32 ;
20
+ /////////////
21
+ // Handles //
22
+ /////////////
29
23
30
- pub const ZX_INFO_PROCESS : zx_object_info_topic_t = 3 | ( 1 << 28 ) ;
24
+ pub type zx_handle_t = u32 ;
31
25
32
- pub type zx_info_process_flags_t = u32 ;
26
+ pub const ZX_HANDLE_INVALID : zx_handle_t = 0 ;
33
27
34
- pub fn zx_cvt < T > ( t : T ) -> io:: Result < T >
35
- where
36
- T : TryInto < zx_status_t > + Copy ,
37
- {
38
- if let Ok ( status) = TryInto :: try_into ( t) {
39
- if status < 0 { Err ( io:: Error :: from_raw_os_error ( status) ) } else { Ok ( t) }
40
- } else {
41
- Err ( io:: Error :: last_os_error ( ) )
42
- }
28
+ unsafe extern "C" {
29
+ pub fn zx_handle_close ( handle : zx_handle_t ) -> zx_status_t ;
43
30
}
44
31
45
- // Safe wrapper around zx_handle_t
32
+ /// A safe wrapper around ` zx_handle_t`.
46
33
pub struct Handle {
47
34
raw : zx_handle_t ,
48
35
}
@@ -65,6 +52,66 @@ impl Drop for Handle {
65
52
}
66
53
}
67
54
55
+ ///////////
56
+ // Futex //
57
+ ///////////
58
+
59
+ pub type zx_futex_t = crate :: sync:: atomic:: Atomic < u32 > ;
60
+
61
+ unsafe extern "C" {
62
+ pub fn zx_object_wait_one (
63
+ handle : zx_handle_t ,
64
+ signals : zx_signals_t ,
65
+ timeout : zx_time_t ,
66
+ pending : * mut zx_signals_t ,
67
+ ) -> zx_status_t ;
68
+
69
+ pub fn zx_futex_wait (
70
+ value_ptr : * const zx_futex_t ,
71
+ current_value : zx_futex_t ,
72
+ new_futex_owner : zx_handle_t ,
73
+ deadline : zx_time_t ,
74
+ ) -> zx_status_t ;
75
+ pub fn zx_futex_wake ( value_ptr : * const zx_futex_t , wake_count : u32 ) -> zx_status_t ;
76
+ pub fn zx_futex_wake_single_owner ( value_ptr : * const zx_futex_t ) -> zx_status_t ;
77
+ pub safe fn zx_thread_self ( ) -> zx_handle_t ;
78
+ }
79
+
80
+ ////////////////
81
+ // Properties //
82
+ ////////////////
83
+
84
+ pub const ZX_PROP_NAME : u32 = 3 ;
85
+
86
+ unsafe extern "C" {
87
+ pub fn zx_object_set_property (
88
+ handle : zx_handle_t ,
89
+ property : u32 ,
90
+ value : * const libc:: c_void ,
91
+ value_size : libc:: size_t ,
92
+ ) -> zx_status_t ;
93
+ }
94
+
95
+ /////////////
96
+ // Signals //
97
+ /////////////
98
+
99
+ pub type zx_signals_t = u32 ;
100
+
101
+ pub const ZX_OBJECT_SIGNAL_3 : zx_signals_t = 1 << 3 ;
102
+ pub const ZX_TASK_TERMINATED : zx_signals_t = ZX_OBJECT_SIGNAL_3 ;
103
+
104
+ /////////////////
105
+ // Object info //
106
+ /////////////////
107
+
108
+ // The upper four bits gives the minor version.
109
+ pub type zx_object_info_topic_t = u32 ;
110
+
111
+ pub const ZX_INFO_PROCESS : zx_object_info_topic_t = 3 | ( 1 << 28 ) ;
112
+
113
+ pub type zx_info_process_flags_t = u32 ;
114
+
68
115
// Returned for topic ZX_INFO_PROCESS
69
116
#[ derive( Default ) ]
70
117
#[ repr( C ) ]
@@ -76,25 +123,6 @@ pub struct zx_info_process_t {
76
123
}
77
124
78
125
unsafe extern "C" {
79
- pub fn zx_job_default ( ) -> zx_handle_t ;
80
-
81
- pub fn zx_task_kill ( handle : zx_handle_t ) -> zx_status_t ;
82
-
83
- pub fn zx_handle_close ( handle : zx_handle_t ) -> zx_status_t ;
84
-
85
- pub fn zx_handle_duplicate (
86
- handle : zx_handle_t ,
87
- rights : zx_rights_t ,
88
- out : * const zx_handle_t ,
89
- ) -> zx_handle_t ;
90
-
91
- pub fn zx_object_wait_one (
92
- handle : zx_handle_t ,
93
- signals : zx_signals_t ,
94
- timeout : zx_time_t ,
95
- pending : * mut zx_signals_t ,
96
- ) -> zx_status_t ;
97
-
98
126
pub fn zx_object_get_info (
99
127
handle : zx_handle_t ,
100
128
topic : u32 ,
@@ -105,6 +133,10 @@ unsafe extern "C" {
105
133
) -> zx_status_t ;
106
134
}
107
135
136
+ ///////////////
137
+ // Processes //
138
+ ///////////////
139
+
108
140
#[ derive( Default ) ]
109
141
#[ repr( C ) ]
110
142
pub struct fdio_spawn_action_t {
@@ -130,180 +162,43 @@ unsafe extern "C" {
130
162
131
163
pub fn fdio_fd_clone ( fd : c_int , out_handle : * mut zx_handle_t ) -> zx_status_t ;
132
164
pub fn fdio_fd_create ( handle : zx_handle_t , fd : * mut c_int ) -> zx_status_t ;
165
+
166
+ pub fn zx_task_kill ( handle : zx_handle_t ) -> zx_status_t ;
133
167
}
134
168
135
169
// fdio_spawn_etc flags
136
170
137
171
pub const FDIO_SPAWN_CLONE_JOB : u32 = 0x0001 ;
138
172
pub const FDIO_SPAWN_CLONE_LDSVC : u32 = 0x0002 ;
139
173
pub const FDIO_SPAWN_CLONE_NAMESPACE : u32 = 0x0004 ;
140
- pub const FDIO_SPAWN_CLONE_STDIO : u32 = 0x0008 ;
141
174
pub const FDIO_SPAWN_CLONE_ENVIRON : u32 = 0x0010 ;
142
175
pub const FDIO_SPAWN_CLONE_UTC_CLOCK : u32 = 0x0020 ;
143
- pub const FDIO_SPAWN_CLONE_ALL : u32 = 0xFFFF ;
144
176
145
177
// fdio_spawn_etc actions
146
178
147
- pub const FDIO_SPAWN_ACTION_CLONE_FD : u32 = 0x0001 ;
148
179
pub const FDIO_SPAWN_ACTION_TRANSFER_FD : u32 = 0x0002 ;
149
180
150
- // Errors
151
-
152
- #[ allow( unused) ]
153
- pub const ERR_INTERNAL : zx_status_t = -1 ;
154
-
155
- // ERR_NOT_SUPPORTED: The operation is not implemented, supported,
156
- // or enabled.
157
- #[ allow( unused) ]
158
- pub const ERR_NOT_SUPPORTED : zx_status_t = -2 ;
159
-
160
- // ERR_NO_RESOURCES: The system was not able to allocate some resource
161
- // needed for the operation.
162
- #[ allow( unused) ]
163
- pub const ERR_NO_RESOURCES : zx_status_t = -3 ;
164
-
165
- // ERR_NO_MEMORY: The system was not able to allocate memory needed
166
- // for the operation.
167
- #[ allow( unused) ]
168
- pub const ERR_NO_MEMORY : zx_status_t = -4 ;
169
-
170
- // ERR_CALL_FAILED: The second phase of zx_channel_call(; did not complete
171
- // successfully.
172
- #[ allow( unused) ]
173
- pub const ERR_CALL_FAILED : zx_status_t = -5 ;
174
-
175
- // ERR_INTERRUPTED_RETRY: The system call was interrupted, but should be
176
- // retried. This should not be seen outside of the VDSO.
177
- #[ allow( unused) ]
178
- pub const ERR_INTERRUPTED_RETRY : zx_status_t = -6 ;
179
-
180
- // ======= Parameter errors =======
181
- // ERR_INVALID_ARGS: an argument is invalid, ex. null pointer
182
- #[ allow( unused) ]
183
- pub const ERR_INVALID_ARGS : zx_status_t = -10 ;
184
-
185
- // ERR_BAD_HANDLE: A specified handle value does not refer to a handle.
186
- #[ allow( unused) ]
187
- pub const ERR_BAD_HANDLE : zx_status_t = -11 ;
188
-
189
- // ERR_WRONG_TYPE: The subject of the operation is the wrong type to
190
- // perform the operation.
191
- // Example: Attempting a message_read on a thread handle.
192
- #[ allow( unused) ]
193
- pub const ERR_WRONG_TYPE : zx_status_t = -12 ;
194
-
195
- // ERR_BAD_SYSCALL: The specified syscall number is invalid.
196
- #[ allow( unused) ]
197
- pub const ERR_BAD_SYSCALL : zx_status_t = -13 ;
198
-
199
- // ERR_OUT_OF_RANGE: An argument is outside the valid range for this
200
- // operation.
201
- #[ allow( unused) ]
202
- pub const ERR_OUT_OF_RANGE : zx_status_t = -14 ;
203
-
204
- // ERR_BUFFER_TOO_SMALL: A caller provided buffer is too small for
205
- // this operation.
206
- #[ allow( unused) ]
207
- pub const ERR_BUFFER_TOO_SMALL : zx_status_t = -15 ;
208
-
209
- // ======= Precondition or state errors =======
210
- // ERR_BAD_STATE: operation failed because the current state of the
211
- // object does not allow it, or a precondition of the operation is
212
- // not satisfied
213
- #[ allow( unused) ]
214
- pub const ERR_BAD_STATE : zx_status_t = -20 ;
215
-
216
- // ERR_TIMED_OUT: The time limit for the operation elapsed before
217
- // the operation completed.
218
- #[ allow( unused) ]
219
- pub const ERR_TIMED_OUT : zx_status_t = -21 ;
220
-
221
- // ERR_SHOULD_WAIT: The operation cannot be performed currently but
222
- // potentially could succeed if the caller waits for a prerequisite
223
- // to be satisfied, for example waiting for a handle to be readable
224
- // or writable.
225
- // Example: Attempting to read from a message pipe that has no
226
- // messages waiting but has an open remote will return ERR_SHOULD_WAIT.
227
- // Attempting to read from a message pipe that has no messages waiting
228
- // and has a closed remote end will return ERR_REMOTE_CLOSED.
229
- #[ allow( unused) ]
230
- pub const ERR_SHOULD_WAIT : zx_status_t = -22 ;
231
-
232
- // ERR_CANCELED: The in-progress operation (e.g., a wait) has been
233
- // // canceled.
234
- #[ allow( unused) ]
235
- pub const ERR_CANCELED : zx_status_t = -23 ;
236
-
237
- // ERR_PEER_CLOSED: The operation failed because the remote end
238
- // of the subject of the operation was closed.
239
- #[ allow( unused) ]
240
- pub const ERR_PEER_CLOSED : zx_status_t = -24 ;
241
-
242
- // ERR_NOT_FOUND: The requested entity is not found.
243
- #[ allow( unused) ]
244
- pub const ERR_NOT_FOUND : zx_status_t = -25 ;
245
-
246
- // ERR_ALREADY_EXISTS: An object with the specified identifier
247
- // already exists.
248
- // Example: Attempting to create a file when a file already exists
249
- // with that name.
250
- #[ allow( unused) ]
251
- pub const ERR_ALREADY_EXISTS : zx_status_t = -26 ;
252
-
253
- // ERR_ALREADY_BOUND: The operation failed because the named entity
254
- // is already owned or controlled by another entity. The operation
255
- // could succeed later if the current owner releases the entity.
256
- #[ allow( unused) ]
257
- pub const ERR_ALREADY_BOUND : zx_status_t = -27 ;
258
-
259
- // ERR_UNAVAILABLE: The subject of the operation is currently unable
260
- // to perform the operation.
261
- // Note: This is used when there's no direct way for the caller to
262
- // observe when the subject will be able to perform the operation
263
- // and should thus retry.
264
- #[ allow( unused) ]
265
- pub const ERR_UNAVAILABLE : zx_status_t = -28 ;
266
-
267
- // ======= Permission check errors =======
268
- // ERR_ACCESS_DENIED: The caller did not have permission to perform
269
- // the specified operation.
270
- #[ allow( unused) ]
271
- pub const ERR_ACCESS_DENIED : zx_status_t = -30 ;
272
-
273
- // ======= Input-output errors =======
274
- // ERR_IO: Otherwise unspecified error occurred during I/O.
275
- #[ allow( unused) ]
276
- pub const ERR_IO : zx_status_t = -40 ;
277
-
278
- // ERR_REFUSED: The entity the I/O operation is being performed on
279
- // rejected the operation.
280
- // Example: an I2C device NAK'ing a transaction or a disk controller
281
- // rejecting an invalid command.
282
- #[ allow( unused) ]
283
- pub const ERR_IO_REFUSED : zx_status_t = -41 ;
284
-
285
- // ERR_IO_DATA_INTEGRITY: The data in the operation failed an integrity
286
- // check and is possibly corrupted.
287
- // Example: CRC or Parity error.
288
- #[ allow( unused) ]
289
- pub const ERR_IO_DATA_INTEGRITY : zx_status_t = -42 ;
290
-
291
- // ERR_IO_DATA_LOSS: The data in the operation is currently unavailable
292
- // and may be permanently lost.
293
- // Example: A disk block is irrecoverably damaged.
294
- #[ allow( unused) ]
295
- pub const ERR_IO_DATA_LOSS : zx_status_t = -43 ;
296
-
297
- // Filesystem specific errors
298
- #[ allow( unused) ]
299
- pub const ERR_BAD_PATH : zx_status_t = -50 ;
300
- #[ allow( unused) ]
301
- pub const ERR_NOT_DIR : zx_status_t = -51 ;
302
- #[ allow( unused) ]
303
- pub const ERR_NOT_FILE : zx_status_t = -52 ;
304
- // ERR_FILE_BIG: A file exceeds a filesystem-specific size limit.
305
- #[ allow( unused) ]
306
- pub const ERR_FILE_BIG : zx_status_t = -53 ;
307
- // ERR_NO_SPACE: Filesystem or device space is exhausted.
308
- #[ allow( unused) ]
309
- pub const ERR_NO_SPACE : zx_status_t = -54 ;
181
+ ////////////
182
+ // Errors //
183
+ ////////////
184
+
185
+ pub type zx_status_t = i32 ;
186
+
187
+ pub const ZX_OK : zx_status_t = 0 ;
188
+ pub const ZX_ERR_NOT_SUPPORTED : zx_status_t = -2 ;
189
+ pub const ZX_ERR_INVALID_ARGS : zx_status_t = -10 ;
190
+ pub const ZX_ERR_BAD_HANDLE : zx_status_t = -11 ;
191
+ pub const ZX_ERR_WRONG_TYPE : zx_status_t = -12 ;
192
+ pub const ZX_ERR_BAD_STATE : zx_status_t = -20 ;
193
+ pub const ZX_ERR_TIMED_OUT : zx_status_t = -21 ;
194
+
195
+ pub fn zx_cvt < T > ( t : T ) -> io:: Result < T >
196
+ where
197
+ T : TryInto < zx_status_t > + Copy ,
198
+ {
199
+ if let Ok ( status) = TryInto :: try_into ( t) {
200
+ if status < 0 { Err ( io:: Error :: from_raw_os_error ( status) ) } else { Ok ( t) }
201
+ } else {
202
+ Err ( io:: Error :: last_os_error ( ) )
203
+ }
204
+ }
0 commit comments