147 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 
 | |
|  * ioctl.c for mdb -- decode an IOCTL system call
 | |
|  */
 | |
| #include "mdb.h"
 | |
| #ifdef SYSCALLS_SUPPORT
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <fcntl.h>
 | |
| #include <sys/stat.h>
 | |
| #include <minix/type.h>
 | |
| #include <minix/callnr.h>
 | |
| #include <minix/com.h>
 | |
| #include <sys/ioctl.h>
 | |
| #include <sgtty.h>
 | |
| #include "proto.h"
 | |
| 
 | |
| PRIVATE int get_request;
 | |
| 
 | |
| PRIVATE char *rnames[] = {
 | |
| 	"TIOCGETP",  
 | |
| 	"TIOCSETP",
 | |
| 	"TIOCGETC",
 | |
| 	"TIOCSETC"
 | |
| };
 | |
| 
 | |
| #define GETPNAME	0
 | |
| #define SETPNAME	1
 | |
| #define GETCNAME	2
 | |
| #define SETCNAME	3
 | |
| 
 | |
| /* 
 | |
|  * decode ioctl call
 | |
|  * send or receive = 'R' or 'S'
 | |
|  */
 | |
| void decode_ioctl(sr, m)
 | |
| int sr;
 | |
| message *m;
 | |
| {
 | |
| int rq;
 | |
| int request, device;
 | |
| int high;
 | |
| long spek, flags;
 | |
| int ispeed, ospeed, speed, erase, kill;
 | |
| int t_intrc, t_quitc, t_startc, t_stopc, t_brk, t_eof;
 | |
| 
 | |
|    device  = m->m2_i1;
 | |
|    request = m->m2_i3;
 | |
|    spek    = m->m2_l1;
 | |
|    flags   = m->m2_l2;
 | |
| 
 | |
| #ifdef DEBUG
 | |
|    if( debug )
 | |
|    Printf("%c device=%d request=%c|%d m2_l1=%lx m2_l2=%lx\n",
 | |
| 	sr,device,
 | |
| 	(request >> 8) & BYTE,
 | |
| 	request & BYTE,
 | |
| 	spek,flags);
 | |
| #endif 
 | |
| 
 | |
|    if ( sr == 'R') request = get_request;
 | |
| 
 | |
|    switch(request) {
 | |
|      case TIOCGETP:
 | |
|      case TIOCSETP:
 | |
| 	rq = (request == TIOCGETP) ? GETPNAME : SETPNAME;
 | |
| 	if (sr == 'S') {
 | |
| 		get_request = request;
 | |
| 		Printf( "Sending %s ",rnames[rq] );
 | |
| 		if ( request == TIOCGETP ) break;
 | |
| 	}
 | |
| 		
 | |
| 	if ( (sr == 'R') && (request == TIOCSETP) ) break;
 | |
| 
 | |
| 	erase = (spek >> 8) & BYTE;
 | |
| 	kill  = spek & BYTE;
 | |
|   	flags = flags & 0xFFFF;
 | |
| 	speed = (spek >> 16) & 0xFFFFL;
 | |
| 	ispeed = speed & BYTE;
 | |
| 	ospeed = (speed >> 8) & BYTE;
 | |
| 	Printf("%s erase=%d kill=%d speed=%d/%d flags=%lx ",
 | |
| 		rnames[rq], erase, kill, ispeed, ospeed, flags);
 | |
| 	break;
 | |
| 
 | |
|      case TIOCGETC:
 | |
|      case TIOCSETC:
 | |
| 	rq = (request == TIOCGETC) ? GETCNAME : SETCNAME;
 | |
| 	if (sr == 'S') {
 | |
| 		get_request = request;
 | |
| 		Printf( "Sending %s ",rnames[rq] );
 | |
| 		if ( request == TIOCGETC ) break;
 | |
| 	}
 | |
| 
 | |
| 	if ( (sr == 'R') && (request == TIOCSETC) ) break;
 | |
| 
 | |
|   	t_intrc  = (spek >> 24) & BYTE;
 | |
|   	t_quitc  = (spek >> 16) & BYTE;
 | |
|   	t_startc = (spek >>  8) & BYTE;
 | |
|   	t_stopc  = (spek >>  0) & BYTE;
 | |
| 	t_brk    = flags & BYTE;
 | |
| 	t_eof    = (flags >> 8 ) & BYTE;
 | |
| 	Printf("%s int %d quit %d start %d stop %d brk %d eof %d\n",
 | |
| 		rnames[rq],
 | |
| 		t_intrc, t_quitc, t_startc, t_stopc, t_brk, t_eof);
 | |
| 	break;
 | |
| 
 | |
|      default:
 | |
| 
 | |
| #ifdef	__i86	/* 16 bit */	
 | |
| 	if ( sr == 'S' ) {
 | |
| 		Printf("Sending ");
 | |
| 		get_request = request;
 | |
| 	}
 | |
| 	else
 | |
| 		Printf("Receiving ");
 | |
| 	
 | |
| 	Printf("Other IOCTL device=%d request=%c|%d\n",
 | |
| 		device, (request >> 8) & BYTE, request & BYTE );
 | |
| 
 | |
| 	break;
 | |
| #endif
 | |
| 
 | |
| #ifdef	__i386	      /* 32 bit encoding */
 | |
| 	if ( sr == 'S' ) {
 | |
| 		Printf("Sending (%lx) ",   request);
 | |
| 		get_request = request;
 | |
| 	}
 | |
| 	else
 | |
| 		Printf("Receiving (%lx) ", request);
 | |
| 	
 | |
| 	high = ( request & 0xFFFF0000 ) >> 16 ;
 | |
| 	request &= _IOCTYPE_MASK;
 | |
| 
 | |
| 	Printf("Other IOCTL device=%d request=%c|%d flags=%x size =%d\n",
 | |
| 		device, (request >> 8) & BYTE, request & BYTE,
 | |
| 		(high  &  ~_IOCPARM_MASK ),
 | |
| 		(high  &   _IOCPARM_MASK )
 | |
| 		);
 | |
| 	break;
 | |
| #endif
 | |
|      }	
 | |
|      Printf("\n");
 | |
| }
 | |
| 
 | |
| 
 | |
| #endif /* SYSCALLS_SUPPORT */
 | 
