home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / BATCH.C next >
Text File  |  1993-04-23  |  15KB  |  687 lines

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