version 1.20, 2001/02/21 09:12:56 |
version 1.21, 2001/03/03 21:40:30 |
|
|
int |
int |
main(int ac, char **av) |
main(int ac, char **av) |
{ |
{ |
fd_set rset, wset; |
fd_set *rset, *wset; |
int in, out, max; |
int in, out, max; |
ssize_t len, olen; |
ssize_t len, olen, set_size; |
|
|
handle_init(); |
handle_init(); |
|
|
|
|
buffer_init(&iqueue); |
buffer_init(&iqueue); |
buffer_init(&oqueue); |
buffer_init(&oqueue); |
|
|
|
set_size = howmany(max + 1, NFDBITS) * sizeof(fd_mask); |
|
rset = (fd_set *)xmalloc(set_size); |
|
wset = (fd_set *)xmalloc(set_size); |
|
|
for (;;) { |
for (;;) { |
FD_ZERO(&rset); |
memset(rset, 0, set_size); |
FD_ZERO(&wset); |
memset(wset, 0, set_size); |
|
|
FD_SET(in, &rset); |
FD_SET(in, rset); |
olen = buffer_len(&oqueue); |
olen = buffer_len(&oqueue); |
if (olen > 0) |
if (olen > 0) |
FD_SET(out, &wset); |
FD_SET(out, wset); |
|
|
if (select(max+1, &rset, &wset, NULL, NULL) < 0) { |
if (select(max+1, rset, wset, NULL, NULL) < 0) { |
if (errno == EINTR) |
if (errno == EINTR) |
continue; |
continue; |
exit(2); |
exit(2); |
} |
} |
|
|
/* copy stdin to iqueue */ |
/* copy stdin to iqueue */ |
if (FD_ISSET(in, &rset)) { |
if (FD_ISSET(in, rset)) { |
char buf[4*4096]; |
char buf[4*4096]; |
len = read(in, buf, sizeof buf); |
len = read(in, buf, sizeof buf); |
if (len == 0) { |
if (len == 0) { |
|
|
} |
} |
} |
} |
/* send oqueue to stdout */ |
/* send oqueue to stdout */ |
if (FD_ISSET(out, &wset)) { |
if (FD_ISSET(out, wset)) { |
len = write(out, buffer_ptr(&oqueue), olen); |
len = write(out, buffer_ptr(&oqueue), olen); |
if (len < 0) { |
if (len < 0) { |
error("write error"); |
error("write error"); |