From 3ecce665198e3420d70139d86ed22e74804c9379 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 28 Dec 2022 22:35:55 -0800
Subject: [PATCH] Do not use LFS64 on linux with musl

glibc is providing open64 and other lfs64 functions but musl aliases
them to normal equivalents since off_t is always 64-bit on musl,
therefore check for target env along when target OS is linux before
using open64, this is more available. Latest Musl has made these
namespace changes [1]

[1] https://git.musl-libc.org/cgit/musl/commit/?id=246f1c811448f37a44b41cd8df8d0ef9736d95f4

Upstream-Status: Submitted [https://github.com/rust-lang/rust/pull/106246]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 library/std/src/os/linux/fs.rs |  9 ++++++++-
 library/std/src/sys/unix/fd.rs | 14 ++++++++++----
 library/std/src/sys/unix/fs.rs | 27 ++++++++++++++++++++-------
 3 files changed, 38 insertions(+), 12 deletions(-)

Index: rustc-1.70.0-src/library/std/src/os/linux/fs.rs
===================================================================
--- rustc-1.70.0-src.orig/library/std/src/os/linux/fs.rs
+++ rustc-1.70.0-src/library/std/src/os/linux/fs.rs
@@ -329,7 +329,14 @@ pub trait MetadataExt {
 impl MetadataExt for Metadata {
     #[allow(deprecated)]
     fn as_raw_stat(&self) -> &raw::stat {
-        unsafe { &*(self.as_inner().as_inner() as *const libc::stat64 as *const raw::stat) }
+        #[cfg(target_env = "musl")]
+        unsafe {
+            &*(self.as_inner().as_inner() as *const libc::stat as *const raw::stat)
+        }
+        #[cfg(not(target_env = "musl"))]
+        unsafe {
+            &*(self.as_inner().as_inner() as *const libc::stat64 as *const raw::stat)
+        }
     }
     fn st_dev(&self) -> u64 {
         self.as_inner().as_inner().st_dev as u64
Index: rustc-1.70.0-src/library/std/src/sys/unix/fd.rs
===================================================================
--- rustc-1.70.0-src.orig/library/std/src/sys/unix/fd.rs
+++ rustc-1.70.0-src/library/std/src/sys/unix/fd.rs
@@ -121,9 +121,12 @@ impl FileDesc {
     }
 
     pub fn read_at(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
-        #[cfg(not(any(target_os = "linux", target_os = "android")))]
+        #[cfg(not(any(
+            all(target_os = "linux", not(target_env = "musl")),
+            target_os = "android"
+        )))]
         use libc::pread as pread64;
-        #[cfg(any(target_os = "linux", target_os = "android"))]
+        #[cfg(any(all(target_os = "linux", not(target_env = "musl")), target_os = "android"))]
         use libc::pread64;
 
         unsafe {
@@ -276,9 +279,12 @@ impl FileDesc {
     }
 
     pub fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
-        #[cfg(not(any(target_os = "linux", target_os = "android")))]
+        #[cfg(not(any(
+            all(target_os = "linux", not(target_env = "musl")),
+            target_os = "android"
+        )))]
         use libc::pwrite as pwrite64;
-        #[cfg(any(target_os = "linux", target_os = "android"))]
+        #[cfg(any(all(target_os = "linux", not(target_env = "musl")), target_os = "android"))]
         use libc::pwrite64;
 
         unsafe {
Index: rustc-1.70.0-src/library/std/src/sys/unix/fs.rs
===================================================================
--- rustc-1.70.0-src.orig/library/std/src/sys/unix/fs.rs
+++ rustc-1.70.0-src/library/std/src/sys/unix/fs.rs
@@ -47,9 +47,13 @@ use libc::{c_int, mode_t};
     all(target_os = "linux", target_env = "gnu")
 ))]
 use libc::c_char;
-#[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "android"))]
+#[cfg(any(
+    all(target_os = "linux", not(target_env = "musl")),
+    target_os = "emscripten",
+    target_os = "android"
+))]
 use libc::dirfd;
-#[cfg(any(target_os = "linux", target_os = "emscripten"))]
+#[cfg(any(not(target_env = "musl"), target_os = "emscripten"))]
 use libc::fstatat64;
 #[cfg(any(
     target_os = "android",
@@ -58,9 +62,10 @@ use libc::fstatat64;
     target_os = "redox",
     target_os = "illumos",
     target_os = "nto",
+    target_env = "musl",
 ))]
 use libc::readdir as readdir64;
-#[cfg(target_os = "linux")]
+#[cfg(all(target_os = "linux", not(target_env = "musl")))]
 use libc::readdir64;
 #[cfg(any(target_os = "emscripten", target_os = "l4re"))]
 use libc::readdir64_r;
@@ -81,7 +86,13 @@ use libc::{
     dirent as dirent64, fstat as fstat64, fstatat as fstatat64, ftruncate64, lseek64,
     lstat as lstat64, off64_t, open as open64, stat as stat64,
 };
+#[cfg(target_env = "musl")]
+use libc::{
+    dirent as dirent64, fstat as fstat64, ftruncate as ftruncate64, lseek as lseek64,
+    lstat as lstat64, off_t as off64_t, open as open64, stat as stat64,
+};
 #[cfg(not(any(
+    target_env = "musl",
     target_os = "linux",
     target_os = "emscripten",
     target_os = "l4re",
@@ -91,7 +102,7 @@ use libc::{
     dirent as dirent64, fstat as fstat64, ftruncate as ftruncate64, lseek as lseek64,
     lstat as lstat64, off_t as off64_t, open as open64, stat as stat64,
 };
-#[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "l4re"))]
+#[cfg(any(not(target_env = "musl"), target_os = "emscripten", target_os = "l4re"))]
 use libc::{dirent64, fstat64, ftruncate64, lseek64, lstat64, off64_t, open64, stat64};
 
 pub use crate::sys_common::fs::try_exists;
@@ -278,6 +289,7 @@ unsafe impl Sync for Dir {}
 #[cfg(any(
     target_os = "android",
     target_os = "linux",
+    not(target_env = "musl"),
     target_os = "solaris",
     target_os = "illumos",
     target_os = "fuchsia",
@@ -312,6 +324,7 @@ struct dirent64_min {
 }
 
 #[cfg(not(any(
+    target_env = "musl",
     target_os = "android",
     target_os = "linux",
     target_os = "solaris",
@@ -787,7 +800,7 @@ impl DirEntry {
     }
 
     #[cfg(all(
-        any(target_os = "linux", target_os = "emscripten", target_os = "android"),
+        any(not(target_env = "musl"), target_os = "emscripten", target_os = "android"),
         not(miri)
     ))]
     pub fn metadata(&self) -> io::Result<FileAttr> {
@@ -811,7 +824,7 @@ impl DirEntry {
     }
 
     #[cfg(any(
-        not(any(target_os = "linux", target_os = "emscripten", target_os = "android")),
+        not(any(not(target_env = "musl"), target_os = "emscripten", target_os = "android")),
         miri
     ))]
     pub fn metadata(&self) -> io::Result<FileAttr> {
