/*
 * 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