Skip to content

Commit

Permalink
Fix the openpty tests for FreeBSD 12.
Browse files Browse the repository at this point in the history
  • Loading branch information
sunfishcode committed Jul 2, 2023
1 parent 917f4e4 commit ef32e32
Showing 1 changed file with 22 additions and 18 deletions.
40 changes: 22 additions & 18 deletions tests/pty/openpty.rs
Original file line number Diff line number Diff line change
@@ -1,72 +1,76 @@
use rustix::fs::{openat, Mode, OFlags, CWD};
use rustix::pty::*;
use std::fs::File;
use std::io;
use std::io::{Read, Write};

#[test]
fn openpty_basic() -> io::Result<()> {
fn openpty_basic() {
// Use `CLOEXEC` if we can.
#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "netbsd"))]
let flags = OpenptFlags::RDWR | OpenptFlags::NOCTTY | OpenptFlags::CLOEXEC;
#[cfg(not(any(linux_kernel, target_os = "freebsd", target_os = "netbsd")))]
let flags = OpenptFlags::RDWR | OpenptFlags::NOCTTY;

let controller = openpt(flags)?;
let controller = openpt(flags).unwrap();

grantpt(&controller)?;
unlockpt(&controller)?;
grantpt(&controller).unwrap();
unlockpt(&controller).unwrap();

let name = ptsname(&controller, Vec::new())?;
let name = match ptsname(&controller, Vec::new()) {
Ok(name) => name,
#[cfg(target_os = "freebsd")]
Err(rustix::io::Errno::NOSYS) => return, // FreeBSD 12 doesn't support this
Err(err) => Err(err).unwrap(),
};
let user = openat(
CWD,
name,
OFlags::RDWR | OFlags::NOCTTY | OFlags::CLOEXEC,
Mode::empty(),
)?;
)
.unwrap();

let mut controller = File::from(controller);
let mut user = File::from(user);

// The '\x04' is Ctrl-D, the default EOF control code.
controller.write_all(b"Hello, world!\n\x04")?;
controller.write_all(b"Hello, world!\n\x04").unwrap();

let mut s = String::new();
user.read_to_string(&mut s)?;
user.read_to_string(&mut s).unwrap();

assert_eq!(s, "Hello, world!\n");
Ok(())
}

// Like `openpty_basic` but use `ioctl_tiocgptpeer` instead of `ptsname`.
#[cfg(target_os = "linux")]
#[test]
fn openpty_get_peer() -> io::Result<()> {
fn openpty_get_peer() {
// Use `CLOEXEC` if we can.
#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "netbsd"))]
let flags = OpenptFlags::RDWR | OpenptFlags::NOCTTY | OpenptFlags::CLOEXEC;
#[cfg(not(any(linux_kernel, target_os = "freebsd", target_os = "netbsd")))]
let flags = OpenptFlags::RDWR | OpenptFlags::NOCTTY;

let controller = openpt(flags)?;
let controller = openpt(flags).unwrap();

grantpt(&controller)?;
unlockpt(&controller)?;
grantpt(&controller).unwrap();
unlockpt(&controller).unwrap();

let user = ioctl_tiocgptpeer(
&controller,
OpenptFlags::RDWR | OpenptFlags::NOCTTY | OpenptFlags::CLOEXEC,
)?;
)
.unwrap();

let mut controller = File::from(controller);
let mut user = File::from(user);

// The '\x04' is Ctrl-D, the default EOF control code.
controller.write_all(b"Hello, world!\n\x04")?;
controller.write_all(b"Hello, world!\n\x04").unwrap();

let mut s = String::new();
user.read_to_string(&mut s)?;
user.read_to_string(&mut s).unwrap();

assert_eq!(s, "Hello, world!\n");
Ok(())
}

0 comments on commit ef32e32

Please sign in to comment.