home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / NETSUP.C < prev    next >
Text File  |  1991-12-24  |  14KB  |  658 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.  
  23.  
  24.  
  25. #define utoa(s,v,r) ultoa((unsigned long)(s),v,r)
  26.  
  27.  
  28.  
  29. void checkup(struct ftime *f1, struct ftime *f2, int *tf)
  30. {
  31.   if ((f1->ft_year)>(f2->ft_year))
  32.     *tf=1;
  33.   else
  34.     if (f1->ft_year==f2->ft_year)
  35.       if (f1->ft_month>f2->ft_month)
  36.     *tf=1;
  37.       else
  38.     if (f1->ft_month==f2->ft_month)
  39.       if (f1->ft_day>f2->ft_day)
  40.         *tf=1;
  41.       else
  42.         if (f1->ft_day==f2->ft_day)
  43.           if (f1->ft_hour>f2->ft_hour)
  44.         *tf=1;
  45.           else
  46.         if (f1->ft_hour==f2->ft_hour)
  47.           if (f1->ft_min>f2->ft_min)
  48.             *tf=1;
  49.           else
  50.             if (f1->ft_min==f2->ft_min)
  51.               if (f1->ft_tsec>f2->ft_tsec)
  52.             *tf=1;
  53. }
  54.  
  55.  
  56. #ifdef OLD
  57.  
  58. int check_bbsdata()
  59. {
  60.   char s1[81],s2[81],s3[81],s4[81];
  61.   int i,e1,e2,e3,e4,tf,n,tf1;
  62.   struct ftime f1,f2,f3,f4;
  63.  
  64.   n=0;
  65.   sprintf(s1,"%sBBSLIST.NET",syscfg.datadir);
  66.   sprintf(s2,"%sCONNECT.NET",syscfg.datadir);
  67.   sprintf(s3,"%sCALLOUT.NET",syscfg.datadir);
  68.   sprintf(s4,"%sBBSDATA.NET",syscfg.datadir);
  69.   e1=exist(s1);
  70.   e2=exist(s2);
  71.   e3=exist(s3);
  72.   e4=exist(s4);
  73.   tf=0;
  74.   if ((e1) && (e2) && (e3)) {
  75.     if (e4) {
  76.       i=open(s1,O_RDONLY);
  77.       getftime(i,&f1);
  78.       close(i);
  79.       i=open(s2,O_RDONLY);
  80.       getftime(i,&f2);
  81.       close(i);
  82.       i=open(s3,O_RDONLY);
  83.       getftime(i,&f3);
  84.       close(i);
  85.       i=open(s4,O_RDONLY);
  86.       getftime(i,&f4);
  87.       close(i);
  88.       tf1=0;
  89.       checkup(&f1,&f4,&tf1);
  90.       if (tf1) {
  91.     tf=1;
  92.     n=1;
  93.       }
  94.       tf1=0;
  95.       checkup(&f2,&f4,&tf1);
  96.       if (tf1) {
  97.     tf=1;
  98.     n=1;
  99.       }
  100.       checkup(&f3,&f4,&tf);
  101.     } else {
  102.       tf=1;
  103.       n=1;
  104.     }
  105.   }
  106.   if (tf) {
  107.     holdphone(1);
  108. #ifdef OLD_WAY
  109.     if (n)
  110.       tf=run_external1("NETWORK3 Y");
  111.     else
  112.       tf=run_external1("NETWORK3");
  113. #else
  114.     if (n)
  115.       shrink_out("NETWORK3 Y",0,0,0,0);
  116.     else
  117.       shrink_out("NETWORK3",0,0,0,0);
  118. #endif
  119.     if (csn!=NULL)
  120.       farfree(csn);
  121.     if (cnn!=NULL)
  122.       farfree(cnn);
  123.     if (con!=NULL)
  124.       farfree(con);
  125.     read_bbs_list_index();
  126.     read_contacts();
  127.     if (tf<0)
  128.       return(0);
  129.     else
  130.       return(1);
  131.   }
  132.   return(0);
  133. }
  134.  
  135.  
  136. #else
  137. /****************************************************************************/
  138. int checkup2(struct ftime *f, char *x)
  139. {
  140.   int q;
  141.   char s[81];
  142.   struct ftime f2;
  143.  
  144.   sprintf(s,"%s%s",syscfg.datadir,x);
  145.   q=open(s,O_RDONLY);
  146.   if (q>0) {
  147.     getftime(q,&f2);
  148.     close(q);
  149.     q=0;
  150.     checkup(&f2,f,&q);
  151.   } else
  152.     q=1;
  153.   return(q);
  154. }
  155.  
  156.  
  157. int check_bbsdata()
  158. {
  159.   char s[81];
  160.   int ok,ok2;
  161.   struct ftime ft;
  162.  
  163.   sprintf(s,"%sCONNECT.UPD",syscfg.datadir);
  164.   if ((ok=exist(s))==0) {
  165.     sprintf(s,"%sBBSLIST.UPD",syscfg.datadir);
  166.     ok=exist(s);
  167.   }
  168.   if (ok  && status.net_edit_stuff) {
  169.     holdphone(1);
  170.     run_external1("NETEDIT /U");
  171.   } else {
  172.     sprintf(s,"%sBBSDATA.NET",syscfg.datadir);
  173.     ok=open(s,O_RDONLY);
  174.     if (ok>0) {
  175.       getftime(ok,&ft);
  176.       close(ok);
  177.       ok=checkup2(&ft,"BBSLIST.NET")||checkup2(&ft,"CONNECT.NET");
  178.       ok2=checkup2(&ft,"CALLOUT.NET");
  179.     } else
  180.       ok=ok2=1;
  181.   }
  182.   sprintf(s,"%sBBSLIST.NET",syscfg.datadir);
  183.   if (!exist(s))
  184.     ok=ok2=0;
  185.   sprintf(s,"%sCONNECT.NET",syscfg.datadir);
  186.   if (!exist(s))
  187.     ok=ok2=0;
  188.   sprintf(s,"%sCALLOUT.NET",syscfg.datadir);
  189.   if (!exist(s))
  190.     ok=ok2=0;
  191.   if (ok||ok2) {
  192.     sprintf(s,"NETWORK3%s",(ok?" Y":""));
  193.     holdphone(1);
  194.  
  195. #ifdef OLD_WAY
  196.     ok=run_external1(s);
  197. #else
  198.     shrink_out(s,0,0,0,0);
  199.     ok=0;
  200. #endif
  201.  
  202.     if (csn!=NULL)
  203.       farfree((void far *)csn);
  204.     if (cnn!=NULL)
  205.       farfree(cnn);
  206.     if (con!=NULL)
  207.       farfree(con);
  208.     read_bbs_list_index();
  209.     read_contacts();
  210.     if (ok>=0)
  211.       return(1);
  212.   }
  213.   return(0);
  214. }
  215. /****************************************************************************/
  216. #endif
  217.  
  218. void cleanup_net()
  219. {
  220.   char s[81],s1[81];
  221.   int ok,ok2,abort,f,i;
  222.   long l,l1;
  223.   struct ffblk ff;
  224.  
  225.  
  226.   if (!syscfg.systemnumber)
  227.     return;
  228.   ok2=1;
  229.   abort=0;
  230.   set_protect(0);
  231.   clrscrb();
  232.   while ((ok2) && (!abort)) {
  233.     ok2=0;
  234.     ok=0;
  235.     sprintf(s,"%sP*.NET",syscfg.datadir);
  236.     ok=(findfirst(s,&ff,0)==0);
  237.     if (ok) {
  238.       holdphone(1);
  239.       hangup=0;
  240.       using_modem=0;
  241.       if (run_external1("NETWORK1")<0)
  242.         abort=1;
  243.       ok2=1;
  244.     }
  245.     sprintf(s,"%sLOCAL.NET",syscfg.datadir);
  246.     if (exist(s)) {
  247.       holdphone(1);
  248.       ok=1;
  249.       hangup=0;
  250.       using_modem=0;
  251.       save_status();
  252.       close_user();
  253.       sprintf(s,"%sNETUP.XXX",syscfg.datadir);
  254.       if (exist(s))
  255.         shrink_out("NETWORK2",0,0,0,0);
  256.       else
  257.         if (run_external1("NETWORK2")<0)
  258.           abort=1;
  259.       ok2=1;
  260.       l1=status.qscanptr;
  261.       get_status();
  262.       if (l1!=status.qscanptr) {
  263.         /* a sub has probably been updated; invalidate sub cache */
  264.         for (i=0; i<MAX_SUBS; i++) {
  265.           if (subboards[i].type)
  266.             sub_dates[i]=0L;
  267.         }
  268.         c_sub=0;
  269.       }
  270.       curlsub=-1;
  271.       if (wfc) {
  272.         wfc=0;
  273.         read_user(1,&thisuser);
  274.         fwaiting=thisuser.waiting;
  275.         wfc=1;
  276.       }
  277.     }
  278.     if (check_bbsdata())
  279.       ok2=1;
  280.     if (ok2) {
  281.       read_contacts();
  282.       clrscrb();
  283.     }
  284.   }
  285.   holdphone(0);
  286. }
  287.  
  288. unsigned int max_speed(int s1, int s2)
  289. {
  290.   int r1,r2,i,i1;
  291.   unsigned ms;
  292.   net_system_list_rec *csne1, *csne2,c1,c2;
  293.  
  294.   csne1=next_system(s1);
  295.   if (!csne1)
  296.     return(300);
  297.   c1=*csne1;
  298.  
  299.   csne2=next_system(s2);
  300.   if (!csne2)
  301.     return(300);
  302.   c2=*csne2;
  303.  
  304.   ms=c1.speed;
  305.   if (c2.speed<ms)
  306.     ms=c2.speed;
  307.  
  308.   i1=(c1.other) & (c2.other);
  309.  
  310.   if (i1 & other_Telebit_19200)
  311.     return(19200);
  312.   if (i1 & other_V32)
  313.     return(9600);
  314.   if (i1 & other_Hayes_9600)
  315.     return(9600);
  316.   if (i1 & other_USR_9600)
  317.     return(9600);
  318.   if (i1 & other_compucom)
  319.     return(9600);
  320.  
  321.   if (ms<=2400)
  322.     return(ms);
  323.   else
  324.     return(2400);
  325. }
  326.  
  327. void do_callout(int sn)
  328. {
  329.   int i,i1,i2;
  330.   char s[81],s1[81];
  331.   float ffl;
  332.   long l;
  333.   net_system_list_rec *csne;
  334.  
  335.   time(&l);
  336.   i=-1;
  337.   for (i1=0; i1<num_call_sys; i1++)
  338.     if (con[i1].sysnum==sn)
  339.       i=i1;
  340.   if (i!=-1) {
  341.     csne=next_system(con[i].sysnum);
  342.     if (csne) {
  343.       sprintf(s,"NETWORK /N%u /A%s /P%s /S%u /T%ld",
  344.         sn,
  345.         (con[i].options & options_sendback)?"1":"0",
  346.         csne->phone,
  347.         modem_i->defl.com_speed,
  348.         l);
  349.       if (con[i].macnum) {
  350.         sprintf(s1," /M%d",(int) con[i].macnum);
  351.         strcat(s,s1);
  352.       }
  353.       if (strncmp(csne->phone,"000",3)) {
  354.         pl(s);
  355.         save_status();
  356.         holdphone(1);
  357.         wait(2.5);
  358.         run_external(s);
  359.         read_contacts();
  360.         get_status();
  361.         last_time_c=l;
  362.         global_xx=0;
  363.         cleanup_net();
  364.         holdphone(0);
  365.         imodem(0);
  366.       }
  367.     }
  368.   }
  369. }
  370.  
  371.  
  372. int ok_to_call(int i)
  373. {
  374.   int ok;
  375.   struct time ti;
  376.   char ch,h,l;
  377.  
  378.   ok=((con[i].options & options_no_call)==0);
  379.   if (con[i].options & options_receive_only)
  380.     ok=0;
  381.   _AH=0x2a;
  382.   geninterrupt(0x21);
  383.   ch=_AL;
  384.   gettime(&ti);
  385.   if (con[i].options & options_ATT_night) {
  386.     if ((ch!=0) && (ch!=6)) {
  387.       if ((ti.ti_hour<23) && (ti.ti_hour>=7))
  388.         ok=0;
  389.     }
  390.     if (ch==0) {
  391.       if ((ti.ti_hour<23) && (ti.ti_hour>=16))
  392.         ok=0;
  393.     }
  394.   }
  395.   if (con[i].options & options_PCP_night) {
  396.     if ((ch!=0) && (ch!=6)) {
  397.       if ((ti.ti_hour<19) && (ti.ti_hour>=6))
  398.         ok=0;
  399.     }
  400.   }
  401.  
  402.   l=con[i].min_hr;
  403.   h=con[i].max_hr;
  404.   if ((l>-1) && (h>-1) && (h!=l)) {
  405.     if ((h==0) || (h==24)) {
  406.       if (ti.ti_hour<l)
  407.         ok=0;
  408.       else
  409.         if ((ti.ti_hour==l) && (ti.ti_min<12))
  410.           ok=0;
  411.         else
  412.           if ((ti.ti_hour==23) && (ti.ti_min>30))
  413.             ok=0;
  414.     } else
  415.       if ((l==0) || (l==24)) {
  416.         if (ti.ti_hour>=h)
  417.           ok=0;
  418.         else
  419.           if ((ti.ti_hour==h-1) && (ti.ti_min>30))
  420.             ok=0;
  421.           else
  422.             if ((ti.ti_hour==0) && (ti.ti_min<12))
  423.               ok=0;
  424.       } else
  425.         if (h>l) {
  426.           if ((ti.ti_hour<l) || (ti.ti_hour>=h))
  427.             ok=0;
  428.           else
  429.             if ((ti.ti_hour==l) && (ti.ti_min<12))
  430.               ok=0;
  431.             else
  432.               if ((ti.ti_hour==h-1) && (ti.ti_min>30))
  433.                 ok=0;
  434.         } else {
  435.           if ((ti.ti_hour>=h) && (ti.ti_hour<l))
  436.             ok=0;
  437.           else
  438.             if ((ti.ti_hour==l) && (ti.ti_min<12))
  439.               ok=0;
  440.             else
  441.               if ((ti.ti_hour==h-1) && (ti.ti_min>30))
  442.                 ok=0;
  443.         }
  444.   }
  445.  
  446.   return(ok);
  447. }
  448.  
  449.  
  450.  
  451. #define WEIGHT 30.0
  452.  
  453. void fixup_long(long *f, long l)
  454. {
  455.   if (*f>l)
  456.     *f=l;
  457.  
  458.   if (*f+(86400L*30L)<l)
  459.     *f=l-86400L*30L;
  460. }
  461.  
  462. void attempt_callout()
  463. {
  464.   int *try,i,i1,i2,i3,index,ok,net_only;
  465.   float *weight,fl,fl1,fl2,ffl;
  466.   long l,l1;
  467.   char ch,s[81],s1[81];
  468.   struct time ti;
  469.  
  470.   net_only=1;
  471.   if (syscfg.netlowtime!= syscfg.nethightime) {
  472.     if (syscfg.nethightime>syscfg.netlowtime) {
  473.       if ((timer()<=(syscfg.netlowtime*60.0)) || (timer()>=(syscfg.nethightime*60.0)))
  474.         net_only=0;
  475.     } else {
  476.       if ((timer()<=(syscfg.netlowtime*60.0)) && (timer()>=(syscfg.nethightime*60.0)))
  477.         net_only=0;
  478.     }
  479.   } else
  480.     net_only=0;
  481.   time(&l);
  482.   if (last_time_c>l)
  483.     last_time_c=0L;
  484.   if (labs(last_time_c-l)<120)
  485.     return;
  486.   if (last_time_c==0L) {
  487.     last_time_c=l;
  488.     return;
  489.   }
  490.   if ((try=(int *)malloca(sizeof(int)*num_call_sys))==NULL)
  491.     return;
  492.   if ((weight=(float *)malloca(sizeof(float)*num_call_sys))==NULL) {
  493.     farfree(try);
  494.     return;
  495.   }
  496.   index=0;
  497.   fl2=0.0;
  498.   for (i=0; i<num_call_sys; i++) {
  499.     ok=ok_to_call(i);
  500.     i2=-1;
  501.     for (i1=0; i1<num_ncn; i1++)
  502.       if (ncn[i1].systemnumber==con[i].sysnum)
  503.     i2=i1;
  504.     if ((ok) && (i2!=-1)) {
  505.       if (ncn[i2].bytes_waiting==0L)
  506.     if (con[i].call_anyway) {
  507.           l1=(l-ncn[i2].lastcontact+60*3)/3600/24;
  508.       if (((unsigned char)l1 < con[i].call_anyway) ||
  509.          ((con[i].options & options_sendback)==0))
  510.             if (!net_only)
  511.               ok=0;
  512.     } else
  513.       ok=0;
  514.       if (con[i].options & options_once_per_day) {
  515.         if (labs(l-ncn[i2].lastcontactsent)<(20L*3600L/con[i].times_per_day))
  516.       ok=0;
  517.       }
  518.  
  519.       fixup_long((long *)&(ncn[i2].lastcontactsent),l);
  520.       fixup_long((long *)&(ncn[i2].lasttry),l);
  521.       if (ok) {
  522.     if (ncn[i2].bytes_waiting==0L)
  523.       fl=5.0*WEIGHT;
  524.     else
  525.       fl=1024.0/((float)ncn[i2].bytes_waiting)*WEIGHT*60.0;
  526.         fl1=(float) (l-ncn[i2].lasttry);
  527.     if ((fl<fl1) || (net_only)) {
  528.           try[index]=i;
  529.       fl1=fl1/fl;
  530.           if (fl1<1.0)
  531.         fl1=1.0;
  532.       if (fl1>5.0)
  533.         fl1=5.0;
  534.           weight[index]=fl1;
  535.       fl2 += weight[index];
  536.       ++index;
  537.     }
  538.       }
  539.     }
  540.   }
  541.   if (index) {
  542.     fl=fl2*((float)rand())/32767.0;
  543.     fl1=0.0;
  544.     i1=-1;
  545.     for (i=0; (i<index) && (i1==-1); i++) {
  546.       fl1 += weight[i];
  547.       if (fl1>=fl)
  548.     i1=i;
  549.     }
  550.     if (i1==-1)
  551.       i1=index-1;
  552.     i=try[i1];
  553.     farfree(try);
  554.     farfree(weight);
  555.     do_callout(con[i].sysnum);
  556.     time(&l);
  557.     last_time_c=l;
  558.   } else {
  559.     farfree(try);
  560.     farfree(weight);
  561.   }
  562. }
  563.  
  564. void force_callout()
  565. {
  566.   int i,i1,i2,i3,index,ok,sn;
  567.   float fl,fl1,fl2,ffl;
  568.   long l,l1;
  569.   char ch,s[81],s1[81];
  570.   struct time ti;
  571.  
  572.   time(&l);
  573.   nl();
  574.   prt(2,"1Which system? ");
  575.   input(s,5);
  576.   sn=atoi(s);
  577.   i=-1;
  578.   for (i1=0; i1<num_call_sys; i1++)
  579.     if (con[i1].sysnum==sn)
  580.       i=i1;
  581.   if (i==-1)
  582.     return;
  583.   ok=ok_to_call(i);
  584.   i2=-1;
  585.   for (i1=0; i1<num_ncn; i1++)
  586.     if (ncn[i1].systemnumber==con[i].sysnum)
  587.       i2=i1;
  588.   if (i2==-1)
  589.     ok=0;
  590.   else
  591.     if (!ok) {
  592.       nl();
  593.       prt(5,"3Are you sure? ");
  594.       if (yn())
  595.         ok=1;
  596.     }
  597.   if (ok) {
  598.     if (ncn[i2].bytes_waiting==0L)
  599.       if (!(con[i].options & options_sendback))
  600.     ok=0;
  601.     if (ok) {
  602.       do_callout(sn);
  603.     }
  604.   }
  605. }
  606.  
  607.  
  608. void print_pending_list()
  609. {
  610.   int i,any=0,i1,i2;
  611.   char s[81],ch,s1[81];
  612.   long l;
  613.  
  614.  
  615.   if (syscfg.systemnumber) {
  616.     time(&l);
  617.  
  618.     nl();
  619.     nl();
  620.     pl(" Network data pending transmission:");
  621.     nl();
  622.     pl(" System       Bytes     Hours");
  623.     pl(" ------      -------    -----");
  624.  
  625.     for (i=0; i<num_ncn; i++) {
  626.       if (ncn[i].bytes_waiting) {
  627.         i2=-1;
  628.         for (i1=0; i1<num_call_sys; i1++)
  629.           if (con[i1].sysnum==ncn[i].systemnumber)
  630.             i2=i1;
  631.         if (i2!=-1) {
  632.           if (ok_to_call(i2))
  633.             ch='*';
  634.           else
  635.             ch=' ';
  636.           any=1;
  637.           if (ncn[i].lastcontactsent)
  638.             ltoa((l-ncn[i].lastcontactsent)/3600,s1,10);
  639.           else
  640.             strcpy(s1,"-NEVER-");
  641.           sprintf(s,"%c%-5d       %7ld    %s",
  642.             ch,
  643.             ncn[i].systemnumber,
  644.             ncn[i].bytes_waiting,
  645.             s1);
  646.           pl(s);
  647.         }
  648.       }
  649.     }
  650.     if (!any)
  651.       pl("--NONE--");
  652.     nl();
  653.     if (!useron)
  654.       pausescr();
  655.   }
  656. }
  657.  
  658.