Skip to content

Commit 9638d0d

Browse files
committed
Rename solaris dir to solarish to indicate it's including both Solaris
and Solaris-derived distributions (i.e. illumos). In addition, a number of missing definitions (and compatability functions) that have been found necessary to run a number of rust binaries on illumos have been added. Portions were contributed by Mike Zeller <[email protected]>
1 parent ff97bdb commit 9638d0d

File tree

3 files changed

+361
-23
lines changed

3 files changed

+361
-23
lines changed

src/unix/mod.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,10 @@ cfg_if! {
349349
// to "pthread" needs to be added.
350350
#[link(name = "pthread")]
351351
extern {}
352+
} else if #[cfg(target_env = "illumos")] {
353+
#[link(name = "c")]
354+
#[link(name = "m")]
355+
extern {}
352356
} else {
353357
#[link(name = "c")]
354358
#[link(name = "m")]
@@ -519,13 +523,16 @@ extern {
519523
pub fn putchar_unlocked(c: ::c_int) -> ::c_int;
520524

521525
#[cfg_attr(target_os = "netbsd", link_name = "__socket30")]
526+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_socket")]
522527
pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int;
523528
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
524529
link_name = "connect$UNIX2003")]
530+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_connect")]
525531
pub fn connect(socket: ::c_int, address: *const sockaddr,
526532
len: socklen_t) -> ::c_int;
527533
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
528534
link_name = "listen$UNIX2003")]
535+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_listen")]
529536
pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int;
530537
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
531538
link_name = "accept$UNIX2003")]
@@ -544,10 +551,12 @@ extern {
544551
option_len: socklen_t) -> ::c_int;
545552
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
546553
link_name = "socketpair$UNIX2003")]
554+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_socketpair")]
547555
pub fn socketpair(domain: ::c_int, type_: ::c_int, protocol: ::c_int,
548556
socket_vector: *mut ::c_int) -> ::c_int;
549557
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
550558
link_name = "sendto$UNIX2003")]
559+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_sendto")]
551560
pub fn sendto(socket: ::c_int, buf: *const ::c_void, len: ::size_t,
552561
flags: ::c_int, addr: *const sockaddr,
553562
addrlen: socklen_t) -> ::ssize_t;
@@ -607,7 +616,8 @@ extern {
607616
pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent;
608617
#[cfg_attr(target_os = "macos", link_name = "readdir_r$INODE64")]
609618
#[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")]
610-
#[cfg_attr(target_os = "solaris", link_name = "__posix_readdir_r")]
619+
#[cfg_attr(any(target_os = "solaris", target_os = "illumos"),
620+
link_name = "__posix_readdir_r")]
611621
#[cfg_attr(target_os = "freebsd", link_name = "readdir_r@FBSD_1.0")]
612622
pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent,
613623
result: *mut *mut ::dirent) -> ::c_int;
@@ -916,6 +926,7 @@ extern {
916926
pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
917927
buflen: ::size_t) -> ::c_int;
918928

929+
#[cfg_attr(target_os = "illumos", link_name = "__xnet_getsockopt")]
919930
pub fn getsockopt(sockfd: ::c_int,
920931
level: ::c_int,
921932
optname: ::c_int,
@@ -1080,9 +1091,11 @@ extern {
10801091
pub fn tcdrain(fd: ::c_int) -> ::c_int;
10811092
pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t;
10821093
pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t;
1094+
#[cfg(not(any(target_os = "solaris", target_os = "illumos")))]
10831095
pub fn cfmakeraw(termios: *mut ::termios);
10841096
pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
10851097
pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
1098+
#[cfg(not(any(target_os = "solaris", target_os = "illumos")))]
10861099
pub fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
10871100
pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int;
10881101
pub fn tcsetattr(fd: ::c_int,
@@ -1137,9 +1150,10 @@ cfg_if! {
11371150
target_os = "bitrig"))] {
11381151
mod bsd;
11391152
pub use self::bsd::*;
1140-
} else if #[cfg(target_os = "solaris")] {
1141-
mod solaris;
1142-
pub use self::solaris::*;
1153+
} else if #[cfg(any(target_os = "solaris",
1154+
target_os = "illumos"))] {
1155+
mod solarish;
1156+
pub use self::solarish::*;
11431157
} else if #[cfg(target_os = "haiku")] {
11441158
mod haiku;
11451159
pub use self::haiku::*;

src/unix/solarish/compat.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Common functions that are unfortunately missing on illumos and
2+
// Solaris, but often needed by other crates.
3+
4+
use unix::solarish::*;
5+
6+
pub unsafe fn cfmakeraw(termios: *mut ::termios) {
7+
let mut t = *termios as ::termios;
8+
t.c_iflag &= !(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
9+
t.c_oflag &= !OPOST;
10+
t.c_lflag &= !(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
11+
t.c_cflag &= !(CSIZE|PARENB);
12+
t.c_cflag |= CS8;
13+
}
14+
15+
pub unsafe fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int {
16+
// Neither of these functions on illumos or Solaris actually ever
17+
// return an error
18+
::cfsetispeed(termios, speed);
19+
::cfsetospeed(termios, speed);
20+
0
21+
}

0 commit comments

Comments
 (0)