|
|
2.30b OS/2
/* DCDWATCH.C */
/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
/* Program to execute another program, but terminate if carrier detect is */
/* lost */
/* Compile small memory model */
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <dos.h>
#include <io.h>
#include <alloc.h>
extern unsigned _heaplen=2048;
#define uint unsigned int
#pragma warn -par
char hungup=0;
uint far *msr;
void interrupt (*old_int21)(void);
struct REGPACK r;
void interrupt new_int21(uint bp, uint di, uint si, uint ds, uint es,
uint dx, uint cx, uint bx, uint ax, uint ip, uint cs, uint flags)
{
r.r_ax=ax;
r.r_bx=bx;
r.r_cx=cx;
r.r_dx=dx;
r.r_bp=bp;
r.r_si=si;
r.r_di=di;
r.r_flags=flags;
r.r_ds=ds;
r.r_es=es;
intr(0xaa,&r);
ax=r.r_ax;
bx=r.r_bx;
cx=r.r_cx;
dx=r.r_dx;
bp=r.r_bp;
si=r.r_si;
di=r.r_di;
flags=r.r_flags;
ds=r.r_ds;
es=r.r_es;
if(!(*(msr)&0x8000) && !hungup) {
hungup=1;
r.r_ax=0x4c00;
intr(0xaa,&r); } /* so exit */
}
#pragma warn +par
int main(int argc, char **argv)
{
char str[256],*arg[30],*comspec;
int i;
FILE *stream;
if(argc<3) {
printf("usage: %%!dcdwatch %%& <program> <arguments>\n");
exit(1) ;}
msr=(uint far *)atol(argv[1]);
if((stream=fopen("INTRSBBS.DAT","r"))!=NULL) {
fgets(str,81,stream);
msr=(uint far *)atol(str);
fclose(stream);
remove("INTRSBBS.DAT"); }
if(msr) {
old_int21=getvect(0x21);
setvect(0xAA,old_int21);
setvect(0x21,new_int21); }
comspec=getenv("COMSPEC");
arg[0]=comspec;
arg[1]="/c";
for(i=2;i<30;i++)
arg[i]=argv[i];
i=spawnvp(P_WAIT,arg[0],arg);
if(msr)
setvect(0x21,old_int21);
return(i);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.