version 1.51, 2002/07/01 20:12:40 |
version 1.52, 2002/07/04 04:42:25 |
|
|
void |
void |
readwrite(int nfd) |
readwrite(int nfd) |
{ |
{ |
struct pollfd *pfd; |
struct pollfd pfd[2]; |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
int wfd = fileno(stdin), n, ret; |
int wfd = fileno(stdin), n, ret; |
int lfd = fileno(stdout); |
int lfd = fileno(stdout); |
|
|
pfd = malloc(2 * sizeof(struct pollfd)); |
|
|
|
/* Setup Network FD */ |
/* Setup Network FD */ |
pfd[0].fd = nfd; |
pfd[0].fd = nfd; |
pfd[0].events = POLLIN; |
pfd[0].events = POLLIN; |
|
|
pfd[1].fd = wfd; |
pfd[1].fd = wfd; |
pfd[1].events = POLLIN; |
pfd[1].events = POLLIN; |
|
|
for (;;) { |
while (pfd[0].fd != -1 || pfd[1].fd != -1) { |
if (iflag) |
if (iflag) |
sleep(iflag); |
sleep(iflag); |
|
|
if ((n = poll(pfd, 2, timeout)) < 0) { |
if ((n = poll(pfd, 2, timeout)) < 0) { |
close(nfd); |
close(nfd); |
close(wfd); |
err(1, "Polling Error"); |
free(pfd); |
|
errx(1, "Polling Error"); |
|
} |
} |
|
|
if (n == 0) |
if (n == 0) |
return; |
return; |
|
|
if (pfd[0].revents & POLLIN) { |
if (pfd[0].revents & POLLIN) { |
if ((n = read(nfd, buf, sizeof(buf))) <= 0) { |
if ((n = read(nfd, buf, sizeof(buf))) < 0) |
return; |
return; |
|
else if (n == 0) { |
|
shutdown(nfd, SHUT_RD); |
|
pfd[0].fd = -1; |
|
pfd[0].events = 0; |
} else { |
} else { |
if (tflag) |
if (tflag) |
atelnet(nfd, buf, n); |
atelnet(nfd, buf, n); |
|
|
if (pfd[1].revents & POLLIN) { |
if (pfd[1].revents & POLLIN) { |
if ((n = read(wfd, buf, sizeof(buf))) < 0) |
if ((n = read(wfd, buf, sizeof(buf))) < 0) |
return; |
return; |
else { |
else if (n == 0) { |
|
shutdown(nfd, SHUT_WR); |
|
pfd[1].fd = -1; |
|
pfd[1].events = 0; |
|
} else { |
if((ret = atomicio(write, nfd, buf, n)) != n) |
if((ret = atomicio(write, nfd, buf, n)) != n) |
return; |
return; |
} |
} |
|
|
{ |
{ |
int i, rv, ret; |
int i, rv, ret; |
|
|
for (i=0; i <= 3; i++) { |
for (i = 0; i <= 3; i++) { |
if ((rv = write(s, "X", 1)) == 1) |
if ((rv = write(s, "X", 1)) == 1) |
ret = 1; |
ret = 1; |
else |
else |