home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
stg_v4.lzh
/
qd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-11
|
2KB
|
125 lines
/*
* qd - quick and dirty terminal program
*
* 90/05/10 StG initial version, replacement for losing qc
* 90/06/09 StG simplified and sped up throughput in both directions
*/
#include <sgstat.h>
#define ERR (-1)
#define BUFSIZ 200 /* buffer size */
struct sgbuf sg,*sav[16];
extern int errno;
raw(pn)
int pn;
{
sav[pn]=malloc(sizeof(sg));
getstat(0,pn,sav[pn]);
getstat(0,pn,&sg);
sg.sg_echo=0;
sg.sg_pause=0;
sg.sg_eorch=0;
sg.sg_eofch=0;
sg.sg_psch=0;
sg.sg_kbich=0;
sg.sg_kbach=0;
/* sg.sg_stn=0; /* really xon/xoff, bug sgstat.h is old */
sg.sg_xon=0;
sg.sg_xoff=0;
setstat(0,pn,&sg);
}
cook(pn)
int pn;
{
setstat(0,pn,sav[pn]);
free(sav[pn]);
}
intr(sig)
{
}
int port;
char buf[BUFSIZ];
int sz;
int tics;
char code=0x1a;
main(argc,argv)
char **argv;
{
if (!*++argv) exit(writeln(2,"use: qd (/port)\n",80));
if ((port=open(*argv,3))==ERR) exit(errno,writeln(2,"cant open port\n",80));
setpr(getpid(),200);
intercept(intr);
raw(port);
raw(0);
tics=0;
loop:
if ((sz=_gs_rdy(port))>0)
{
tics=0;
if (sz>BUFSIZ) sz=BUFSIZ;
if (sz>1) sz=1;
sz=read(port,buf,sz);
if (sz<0)
sz=0;
else
if (*(unsigned char *)buf<32)
{
write(1,"^",1);
*buf+=64;
}
write(1,buf,sz);
}
if ((sz=_gs_rdy(0))>0)
{
tics=0;
if (sz>BUFSIZ) sz=BUFSIZ;
sz=read(0,buf,sz);
if (sz<0) sz=0;
if (sz==1 && *buf==code) menu();
else write(port,buf,sz);
}
if (tics)
{
tsleep(tics);
if (tics<10) tics++;
}
goto loop;
}
menu()
{
write(1,"?\b",2);
read(0,buf,1);
if (*buf==code)
{
write(port,buf,1);
return;
}
switch (tolower(*buf))
{
case 's':
cook(0);
system("");
raw(0);
break;
case 'q':
cook(0);
cook(port);
close(port);
exit(0);
}
}