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