63 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #include "sysincludes.h"
 | |
| #include "msdos.h"
 | |
| #include "mtools.h"
 | |
| #include "file.h"
 | |
| #include "llong.h"
 | |
| 
 | |
| /*
 | |
|  * Copy the data from source to target
 | |
|  */
 | |
| 
 | |
| int copyfile(Stream_t *Source, Stream_t *Target)
 | |
| {
 | |
| 	char buffer[8*16384];
 | |
| 	int pos;
 | |
| 	int ret, retw;
 | |
| 	size_t len;
 | |
| 	mt_size_t mt_len;
 | |
| 
 | |
| 	if (!Source){
 | |
| 		fprintf(stderr,"Couldn't open source file\n");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	if (!Target){
 | |
| 		fprintf(stderr,"Couldn't open target file\n");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	pos = 0;
 | |
| 	GET_DATA(Source, 0, &mt_len, 0, 0);
 | |
| 	if (mt_len & ~max_off_t_31) {
 | |
| 		fprintf(stderr, "File too big\n");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	len = truncBytes32(mt_len);
 | |
| 	while(1){
 | |
| 		ret = READS(Source, buffer, (mt_off_t) pos, 8*16384);
 | |
| 		if (ret < 0 ){
 | |
| 			perror("file read");
 | |
| 			return -1;
 | |
| 		}
 | |
| 		if(!ret)
 | |
| 			break;
 | |
| 		if(got_signal)
 | |
| 			return -1;
 | |
| 		if (ret == 0)
 | |
| 			break;
 | |
| 		if ((retw = force_write(Target, buffer, (mt_off_t) pos, ret)) != ret){
 | |
| 			if(retw < 0 )
 | |
| 				perror("write in copy");
 | |
| 			else
 | |
| 				fprintf(stderr,
 | |
| 					"Short write %d instead of %d\n", retw,
 | |
| 					ret);
 | |
| 			if(errno == ENOSPC)
 | |
| 				got_signal = 1;
 | |
| 			return ret;
 | |
| 		}
 | |
| 		pos += ret;
 | |
| 	}
 | |
| 	return pos;
 | |
| }
 | 
