Commit Graph

1496 Commits

Author SHA1 Message Date
bors d52c44ea8d Auto merge of #49460 - kennytm:rollup, r=kennytm
Rollup of 12 pull requests

- Successful merges: #49243, #49329, #49364, #49400, #49405, #49427, #49428, #49429, #49439, #49442, #49444, #49452
- Failed merges:
2018-03-28 22:18:13 +00:00
bors e5277c1457 Auto merge of #49357 - frewsxcv:frewsxcv-termination-doc-examples, r=GuillaumeGomez
Remove hidden `foo` functions from doc examples; use `Termination` trait.

Fixes https://github.com/rust-lang/rust/issues/49233.

Easier to review with the white-space ignoring `?w=1` feature: https://github.com/rust-lang/rust/pull/49357/files?w=1
2018-03-28 18:11:44 +00:00
kennytm 010fb40b44 Rollup merge of #49400 - Diggsey:shrink-to, r=joshtriplett
Implement `shrink_to` method on collections

Fixes #49385
2018-03-28 17:55:09 +02:00
Corey Farwell e9dcec070d Remove hidden foo functions from doc examples; use Termination trait.
Fixes https://github.com/rust-lang/rust/issues/49233.
2018-03-28 13:15:05 +02:00
Diggory Blake 04f6692aaf Implement shrink_to method on collections 2018-03-27 01:39:11 +01:00
bors 482a913fb3 Auto merge of #49315 - TheDan64:smaller_unsafe_block, r=joshtriplett
Reduce scope of unsafe block in sun_path_offset

I reduced the scope of the unsafe block to the `uninitialized` call which is the only actual unsafe bit.
2018-03-25 05:26:58 +00:00
Daniel Kolsoi fdde09c70c Reduce scope of unsafe block in sun_path_offset 2018-03-23 17:01:34 -04:00
Alex Crichton 16eeb10bee Rollup merge of #48624 - bdrewery:freebsd-posix-spawn, r=alexcrichton
Command: Support posix_spawn() on FreeBSD/OSX/GNU Linux
2018-03-23 10:16:07 -07:00
Bryan Drewery 70559c54ce Command::env_saw_path() may be unused on platforms not using posix_spawn() 2018-03-22 09:49:20 -07:00
Simon Sapin c09b9f9372 Deprecate the AsciiExt trait in favor of inherent methods
The trait and some of its methods are stable and will remain.
Some of the newer methods are unstable and can be removed later.

Fixes https://github.com/rust-lang/rust/issues/39658
2018-03-21 17:54:33 +01:00
Bryan Drewery 6212904dd8 Don't use posix_spawn() if PATH was modified in the environment.
The expected behavior is that the environment's PATH should be used
to find the process.  posix_spawn() could be used if we iterated
PATH to search for the binary to execute.  For now just skip
posix_spawn() if PATH is modified.
2018-03-19 15:40:09 -07:00
Bryan Drewery 00dac20e01 Merge branch 'update-beta-freebsd' into freebsd-posix-spawn 2018-03-19 13:11:55 -07:00
Alex Crichton de3a63d663 Rollup merge of #48618 - scottmcm:elaborate-exitcode, r=alexcrichton
Better docs and associated SUCCESS/FAILURE for process::ExitCode

Follow-up to https://github.com/rust-lang/rust/pull/48497#discussion_r170676525, since that PR was the minimal thing to unblock https://github.com/rust-lang/rust/issues/48453#issuecomment-368155082.

r? @nikomatsakis
2018-03-06 23:38:06 -08:00
Scott McMurray 74c5c6e6cb Move process::ExitCode internals to sys
Now begins the saga of fixing compilation errors on other platforms...
2018-03-03 18:44:44 -08:00
Manish Goregaokar 8bf026df5b Rollup merge of #48328 - frewsxcv:frewsxcv-clarify-error-zero-duration, r=sfackler
Fixes #47311.
r? @nrc
2018-03-02 22:01:20 -08:00
Bryan Drewery d740083fc8 Support posix_spawn() for Linux glibc 2.24+.
The relevant support was added in https://sourceware.org/bugzilla/show_bug.cgi?id=10354#c12
2018-03-02 13:08:04 -08:00
Bryan Drewery 5ba6b3a728 Move glibc version lookup handling to sys::os and add a simpler glibc_version() 2018-03-02 12:54:03 -08:00
Bryan Drewery 99b50efb6e Use _ 2018-03-02 08:50:37 -08:00
Bryan Drewery ef73b3ae2e Add comment explaining when posix_spawn() can be supported. 2018-03-01 09:18:16 -08:00
Bryan Drewery 2e2d9260f9 posix_spawn() on OSX supports returning ENOENT. 2018-03-01 09:17:49 -08:00
Bryan Drewery a9ea876960 posix_spawn() always returns its error rather than setting errno. 2018-02-28 22:16:35 -08:00
Bryan Drewery 85b82f254e Support posix_spawn() for FreeBSD.
spawn() is expected to return an error if the specified file could not be
executed.  FreeBSD's posix_spawn() supports returning ENOENT/ENOEXEC if
the exec() fails, which not all platforms support.  This brings a very
significant performance improvement for FreeBSD, involving heavy use of
Command in threads, due to fork() invoking jemalloc fork handlers and
causing lock contention.  FreeBSD's posix_spawn() avoids this problem
due to using vfork() internally.
2018-02-28 15:36:32 -08:00
Bryan Drewery b3ecf5f57c Remove excess newline 2018-02-28 15:36:32 -08:00
Bryan Drewery 8e3fa0d3c4 Pass proper pointer for envp. 2018-02-28 15:36:32 -08:00
Bryan Drewery 94630e4ca5 No need to zero when an initializer for the object is already used. 2018-02-28 15:36:32 -08:00
Bryan Drewery f4633865d3 Avoid error for unused variables 2018-02-28 15:36:31 -08:00
Alex Crichton 11696acd6d Support posix_spawn() when possible. 2018-02-28 15:35:59 -08:00
kennytm 1aa103511b Rollup merge of #48330 - frewsxcv:frewsxcv-tests-zero-duration, r=sfackler
Add tests ensuring zero-Duration timeouts result in errors; fix Redox issues.

Part of #48311
2018-02-25 22:47:56 +08:00
Corey Farwell a554a2f564 Return error if timeout is zero-Duration on Redox. 2018-02-25 08:54:08 -05:00
Corey Farwell 0700bd12d0 Clarify "It is an error to..." wording for zero-duration behaviors.
Documentation fix side of https://github.com/rust-lang/rust/issues/48311.
2018-02-24 08:56:36 -05:00
Corey Farwell d17d645ad7 Add tests ensuring zero-Duration timeouts result in errors.
Part of https://github.com/rust-lang/rust/issues/48311
2018-02-18 21:42:02 -05:00
Corey Farwell 472dcdb4ec Fix broken documentation link. 2018-02-17 20:57:00 -05:00
bors b298607864 Auto merge of #47956 - retep998:is-nibbles, r=BurntSushi
This is the ideal FileType on Windows. You may not like it, but this is what peak performance looks like.

Theoretically this would fix https://github.com/rust-lang/rust/issues/46484

The current iteration of this PR should not cause existing code to break, but instead merely improves handling around reparse points. Specifically...

* Reparse points are considered to be symbolic links if they have the name surrogate bit set. Name surrogates are reparse points that effectively act like symbolic links, redirecting you to a different directory/file. By checking for this bit instead of specific tags, we become much more general in our handling of reparse points, including those added by third parties.
* If something is a reparse point but does not have the name surrogate bit set, then we ignore the fact that it is a reparse point because it is actually a file or directory directly there, despite having additional handling by drivers due to the reparse point.
* For everything which is not a symbolic link (including non-surrogate reparse points) we report whether it is a directory or a file based on the presence of the directory attribute bit.
* Notably this still preserves invariant that when `is_symlink` returns `true`, both `is_dir` and `is_file` will return `false`. The potential for breakage was far too high.
* Adds an unstable `FileTypeExt` to allow users to determine whether a symbolic link is a directory or a file, since `FileType` by design is incapable of reporting this information.
2018-02-17 11:32:16 +00:00
Peter Atashian 9269e83b37 Add an unstable FileTypeExt extension trait for Windows 2018-02-11 13:40:46 -05:00
kennytm 8b8c6ee796 Rollup merge of #47912 - cuviper:glibc-stack-guard, r=alexcrichton
Use a range to identify SIGSEGV in stack guards

Previously, the `guard::init()` and `guard::current()` functions were
returning a `usize` address representing the top of the stack guard,
respectively for the main thread and for spawned threads.  The `SIGSEGV`
handler on `unix` targets checked if a fault was within one page below that
address, if so reporting it as a stack overflow.

Now `unix` targets report a `Range<usize>` representing the guard memory,
so it can cover arbitrary guard sizes.  Non-`unix` targets which always
return `None` for guards now do so with `Option<!>`, so they don't pay any
overhead.

For `linux-gnu` in particular, the previous guard upper-bound was
`stackaddr + guardsize`, as the protected memory was *inside* the stack.
This was a glibc bug, and starting from 2.27 they are moving the guard
*past* the end of the stack.  However, there's no simple way for us to know
where the guard page actually lies, so now we declare it as the whole range
of `stackaddr ± guardsize`, and any fault therein will be called a stack
overflow.  This fixes #47863.
2018-02-04 23:28:57 +08:00
Peter Atashian c42d76d3c8 Somehow this function got flipped around
Unflip it
2018-02-03 01:52:04 -05:00
Peter Atashian f4c83693f9 Go back to files directories and symlinks being mutually exclusive
Be smarter about what a symlink is however
2018-02-03 01:45:58 -05:00
Peter Atashian 259b0329d4 This internal only method is no longer needed. 2018-02-01 20:42:31 -05:00
Peter Atashian dcf53c1590 Rewrite remove_dir_all to be correct
The fact that this had to be rewritten does not bode well
2018-02-01 20:35:50 -05:00
Peter Atashian b1b9edf5ae This is what FileType on Windows should ideally be. 2018-02-01 20:29:19 -05:00
Josh Stone 55b54a999b Use a range to identify SIGSEGV in stack guards
Previously, the `guard::init()` and `guard::current()` functions were
returning a `usize` address representing the top of the stack guard,
respectively for the main thread and for spawned threads.  The `SIGSEGV`
handler on `unix` targets checked if a fault was within one page below
that address, if so reporting it as a stack overflow.

Now `unix` targets report a `Range<usize>` representing the guard
memory, so it can cover arbitrary guard sizes.  Non-`unix` targets which
always return `None` for guards now do so with `Option<!>`, so they
don't pay any overhead.

For `linux-gnu` in particular, the previous guard upper-bound was
`stackaddr + guardsize`, as the protected memory was *inside* the stack.
This was a glibc bug, and starting from 2.27 they are moving the guard
*past* the end of the stack.  However, there's no simple way for us to
know where the guard page actually lies, so now we declare it as the
whole range of `stackaddr ± guardsize`, and any fault therein will be
called a stack overflow.  This fixes #47863.
2018-01-31 11:41:29 -08:00
Diggory Blake 36695a37c5 Implement extensible syscall interface for wasm 2018-01-30 23:22:19 +00:00
kennytm 4dbfc8ddbf Rollup merge of #47760 - little-dude:master, r=alexcrichton
implement Send for process::Command on unix

closes https://github.com/rust-lang/rust/issues/47751
2018-01-30 17:10:53 +08:00
Corentin Henry 9e6ed17c4f make Command.argv Send on unix platforms
Implementing Send for a specific field rather than the whole struct is
safer: if a field is changed/modified and becomes non-Send, we can catch
it.
2018-01-26 07:22:58 -08:00
John Kåre Alsaker 634f8cc06a Print inlined functions on Windows 2018-01-26 04:49:54 +01:00
Corentin Henry 831ff77570 implement Send for process::Command on unix
closes https://github.com/rust-lang/rust/issues/47751
2018-01-25 15:14:38 -08:00
Guillaume Gomez ab54a9c73c Rollup merge of #47334 - etaoins:only-call-res-init-on-gnu-unix, r=alexcrichton
Only link res_init() on GNU/*nix

To workaround a bug in glibc <= 2.26 lookup_host() calls res_init() based on the glibc version detected at runtime. While this avoids calling res_init() on platforms where it's not required we will still end up linking against the symbol.

This causes an issue on macOS where res_init() is implemented in a separate library (libresolv.9.dylib) from the main libc. While this is harmless for standalone programs it becomes a problem if Rust code is statically linked against another program. If the linked program doesn't already specify -lresolv it will cause the link to fail. This is captured in issue #46797

Fix this by hooking in to the glibc workaround in `cvt_gai` and only activating it for the "gnu" environment on Unix This should include all glibc platforms while excluding musl, windows-gnu, macOS, FreeBSD, etc.

This has the side benefit of removing the #[cfg] in sys_common; only unix.rs has code related to the workaround now.

Before this commit:
```shell
> cat main.rs
use std::net::ToSocketAddrs;

#[no_mangle]
pub extern "C" fn resolve_test() -> () {
    let addr_list = ("google.com.au", 0).to_socket_addrs().unwrap();
    println!("{:?}", addr_list);
}
> rustc --crate-type=staticlib main.rs
> clang libmain.a test.c -o combined
Undefined symbols for architecture x86_64:
  "_res_9_init", referenced from:
      std::net::lookup_host::h93c17fe9ad38464a in libmain.a(std-826c8d3b356e180c.std0.rcgu.o)
ld: symbol(s) not found for architecture x86_64
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
```

Afterwards:
```shell
> rustc --crate-type=staticlib main.rs
> clang libmain.a test.c -o combined
> ./combined
IntoIter([V4(172.217.25.131:0)])
```

Fixes  #46797
2018-01-21 23:11:38 +01:00
Zack M. Davis 14982db2d6 in which the unused-parens lint comes to cover function and method args
Resolves #46137.
2018-01-18 08:33:58 -08:00
Ryan Cumming 090a968fe7 Only link res_init() on GNU/*nix
To workaround a bug in glibc <= 2.26 lookup_host() calls res_init()
based on the glibc version detected at runtime. While this avoids
calling res_init() on platforms where it's not required we will still
end up linking against the symbol.

This causes an issue on macOS where res_init() is implemented in a
separate library (libresolv.9.dylib) from the main libc. While this is
harmless for standalone programs it becomes a problem if Rust code is
statically linked against another program. If the linked program doesn't
already specify -lresolv it will cause the link to fail. This is
captured in issue #46797

Fix this by hooking in to the glibc workaround in `cvt_gai` and only
activating it for the "gnu" environment on Unix This should include all
glibc platforms while excluding musl, windows-gnu, macOS, FreeBSD, etc.

This has the side benefit of removing the #[cfg] in sys_common; only
unix.rs has code related to the workaround now.
2018-01-16 06:30:44 +11:00
Ed Schouten cc8565b20a Make the documentation build work on CloudABI.
Just like with wasm, we can't just import unix::ext and windows::ext.
Our shims are not complete enough for that.
2018-01-11 11:29:52 +01:00