Skip to content

Commit 461a4cb

Browse files
committed
Add links to online OS documentation
1 parent 9b13b9e commit 461a4cb

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

src/lib.rs

+50
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,56 @@ macro_rules! from {
115115
};
116116
}
117117

118+
/// Link to online documentation for (almost) all supported OSs.
119+
#[rustfmt::skip]
120+
macro_rules! man_links {
121+
// Links to all OSs.
122+
($syscall: tt ( $section: tt ) ) => {
123+
concat!(
124+
man_links!(__ intro),
125+
man_links!(__ unix $syscall($section)),
126+
man_links!(__ windows $syscall($section)),
127+
)
128+
};
129+
// Links to Unix-like OSs.
130+
(unix: $syscall: tt ( $section: tt ) ) => {
131+
concat!(
132+
man_links!(__ intro),
133+
man_links!(__ unix $syscall($section)),
134+
)
135+
};
136+
// Links to Windows only.
137+
(windows: $syscall: tt ( $section: tt ) ) => {
138+
concat!(
139+
man_links!(__ intro),
140+
man_links!(__ windows $syscall($section)),
141+
)
142+
};
143+
// Internals.
144+
(__ intro) => {
145+
"\n\nAdditional documentation can be found in manual of the OS:\n\n"
146+
};
147+
// List for Unix-like OSs.
148+
(__ unix $syscall: tt ( $section: tt ) ) => {
149+
concat!(
150+
" * DragonFly BSD: <https://man.dragonflybsd.org/?command=", stringify!($syscall), "&section=", stringify!($section), ">\n",
151+
" * FreeBSD: <https://www.freebsd.org/cgi/man.cgi?query=", stringify!($syscall), "&sektion=", stringify!($section), ">\n",
152+
" * Linux: <https://man7.org/linux/man-pages/man", stringify!($section), "/", stringify!($syscall), ".", stringify!($section), ".html>\n",
153+
" * macOS: <https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/", stringify!($syscall), ".", stringify!($section), ".html> (archived, actually for iOS)\n",
154+
" * NetBSD: <https://man.netbsd.org/", stringify!($syscall), ".", stringify!($section), ">\n",
155+
" * OpenBSD: <https://man.openbsd.org/", stringify!($syscall), ".", stringify!($section), ">\n",
156+
" * iOS: <https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/", stringify!($syscall), ".", stringify!($section), ".html> (archived)\n",
157+
" * illumos: <https://illumos.org/man/3SOCKET/", stringify!($syscall), ">\n",
158+
)
159+
};
160+
// List for Window (so just Windows).
161+
(__ windows $syscall: tt ( $section: tt ) ) => {
162+
concat!(
163+
" * Windows: <https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-", stringify!($syscall), ">\n",
164+
)
165+
};
166+
}
167+
118168
mod sockaddr;
119169
mod socket;
120170
mod sockref;

src/socket.rs

+23
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ impl Socket {
124124
/// the socket is made non-inheritable.
125125
///
126126
/// [`Socket::new_raw`] can be used if you don't want these flags to be set.
127+
#[doc = man_links!(socket(2))]
127128
pub fn new(domain: Domain, ty: Type, protocol: Option<Protocol>) -> io::Result<Socket> {
128129
let ty = set_common_type(ty);
129130
Socket::new_raw(domain, ty, protocol).and_then(set_common_flags)
@@ -144,6 +145,7 @@ impl Socket {
144145
///
145146
/// This function sets the same flags as in done for [`Socket::new`],
146147
/// [`Socket::pair_raw`] can be used if you don't want to set those flags.
148+
#[doc = man_links!(unix: socketpair(2))]
147149
#[cfg(any(doc, all(feature = "all", unix)))]
148150
#[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))]
149151
pub fn pair(
@@ -177,6 +179,7 @@ impl Socket {
177179
///
178180
/// This function directly corresponds to the `bind(2)` function on Windows
179181
/// and Unix.
182+
#[doc = man_links!(bind(2))]
180183
pub fn bind(&self, address: &SockAddr) -> io::Result<()> {
181184
sys::bind(self.as_raw(), address)
182185
}
@@ -188,6 +191,7 @@ impl Socket {
188191
///
189192
/// An error will be returned if `listen` or `connect` has already been
190193
/// called on this builder.
194+
#[doc = man_links!(connect(2))]
191195
///
192196
/// # Notes
193197
///
@@ -242,6 +246,7 @@ impl Socket {
242246
///
243247
/// An error will be returned if `listen` or `connect` has already been
244248
/// called on this builder.
249+
#[doc = man_links!(listen(2))]
245250
pub fn listen(&self, backlog: c_int) -> io::Result<()> {
246251
sys::listen(self.as_raw(), backlog)
247252
}
@@ -253,6 +258,7 @@ impl Socket {
253258
///
254259
/// This function sets the same flags as in done for [`Socket::new`],
255260
/// [`Socket::accept_raw`] can be used if you don't want to set those flags.
261+
#[doc = man_links!(accept(2))]
256262
pub fn accept(&self) -> io::Result<(Socket, SockAddr)> {
257263
// Use `accept4` on platforms that support it.
258264
#[cfg(any(
@@ -299,6 +305,10 @@ impl Socket {
299305

300306
/// Returns the socket address of the local half of this socket.
301307
///
308+
/// This function directly corresponds to the `getsockname(2)` function on
309+
/// Windows and Unix.
310+
#[doc = man_links!(getsockname(2))]
311+
///
302312
/// # Notes
303313
///
304314
/// Depending on the OS this may return an error if the socket is not
@@ -311,6 +321,10 @@ impl Socket {
311321

312322
/// Returns the socket address of the remote peer of this socket.
313323
///
324+
/// This function directly corresponds to the `getpeername(2)` function on
325+
/// Windows and Unix.
326+
#[doc = man_links!(getpeername(2))]
327+
///
314328
/// # Notes
315329
///
316330
/// This returns an error if the socket is not [`connect`ed].
@@ -359,6 +373,7 @@ impl Socket {
359373
///
360374
/// This function will cause all pending and future I/O on the specified
361375
/// portions to return immediately with an appropriate value.
376+
#[doc = man_links!(shutdown(2))]
362377
pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
363378
sys::shutdown(self.as_raw(), how)
364379
}
@@ -368,6 +383,7 @@ impl Socket {
368383
///
369384
/// The [`connect`] method will connect this socket to a remote address.
370385
/// This method might fail if the socket is not connected.
386+
#[doc = man_links!(recv(2))]
371387
///
372388
/// [`connect`]: Socket::connect
373389
///
@@ -419,6 +435,7 @@ impl Socket {
419435
/// In addition to the number of bytes read, this function returns the flags
420436
/// for the received message. See [`RecvFlags`] for more information about
421437
/// the returned flags.
438+
#[doc = man_links!(recvmsg(2))]
422439
///
423440
/// [`recv`]: Socket::recv
424441
/// [`connect`]: Socket::connect
@@ -484,6 +501,7 @@ impl Socket {
484501

485502
/// Receives data from the socket. On success, returns the number of bytes
486503
/// read and the address from whence the data came.
504+
#[doc = man_links!(recvfrom(2))]
487505
///
488506
/// # Safety
489507
///
@@ -510,6 +528,7 @@ impl Socket {
510528
/// Receives data from the socket. Returns the amount of bytes read, the
511529
/// [`RecvFlags`] and the remote address from the data is coming. Unlike
512530
/// [`recv_from`] this allows passing multiple buffers.
531+
#[doc = man_links!(recvmsg(2))]
513532
///
514533
/// [`recv_from`]: Socket::recv_from
515534
///
@@ -573,6 +592,7 @@ impl Socket {
573592
/// been connected.
574593
///
575594
/// On success returns the number of bytes that were sent.
595+
#[doc = man_links!(send(2))]
576596
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
577597
self.send_with_flags(buf, 0)
578598
}
@@ -594,6 +614,7 @@ impl Socket {
594614

595615
/// Identical to [`send_vectored`] but allows for specification of arbitrary
596616
/// flags to the underlying `sendmsg`/`WSASend` call.
617+
#[doc = man_links!(sendmsg(2))]
597618
///
598619
/// [`send_vectored`]: Socket::send_vectored
599620
#[cfg(not(target_os = "redox"))]
@@ -621,6 +642,7 @@ impl Socket {
621642
/// number of bytes written.
622643
///
623644
/// This is typically used on UDP or datagram-oriented sockets.
645+
#[doc = man_links!(sendto(2))]
624646
pub fn send_to(&self, buf: &[u8], addr: &SockAddr) -> io::Result<usize> {
625647
self.send_to_with_flags(buf, addr, 0)
626648
}
@@ -640,6 +662,7 @@ impl Socket {
640662

641663
/// Send data to a peer listening on `addr`. Returns the amount of bytes
642664
/// written.
665+
#[doc = man_links!(sendmsg(2))]
643666
#[cfg(not(target_os = "redox"))]
644667
#[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))]
645668
pub fn send_to_vectored(&self, bufs: &[IoSlice<'_>], addr: &SockAddr) -> io::Result<usize> {

src/sys/unix.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,7 @@ impl crate::Socket {
10531053
/// This function will block the calling thread until a new connection is
10541054
/// established. When established, the corresponding `Socket` and the remote
10551055
/// peer's address will be returned.
1056+
#[doc = man_links!(unix: accept4(2))]
10561057
#[cfg(all(
10571058
feature = "all",
10581059
any(
@@ -1806,6 +1807,7 @@ impl crate::Socket {
18061807
/// Different OSs support different kinds of `file`s, see the OS
18071808
/// documentation for what kind of files are supported. Generally *regular*
18081809
/// files are supported by all OSs.
1810+
#[doc = man_links!(unix: sendfile(2))]
18091811
///
18101812
/// The `offset` is the absolute offset into the `file` to use as starting
18111813
/// point.

0 commit comments

Comments
 (0)