130 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * mcat.c
 | |
|  * Same thing as cat /dev/fd0 or cat file >/dev/fd0
 | |
|  * Something, that isn't possible with floppyd anymore.
 | |
|  */
 | |
| 
 | |
| #include "sysincludes.h"
 | |
| #include "msdos.h"
 | |
| #include "mtools.h"
 | |
| #include "mainloop.h"
 | |
| #include "fsP.h"
 | |
| #include "xdf_io.h"
 | |
| #include "floppyd_io.h"
 | |
| #include "plain_io.h"
 | |
| 
 | |
| void usage(void) 
 | |
| {
 | |
| 	fprintf(stderr, "Mtools version %s, dated %s\n", 
 | |
| 		mversion, mdate);
 | |
| 	fprintf(stderr, "Usage: mcat [-w] device\n");
 | |
| 	fprintf(stderr, "       -w write on device else read\n");
 | |
| 	exit(1);
 | |
| }
 | |
| 
 | |
| #define BUF_SIZE 16000
 | |
| 
 | |
| void mcat(int argc, char **argv, int type)
 | |
| {
 | |
| 	struct device *dev;
 | |
| 	struct device out_dev;
 | |
| 	char *drive, name[EXPAND_BUF];
 | |
|         char errmsg[200];
 | |
|         Stream_t *Stream;
 | |
| 	char buf[BUF_SIZE];
 | |
| 
 | |
| 	mt_off_t address = 0;
 | |
| 
 | |
| 	char mode = O_RDONLY;
 | |
| 	int optindex = 1;
 | |
| 	size_t len;
 | |
| 
 | |
| 	noPrivileges = 1;
 | |
| 
 | |
| 	if (argc < 2) {
 | |
| 		usage();
 | |
| 	}
 | |
| 
 | |
| 	if (argv[1][0] == '-') {
 | |
| 		if (argv[1][1] != 'w') {
 | |
| 			usage();
 | |
| 		}
 | |
| 		mode = O_WRONLY;
 | |
| 		optindex++;
 | |
| 	}
 | |
| 
 | |
| 	if (argc - optindex < 1)
 | |
| 		usage();
 | |
| 
 | |
| 
 | |
| 	if (skip_drive(argv[optindex]) == argv[optindex])
 | |
| 		usage();
 | |
| 
 | |
|         drive = get_drive(argv[optindex], NULL);
 | |
| 
 | |
|         /* check out a drive whose letter and parameters match */       
 | |
|         sprintf(errmsg, "Drive '%s:' not supported", drive);    
 | |
|         Stream = NULL;
 | |
|         for (dev=devices; dev->name; dev++) {
 | |
|                 FREE(&Stream);
 | |
|                 if (strcmp(dev->drive, drive) != 0)
 | |
|                         continue;
 | |
|                 out_dev = *dev;
 | |
|                 expand(dev->name,name);
 | |
| #ifdef USING_NEW_VOLD
 | |
|                 strcpy(name, getVoldName(dev, name));
 | |
| #endif
 | |
| 
 | |
|                 Stream = 0;
 | |
| #ifdef USE_XDF
 | |
|                 Stream = XdfOpen(&out_dev, name, mode, errmsg, 0);
 | |
| 				if(Stream)
 | |
|                         out_dev.use_2m = 0x7f;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifdef USE_FLOPPYD
 | |
|                 if(!Stream)
 | |
|                         Stream = FloppydOpen(&out_dev, dev, name, 
 | |
| 					     mode, errmsg, 0, 1);
 | |
| #endif
 | |
| 
 | |
| 
 | |
|                 if (!Stream)
 | |
|                         Stream = SimpleFileOpen(&out_dev, dev, name, mode,
 | |
| 						errmsg, 0, 1, 0);
 | |
| 
 | |
|                 if( !Stream)
 | |
|                         continue;
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         /* print error msg if needed */ 
 | |
|         if ( dev->drive == 0 ){
 | |
|                 FREE(&Stream);
 | |
|                 fprintf(stderr,"%s\n",errmsg);
 | |
|                 exit(1);
 | |
|         }
 | |
| 
 | |
| 	if (mode == O_WRONLY) {
 | |
| 		while ((len = fread(buf, 1, BUF_SIZE, stdin)) 
 | |
| 		       == BUF_SIZE) {
 | |
| 			WRITES(Stream, buf, address, BUF_SIZE);
 | |
| 			address += BUF_SIZE;
 | |
| 		}
 | |
| 		if (len)
 | |
| 			WRITES(Stream, buf, address, len);
 | |
| 	} else {
 | |
| 		while ((len = READS(Stream, buf, address, BUF_SIZE)) 
 | |
| 		       == BUF_SIZE) {
 | |
| 			fwrite(buf, 1, BUF_SIZE, stdout);
 | |
| 			address += BUF_SIZE;
 | |
| 		}
 | |
| 		if (len)
 | |
| 			fwrite(buf, 1, len, stdout);
 | |
| 	}
 | |
| 
 | |
| 	FREE(&Stream);
 | |
| 	exit(0);
 | |
| }
 | 
