/*
 * pure-getfile.c : file getting routine for PURE network service.
 *
 * $Id: pure-getfile.c,v 1.1 2000/12/30 16:31:42 simm Exp $
 */

#include "pure.h"
#define BUFSIZE (4096)
#define OPEN_MODE ( O_WRONLY | O_BINARY | O_CREAT )

#define pure_new_getfile( file ) \
	((((file)->handle = open((file)->name, OPEN_MODE|O_TRUNC, 0600 )) < 0 ) ? -1 : 0 )

#define pure_append_getfile( file ) \
	((((file)->handle = open((file)->name, OPEN_MODE, 0600 )) < 0 ) ? -1 : 0 )

int pure_open_getfile( dcc_file* file, char* arg )
{
	int result = 0;

	file->offset = 0;
	if ( !arg )
		result = pure_new_getfile( file );
	else if ( arg[0] == '0' || arg[0] == 'n' || arg[0] == 'N' )
		result = pure_new_getfile( file );
	else if ( pure_append_getfile( file ) )
		result = -1;
	else
		file->offset = lseek( file->handle, 0, SEEK_END );

	return result;
}

int pure_getfile( dcc_file* file, net_peer* peer )
{
	int len, old, new;
	u_long report;
	char buf[BUFSIZE];

	old = -1;
	while ( file->offset < file->size ) {
		if ( ( len = read( peer->handle, buf, BUFSIZE ) ) < 0 )
			return -1;
		write( file->handle, buf, len );
		file->offset += len;
		report = htonl(file->offset);
		write( peer->handle, &report, sizeof(u_long) );
		new = 100 * file->offset / file->size;
		if ( old / 10 < new / 10 ) {
			printf( "[REPORT] %d %d %d\n", new, file->offset, file->size );
			old = new;
		}
	}
	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1