Check the presence of linkat() on Solaris (not available in version 10, available in version 11)
This commit is contained in:
parent
7e21b417d4
commit
f0aa3c6354
@ -33,7 +33,7 @@ use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
|
|||||||
target_os = "watchos",
|
target_os = "watchos",
|
||||||
))]
|
))]
|
||||||
use crate::sys::weak::syscall;
|
use crate::sys::weak::syscall;
|
||||||
#[cfg(any(target_os = "android", target_os = "macos"))]
|
#[cfg(any(target_os = "android", target_os = "macos", target_os = "solaris"))]
|
||||||
use crate::sys::weak::weak;
|
use crate::sys::weak::weak;
|
||||||
|
|
||||||
use libc::{c_int, mode_t};
|
use libc::{c_int, mode_t};
|
||||||
@ -42,6 +42,7 @@ use libc::{c_int, mode_t};
|
|||||||
target_os = "macos",
|
target_os = "macos",
|
||||||
target_os = "ios",
|
target_os = "ios",
|
||||||
target_os = "watchos",
|
target_os = "watchos",
|
||||||
|
target_os = "solaris",
|
||||||
all(target_os = "linux", target_env = "gnu")
|
all(target_os = "linux", target_env = "gnu")
|
||||||
))]
|
))]
|
||||||
use libc::c_char;
|
use libc::c_char;
|
||||||
@ -1423,15 +1424,15 @@ pub fn link(original: &Path, link: &Path) -> io::Result<()> {
|
|||||||
run_path_with_cstr(original, |original| {
|
run_path_with_cstr(original, |original| {
|
||||||
run_path_with_cstr(link, |link| {
|
run_path_with_cstr(link, |link| {
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
if #[cfg(any(target_os = "vxworks", target_os = "redox", target_os = "android", target_os = "espidf", target_os = "horizon", target_os = "solaris"))] {
|
if #[cfg(any(target_os = "vxworks", target_os = "redox", target_os = "android", target_os = "espidf", target_os = "horizon"))] {
|
||||||
// VxWorks, Redox, ESP-IDF and Solaris lack `linkat`, so use `link` instead. POSIX leaves
|
// VxWorks, Redox and ESP-IDF lack `linkat`, so use `link` instead. POSIX leaves
|
||||||
// it implementation-defined whether `link` follows symlinks, so rely on the
|
// it implementation-defined whether `link` follows symlinks, so rely on the
|
||||||
// `symlink_hard_link` test in library/std/src/fs/tests.rs to check the behavior.
|
// `symlink_hard_link` test in library/std/src/fs/tests.rs to check the behavior.
|
||||||
// Android has `linkat` on newer versions, but we happen to know `link`
|
// Android has `linkat` on newer versions, but we happen to know `link`
|
||||||
// always has the correct behavior, so it's here as well.
|
// always has the correct behavior, so it's here as well.
|
||||||
cvt(unsafe { libc::link(original.as_ptr(), link.as_ptr()) })?;
|
cvt(unsafe { libc::link(original.as_ptr(), link.as_ptr()) })?;
|
||||||
} else if #[cfg(target_os = "macos")] {
|
} else if #[cfg(any(target_os = "macos", target_os = "solaris"))] {
|
||||||
// On MacOS, older versions (<=10.9) lack support for linkat while newer
|
// MacOS (<=10.9) and Solaris 10 lack support for linkat while newer
|
||||||
// versions have it. We want to use linkat if it is available, so we use weak!
|
// versions have it. We want to use linkat if it is available, so we use weak!
|
||||||
// to check. `linkat` is preferable to `link` because it gives us a flag to
|
// to check. `linkat` is preferable to `link` because it gives us a flag to
|
||||||
// specify how symlinks should be handled. We pass 0 as the flags argument,
|
// specify how symlinks should be handled. We pass 0 as the flags argument,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user