Commit Graph

162 Commits

Author SHA1 Message Date
oxalica
15cb3e08e3
Fix cfgs for current libc 2019-10-18 10:32:27 +08:00
oxalica
43f398be6d
Prefer statx on linux if available 2019-10-18 10:32:27 +08:00
Mazdak Farrokhzad
76938abba1
Rollup merge of #63332 - marmistrz:truncate, r=alexcrichton
Add an overflow check in truncate implementation for Unix.

Closes #63326.
cc @alexcrichton
2019-08-08 16:33:37 +02:00
Marcin Mielniczuk
3adbf63b11
Move the TryInto import into the inner scope 2019-08-08 11:44:59 +02:00
Jeremy Soller
0498da9a3d
redox: convert to target_family unix 2019-08-06 16:18:23 -06:00
Marcin Mielniczuk
3cd9f3f6ab
Add an overflow check in truncate implementation for Unix. 2019-08-06 19:35:54 +02:00
Marcel Hellwig
cc314b066a Remove bitrig support from rust 2019-05-13 11:09:06 +02:00
Edward Barnard
0fd446ea78 Make std::fs::copy attempt to create copy-on-write clones of files on MacOS. 2019-05-02 09:41:37 +01:00
Steven Fackler
bd177f3ea3 Stabilized vectored IO
This renames `std::io::IoVec` to `std::io::IoSlice` and
`std::io::IoVecMut` to `std::io::IoSliceMut`, and stabilizes
`std::io::IoSlice`, `std::io::IoSliceMut`,
`std::io::Read::read_vectored`, and `std::io::Write::write_vectored`.

Closes #58452
2019-04-27 08:34:08 -07:00
David Vázquez Púa
d602a6b942 Fix sync_all on macos/ios
sync_all should flush all metadata in macos/ios, so it should call
fcntl with the F_FULLFSYNC flag as sync_data does.

Fixes #55920
2019-04-19 20:42:52 +02:00
Alex Crichton
acf3ddb5ad std: Add {read,write}_vectored for more types
This commit implements the `{read,write}_vectored` methods on more types
in the standard library, namely:

* `std::fs::File`
* `std::process::ChildStd{in,out,err}`
* `std::io::Std{in,out,err}`
* `std::io::Std{in,out,err}Lock`
* `std::io::Std{in,out,err}Raw`

Where supported the OS implementations hook up to native support,
otherwise it falls back to the already-defaulted implementation.
2019-04-10 12:51:25 -07:00
Alex Crichton
61b487ca8b wasi: Fill out std::fs module for WASI
This commit fills out the `std::fs` module and implementation for WASI.
Not all APIs are implemented, such as permissions-related ones and
`canonicalize`, but all others APIs have been implemented and very
lightly tested so far. We'll eventually want to run a more exhaustive
test suite!

For now the highlights of this commit are:

* The `std::fs::File` type is now backed by `WasiFd`, a raw WASI file
  descriptor.
* All APIs in `std::fs` (except permissions/canonicalize) have
  implementations for the WASI target.
* A suite of unstable extension traits were added to
  `std::os::wasi::fs`. These traits expose the raw filesystem
  functionality of WASI, namely `*at` syscalls (opening a file relative
  to an already opened one, for example). Additionally metadata only
  available on wasi is exposed through these traits.

Perhaps one of the most notable parts is the implementation of
path-taking APIs. WASI actually has no fundamental API that just takes a
path, but rather everything is relative to a previously opened file
descriptor. To allow existing APIs to work (that only take a path) WASI
has a few syscalls to learn about "pre opened" file descriptors by the
runtime. We use these to build a map of existing directory names to file
descriptors, and then when using a path we try to anchor it at an
already-opened file.

This support is very rudimentary though and is intended to be shared
with C since it's likely to be so tricky. For now though the C library
doesn't expose quite an API for us to use, so we implement it for now
and will swap it out as soon as one is available.
2019-04-03 08:05:46 -07:00
Mazdak Farrokhzad
379c380a60 libstd: deny(elided_lifetimes_in_paths) 2019-03-31 12:56:51 +02:00
Harald Hoyer
cf8347ba6b
fs::copy() set file mode early
A convenience method like fs::copy() should try to prevent pitfalls a
normal user doesn't think about.

In case of an empty umask, setting the file mode early prevents
temporarily world readable or even writeable files,
because the default mode is 0o666.

In case the target is a named pipe or special device node, setting the
file mode can lead to unwanted side effects, like setting permissons on
`/dev/stdout` or for root setting permissions on `/dev/null`.

copy_file_range() returns EINVAL, if the destination is a FIFO/pipe or
a device like "/dev/null", so fallback to io::copy, too.

Use `fcopyfile` on MacOS instead of `copyfile`.

Fixes: https://github.com/rust-lang/rust/issues/26933
Fixed: https://github.com/rust-lang/rust/issues/37885
2019-03-23 07:36:27 +01:00
Edward Barnard
c82a42c155 Change std::fs::copy to use copyfile on MacOS and iOS 2019-03-04 12:33:15 +00:00
Taiki Endo
93b6d9e086 libstd => 2018 2019-02-28 04:06:15 +09:00
Mark Rousskov
2a663555dd Remove licenses 2018-12-25 21:08:33 -07:00
teresy
eca11b99a7 refactor: use shorthand fields 2018-11-06 15:05:44 -05:00
Matthias Krüger
71120ef1e5 Fix typos found by codespell. 2018-08-19 17:41:28 +02:00
Colin Finck
e50f4eeaad Add targets for HermitCore (https://hermitcore.org) to the Rust compiler and port libstd to it.
As a start, the port uses the simplest possible configuration (no jemalloc, abort on panic)
and makes use of existing Unix-specific code wherever possible.
It adds targets for x86_64 (current main HermitCore platform) and aarch64 (HermitCore platform
under development).

Together with the patches to "liblibc" and "llvm", this enables HermitCore applications to be
written in Rust.
2018-07-30 15:50:51 +02:00
Pietro Albini
2348dc5b3f
Rollup merge of #51786 - cuviper:stat64-pointers, r=Mark-Simulacrum
Remove unnecessary stat64 pointer casts

In effect, these just casted `&mut stat64` to `*mut stat64`, twice.
That's harmless, but it masked a problem when this was copied to new
code calling `fstatat`, which takes a pointer to `struct stat`.  That
will be fixed by #51785, but let's remove the unnecessary casts here
too.
2018-06-26 11:35:41 +02:00
bors
7d2fa4a4d2 Auto merge of #50630 - sharkdp:fix-50619, r=sfackler
Fix possibly endless loop in ReadDir iterator

Certain directories in `/proc` can cause the `ReadDir` iterator to loop indefinitely. We get an error code (22) when calling libc's `readdir_r` on these directories, but `entry_ptr` is `NULL` at the same time, signalling the end of the directory stream.

This change introduces an internal state to the iterator such that the `Some(Err(..))` value will only be returned once when calling `next`. Subsequent calls will return `None`.

fixes #50619
2018-06-26 03:49:37 +00:00
Josh Stone
490f49fd2a Remove unnecessary stat64 pointer casts
In effect, these just casted `&mut stat64` to `*mut stat64`, twice.
That's harmless, but it masked a problem when this was copied to new
code calling `fstatat`, which takes a pointer to `struct stat`.  That
will be fixed by #51785, but let's remove the unnecessary casts here
too.
2018-06-25 12:34:33 -07:00
Josh Stone
65d31d7269 Use fstatat64 where available 2018-06-25 11:42:27 -07:00
sharkdp
af75314ecd Fix possibly endless loop in ReadDir iterator
Certain directories in `/proc` can cause the `ReadDir`
iterator to loop indefinitely. We get an error code (22) when
calling libc's `readdir_r` on these directories, but `entry_ptr`
is `NULL` at the same time, signalling the end of the directory
stream.

This change introduces an internal state to the iterator such
that the `Some(Err(..))` value will only be returned once when
calling `next`. Subsequent calls will return `None`.

fixes #50619
2018-06-12 21:03:27 +02:00
Nicolas Koch
2c3eff99f0 fs: copy: Add EPERM to fallback error conditions
Fixes #51266
2018-06-01 09:32:20 +02:00
Guillaume Gomez
af4acbe5e7
Rollup merge of #51213 - nicokoch:copy_permissions, r=cramertj
fs: copy: Use File::set_permissions instead of fs::set_permissions

We already got the open file descriptor at this point.
Don't make the kernel resolve the path again.
2018-05-31 22:17:14 +02:00
Guillaume Girol
8dec03b71a libstd/sys/unix/fs.rs: fix compilation on fuchsia 2018-05-31 19:18:58 +02:00
Guillaume Girol
cb2a0d61ad std::fs::DirEntry.metadata(): use fstatat instead of lstat when possible 2018-05-30 20:52:30 +02:00
Nicolas Koch
c5ee3b6df1 Remobve unused import 2018-05-30 12:09:20 +02:00
Nicolas Koch
9b6940d0b4 fs: copy: Use File::set_permissions instead of fs::set_permissions
We already got the open file descriptor at this point.
Don't make the kernel resolve the path again.
2018-05-30 06:33:54 +02:00
bors
ec99b220fe Auto merge of #50772 - nicokoch:fastcopy, r=alexcrichton
fs: copy: use copy_file_range on Linux

Linux 4.5 introduced a new system call [copy_file_range](http://man7.org/linux/man-pages/man2/copy_file_range.2.html) to copy data from one file to another.

This PR uses the new system call (if available). This has several advantages:

1. No need to constantly copy data from userspace to kernel space, if the buffer is small or the file is large
2. On some filesystems, like BTRFS, the kernel can leverage internal fs mechanisms for huge performance gains
3. Filesystems on the network dont need to copy data between the host and the client machine (they have to in the current read/write implementation)

I have created a small library that also implements the new system call for some huge performance gains here: https://github.com/nicokoch/fastcopy
Benchmark results are in the README
2018-05-29 23:49:11 +00:00
Nicolas Koch
c7d6a0130b Fix additional nits:
- compute bytes_to_copy more elegantly
  - add assert that written is 0 in fallback case
2018-05-29 23:42:42 +02:00
Nicolas Koch
3b271eb039 Use FIXME instead of TODO; Move bytes_to_copy calculation inside if
branch
2018-05-28 17:19:42 +02:00
Nicolas Koch
3f392abdfb Implement suggestions from the PR
- Move loading of atomic bool outside the loop
  - Add comment about TryFrom for future improvement
2018-05-24 14:51:59 +02:00
Nicolas Koch
09d03bc245 Store ENOSYS in a global to avoid unnecessary system calls 2018-05-17 14:10:14 +02:00
Nicolas Koch
a5e2942861 Fix large file copies on 32 bit platforms 2018-05-16 10:35:19 +02:00
Nicolas Koch
f4c2825c8f Adjust len in every iteration 2018-05-16 10:27:14 +02:00
Nicolas Koch
b605923cc8 Add clarifying comment about offset argument 2018-05-16 10:21:34 +02:00
Nicolas Koch
00ec3cf2a0 Use copy_file_range on android also 2018-05-16 10:17:06 +02:00
Nicolas Koch
834ef9f08a fs: use copy_file_range on linux 2018-05-15 15:25:09 +02:00
Tobias Bucher
6d1da82329 Don't unconditionally set CLOEXEC twice on every fd we open on Linux
Previously, every `open64` was accompanied by a `ioctl(…, FIOCLEX)`,
because some old Linux version would ignore the `O_CLOEXEC` flag we pass
to the `open64` function.

Now, we check whether the `CLOEXEC` flag is set on the first file we
open – if it is, we won't do extra syscalls for every opened file. If it
is not set, we fall back to the old behavior of unconditionally calling
`ioctl(…, FIOCLEX)` on newly opened files.

On old Linuxes, this amounts to one extra syscall per process, namely
the `fcntl(…, F_GETFD)` call to check the `CLOEXEC` flag.

On new Linuxes, this reduces the number of syscalls per opened file by
one, except for the first file, where it does the same number of
syscalls as before (`fcntl(…, F_GETFD)` to check the flag instead of
`ioctl(…, FIOCLEX)` to set it).
2018-05-14 13:20:39 +02:00
Marco A L Barbosa
e57ee3d0bf Fix some tests for linux gnux32 2017-10-20 13:18:16 -02:00
Trevor Merrifield
6ae9fc2772 Remove st_mode mask 2017-09-17 20:13:33 -04:00
Trevor Merrifield
e391079496 Retain suid/sgid/sticky bits in Metadata.permissions
Most users would expect set_permissions(Metadata.permissions()) to be
non-destructive. While we can't guarantee this, we can at least pass
the needed info to chmod.

Also update the PermissionsExt documentation to disambiguate what it
contains, and to refer to the underlying value as `st_mode` rather than
its type `mode_t`.

Closes #44147
2017-09-15 22:42:34 -04:00
Tobias Schaffner
9bbc6dbde3 Add modifications needed for L4re in libstd
This commit adds the needed modifications to compile the std crate
for the L4 Runtime environment (L4Re).

A target for the L4Re was introduced in commit:
c151220a84

In many aspects implementations for linux also apply for the L4Re
microkernel.

Two uncommon characteristics had to be resolved:
* L4Re has no network funktionality
* L4Re has a maximum stacksize of 1Mb for threads

Co-authored-by: Sebastian Humenda <sebastian.humenda@tu-dresden.de>
2017-09-08 14:36:56 +02:00
Alex Crichton
e5b123cba2 Update the libc submodule
Brings in a few fixes for wasm/asmjs
2017-08-28 07:58:19 -07:00
Corey Farwell
1949c6599d Add comments clarifying behavior of unix set_readonly behavior. 2017-08-15 09:42:11 -04:00
Danek Duvall
9427bb36f6 Fix a dangling symlink bug in remove_dir_all() on Solaris
This fixes a handful of long-failing tests.
2017-08-03 14:55:01 -07:00
Steven Fackler
ecbb896b9e Add Read::initializer.
This is an API that allows types to indicate that they can be passed
buffers of uninitialized memory which can improve performance.
2017-06-20 20:26:22 -07:00