home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / OLDDEV.ARJ / EXTRN.C < prev    next >
C/C++ Source or Header  |  1991-08-14  |  14KB  |  701 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22. #include <process.h>
  23. #include <math.h>
  24.  
  25.  
  26.  
  27. #define SCROLL_UP(t,b,l) \
  28.   _CH=t;\
  29.   _DH=b;\
  30.   _BH=curatr;\
  31.   _AL=l;\
  32.   _CL=0;\
  33.   _DL=79;\
  34.   _AH=6;\
  35.   my_video_int();
  36.  
  37.  
  38.  
  39. unsigned char getkeyext()
  40. {
  41.   unsigned char ch;
  42.   static int holding=0;
  43.   static char held=0;
  44.  
  45.   if (holding) {
  46.     holding=0;
  47.     return(held);
  48.   }
  49.   ch=getkey();
  50.   if (charbufferpointer==0) {
  51.     if (ch==16) {
  52.       ch=getkey();
  53.       if ((ch==1) && (charbufferpointer==0)) {
  54.         strcpy(charbuffer,&(thisuser.macros[2][0]));
  55.         ch=charbuffer[0];
  56.         if (ch) {
  57.           charbufferpointer=1;
  58.       return(ch);
  59.         } else
  60.       return(getkeyext());
  61.       } else
  62.         if ((ch==4) && (charbufferpointer==0)) {
  63.           strcpy(charbuffer,&(thisuser.macros[0][0]));
  64.           ch=charbuffer[0];
  65.           if (ch) {
  66.             charbufferpointer=1;
  67.         return(ch);
  68.           } else
  69.         return(getkeyext());
  70.         } else
  71.           if ((ch==6) && (charbufferpointer==0)) {
  72.             strcpy(charbuffer,&(thisuser.macros[1][0]));
  73.             ch=charbuffer[0];
  74.             if (ch) {
  75.               charbufferpointer=1;
  76.           return(ch);
  77.             } else
  78.           return(getkeyext());
  79.           } else {
  80.             holding=1;
  81.         held=ch;
  82.             return(16);
  83.           }
  84.     }
  85.   }
  86.   return(ch);
  87. }
  88.  
  89.  
  90. void cd_to(char *s)
  91. {
  92.   char s1[81];
  93.   int i,db;
  94.  
  95.   strcpy(s1,s);
  96.   i=strlen(s1)-1;
  97.   db=(s1[i]=='\\');
  98.   if (i==0)
  99.     db=0;
  100.   if ((i==2) && (s1[1]==':'))
  101.     db=0;
  102.   if (db)
  103.     s1[i]=0;
  104.   chdir(s1);
  105.   if (s[1]==':')
  106.     setdisk(s[0]-'A');
  107. }
  108.  
  109. void get_dir(char *s, int be)
  110. {
  111.   strcpy(s,"X:\\");
  112.   s[0]='A'+getdisk();
  113.   getcurdir(0,&(s[3]));
  114.   if (be) {
  115.     if (s[strlen(s)-1]!='\\')
  116.       strcat(s,"\\");
  117.   }
  118. }
  119.  
  120.  
  121. void initporte(int port_num)
  122. /* This function initializes the com buffer, setting up the interrupt,
  123.  * and com parameters
  124.  */
  125. {
  126.   int temp;
  127.  
  128.   if (!ok_modem_stuff)
  129.     return;
  130.   temp=port_num;
  131.   setvect(8+async_irq,async_isr);
  132.   head=tail=0;
  133.   outportb(base+3,0x03);
  134.   disable();
  135.   temp=inportb(base+5);
  136.   temp=inportb(base);
  137.   temp=inportb(0x21);
  138.   temp=temp & ((1 << async_irq) ^ 0x00ff);
  139.   outportb(0x21,temp);
  140.   outportb(base+1,0x01);
  141.   temp=inportb(base+4);
  142.   outportb(base+4,temp | 0x0A);
  143.   enable();
  144.   dtr(1);
  145. }
  146.  
  147.  
  148.  
  149. int do_it(char *cl)
  150. {
  151.   int i,i1,l;
  152.   char s[160];
  153.   char *ss[30];
  154.  
  155.   sl1(1,"");
  156.   strcpy(s,cl);
  157.   ss[0]=s;
  158.   i=1;
  159.   l=strlen(s);
  160.   for (i1=1; i1<l; i1++)
  161.     if (s[i1]==32) {
  162.       s[i1]=0;
  163.       ss[i++]=&(s[i1+1]);
  164.     }
  165.   ss[i]=NULL;
  166.   i=spawnvpe(P_WAIT,ss[0],ss,xenviron);
  167.   return(i);
  168. }
  169.  
  170.  
  171.  
  172. int do_remote(char *s, int ccc)
  173. {
  174.   int rc,xx;
  175.   char x[161];
  176.  
  177.   sl1(1,"");
  178.   close_user();
  179.   checkhangup();
  180.   if (hangup)
  181.     return(32767);
  182.   sprintf(x,"%s /C %s", getenv("COMSPEC"), s);
  183.   if (ccc)
  184.     rc=do_it(x);
  185.   else
  186.     rc=do_it(s);
  187.   initporte(syscfg.primaryport);
  188.   chdir(cdir);
  189.   setdisk(cdir[0]-'A');
  190.   return(rc);
  191. }
  192.  
  193. void checka1()
  194. {
  195.   char ch;
  196.   long d1;
  197.  
  198.   while ((!empty()) && (!(abortext)) && (!hangup)) {
  199.     ch=inkey();
  200.     switch(ch) {
  201.       case 3:
  202.       case 32:
  203.       case 24:
  204.         abortext=1;
  205.         break;
  206.       case 'P':
  207.       case 'p':
  208.       case 19:
  209.         d1=timer1();
  210.         while ((inkey()==0) && (labs(timer1()-d1)<3276L) && (!hangup))
  211.           checkhangup();
  212.         lines_listed=0;
  213.         break;
  214.     }
  215.   }
  216. }
  217.  
  218.  
  219. union REGS ca_r;
  220. int ca_pause,ca_ctrl_c;
  221. long ca_d1;
  222.  
  223.  
  224. void checka2()
  225. {
  226.   ca_pause=0;
  227.   ca_ctrl_c=0;
  228.   ca_r.h.ah=1;
  229.   int86(0x16,&ca_r,&ca_r);
  230.   if ((ca_r.x.flags & 64)==0) {
  231.     if (ca_r.x.ax==11779)
  232.       ca_ctrl_c=1;
  233.     if (ca_r.x.ax==7955)
  234.       ca_pause=1;
  235.   }
  236.   if (head!=tail) {
  237.     if (buffer[tail]==3)
  238.       ca_ctrl_c=1;
  239.     if (buffer[tail]==19)
  240.       ca_pause=1;
  241.   }
  242.   if (ca_pause) {
  243.     while (inkey()!=0)
  244.       ;
  245.     ca_d1=timer1();
  246.     while ((inkey()==0) && (labs(timer1()-ca_d1)<3276L) && (!hangup))
  247.       checkhangup();
  248.     lines_listed=0;
  249.   }
  250.   if ((ca_ctrl_c) && (nextext)) {
  251.     while (inkey()!=0)
  252.       ;
  253.     pl("^C");
  254.     ca_r.x.ax=0x4c00;
  255.     int86(INT_SAVE_21,&ca_r,&ca_r);
  256.   }
  257. }
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264. void run_external(char *s)
  265. {
  266.   do_remote(s,1);
  267. }
  268.  
  269.  
  270.  
  271. int run_external1(char *s)
  272. {
  273.   int i;
  274.  
  275.   i=do_remote(s,0);
  276.   return(i);
  277. }
  278.  
  279.  
  280.  
  281. void outdosstr(char *s)
  282. /* This function outputs a string of characters to the screen (and remotely
  283.  * if applicable).  The com port is also checked first to see if a remote
  284.  * user has hung up
  285.  */
  286. {
  287.   int i;
  288.  
  289.   checkhangup();
  290.   if (hangup==0) {
  291.     i=0;
  292.     while ((s[i] !='$') && (i<1024)) {
  293.       checka2();
  294.       outchr(s[i++]);
  295.     }
  296.   }
  297. }
  298.  
  299.  
  300. union REGS ni_r;
  301. struct SREGS ni_s;
  302. unsigned ni_n;
  303. char ni_ch,ni_ch1,ni_ss[10],ni_ch2;
  304. unsigned char *ni_st;
  305.  
  306. static unsigned short ni_stack[150];
  307.  
  308.  
  309. #pragma warn -par
  310.  
  311. void far interrupt newintr1(unsigned bp, unsigned di, unsigned si,
  312.                            unsigned ds, unsigned es, unsigned dx,
  313.                            unsigned cx, unsigned bx, unsigned ax,
  314.                            unsigned ip, unsigned cs, unsigned flags)
  315. {
  316.  
  317.   unsigned short ni_SS, ni_SP;
  318. #define NEW_STK() { _BX=FP_OFF(&ni_stack[98]); _SS=_DS; _SP=_BX; }
  319. #define OLD_STK() { _AX=ni_SS; _BX=ni_SP; _SS=_AX; _SP=_BX; }
  320.  
  321.  
  322.  
  323.   ni_r.x.ax=ax;
  324.   ni_r.x.bx=bx;
  325.   ni_r.x.cx=cx;
  326.   ni_r.x.dx=dx;
  327.   ni_r.x.si=si;
  328.   ni_r.x.di=di;
  329.   ni_r.x.flags=flags;
  330.   ni_s.ds=ds;
  331.   ni_s.es=es;
  332.  
  333.   ni_SS=_SS;
  334.   ni_SP=_SP;
  335.  
  336.   ni_ch=ni_r.h.ah;
  337.   ni_ch1=0;
  338.  
  339.   switch(ni_ch) {
  340.     case 0x01:
  341.       NEW_STK();
  342.       ni_ch=getkeyext();
  343.       outchr(ni_ch);
  344.       if (hangup)
  345.         ni_ch=3;
  346.       ni_r.h.al=ni_ch;
  347.       ni_ch1=1;
  348.       OLD_STK();
  349.       break;
  350.     case 0x02:
  351.       NEW_STK();
  352.       outchr(ni_r.h.dl);
  353.       ni_ch1=1;
  354.       checka2();
  355.       OLD_STK();
  356.       break;
  357.     case 0x06:
  358.       NEW_STK();
  359.       if (ni_r.h.dl!=0xff) {
  360.         outchr(ni_r.h.dl);
  361.         ni_ch1=1;
  362.       } else {
  363.         if (empty()) {
  364.           ni_r.x.flags |= 64;
  365.         } else {
  366.           ni_r.x.flags &= (0xffff ^ 64);
  367.           ni_r.h.al=getkeyext();
  368.         }
  369.       }
  370.       OLD_STK();
  371.       break;
  372.     case 0x07:
  373.       NEW_STK();
  374.       ni_ch1=1;
  375.       ni_r.h.al=getkeyext();
  376.       OLD_STK();
  377.       break;
  378.     case 0x08:
  379.       NEW_STK();
  380.       ni_ch1=1;
  381.       ni_r.h.al=getkeyext();
  382.       OLD_STK();
  383.       break;
  384.     case 0x09:
  385.       NEW_STK();
  386.       outdosstr((char *) MK_FP(ni_s.ds, ni_r.x.dx));
  387.       ni_ch1=1;
  388.       OLD_STK();
  389.       break;
  390.     case 0x0a:
  391.       NEW_STK();
  392.       ni_st=(char *) MK_FP(ni_s.ds,ni_r.x.dx);
  393.       ni_n=(unsigned int)(ni_st[0]);
  394.       if (in_extern==2)
  395.         getkeyext();
  396.       in_extern=0;
  397.       input_extern=1;
  398.       input1(&(ni_st[2]),ni_n-3,1,0);
  399.       input_extern=0;
  400.       in_extern=1;
  401.       ni_st[1]=strlen(&(ni_st[2]));
  402.       strcat(&(ni_st[2]),"\r");
  403.       if ((hangup)) {
  404.         strcpy(&(ni_st[2]),"EXIT\r");
  405.         ni_st[1]=4;
  406.         outs("Exiting...");
  407.       }
  408.       ni_ch1=1;
  409.       OLD_STK();
  410.       break;
  411.     case 0x0b:
  412.       NEW_STK();
  413.       if (empty())
  414.         ni_r.h.al=0x00;
  415.       else
  416.         ni_r.h.al=0xff;
  417.       ni_ch1=1;
  418.       OLD_STK();
  419.       break;
  420.     case 0x0c:
  421.       ni_r.h.ah=ni_r.h.al;
  422.       int86x(0x21,&ni_r,&ni_r,&ni_s);
  423.       ni_ch1=1;
  424.       break;
  425.     case 0x3f:
  426.       if (ni_r.x.bx==0x0000) {
  427.         NEW_STK();
  428.         ni_st=(char *)MK_FP(ni_s.ds,ni_r.x.dx);
  429.         inputl(ni_st,ni_r.x.cx);
  430.         strcat(ni_st,"\r\n");
  431.         ni_r.x.ax=strlen(ni_st);
  432.         if (hangup)
  433.           ni_r.x.ax=0;
  434.         ni_r.x.flags &=(0xffff ^ 1);
  435.         ni_ch1=1;
  436.         OLD_STK();
  437.       } else
  438.         int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  439.       break;
  440.     case 0x40:
  441.       if ((ni_r.x.bx==0x0001) || (ni_r.x.bx==0x0002)) {
  442.         NEW_STK();
  443.         ni_st=(char *)MK_FP(ni_s.ds,ni_r.x.dx);
  444.         for (ni_n=0; ni_n<ni_r.x.cx; ni_n++) {
  445.           outchr(ni_st[ni_n]);
  446.           checka2();
  447.         }
  448.         ni_r.x.ax=ni_r.x.cx;
  449.         ni_r.x.flags &=(0xffff ^ 1);
  450.         ni_ch1=1;
  451.         OLD_STK();
  452.       } else
  453.         int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  454.       break;
  455.     default:
  456.       int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  457.       break;
  458.   }
  459.  
  460.   if (ni_ch1) {
  461.     if (arcling) {
  462.       if ((nextext) && (!abortext)) {
  463.         checka1();
  464.         if (abortext) {
  465.           ni_r.x.ax=0x4c00;
  466.           int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  467.         }
  468.       }
  469.     }
  470.     checkhangup();
  471.     if (hangup) {
  472.       if (hanguptime1<0L) {
  473.         hanguptime1=timer1();
  474.         outs("Aborting...\r\n");
  475.         ni_r.x.ax=0x4c00;
  476.         int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  477.       } else {
  478.         if (labs(timer1()-hanguptime1)>36L) {
  479.           hanguptime1=timer1();
  480.           outs("Aborting...\r\n");
  481.           ni_r.x.ax=0x4c00;
  482.           int86x(INT_SAVE_21,&ni_r,&ni_r,&ni_s);
  483.         }
  484.       }
  485.     }
  486.   }
  487.  
  488.   ax=ni_r.x.ax;
  489.   bx=ni_r.x.bx;
  490.   cx=ni_r.x.cx;
  491.   dx=ni_r.x.dx;
  492.   si=ni_r.x.si;
  493.   di=ni_r.x.di;
  494.   flags=ni_r.x.flags;
  495.   ds=ni_s.ds;
  496.   es=ni_s.es;
  497. }
  498.  
  499.  
  500. #pragma warn +par
  501.  
  502. int do_external(char *s, int enab)
  503. {
  504.   unsigned short sav;
  505.  
  506.   checkhangup();
  507.   if (hangup)
  508.     return(0);
  509.   in_extern=1;
  510.   hanguptime1=-1L;
  511.   abortext=0;
  512.   nextext=enab;
  513.   arcling=1;
  514.   sav=syscfg.sysconfig;
  515.   if ((syscfg.sysconfig & sysconfig_no_local)==0)
  516.     syscfg.sysconfig |= sysconfig_no_local;
  517.   setvect(INT_SAVE_21,getvect(0x21));
  518.  
  519.   set_global_handle(0);
  520.  
  521.   setvect(0x21,newintr1);
  522.  
  523.   do_remote(s,1);
  524.  
  525.   setvect(0x21,getvect(INT_SAVE_21));
  526.  
  527.   if (abortext) {
  528.     nl();
  529.     nl();
  530.   }
  531.  
  532.   syscfg.sysconfig=sav;
  533.   if (in_extern==2)
  534.     getkey();
  535.   in_extern=0;
  536.   return(abortext);
  537. }
  538.  
  539.  
  540. int full_external(char *s, int ctc, int ccc)
  541. {
  542.   unsigned short sav;
  543.   int ookskey,xx,cy,cx,xxx;
  544.  
  545.   sl1(1,"");
  546.   checkhangup();
  547.   if (hangup)
  548.     return(0);
  549.   in_extern=1;
  550.   ookskey=okskey;
  551.   okskey=0;
  552.   hanguptime1=-1L;
  553.   arcling=0;
  554.   if (screenlinest>defscreenbottom-topline)
  555.     set_protect(0);
  556.   abortext=0;
  557.   nextext=ctc;
  558.   sav=syscfg.sysconfig;
  559.   if ((syscfg.sysconfig & sysconfig_no_local)==0)
  560.     syscfg.sysconfig |= sysconfig_no_local;
  561.  
  562.   setvect(INT_SAVE_21,getvect(0x21));
  563.  
  564.   set_global_handle(0);
  565.  
  566.   setvect(0x21,newintr1);
  567.  
  568.   if ((screenlinest<=defscreenbottom) && (screenlinest>20)) {
  569.     screenbottom=screenlinest-1+topline;
  570.     cy=wherey();
  571.     cx=wherex();
  572.     xxx=cy-screenbottom+topline;
  573.     if (xxx>0) {
  574.       SCROLL_UP(topline,defscreenbottom,xxx);
  575.       movecsr(cx,screenbottom);
  576.     }
  577.   }
  578.  
  579.   do_remote(s,ccc);
  580.  
  581.   screenbottom=defscreenbottom;
  582.  
  583.   setvect(0x21,getvect(INT_SAVE_21));
  584.  
  585.   if (abortext) {
  586.     nl();
  587.     nl();
  588.   }
  589.  
  590.   syscfg.sysconfig=sav;
  591.   okskey=ookskey;
  592.   if (in_extern==2)
  593.     getkey();
  594.   in_extern=0;
  595.   if (!wfc)
  596.     topscreen();
  597.   return(abortext);
  598. }
  599.  
  600. void alf(int f, char *s)
  601. {
  602.   char s1[100];
  603.  
  604.   strcpy(s1,s);
  605.   strcat(s1,"\r\n");
  606.   write(f,(void *)s1,strlen(s1));
  607. }
  608.  
  609. char *create_chain_file(char *fn)
  610. {
  611.   int i,i1,f;
  612.   char s[81],s1[81],gd[81],dd[81];
  613.   static char fpn[81];
  614.   long l;
  615.  
  616.   cd_to(syscfg.gfilesdir);
  617.   get_dir(gd,1);
  618.   cd_to(cdir);
  619.   cd_to(syscfg.datadir);
  620.   get_dir(dd,1);
  621.   cd_to(cdir);
  622.  
  623.   unlink(fn);
  624.   f=open(fn,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  625.   itoa(usernum,s,10);
  626.   alf(f,s);
  627.   alf(f,thisuser.name);
  628.   alf(f,thisuser.realname);
  629.   alf(f,thisuser.callsign);
  630.   itoa(thisuser.age,s,10);
  631.   alf(f,s);
  632.   s[0]=thisuser.sex;
  633.   s[1]=0;
  634.   alf(f,s);
  635.   sprintf(s,"%10.2f",thisuser.gold);
  636.   alf(f,s);
  637.   alf(f,thisuser.laston);
  638.   itoa(thisuser.screenchars,s,10);
  639.   alf(f,s);
  640.   itoa(thisuser.screenlines,s,10);
  641.   alf(f,s);
  642.   itoa(thisuser.sl,s,10);
  643.   alf(f,s);
  644.   if (cs())
  645.     alf(f,"1");
  646.   else
  647.     alf(f,"0");
  648.   if (so())
  649.     alf(f,"1");
  650.   else
  651.     alf(f,"0");
  652.   if (okansi())
  653.     alf(f,"1");
  654.   else
  655.     alf(f,"0");
  656.   if (incom)
  657.     alf(f,"1");
  658.   else
  659.     alf(f,"0");
  660.   sprintf(s,"%10.2f",nsl());
  661.   alf(f,s);
  662.   alf(f,gd);
  663.   alf(f,dd);
  664.   sl1(3,s);
  665.   alf(f,s);
  666.   sprintf(s,"%u",modem_speed);
  667.   if (!using_modem)
  668.     strcpy(s,"KB");
  669.   alf(f,s);
  670.   itoa(syscfg.primaryport,s,10);
  671.   alf(f,s);
  672.   alf(f,syscfg.systemname);
  673.   alf(f,syscfg.sysopname);
  674.   l=(long) (timeon);
  675.   if (l<0)
  676.     l += 3600*24;
  677.   ltoa(l,s,10);
  678.   alf(f,s);
  679.   l=(long) (timer()-timeon);
  680.   if (l<0)
  681.     l += 3600*24;
  682.   ltoa(l,s,10);
  683.   alf(f,s);
  684.   ltoa(thisuser.uk,s,10);
  685.   alf(f,s);
  686.   itoa(thisuser.uploaded,s,10);
  687.   alf(f,s);
  688.   ltoa(thisuser.dk,s,10);
  689.   alf(f,s);
  690.   itoa(thisuser.downloaded,s,10);
  691.   alf(f,s);
  692.   if (andwith==0x7f)
  693.     alf(f,"7E1");
  694.   else
  695.     alf(f,"8N1");
  696.   close(f);
  697.   get_dir(fpn,1);
  698.   strcat(fpn,fn);
  699.   return(fpn);
  700. }
  701.