home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / BATCH.C next >
Text File  |  1992-07-28  |  15KB  |  694 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7.  
  8. #include "vars.h"
  9. #pragma hdrstop
  10. #include <dir.h>
  11. #define SETREC(i)  lseek(dlf,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  12.  
  13. void listbatch()
  14. {
  15.   char s[81];
  16.   int abort,i;
  17.  
  18.   abort=0;
  19.   nl();
  20.   if (numbatchdl)
  21.     npr("1Files 7- 1%d  Time 7- 1%s\r\n",numbatch,ctim(batchtime));
  22.   else
  23.     npr("1Files 7- 1%d\r\n",numbatch);
  24.   nl();
  25.   for (i=0; (i<numbatch) && (!abort) && (!hangup); i++) {
  26.     if (batch[i].sending)
  27.       sprintf(s,"1[7%d1] (7D1) %s   %s  %s",i+1, batch[i].filename,
  28.       ctim(batch[i].time),
  29.       directories[batch[i].dir].name);
  30.     else
  31.       sprintf(s,"1[7%d1] (7U1) %s             %s",i+1,batch[i].filename,
  32.       directories[batch[i].dir].name);
  33.  
  34.     pla(s,&abort);
  35.   }
  36. }
  37.  
  38. void delbatch(int i)
  39. {
  40.   int i1;
  41.  
  42.   if (i<numbatch) {
  43.     if (batch[i].sending) {
  44.       batchtime -= batch[i].time;
  45.       --numbatchdl;
  46.     }
  47.     --numbatch;
  48.     for (i1=i; i1<=numbatch; i1++) {
  49.       batch[i1]=batch[i1+1];
  50.     }
  51.   }
  52. }
  53.  
  54. void downloaded(char *fn)
  55. {
  56.   int i,i1;
  57.   uploadsrec u;
  58.   char s[81];
  59.  
  60.   for (i1=0; i1<numbatch; i1++) {
  61.     if ((strcmp(fn,batch[i1].filename)==0) && (batch[i1].sending)) {
  62.       dliscan1(batch[i1].dir);
  63.       i=recno((batch[i1].filename));
  64.       if (i>0) {
  65.         SETREC(i);
  66.         read(dlf,(void *)&u,sizeof(uploadsrec));
  67.         ++thisuser.downloaded;
  68.         thisuser.dk += (int) ((u.numbytes+1023)/1024);
  69.         ++u.numdloads;
  70.         SETREC(i);
  71.         write(dlf,(void *)&u,sizeof(uploadsrec));
  72.     sprintf(s,"Leeched '%s'",u.filename);
  73.     sysoplog(s);
  74.     if (syscfg.sysconfig & sysconfig_log_dl) {
  75.       sprintf(s,"%s Leeched '%s' on %s",
  76.         nam(&thisuser,usernum), u.filename, date());
  77.       ssm(u.ownerusr,0,s);
  78.     }
  79.       }
  80.       closedl();
  81.       delbatch(i1);
  82.  
  83.       return;
  84.     }
  85.   }
  86.   sprintf(s,"!!! Couldn't find '%s' in DL batch queue.",fn);
  87.   sysoplog(s);
  88. }
  89.  
  90. void didnt_upload(int ind)
  91. {
  92.   int i,i1;
  93.   char s[81];
  94.   uploadsrec u;
  95.  
  96.   if (batch[ind].sending)
  97.     return;
  98.  
  99.   dliscan1(batch[ind].dir);
  100.   i=recno(batch[ind].filename);
  101.   if (i>0) {
  102.     do {
  103.       SETREC(i);
  104.       read(dlf, &u, sizeof(uploadsrec));
  105.       if (u.numbytes!=0)
  106.         i=nrecno(batch[ind].filename, i);
  107.     } while ((i!=-1) && (u.numbytes!=0));
  108.  
  109.     if ((i!=-1) && (u.numbytes==0)) {
  110.       if (u.mask & mask_extended)
  111.         delete_extended_description(u.filename);
  112.       for (i1=i; i1<numf; i1++) {
  113.         SETREC(i1+1);
  114.         read(dlf,(void *)&u,sizeof(uploadsrec));
  115.         SETREC(i1);
  116.         write(dlf,(void *)&u,sizeof(uploadsrec));
  117.       }
  118.       --i;
  119.       --numf;
  120.       SETREC(0);
  121.       read(dlf, &u, sizeof(uploadsrec));
  122.       u.numbytes=numf;
  123.       SETREC(0);
  124.       write(dlf,(void *)&u,sizeof(uploadsrec));
  125.       closedl();
  126.       return;
  127.     }
  128.   }
  129.   sprintf(s,"!!! Couldn't find '%s' in transfer area.",batch[ind].filename);
  130.   sysoplog(s);
  131.  
  132.   closedl();
  133. }
  134.  
  135.  
  136. void uploaded(char *fn)
  137. {
  138.   int i,i1, d1, d2, rn;
  139.   uploadsrec u;
  140.   char s[81], s1[81], s2[81];
  141.   char *b;
  142.  
  143.   for (i1=0; i1<numbatch; i1++) {
  144.     if ((strcmp(fn,batch[i1].filename)==0) && (!batch[i1].sending)) {
  145.       dliscan1(batch[i1].dir);
  146.       rn=recno((batch[i1].filename));
  147.       if (rn>0) {
  148.         do {
  149.           SETREC(rn);
  150.           read(dlf, &u, sizeof(uploadsrec));
  151.           if (u.numbytes!=0)
  152.             rn=nrecno(batch[i1].filename, rn);
  153.         } while ((rn!=-1) && (u.numbytes!=0));
  154.  
  155.         if ((rn!=-1) && (u.numbytes==0)) {
  156.  
  157.           sprintf(s1,"%s%s",syscfg.batchdir, fn);
  158.           sprintf(s2,"%s%s", directories[batch[i1].dir].path, fn);
  159.  
  160.           if ((strcmp(s1,s2)!=0) && (exist(s1))) {
  161.             d2=0;
  162.             if ((s1[1]!=':') && (s2[1]!=':'))
  163.               d2=1;
  164.             if ((s1[1]==':') && (s2[1]==':') && (s1[0]==s2[0]))
  165.               d2=1;
  166.             if (d2) {
  167.               rename(s1,s2);
  168.               unlink(s1);
  169.             } else {
  170.               if ((b=malloca(16400))==NULL)
  171.                 return;
  172.               d1=open(s1,O_RDONLY | O_BINARY);
  173.               d2=open(s2,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  174.               i=read(d1,(void *)b,16384);
  175.               while (i>0) {
  176.                 write(d2,(void *)b,i);
  177.                 i=read(d1,(void *)b,16384);
  178.               }
  179.               close(d1);
  180.               close(d2);
  181.               unlink(s1);
  182.               farfree(b);
  183.             }
  184.           }
  185.  
  186.           d1=open(s2,O_RDONLY | O_BINARY);
  187.           if (d1>0) {
  188.             if (syscfg.upload_c[0]) {
  189.               close(d1);
  190.               if (check_ul_event(batch[i1].dir, &u)) {
  191.                 closedl();
  192.                 didnt_upload(i1);
  193.                 delbatch(i1);
  194.                 d1=-1;
  195.               } else {
  196.                 d1=open(s2,O_RDONLY | O_BINARY);
  197.               }
  198.             }
  199.             if (d1>=0) {
  200.               u.numbytes = filelength(d1);
  201.               close(d1);
  202.  
  203.               ++thisuser.uploaded;
  204.               thisuser.uk += (int) ((u.numbytes+1023)/1024);
  205.               ++status.uptoday;
  206.               save_status();
  207.               SETREC(rn);
  208.               write(dlf,(void *)&u,sizeof(uploadsrec));
  209.           sprintf(s,"+%s Uploaded on %s",
  210.         u.filename,
  211.         directories[batch[i1].dir].name);
  212.           sysoplog(s);
  213.           npr("Uploaded '%s' to %s\r\n",u.filename,
  214.         directories[batch[i1].dir].name);
  215.         }
  216.       }
  217.       closedl();
  218.       delbatch(i1);
  219.       return;
  220.     }
  221.       }
  222.       sprintf("!!! Couldn't find file '%s' in directory.", fn);
  223.       sysoplog(s);
  224.       npr("Couldn't find data for file '%s'; deleting\r\n",fn);
  225.       closedl();
  226.       didnt_upload(i1);
  227.       delbatch(i1);
  228.  
  229.       return;
  230.     }
  231.   }
  232.   sprintf(s,"!!! Couldn't find '%s' in UL batch queue.",fn);
  233.   sysoplog(s);
  234.   npr("Don't know what to do with file '%s'; deleting\r\n",fn);
  235.  
  236.   sprintf(s,"%s%s",syscfg.batchdir, fn);
  237.   unlink(s);
  238. }
  239.  
  240. void ymbatchdl(int had)
  241. {
  242.   int rr,i,ok,cur=0;
  243.   char s[81];
  244.   uploadsrec u;
  245.   double percent;
  246.  
  247.   if (!incom)
  248.     return;
  249.   sprintf(s,"Ymodem BATCH DL, %d files, time=%s",numbatchdl, ctim(batchtime));
  250.   if (had)
  251.     strcat(s,", HAD");
  252.   sysoplog(s);
  253.   nl();
  254.   pl(s);
  255.   nl();
  256.  
  257.   rr=0;
  258.   do {
  259.     tleft(1);
  260.     if ((syscfg.req_ratio>0.0001) && (ratio()<syscfg.req_ratio))
  261.       rr=1;
  262.     if (thisuser.exempt & exempt_ratio)
  263.       rr=0;
  264.     if (!batch[cur].sending) {
  265.       rr=0;
  266.       ++cur;
  267.     }
  268.     if ((nsl()>=batch[cur].time) && (!rr)) {
  269.       dliscan1(batch[cur].dir);
  270.       i=recno(batch[cur].filename);
  271.       if (i<=0) {
  272.         delbatch(cur);
  273.         closedl();
  274.       } else {
  275.         sprintf(s,"%d files left, Time left = %s\r\n",numbatchdl,ctim(batchtime));
  276.         outs(s);
  277.         SETREC(i);
  278.         read(dlf,(void *)&u,sizeof(uploadsrec));
  279.         closedl();
  280.         sprintf(s,"%s%s",directories[batch[cur].dir].path,u.filename);
  281.         xymodem_send(s,&ok,&percent,u.filetype,1,1,1);
  282.         if (ok) {
  283.           downloaded(u.filename);
  284.         } else {
  285.           closedl();
  286.         }
  287.       }
  288.     } else
  289.       delbatch(cur);
  290.   } while ((ok) && (!hangup) && (numbatch>cur) && (!rr));
  291.   if ((ok) && (!hangup))
  292.     endbatch();
  293.   if (rr) {
  294.     nl();
  295.     pl("Your ratio is too low to continue the transfer.");
  296.     nl();
  297.   }
  298.   if (had) {
  299.     dtr(0);
  300.     hangup=1;
  301.   }
  302. }
  303.  
  304.  
  305. void handle_dszline(char *l)
  306. {
  307.   char *ss;
  308.   int i;
  309.   char s[161];
  310.  
  311.   /* find the filename */
  312.   ss=strtok(l," \t");
  313.   for (i=0; (i<10) && (ss); i++)
  314.     ss=strtok(NULL," \t");
  315.  
  316.   if (ss) {
  317.     strcpy(s,stripfn(ss));
  318.     align(s);
  319.  
  320.     switch(*l) {
  321.       case 'Z':
  322.       case 'S':
  323.       case 'R':
  324.       case 'B':
  325.       case 'H':
  326.     /* received a file */
  327.     uploaded(s);
  328.     break;
  329.  
  330.       case 'z':
  331.       case 's':
  332.       case 'r':
  333.       case 'b':
  334.       case 'h':
  335.         /* sent a file */
  336.         downloaded(s);
  337.         break;
  338.  
  339.       case 'E':
  340.       case 'L':
  341.       case 'U':
  342.         /* error */
  343.         sprintf(s,"Error transferring '%s'",ss);
  344.         sysoplog(s);
  345.         break;
  346.     }
  347.   }
  348. }
  349.  
  350.  
  351.  
  352. double ratio1(long a)
  353. {
  354.   double r;
  355.  
  356.   if ((thisuser.dk==0) && (a==0))
  357.     return(99.999);
  358.   r=((float) thisuser.uk) / ((float) (thisuser.dk + a));
  359.   if (r>99.998)
  360.     r=99.998;
  361.   return(r);
  362. }
  363.  
  364. void make_ul_batch_list(char *listfn)
  365. {
  366.   int f,i;
  367.   char s[255];
  368.  
  369.   sprintf(listfn,"%s\\FILES.UL",cdir);
  370.  
  371.   _chmod(listfn,1,0);
  372.   unlink(listfn);
  373.  
  374.   f=open(listfn,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  375.   if (f<0) {
  376.     listfn[0]=0;
  377.     return;
  378.   }
  379.  
  380.   for (i=0; i<numbatch; i++) {
  381.     if (!batch[i].sending) {
  382.       sprintf(s,"%s%s\r\n",directories[batch[i].dir].path,stripfn(batch[i].filename));
  383.       write(f,s,strlen(s));
  384.     }
  385.   }
  386.   close(f);
  387. }
  388.  
  389. void make_dl_batch_list(char *listfn)
  390. {
  391.   char s[255];
  392.   int i, f, ok;
  393.   double at=0.0;
  394.   long addk=0,thisk;
  395.  
  396.   sprintf(listfn,"%s\\FILES.DL",cdir);
  397.  
  398.   _chmod(listfn,1,0);
  399.   unlink(listfn);
  400.  
  401.   f=open(listfn,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  402.   if (f<0) {
  403.     listfn[0]=0;
  404.     return;
  405.   }
  406.  
  407.   for (i=0; i<numbatch; i++) {
  408.     if (batch[i].sending) {
  409.       sprintf(s,"%s%s\r\n",directories[batch[i].dir].path,stripfn(batch[i].filename));
  410.       ok=1;
  411.       if (nsl() < (batch[i].time + at))
  412.         ok=0;
  413.       thisk=(batch[i].len+1023)/1024;
  414.       if ((syscfg.req_ratio>0.0001) && (ratio1(addk+thisk)<syscfg.req_ratio) &&
  415.           (!(thisuser.exempt & exempt_ratio)))
  416.         ok=0;
  417.       if (ok) {
  418.         write(f,s,strlen(s));
  419.         at += batch[i].time;
  420.         addk += thisk;
  421.       }
  422.     }
  423.   }
  424.   close(f);
  425. }
  426.  
  427.  
  428. void run_cmd(char *cmdln, char *downlist, char *uplist, char *dl, int had)
  429. {
  430.   char sx1[21], sx2[21], sx3[21], s[161];
  431.  
  432.   ultoa(com_speed,sx1,10);
  433.   ultoa(modem_speed,sx3,10);
  434.   sx2[0]='0'+syscfg.primaryport;
  435.   sx2[1]=0;
  436.   stuff_in(s,cmdln,sx1,sx2,downlist,sx3,uplist);
  437.   if (s[0]) {
  438.     make_abs_cmd(s);
  439.     clrscrb();
  440.     outs(dl);
  441.     outs("\r\n");
  442.     outs(s);
  443.     outs("\r\n");
  444.     if (incom) {
  445.       _chmod(dszlog,1,0);
  446.       unlink(dszlog);
  447.  
  448.       if (uplist[0])
  449.         cd_to(syscfg.batchdir);
  450.  
  451.       run_external1(s);
  452.  
  453.       cd_to(cdir);
  454.  
  455.       if (had) {
  456.         dtr(0);
  457.         hangup=1;
  458.         wait1(2);
  459.         if (!cdet()) {
  460.           dtr(1);
  461.           wait1(2);
  462.           holdphone(1);
  463.         }
  464.       } else {
  465.         nl();
  466.     pl("1Please wait5...");
  467.     nl();
  468.       }
  469.       process_dszlog();
  470.       _chmod(dszlog,1,0);
  471.       unlink(dszlog);
  472.       topscreen();
  473.     }
  474.   }
  475.   if (downlist[0]) {
  476.     _chmod(downlist,1,0);
  477.     unlink(downlist);
  478.   }
  479.   if (uplist[0]) {
  480.     _chmod(uplist,1,0);
  481.     unlink(uplist);
  482.   }
  483. }
  484.  
  485.  
  486. void process_dszlog()
  487. {
  488.   int f,i,i1;
  489.   char *ss;
  490.   char *lines[100];
  491.  
  492.   f=open(dszlog,O_RDONLY | O_TEXT);
  493.   if (f>0) {
  494.     i1=(int)filelength(f);
  495.     ss=malloca(i1);
  496.     if (ss) {
  497.       i=read(f,ss,i1);
  498.       if (i>0) {
  499.         ss[i]=0;
  500.         lines[0]=strtok(ss,"\n");
  501.         for (i=1; (i<90) && (lines[i-1]); i++)
  502.       lines[i]=strtok(NULL,"\n");
  503.     lines[99]=NULL;
  504.         for (i1=0; lines[i1]; i1++) {
  505.           handle_dszline(lines[i1]);
  506.     }
  507.       }
  508.       farfree(ss);
  509.     }
  510.     close(f);
  511.   }
  512.   _chmod(dszlog,1,0);
  513.   unlink(dszlog);
  514. }
  515.  
  516. void dszbatchdl(int had, char *cmdln, char *desc)
  517. {
  518.   char listfn[81],dl[100];
  519.  
  520.  
  521.   sprintf(dl,"%s BATCH DL, %d files, time=%s",
  522.           desc, numbatchdl, ctim(batchtime));
  523.   if (had)
  524.     strcat(dl,", HAD");
  525.   sysoplog(dl);
  526.   nl();
  527.   pl(dl);
  528.   nl();
  529.   make_dl_batch_list(listfn);
  530.   run_cmd(cmdln, listfn, "", dl, had);
  531. }
  532.  
  533. void dszbatchul(int had, char *cmdln, char *desc)
  534. {
  535.   char listfn[81],dl[100];
  536.   int i,i1,f,ok;
  537.   double ti;
  538.  
  539.   sprintf(dl,"%s BATCH UL, %d files", desc, numbatch-numbatchdl);
  540.   if (had)
  541.     strcat(dl,", HAD");
  542.   sysoplog(dl);
  543.   nl();
  544.   pl(dl);
  545.   nl();
  546.   make_ul_batch_list(listfn);
  547.   ti=timer();
  548.   run_cmd(cmdln, "", listfn, dl, had);
  549.   ti=timer()-ti;
  550.   if (ti<0)
  551.     ti += 24.0*3600.0;
  552.   thisuser.extratime += ti;
  553. }
  554.  
  555. /****************************************************************************/
  556. /*
  557.  * Bimodem batch has not yet been implemented.
  558.  */
  559.  
  560. #pragma warn -par
  561.  
  562. void bibatch(int had, int pn)
  563. {
  564. }
  565.  
  566. #pragma warn +par
  567.  
  568. /****************************************************************************/
  569.  
  570. void batchdl()
  571. {
  572.   int i,abort,done,i1,i2,had,dsz;
  573.   char s[81],s1[81],ch,ch1;
  574.  
  575.   done=0;
  576.   if (numbatch==0) {
  577.     nl();
  578.     pl("6No files in queue.");
  579.     nl();
  580.     return;
  581.   }
  582.   do {
  583.     nl();
  584.     prt(2,"7[1Batch7] 1L7,1R7,1Q7,1C7,1D7,1U7,1B7,1? 7: ");
  585.     ch=onek("Q?CLRDUB");
  586.     switch(ch) {
  587.       case '?':
  588.         printmenu(9);
  589.         break;
  590.       case 'Q':
  591.         done=1;
  592.         break;
  593.       case 'L':
  594.         listbatch();
  595.         break;
  596.       case 'R':
  597.         nl();
  598.         prt(2,"Remove which? ");
  599.         input(s,2);
  600.         i=atoi(s);
  601.         if ((i>0) && (i<=numbatch)) {
  602.           didnt_upload(i-1);
  603.           delbatch(i-1);
  604.         }
  605.         if (numbatch==0) {
  606.           nl();
  607.       pl("6Batch queue empty.");
  608.       nl();
  609.       done=1;
  610.     }
  611.     break;
  612.       case 'C':
  613.     prt(5,"eClear queue? ");
  614.         if (yn()) {
  615.           for (i=0; i<numbatch; i++)
  616.             didnt_upload(i);
  617.           numbatch=0;
  618.           numbatchdl=0;
  619.           batchtime=0.0;
  620.           done=1;
  621.       pl("6Queue cleared.");
  622.     }
  623.     break;
  624.       case 'U':
  625.         if (numbatchdl==numbatch) {
  626.           nl();
  627.       pl("6Nothing in batch upload queue.");
  628.       nl();
  629.       break;
  630.     }
  631.     nl();
  632.     prt(5,"eHang up after transfer? ");
  633.         had=yn();
  634.     nl();
  635.     i=get_protocol(xf_up_batch);
  636.     if (i>0) {
  637.       dszbatchul(had, externs[i-6].receivebatchfn, externs[i-6].description);
  638.       if (!had) {
  639.         nl();
  640.         /* npr("Your ratio is now: %-6.3f\r\n",ratio()); */
  641.       }
  642.       done=1;
  643.     }
  644.     break;
  645.       case 'B':
  646.         nl();
  647.     prt(5,"eHang up after transfer? ");
  648.         had=yn();
  649.     nl();
  650.     i=get_protocol(xf_bi);
  651.     if (i>0) {
  652.       bibatch(had, i);
  653.       if (!had) {
  654.         nl();
  655.         /* npr("Your ratio is now: %-6.3f\r\n",ratio()); */
  656.       }
  657.       done=1;
  658.     }
  659.     break;
  660.       case 'D':
  661.         if (numbatchdl==0) {
  662.           nl();
  663.       pl("6Nothing in batch download queue.");
  664.       nl();
  665.       break;
  666.     }
  667.         nl();
  668.         if (!ratio_ok()) {
  669.           nl();
  670.           pl("Sorry, your ratio is too low.");
  671.           nl();
  672.           break;
  673.     }
  674.     nl();
  675.     prt(5,"eHang up after transfer? ");
  676.         had=yn();
  677.     nl();
  678.     i=get_protocol(xf_down_batch);
  679.     if (i>0) {
  680.           if (i==4)
  681.             ymbatchdl(had);
  682.           else
  683.             dszbatchdl(had,externs[i-6].sendbatchfn, externs[i-6].description);
  684.       if (!had) {
  685.         nl();
  686.         /* npr("Your ratio is now: %-6.3f\r\n",ratio()); */
  687.       }
  688.       done=1;
  689.     }
  690.     break;
  691.     }
  692.   } while ((!done) && (!hangup));
  693. }
  694.