minix/commands/mdb/ioctl.c
Ben Gras 5e3b213f05 import of mdb (minix debugger), some ptrace and signals unbreaking
seem to have made it work (runtime debugging and core reading).
2005-08-04 08:44:16 +00:00

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