如何修复socat在MacO上正常工作?

时间:2019-10-04 11:46:58

标签: c macos termios socat

我已经在MacOs Mojave上尝试了socat的Homebrew版本,并且在与以下命令一起运行时无法正常工作:

socat STDIO,raw TCP:localhost:40707

出现错误:

tcsetattr(7, TCSADRAIN, 0x10457ad30): Device not configured

在没有raw的情况下,它可以正常工作,但是我想要原始,因为我希望能够在socat连接到的外壳内操纵文本对话框。

因此,我下载了socat的1.7.3.3版本的源代码,经过一小段破解后便对其进行了编译。我的本地编译版本也存在同样的问题。查看socat的来源,它在xio-termios.c中:

int xiotermios_flush(int fd) {
    if (_xiotermios_doit) {
        if (Tcsetattr(fd, TCSADRAIN, &_xiotermios_data.termarg) < 0) {
            Error3("tcsetattr(%d, TCSADRAIN, %p): %s",
                fd, &_xiotermios_data.termarg, strerror(errno));
            return -1;
        }
        _xiotermios_doit = false;
    }
    return 0;
}

我认为tcsetattr在Mac上的工作方式略有不同,因为相同的代码在Linux上可以正常工作。谁能帮我解决这个问题?

更新:我决定尝试创建一个运行socat的docker容器作为解决方法。

FROM alpine:3.10.2
RUN apk add --no-cache socat
ENTRYPOINT ["socat"]

然后我用以下命令运行容器:

docker run --rm -ti socat STDIO,raw TCP:host.docker.internal:40707

不幸的是,这也不起作用,只是给了我

tcsetattr(5, TCSADRAIN, 0x55aadeb42b40): Not a tty

尽管如此,它似乎在没有raw的情况下仍然有效。

1 个答案:

答案 0 :(得分:0)

回到以前的Socat版本1.7.3.2并使其正常运行,因此Mac(1.7.3.3)上的最新socat似乎出了点问题。