]> git.lizzy.rs Git - rust.git/commitdiff
process_unix: prefer i32::*_be_bytes over manually shifting bytes
authorLzu Tao <taolzu@gmail.com>
Sun, 12 Jul 2020 16:47:15 +0000 (16:47 +0000)
committerLzu Tao <taolzu@gmail.com>
Sun, 12 Jul 2020 16:47:15 +0000 (16:47 +0000)
src/libstd/sys/unix/process/process_unix.rs

index f389c60615f244e28fa34a3694e6f567adae9433..de35fe0521d03a8a3cefc8597732868048eca5b7 100644 (file)
@@ -1,3 +1,4 @@
+use crate::convert::TryInto;
 use crate::fmt;
 use crate::io::{self, Error, ErrorKind};
 use crate::ptr;
@@ -17,7 +18,7 @@ pub fn spawn(
         default: Stdio,
         needs_stdin: bool,
     ) -> io::Result<(Process, StdioPipes)> {
-        const CLOEXEC_MSG_FOOTER: &[u8] = b"NOEX";
+        const CLOEXEC_MSG_FOOTER: [u8; 4] = *b"NOEX";
 
         let envp = self.capture_env();
 
@@ -52,11 +53,12 @@ pub fn spawn(
                     drop(input);
                     let Err(err) = self.do_exec(theirs, envp.as_ref());
                     let errno = err.raw_os_error().unwrap_or(libc::EINVAL) as u32;
+                    let errno = errno.to_be_bytes();
                     let bytes = [
-                        (errno >> 24) as u8,
-                        (errno >> 16) as u8,
-                        (errno >> 8) as u8,
-                        (errno >> 0) as u8,
+                        errno[0],
+                        errno[1],
+                        errno[2],
+                        errno[3],
                         CLOEXEC_MSG_FOOTER[0],
                         CLOEXEC_MSG_FOOTER[1],
                         CLOEXEC_MSG_FOOTER[2],
@@ -81,12 +83,13 @@ pub fn spawn(
             match input.read(&mut bytes) {
                 Ok(0) => return Ok((p, ours)),
                 Ok(8) => {
+                    let (errno, footer) = bytes.split_at(4);
                     assert!(
-                        combine(CLOEXEC_MSG_FOOTER) == combine(&bytes[4..8]),
+                        combine(CLOEXEC_MSG_FOOTER) == combine(footer.try_into().unwrap()),
                         "Validation on the CLOEXEC pipe failed: {:?}",
                         bytes
                     );
-                    let errno = combine(&bytes[0..4]);
+                    let errno = combine(errno.try_into().unwrap());
                     assert!(p.wait().is_ok(), "wait() should either return Ok or panic");
                     return Err(Error::from_raw_os_error(errno));
                 }
@@ -103,13 +106,8 @@ pub fn spawn(
             }
         }
 
-        fn combine(arr: &[u8]) -> i32 {
-            let a = arr[0] as u32;
-            let b = arr[1] as u32;
-            let c = arr[2] as u32;
-            let d = arr[3] as u32;
-
-            ((a << 24) | (b << 16) | (c << 8) | (d << 0)) as i32
+        fn combine(arr: [u8; 4]) -> i32 {
+            i32::from_be_bytes(arr)
         }
     }