about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-05-06 13:22:22 +0200
committerGitHub <noreply@github.com>2020-05-06 13:22:22 +0200
commitb86620a558dd662fe4261b8c0a2798b7c3d1f068 (patch)
tree37c3fb4745e7d4415233d21c70eba1595fca85cc /src/libstd/sys
parentf29a92366e06b43da52929a14ac4931b218cb3fc (diff)
parentfbf791bd5259ebbf7575db245a2cffd0f59a15a8 (diff)
downloadrust-b86620a558dd662fe4261b8c0a2798b7c3d1f068.tar.gz
rust-b86620a558dd662fe4261b8c0a2798b7c3d1f068.zip
Rollup merge of #71921 - RalfJung:open-mode, r=hanna-kruppe
explain the types used in the open64 call

Fixes https://github.com/rust-lang/rust/issues/71915, where I learned about this quirk. I don't actually know what I am talking about here. ;)
Diffstat (limited to 'src/libstd/sys')
-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);