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