78 lines
2.1 KiB
C
78 lines
2.1 KiB
C
|
#include <lib.h>
|
||
|
#include <minix/com.h>
|
||
|
#define ioctl _ioctl
|
||
|
#include <sgtty.h>
|
||
|
|
||
|
PUBLIC int ioctl(fd, request, argp)
|
||
|
int fd;
|
||
|
int request;
|
||
|
struct sgttyb *argp;
|
||
|
{
|
||
|
int n;
|
||
|
long erase, kill, intr, quit, xon, xoff, eof, brk, speed;
|
||
|
struct tchars *argt;
|
||
|
|
||
|
_M.TTY_REQUEST = request;
|
||
|
_M.TTY_LINE = fd;
|
||
|
|
||
|
switch(request) {
|
||
|
case TIOCSETP:
|
||
|
erase = argp->sg_erase & BYTE;
|
||
|
kill = argp->sg_kill & BYTE;
|
||
|
speed = ((argp->sg_ospeed & BYTE) << 8) | (argp->sg_ispeed & BYTE);
|
||
|
_M.TTY_SPEK = (speed << 16) | (erase << 8) | kill;
|
||
|
_M.TTY_FLAGS = argp->sg_flags;
|
||
|
n = _callx(FS, IOCTL);
|
||
|
return(n);
|
||
|
|
||
|
case TIOCSETC:
|
||
|
argt = (struct tchars * /* kludge */) argp;
|
||
|
intr = argt->t_intrc & BYTE;
|
||
|
quit = argt->t_quitc & BYTE;
|
||
|
xon = argt->t_startc & BYTE;
|
||
|
xoff = argt->t_stopc & BYTE;
|
||
|
eof = argt->t_eofc & BYTE;
|
||
|
brk = argt->t_brkc & BYTE; /* not used at the moment */
|
||
|
_M.TTY_SPEK = (intr<<24) | (quit<<16) | (xon<<8) | (xoff<<0);
|
||
|
_M.TTY_FLAGS = (eof<<8) | (brk<<0);
|
||
|
n = _callx(FS, IOCTL);
|
||
|
return(n);
|
||
|
|
||
|
case TIOCGETP:
|
||
|
n = _callx(FS, IOCTL);
|
||
|
argp->sg_erase = (_M.TTY_SPEK >> 8) & BYTE;
|
||
|
argp->sg_kill = (_M.TTY_SPEK >> 0) & BYTE;
|
||
|
argp->sg_flags = _M.TTY_FLAGS & 0xFFFFL;
|
||
|
speed = (_M.TTY_SPEK >> 16) & 0xFFFFL;
|
||
|
argp->sg_ispeed = speed & BYTE;
|
||
|
argp->sg_ospeed = (speed >> 8) & BYTE;
|
||
|
return(n);
|
||
|
|
||
|
case TIOCGETC:
|
||
|
n = _callx(FS, IOCTL);
|
||
|
argt = (struct tchars *) argp;
|
||
|
argt->t_intrc = (_M.TTY_SPEK >> 24) & BYTE;
|
||
|
argt->t_quitc = (_M.TTY_SPEK >> 16) & BYTE;
|
||
|
argt->t_startc = (_M.TTY_SPEK >> 8) & BYTE;
|
||
|
argt->t_stopc = (_M.TTY_SPEK >> 0) & BYTE;
|
||
|
argt->t_eofc = (_M.TTY_FLAGS >> 8) & BYTE;
|
||
|
argt->t_brkc = (_M.TTY_FLAGS >> 8) & BYTE;
|
||
|
return(n);
|
||
|
|
||
|
/* This is silly, do we want to add 1001 cases and _M.TTY_XYZ's here?
|
||
|
* We should just pop argp into the message for low-level interpretation.
|
||
|
*/
|
||
|
|
||
|
case TIOCFLUSH:
|
||
|
_M.TTY_FLAGS = (int /* kludge */) argp;
|
||
|
return _callx(FS, IOCTL);
|
||
|
|
||
|
/* decided to pop argp in the ADDRESS field. Left TIOCFLUSH a special case
|
||
|
* since it affects other platforms and old software too. FM
|
||
|
*/
|
||
|
default:
|
||
|
_M.ADDRESS = (char *)argp;
|
||
|
return _callx(FS, IOCTL);
|
||
|
}
|
||
|
}
|