您可以找到 OpenSSH 源代码 in github 的副本。 packet_write_wait 函数在opacket.c:
void
packet_write_wait(void)
{
int r;
if ((r = ssh_packet_write_wait(active_state)) != 0)
sshpkt_fatal(active_state, __func__, r);
}
它调用另一个函数来写入数据包。如果失败,它会调用sshpkt_fatal。 sshpkt_fatal 在packet.c 中,它的工作是打印错误信息然后退出。
/*
* Pretty-print connection-terminating errors and exit.
*/
void
sshpkt_fatal(struct ssh *ssh, const char *tag, int r)
{
switch (r) {
case SSH_ERR_CONN_CLOSED:
logdie("Connection closed by %.200s port %d",
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
[...code removed...]
/* FALLTHROUGH */
default:
logdie("%s%sConnection %s %.200s port %d: %s",
tag != NULL ? tag : "", tag != NULL ? ": " : "",
ssh->state->server_side ? "from" : "to",
ssh_remote_ipaddr(ssh), ssh_remote_port(ssh), ssh_err(r));
}
}
您询问的消息由默认情况处理。最后一个参数,提供冒号后的文本,是通过调用ssh_err 提供的:
const char *
ssh_err(int n)
{
switch (n) {
case SSH_ERR_SUCCESS:
return "success";
case SSH_ERR_INTERNAL_ERROR:
return "unexpected internal error";
[...etc...]
您感兴趣的ssh_err 案例是这个:
case SSH_ERR_SYSTEM_ERROR:
return strerror(errno);
简而言之,“Broken pipe”消息来自标准库函数strerror,它将错误编号转换为标准错误消息。
list of standard error codes 表示“Broken pipe”与 EPIPE 错误相关。