88// except according to those terms.
99
1010use self :: mach_sys:: { kern_return_t, mach_msg_body_t, mach_msg_header_t, mach_msg_return_t} ;
11- use self :: mach_sys:: { mach_msg_ool_descriptor_t, mach_msg_port_descriptor_t} ;
11+ use self :: mach_sys:: { mach_msg_ool_descriptor_t, mach_msg_port_descriptor_t, mach_msg_type_name_t } ;
1212use self :: mach_sys:: { mach_msg_timeout_t, mach_port_limits_t, mach_port_msgcount_t} ;
1313use self :: mach_sys:: { mach_port_right_t, mach_port_t, mach_task_self_, vm_inherit_t} ;
1414
@@ -134,7 +134,7 @@ impl Drop for OsIpcReceiver {
134134 }
135135}
136136
137- fn mach_port_allocate ( right : mach_port_right_t ) -> Result < mach_port_t , MachError > {
137+ fn mach_port_allocate ( right : mach_port_right_t ) -> Result < mach_port_t , KernelError > {
138138 let mut port: mach_port_t = 0 ;
139139 let os_result = unsafe {
140140 mach_sys:: mach_port_allocate ( mach_task_self ( ) , right, & mut port)
@@ -165,6 +165,34 @@ fn mach_port_mod_release(port: mach_port_t, right: mach_port_right_t) -> Result<
165165 Err ( err. into ( ) )
166166}
167167
168+ fn mach_port_move_member ( port : mach_port_t , set : mach_port_t ) -> Result < ( ) , KernelError > {
169+ let error = unsafe {
170+ mach_sys:: mach_port_move_member ( mach_task_self ( ) , port, set)
171+ } ;
172+ if error == KERN_SUCCESS {
173+ return Ok ( ( ) ) ;
174+ }
175+ Err ( error. into ( ) )
176+ }
177+
178+ fn mach_port_extract_right (
179+ port : mach_port_t ,
180+ message_type : mach_msg_type_name_t
181+ ) -> Result < ( mach_port_t , mach_msg_type_name_t ) , KernelError > {
182+ let ( mut right, mut acquired_right) = ( 0 , 0 ) ;
183+ let error = unsafe {
184+ mach_sys:: mach_port_extract_right ( mach_task_self ( ) ,
185+ port,
186+ message_type,
187+ & mut right,
188+ & mut acquired_right)
189+ } ;
190+ if error == KERN_SUCCESS {
191+ return Ok ( ( right, acquired_right) ) ;
192+ }
193+ Err ( error. into ( ) )
194+ }
195+
168196impl OsIpcReceiver {
169197 fn new ( ) -> Result < OsIpcReceiver , MachError > {
170198 let port = try!( mach_port_allocate ( MACH_PORT_RIGHT_RECEIVE ) ) ;
@@ -181,7 +209,7 @@ impl OsIpcReceiver {
181209 if os_result == KERN_SUCCESS {
182210 Ok ( OsIpcReceiver :: from_name ( port) )
183211 } else {
184- Err ( MachError :: from ( os_result) )
212+ Err ( KernelError :: from ( os_result) . into ( ) )
185213 }
186214 }
187215
@@ -210,20 +238,9 @@ impl OsIpcReceiver {
210238 fn sender ( & self ) -> Result < OsIpcSender , MachError > {
211239 let port = self . port . get ( ) ;
212240 debug_assert ! ( port != MACH_PORT_NULL ) ;
213- unsafe {
214- let ( mut right, mut acquired_right) = ( 0 , 0 ) ;
215- let os_result = mach_sys:: mach_port_extract_right ( mach_task_self ( ) ,
216- port,
217- MACH_MSG_TYPE_MAKE_SEND as u32 ,
218- & mut right,
219- & mut acquired_right) ;
220- if os_result == KERN_SUCCESS {
221- debug_assert ! ( acquired_right == MACH_MSG_TYPE_PORT_SEND as u32 ) ;
222- Ok ( OsIpcSender :: from_name ( right) )
223- } else {
224- Err ( MachError :: from ( os_result) )
225- }
226- }
241+ let ( right, acquired_right) = mach_port_extract_right ( port, MACH_MSG_TYPE_MAKE_SEND as u32 ) ?;
242+ debug_assert ! ( acquired_right == MACH_MSG_TYPE_PORT_SEND as u32 ) ;
243+ Ok ( OsIpcSender :: from_name ( right) )
227244 }
228245
229246 fn register_bootstrap_name ( & self ) -> Result < String , MachError > {
@@ -235,20 +252,12 @@ impl OsIpcReceiver {
235252 TASK_BOOTSTRAP_PORT ,
236253 & mut bootstrap_port) ;
237254 if os_result != KERN_SUCCESS {
238- return Err ( MachError :: from ( os_result) )
255+ return Err ( KernelError :: from ( os_result) . into ( ) )
239256 }
240257
241258
242259 // FIXME(pcwalton): Does this leak?
243- let ( mut right, mut acquired_right) = ( 0 , 0 ) ;
244- let os_result = mach_sys:: mach_port_extract_right ( mach_task_self ( ) ,
245- port,
246- MACH_MSG_TYPE_MAKE_SEND as u32 ,
247- & mut right,
248- & mut acquired_right) ;
249- if os_result != KERN_SUCCESS {
250- return Err ( MachError :: from ( os_result) )
251- }
260+ let ( right, acquired_right) = mach_port_extract_right ( port, MACH_MSG_TYPE_MAKE_SEND as u32 ) ?;
252261 debug_assert ! ( acquired_right == MACH_MSG_TYPE_PORT_SEND as u32 ) ;
253262
254263 let mut os_result;
@@ -276,7 +285,7 @@ impl OsIpcReceiver {
276285 TASK_BOOTSTRAP_PORT ,
277286 & mut bootstrap_port) ;
278287 if os_result != KERN_SUCCESS {
279- return Err ( MachError :: from ( os_result) )
288+ return Err ( KernelError :: from ( os_result) . into ( ) )
280289 }
281290
282291 let c_name = CString :: new ( name) . unwrap ( ) ;
@@ -305,7 +314,7 @@ impl OsIpcReceiver {
305314 MACH_MSG_TYPE_MAKE_SEND_ONCE as u32 ,
306315 & mut 0 ) ;
307316 if os_result != KERN_SUCCESS {
308- return Err ( MachError :: from ( os_result) )
317+ return Err ( KernelError :: from ( os_result) . into ( ) )
309318 }
310319 }
311320 Ok ( ( ) )
@@ -391,7 +400,7 @@ impl OsIpcSender {
391400 TASK_BOOTSTRAP_PORT ,
392401 & mut bootstrap_port) ;
393402 if os_result != KERN_SUCCESS {
394- return Err ( MachError :: from ( os_result) )
403+ return Err ( KernelError :: from ( os_result) . into ( ) )
395404 }
396405
397406 let mut port = 0 ;
@@ -542,16 +551,10 @@ impl OsIpcReceiverSet {
542551 }
543552
544553 pub fn add ( & mut self , receiver : OsIpcReceiver ) -> Result < u64 , MachError > {
545- let os_result = unsafe {
546- mach_sys:: mach_port_move_member ( mach_task_self ( ) , receiver. extract_port ( ) , self . port . get ( ) )
547- } ;
548- if os_result == KERN_SUCCESS {
549- let receiver_port = receiver. consume_port ( ) ;
550- self . ports . push ( receiver_port) ;
551- Ok ( receiver_port as u64 )
552- } else {
553- Err ( MachError :: from ( os_result) )
554- }
554+ mach_port_move_member ( receiver. extract_port ( ) , self . port . get ( ) ) ?;
555+ let receiver_port = receiver. consume_port ( ) ;
556+ self . ports . push ( receiver_port) ;
557+ Ok ( receiver_port as u64 )
555558 }
556559
557560 pub fn select ( & mut self ) -> Result < Vec < OsIpcSelectionResult > , MachError > {
0 commit comments