#nix #shim #unix #macos #linux #pty #ptsname-r

nix-ptsname_r-shim

Nix ptsname_r 桥接器

4个版本

使用旧的Rust 2015

0.2.0 2018年9月22日
0.1.3 2017年10月16日
0.1.2 2017年10月4日
0.1.1 2017年10月4日

#702 in Unix API

MIT/Apache

11KB
78 代码行(不含注释)

Nix ptsname_r() 桥接器

Build Status

使用此桥接器的 ptsname_r() 替代 Nix 的 ptsname_r() 在 Linux 上可以使您的应用程序在 ptsname_r() 方面可移植到 macOS。此 crate 暴露的 ptsname_r() 简单地引用 Linux 上的 Nix 原始的 ptsname_r() 并在 macOS 上使用其桥接器。函数签名和行为是相同的。

用法

以下是一个如何将此桥接器用于现有程序并使用 Nix 的 ptsname_r 的示例。

之前

使用不适用于 macOS 的 Nix 的 ptsname_r()

extern crate nix;
use nix::fcntl::O_RDWR;
use nix::pty::{posix_openpt, ptsname_r};

fn main() {
    let master_fd = posix_openpt(O_RDWR).unwrap();
    let slave_name = ptsname_r(&master_fd).unwrap();
    println!("Slave Name was: {}", slave_name);
}

之后

使用 Nix ptsname_r() 桥接器的 ptsname_r(),它在 macOS 上提供等效功能,但在其他平台上回退到 Nix 的 ptsname_r()

extern crate nix;
use nix::fcntl::O_RDWR;
// Remove use of Nix's ptsname_r
use nix::pty::posix_openpt;

// Add this crate and use its ptsname_r
extern crate nix_ptsname_r_shim;
use nix_ptsname_r_shim::ptsname_r;

fn main() {
    let master_fd = posix_openpt(O_RDWR).unwrap();
    let slave_name = ptsname_r(&master_fd).unwrap();
    println!("Slave Name was: {}", slave_name);
}

背景

在 POSIX 中,ptsname() 用于由 posix_openpt 创建的文件描述符,以获取从属伪终端的名称。

不幸的是,ptsname() 通过修改全局变量来返回指向包含从属名称的修改后的变量的指针。在 Rust 的 Nix 中,这被视为不安全。它也不是线程安全的,可能在信号处理期间以及其他问题中引起问题。因此,Nix 中的实现被标记为 unsafe

作为回应,在Linux平台上,存在一个名为ptsname_r()的函数,它是ptsname()的重入式和更安全的版本,因为它将数据写入调用者提供的缓冲区。在Nix中,它分配一个缓冲区并将其包装在一个拥有的String中,以使其更安全。

遗憾的是,macOS/Darwin不包含ptsname_r()函数。作为替代,您需要使用TIOCPTYGNAME系统调用,并将主文件描述符和缓冲区指针作为参数。它几乎与ptsname_r()相同,但仍有区别。

确定这不是Nix的范畴,为确实具有该功能但底层调用不同的平台包含此类模拟器。 应将该仿真的功能移动到外部crate。

这超出了范围,但需要一个这样的模拟器,如下两个示例所示,它们已实现类似的模拟器

  • 这个示例是我找到的第一个采用这种方法。作者使用它进行我假设是在某个大型托管提供商的工作相关的事情。我不确定作者确切地用它来做什么,但作者需要ptsname_r功能。作者没有使用nix,但我可以看到作者cfg将这些类似的nix包装器门控到OS。我猜作者也希望在Linux和macOS之间保持相似的API。这个版本可能是以下参考的基础。

  • 我的另一个示例正在进行pexpect克隆。为了进行pexpect克隆,作者必须通过名称打开从属终端,他必须通过ptsname_r找到它,然后在调用exec之前将其分配到正确的描述符。与第一个参考不同,作者使用nix,但在macOS中为nix/macOS所缺乏的几乎实现了ptsname_r的polyfills。像我和前面的示例一样,作者也用类似的API为macOS填补了空白,以仿制Linux版本。

许可证

根据您选择的以下许可证之一获得许可:

供您选择。

贡献

除非您明确说明,否则您有意提交给作品并包括在内的任何贡献,根据Apache-2.0许可证的定义,应双重许可,如上所述,没有其他条款或条件。

依赖关系

~1.5MB
~36K SLoC