version 1.46, 2020/05/03 16:11:06 |
version 1.47, 2020/05/03 16:32:16 |
Line 577 static pid_t ppid; |
|
Line 577 static pid_t ppid; |
|
static ssize_t rcvcnt, rcvstate; |
static ssize_t rcvcnt, rcvstate; |
static char rcvbuf[8 * 1024]; |
static char rcvbuf[8 * 1024]; |
|
|
|
static int |
|
recvx(int fd, void *buf, size_t len, int flags, int *msgflags) |
|
{ |
|
struct msghdr msg; |
|
struct iovec iov; |
|
int error; |
|
|
|
memset(&msg, 0, sizeof(msg)); |
|
msg.msg_iov = &iov; |
|
iov.iov_base = buf; |
|
iov.iov_len = len; |
|
error = recvmsg(fd, &msg, flags); |
|
if (error) |
|
return error; |
|
*msgflags = msg.msg_flags; |
|
return 0; |
|
} |
|
|
static void |
static void |
oob(int signo) |
oob(int signo) |
{ |
{ |
struct termios tty; |
struct termios tty; |
int atmark; |
int atmark = 0; |
ssize_t n, rcvd; |
ssize_t n, rcvd; |
char waste[BUFSIZ], mark; |
char waste[BUFSIZ], mark; |
|
|
rcvd = 0; |
rcvd = 0; |
while (recv(rem, &mark, 1, MSG_OOB) == -1) { |
while (recvx(rem, &mark, 1, MSG_OOB, &atmark) == -1) { |
switch (errno) { |
switch (errno) { |
case EWOULDBLOCK: |
case EWOULDBLOCK: |
/* |
/* |
|
|
return; |
return; |
} |
} |
} |
} |
|
atmark &= MSG_OOB; |
if (mark & TIOCPKT_WINDOW) { |
if (mark & TIOCPKT_WINDOW) { |
/* Let server know about window size changes */ |
/* Let server know about window size changes */ |
(void)kill(ppid, SIGUSR1); |
(void)kill(ppid, SIGUSR1); |
|
|
} |
} |
if (mark & TIOCPKT_FLUSHWRITE) { |
if (mark & TIOCPKT_FLUSHWRITE) { |
(void)tcflush(1, TCIOFLUSH); |
(void)tcflush(1, TCIOFLUSH); |
for (;;) { |
if (!atmark) |
if (ioctl(rem, SIOCATMARK, &atmark) < 0) { |
|
warn("ioctl SIOCATMARK (ignored)"); |
|
break; |
|
} |
|
if (atmark) |
|
break; |
|
n = read(rem, waste, sizeof (waste)); |
n = read(rem, waste, sizeof (waste)); |
if (n <= 0) |
|
break; |
|
} |
|
/* |
/* |
* Don't want any pending data to be output, so clear the recv |
* Don't want any pending data to be output, so clear the recv |
* buffer. If we were hanging on a write when interrupted, |
* buffer. If we were hanging on a write when interrupted, |