/* * pure-loop.c : communication loop for PURE network service. * * $Id: pure-loop.c,v 1.1 2000/12/30 16:31:42 simm Exp $ */ #include "pure.h" #define MINE (0) #define BUFSIZE (1024) static int pure_loop_inner( int send, int recv, fd_set* pfds ) { int len, count, result; char* pt; static char buf[BUFSIZE]; result = 1; if ( FD_ISSET( send, pfds ) ) { if ( ( result = read( send, buf, BUFSIZE ) ) > 0 ) { for ( len = result, pt = buf ; len > 0 ; pt += count, len -= count ) if ( ( count = write( recv, pt, len ) ) < 0 ) return -1; ++result; } } return result; } int pure_loop( net_peer* peer ) { fd_set fds; int result; for (;;) { FD_ZERO( &fds ); FD_SET( MINE, &fds ); FD_SET( peer->handle, &fds ); if ( select( FD_SETSIZE, &fds, NULL, NULL, NULL ) == -1 ) continue; if ( ( result = pure_loop_inner( MINE, peer->handle, &fds ) ) <= 0 ) break; if ( ( result = pure_loop_inner( peer->handle, MINE, &fds ) ) <= 0 ) break; } close( MINE ); close( peer->handle ); return result ? 1 : 0; }