about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2020-05-05 16:43:57 +0200
committerRalf Jung <post@ralfj.de>2020-05-05 17:08:22 +0200
commitfbf791bd5259ebbf7575db245a2cffd0f59a15a8 (patch)
tree10976399f0a8a83d30eb54821dad46f3d8beb37d
parent04689e22e946879f2f5e2c73849d2f4e1f2b4b32 (diff)
downloadrust-fbf791bd5259ebbf7575db245a2cffd0f59a15a8.tar.gz
rust-fbf791bd5259ebbf7575db245a2cffd0f59a15a8.zip
explain the types used in the open64 call
-rw-r--r--src/libstd/sys/unix/fs.rs4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs
index 2cfc63d9492..80cf6a5dbc2 100644
--- a/src/libstd/sys/unix/fs.rs
+++ b/src/libstd/sys/unix/fs.rs
@@ -703,6 +703,10 @@ impl File {
             | opts.get_access_mode()?
             | opts.get_creation_mode()?
             | (opts.custom_flags as c_int & !libc::O_ACCMODE);
+        // The third argument of `open64` is documented to have type `mode_t`. On
+        // some platforms (like macOS, where `open64` is actually `open`), `mode_t` is `u16`.
+        // However, since this is a variadic function, C integer promotion rules mean that on
+        // the ABI level, this still gets passed as `c_int` (aka `u32` on Unix platforms).
         let fd = cvt_r(|| unsafe { open64(path.as_ptr(), flags, opts.mode as c_int) })?;
         let fd = FileDesc::new(fd);