home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / NETSUP.C < prev    next >
C/C++ Source or Header  |  1993-09-11  |  13KB  |  612 lines

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