// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. use std::cell::RefCell; use std::path::Path; use std::path::PathBuf; use std::rc::Rc; use deno_core::error::AnyError; use deno_core::op2; use deno_core::OpState; use deno_fs::FileSystemRc; use serde::Serialize; use crate::NodePermissions; #[op2(fast)] pub fn op_node_fs_exists_sync
(
state: &mut OpState,
#[string] path: String,
) -> Result ()
.check_read_with_api_name(&path, Some("node:fs.existsSync()"))?;
let fs = state.borrow:: (
state: &mut OpState,
#[string] path: &str,
#[string] new_path: &str,
) -> Result<(), AnyError>
where
P: NodePermissions + 'static,
{
let path = Path::new(path);
let new_path = Path::new(new_path);
state
.borrow_mut:: ()
.check_read_with_api_name(path, Some("node:fs.cpSync"))?;
state
.borrow_mut:: ()
.check_write_with_api_name(new_path, Some("node:fs.cpSync"))?;
let fs = state.borrow:: (
state: Rc ()
.check_read_with_api_name(&path, Some("node:fs.cpSync"))?;
state
.borrow_mut:: ()
.check_write_with_api_name(&new_path, Some("node:fs.cpSync"))?;
state.borrow:: (
state: Rc ()
.check_read_with_api_name(Path::new(&path), Some("node:fs.statfs"))?;
state
.borrow_mut:: ()
.check_sys("statfs", "node:fs.statfs")?;
}
#[cfg(unix)]
{
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt;
let path = OsStr::new(&path);
let mut cpath = path.as_bytes().to_vec();
cpath.push(0);
if bigint {
#[cfg(not(target_os = "macos"))]
// SAFETY: `cpath` is NUL-terminated and result is pointer to valid statfs memory.
let (code, result) = unsafe {
let mut result: libc::statfs64 = std::mem::zeroed();
(libc::statfs64(cpath.as_ptr() as _, &mut result), result)
};
#[cfg(target_os = "macos")]
// SAFETY: `cpath` is NUL-terminated and result is pointer to valid statfs memory.
let (code, result) = unsafe {
let mut result: libc::statfs = std::mem::zeroed();
(libc::statfs(cpath.as_ptr() as _, &mut result), result)
};
if code == -1 {
return Err(std::io::Error::last_os_error().into());
}
Ok(StatFs {
typ: result.f_type as _,
bsize: result.f_bsize as _,
blocks: result.f_blocks as _,
bfree: result.f_bfree as _,
bavail: result.f_bavail as _,
files: result.f_files as _,
ffree: result.f_ffree as _,
})
} else {
// SAFETY: `cpath` is NUL-terminated and result is pointer to valid statfs memory.
let (code, result) = unsafe {
let mut result: libc::statfs = std::mem::zeroed();
(libc::statfs(cpath.as_ptr() as _, &mut result), result)
};
if code == -1 {
return Err(std::io::Error::last_os_error().into());
}
Ok(StatFs {
typ: result.f_type as _,
bsize: result.f_bsize as _,
blocks: result.f_blocks as _,
bfree: result.f_bfree as _,
bavail: result.f_bavail as _,
files: result.f_files as _,
ffree: result.f_ffree as _,
})
}
}
#[cfg(windows)]
{
use deno_core::anyhow::anyhow;
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use windows_sys::Win32::Storage::FileSystem::GetDiskFreeSpaceW;
let _ = bigint;
// Using a vfs here doesn't make sense, it won't align with the windows API
// call below.
#[allow(clippy::disallowed_methods)]
let path = Path::new(&path).canonicalize()?;
let root = path
.ancestors()
.last()
.ok_or(anyhow!("Path has no root."))?;
let mut root = OsStr::new(root).encode_wide().collect:: (
state: &mut OpState,
#[string] path: &str,
#[number] atime_secs: i64,
#[smi] atime_nanos: u32,
#[number] mtime_secs: i64,
#[smi] mtime_nanos: u32,
) -> Result<(), AnyError>
where
P: NodePermissions + 'static,
{
let path = Path::new(path);
state
.borrow_mut:: ()
.check_write_with_api_name(path, Some("node:fs.lutimes"))?;
let fs = state.borrow:: (
state: Rc ()
.check_write_with_api_name(&path, Some("node:fs.lutimesSync"))?;
state.borrow:: (
state: &mut OpState,
#[string] path: String,
uid: Option ()
.check_write_with_api_name(&path, Some("node:fs.lchownSync"))?;
let fs = state.borrow:: (
state: Rc ()
.check_write_with_api_name(&path, Some("node:fs.lchown"))?;
state.borrow::