|
|
1.1 ! root 1: /* DCDWATCH.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Program to execute another program, but terminate if carrier detect is */ ! 6: /* lost */ ! 7: ! 8: /* Compile small memory model */ ! 9: ! 10: #include <stdio.h> ! 11: #include <stdlib.h> ! 12: #include <process.h> ! 13: #include <dos.h> ! 14: #include <io.h> ! 15: #include <alloc.h> ! 16: ! 17: extern unsigned _heaplen=2048; ! 18: ! 19: #define uint unsigned int ! 20: ! 21: #pragma warn -par ! 22: ! 23: char hungup=0; ! 24: uint far *msr; ! 25: ! 26: void interrupt (*old_int21)(void); ! 27: ! 28: struct REGPACK r; ! 29: ! 30: void interrupt new_int21(uint bp, uint di, uint si, uint ds, uint es, ! 31: uint dx, uint cx, uint bx, uint ax, uint ip, uint cs, uint flags) ! 32: { ! 33: ! 34: r.r_ax=ax; ! 35: r.r_bx=bx; ! 36: r.r_cx=cx; ! 37: r.r_dx=dx; ! 38: r.r_bp=bp; ! 39: r.r_si=si; ! 40: r.r_di=di; ! 41: r.r_flags=flags; ! 42: r.r_ds=ds; ! 43: r.r_es=es; ! 44: ! 45: intr(0xaa,&r); ! 46: ! 47: ax=r.r_ax; ! 48: bx=r.r_bx; ! 49: cx=r.r_cx; ! 50: dx=r.r_dx; ! 51: bp=r.r_bp; ! 52: si=r.r_si; ! 53: di=r.r_di; ! 54: flags=r.r_flags; ! 55: ds=r.r_ds; ! 56: es=r.r_es; ! 57: ! 58: if(!(*(msr)&0x8000) && !hungup) { ! 59: hungup=1; ! 60: r.r_ax=0x4c00; ! 61: intr(0xaa,&r); } /* so exit */ ! 62: } ! 63: ! 64: #pragma warn +par ! 65: ! 66: ! 67: int main(int argc, char **argv) ! 68: { ! 69: char str[256],*arg[30],*comspec; ! 70: int i; ! 71: FILE *stream; ! 72: ! 73: if(argc<3) { ! 74: printf("usage: %%!dcdwatch %%& <program> <arguments>\n"); ! 75: exit(1) ;} ! 76: ! 77: msr=(uint far *)atol(argv[1]); ! 78: ! 79: if((stream=fopen("INTRSBBS.DAT","r"))!=NULL) { ! 80: fgets(str,81,stream); ! 81: msr=(uint far *)atol(str); ! 82: fclose(stream); ! 83: remove("INTRSBBS.DAT"); } ! 84: ! 85: if(msr) { ! 86: old_int21=getvect(0x21); ! 87: setvect(0xAA,old_int21); ! 88: setvect(0x21,new_int21); } ! 89: ! 90: comspec=getenv("COMSPEC"); ! 91: ! 92: arg[0]=comspec; ! 93: arg[1]="/c"; ! 94: for(i=2;i<30;i++) ! 95: arg[i]=argv[i]; ! 96: ! 97: i=spawnvp(P_WAIT,arg[0],arg); ! 98: ! 99: if(msr) ! 100: setvect(0x21,old_int21); ! 101: return(i); ! 102: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.