Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upUnix socket support in the standard library #1479
Conversation
sfackler
added
the
T-libs
label
Jan 26, 2016
sfackler
self-assigned this
Jan 26, 2016
alexcrichton
reviewed
Jan 26, 2016
| is more accurate but weirdly repetitive and the extension trait module | ||
| `std::os::linux::unix` is even weirder. `std::os::unix::socket` is an option, | ||
| but seems like too general of a name for specifically `AF_UNIX` sockets as | ||
| opposed to *all* sockets. |
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 26, 2016
Member
Perhaps another unresolved question for now could be whether Windows named pipes should be added in parallel? Or something along the lines of if we should hold off on stabilization until there's a suitable Windows alternative as well.
This comment has been minimized.
This comment has been minimized.
sfackler
Jan 27, 2016
Author
Member
I don't think that blocking this feature on named pipes makes a ton of sense. Named pipes do not appear to be used heavily in the Rust ecosystem, and I don't really want us to get into a habit of wanting to add platform specific feature X to the standard library and then hunting for a roughly comparable other-platform specific feature Y to implement along side it for "symmetry".
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 28, 2016
Member
Hm ok, but I do also want to not tip the scales too far in favor of Unix as there are lots of abstractions on Windows we could reasonably provide (e.g. named pipes, IOCP bindings, etc). While crates today may not use these much it may just be because the Windows community is a little smaller.
These are mostly just musings, though, I'd be ok if the RFC doesn't explicitly mention named pipes.
alexcrichton
reviewed
Jan 26, 2016
| /// This function will cause all pending and future I/O calls on the | ||
| /// specified portions to immediately return with an appropriate value | ||
| /// (see the documentation of `Shutdown`). | ||
| pub fn shutdown(&self, how: Shutdown) -> io::Result<()> { |
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 26, 2016
Member
This function isn't currently on UdpSocket, which I seem to recall is because it doesn't do much for datagram-oriented services, but do you know if it works well with Unix datagrams?
This comment has been minimized.
This comment has been minimized.
sfackler
Jan 26, 2016
Author
Member
I think I probably just added it for completeness, but I'd expect it to bounce any pending recv calls at least. I'll see if it actually does anything.
This comment has been minimized.
This comment has been minimized.
sfackler
Jan 27, 2016
Author
Member
It looks like shutdown does do what you'd expect for a datagram socket: rust-lang-nursery/unix-socket@63650be#diff-b4aea3e418ccdb71239b96952d9cddb6R1252
alexcrichton
reviewed
Jan 26, 2016
| Differences from `UdpSocket`: | ||
| * `bind` takes an `AsRef<Path>` rather than a `ToSocketAddrs`. | ||
| * The `unbound` method creates an unbound socket, as a Unix socket does not need | ||
| to be bound to send messages. |
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 26, 2016
Member
This method differs somewhat from the planned strategy of UdpSocket which is to perhaps introduce a UdpBuilder, but does this mean that an unbound UnixDatagram is useful in its own right for sending/receiving data?
This comment has been minimized.
This comment has been minimized.
sfackler
Jan 26, 2016
Author
Member
It can't receive any data since you can't address it, but it can send: https://github.com/rust-lang-nursery/unix-socket/blob/master/src/lib.rs#L1159-L1173. This was added explicitly in a PR, so I believe it's a thing that's used in practice: rust-lang-nursery/unix-socket#14
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 28, 2016
Member
Hm ok, seems reasonable to at least come in as unstable-to-start-out-with
alexcrichton
reviewed
Jan 26, 2016
|
|
||
| While there is precedent for platform specific components in the standard | ||
| library, this will be the by far the largest platform specific addition. | ||
|
|
This comment has been minimized.
This comment has been minimized.
alexcrichton
Jan 26, 2016
Member
One drawback that may want to be mentioned here is the lack of a smooth migration path from unix-socket to the standard library. For example users of Unix sockets will currently have to decide whether to support older versions of Rust (and use unix-socket) or newer versions (use std::os::unix::net). Additionally, we'll have to duplicate the code when unix-socket is compiled against a standard library that also has Unix sockets.
We have ideas for implementing such a migration path, but none of these ideas have an RFC or have been implemented.
This comment has been minimized.
This comment has been minimized.
sfackler
Jan 27, 2016
Author
Member
I'm not particularly worried about this specific case - there's not all that much code and these kinds of objects aren't typically going to be passed around between crates like Durations might be.
The migration path ideas we've had seem to me to be a bit like the ideas to store fully elaborated source on crates.io - probably never going to happen :).
sfackler
force-pushed the
sfackler:unix-socket
branch
from
4eaf358
to
3f0c85b
Jan 27, 2016
DemiMarie
reviewed
Feb 1, 2016
| Unix sockets can be configured with the `SOCK_STREAM`, `SOCK_DGRAM`, and | ||
| `SOCK_SEQPACKET` types. `SOCK_STREAM` creates a connection-oriented socket that | ||
| behaves like a TCP socket, `SOCK_DGRAM` creates a packet-oriented socket that | ||
| behaves like a UDP socket, and `SOCK_SEQPACKET` provides something of a hybrid |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
|
This comment has been minimized.
This comment has been minimized.
|
Also from discussion in triage yesterday, the libs team concluded that a good way forward for now with abstract sockets is to do something like:
It at least errs on the side of being conservative for now! |
alexcrichton
added
the
final-comment-period
label
Mar 3, 2016
This comment has been minimized.
This comment has been minimized.
|
Updated to disallow use of the abstract namespace. |
This comment has been minimized.
This comment has been minimized.
gkoz
commented
Mar 7, 2016
|
Shouldn't there be a way to set permissions on the socket before starting to listen to it? |
This comment has been minimized.
This comment has been minimized.
|
What libc API would that use? According to the man page, the socket will inherit the permissions of the directory it's defined in on Linux, but filesystem permissions are ignored on BSD: http://man7.org/linux/man-pages/man7/unix.7.html#NOTES |
This comment has been minimized.
This comment has been minimized.
gkoz
commented
Mar 7, 2016
|
I had |
maghoff
and others
added some commits
Mar 7, 2016
alexcrichton
referenced this pull request
Mar 17, 2016
Closed
Tracking issue for Unix Sockets in the standard library #32312
This comment has been minimized.
This comment has been minimized.
|
The libs team discussed this RFC during triage yesterday, an the decision was to merge. This was the original intention for how Unix sockets would reenter the standard library and the Thanks again for the RFC @sfackler! Tracking issue: rust-lang/rust#32312 |
alexcrichton
merged commit 97780a7
into
rust-lang:master
Mar 17, 2016
This comment has been minimized.
This comment has been minimized.
|
Ah, also, the initial implementation: rust-lang/rust#32302 |
sfackler commentedJan 26, 2016
Rendered