/*
* 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;
}
syntax highlighted by Code2HTML, v. 0.9.1