home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV412S.ZIP / BATCH.C next >
C/C++ Source or Header  |  1990-08-06  |  10KB  |  466 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.               Copyright (C) 1988 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 <stdio.h>
  18. #include <sys\stat.h>
  19. #include <fcntl.h>
  20. #include <time.h>
  21. #include <dos.h>
  22. #include <dir.h>
  23. #include <string.h>
  24. #include <io.h>
  25. #include <alloc.h>
  26. #include <stdlib.h>
  27. #include "vardec.h"
  28. #include "fcns.h"
  29.  
  30. extern userrec thisuser;
  31. extern directoryrec directories[64];
  32. extern int num_dirs,hangup,userfile,echo,useron,userfile,usernum;
  33. extern int incom,fwaiting,helpl;
  34. extern configrec syscfg;
  35. extern statusrec status;
  36. extern char ctypes[NUM_CTYPES][18];
  37. extern int edlf,dlf,curdir,numf;
  38. extern usersubrec udir[64];
  39. extern long nscandate;
  40. extern char curspeed[81],cdir[81],dszlog[81];
  41. extern unsigned int modem_speed,com_speed;
  42. extern float batchtime;
  43. extern int numbatch, numbatchdl, num_listed;
  44. extern batchrec *batch;
  45. extern double extratimecall;
  46. extern unsigned char realsl;
  47.  
  48. #define SETREC(i)  lseek(dlf,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  49.  
  50.  
  51. void listbatch()
  52. {
  53.   char s[81];
  54.   int abort,i;
  55.  
  56.   abort=0;
  57.   nl();
  58.   sprintf(s,"Files - %d  Time - %s",numbatch,ctim(batchtime));
  59.   pl(s);
  60.   nl();
  61.   for (i=0; (i<numbatch) && (!abort) && (!hangup); i++) {
  62.     sprintf(s,"%d. (%s) %s   %s",i+1,batch[i].sending?"D":"U",
  63.       batch[i].filename,ctim(batch[i].time));
  64.     pla(s,&abort);
  65.   }
  66. }
  67.  
  68. void delbatch(int i)
  69. {
  70.   int i1;
  71.  
  72.   if (i<numbatch) {
  73.     batchtime -= batch[i].time;
  74.     if (batch[i].sending)
  75.       --numbatchdl;
  76.     --numbatch;
  77.     for (i1=i; i1<=numbatch; i1++) {
  78.       batch[i1]=batch[i1+1];
  79.     }
  80.   }
  81. }
  82.  
  83. void downloaded(char *fn)
  84. {
  85.   int i,i1;
  86.   uploadsrec u;
  87.   char s[81];
  88.  
  89.   for (i1=0; i1<numbatch; i1++) {
  90.     if ((strcmp(fn,batch[i1].filename)==0) && (batch[i1].sending)) {
  91.       dliscan1(batch[i1].dir);
  92.       i=recno((batch[i1].filename));
  93.       if (i>0) {
  94.         SETREC(i);
  95.         read(dlf,(void *)&u,sizeof(uploadsrec));
  96.         ++thisuser.downloaded;
  97.         thisuser.dk += (int) ((u.numbytes+1023)/1024);
  98.         ++u.numdloads;
  99.         SETREC(i);
  100.         write(dlf,(void *)&u,sizeof(uploadsrec));
  101.         sprintf(s,"Downloaded '%s'",u.filename);
  102.         sysoplog(s);
  103.         sprintf(s,"%s downloaded '%s' on %s",
  104.           nam(&thisuser,usernum), u.filename, date());
  105.         ssm(u.ownerusr,0,s);
  106.       }
  107.       closedl();
  108.       delbatch(i1);
  109.  
  110.       return;
  111.     }
  112.   }
  113.   sprintf(s,"!!! Couldn't find '%s' in DL batch queue.",fn);
  114.   sysoplog(s);
  115. }
  116.  
  117.  
  118. void uploaded(char *fn)
  119. {
  120.   int i,i1;
  121.   uploadsrec u;
  122.   char s[81];
  123.  
  124.   for (i1=0; i1<numbatch; i1++) {
  125.     if ((strcmp(fn,batch[i1].filename)==0) && (!batch[i1].sending)) {
  126.       dliscan1(batch[i1].dir);
  127.       i=recno((batch[i1].filename));
  128.       if (i>0) {
  129.         SETREC(i);
  130.         read(dlf,(void *)&u,sizeof(uploadsrec));
  131.  
  132.         /* more here */
  133.  
  134.         ++thisuser.uploaded;
  135.         thisuser.uk += (int) ((u.numbytes+1023)/1024);
  136.         ++status.uptoday;
  137.         save_status();
  138.         SETREC(i);
  139.         write(dlf,(void *)&u,sizeof(uploadsrec));
  140.         sprintf(s,"+%s uploaded on %s",
  141.           u.filename,
  142.           directories[batch[i1].dir].name);
  143.         sysoplog(s);
  144.       }
  145.       closedl();
  146.       delbatch(i1);
  147.  
  148.       return;
  149.     }
  150.   }
  151.   sprintf(s,"!!! Couldn't find '%s' in UL batch queue.",fn);
  152.   sysoplog(s);
  153. }
  154.  
  155. void ymbatchdl(int had)
  156. {
  157.   int rr,i,ok,cur=0;
  158.   char s[81];
  159.   uploadsrec u;
  160.   double percent;
  161.  
  162.   if (!incom)
  163.     return;
  164.   sprintf(s,"YMBATCH, %d files, time=%s",numbatchdl, ctim(batchtime));
  165.   if (had)
  166.     strcat(s,", HAD");
  167.   sysoplog(s);
  168.  
  169.   rr=0;
  170.   do {
  171.     tleft(1);
  172.     if ((syscfg.req_ratio>0.0001) && (ratio()<syscfg.req_ratio))
  173.       rr=1;
  174.     if (thisuser.exempt & exempt_ratio)
  175.       rr=0;
  176.     if (!batch[cur].sending) {
  177.       rr=0;
  178.       ++cur;
  179.     }
  180.     if ((nsl()>=batch[cur].time) && (!rr)) {
  181.       dliscan1(batch[cur].dir);
  182.       i=recno(batch[cur].filename);
  183.       if (i<=0) {
  184.         delbatch(cur);
  185.         closedl();
  186.       } else {
  187.         sprintf(s,"%d files left, Time left = %s\r\n",numbatchdl,ctim(batchtime));
  188.         outs(s);
  189.         SETREC(i);
  190.         read(dlf,(void *)&u,sizeof(uploadsrec));
  191.         closedl();
  192.         strcpy(s,directories[batch[cur].dir].path);
  193.         strcat(s,u.filename);
  194.         xymodem_send(s,&ok,&percent,u.filetype,1,1,1);
  195.         if (ok) {
  196.           downloaded(u.filename);
  197.         } else {
  198.           closedl();
  199.         }
  200.       }
  201.     } else
  202.       delbatch(cur);
  203.   } while ((ok) && (!hangup) && (numbatch>cur) && (!rr));
  204.   if ((ok) && (!hangup))
  205.     endbatch();
  206.   if (rr) {
  207.     nl();
  208.     pl("Your ratio is too low to continue the transfer.");
  209.     nl();
  210.   }
  211. }
  212.  
  213.  
  214. void handle_dszline(char *l)
  215. {
  216.   char *ss;
  217.   int i;
  218.   char s[161];
  219.  
  220.   /* find the filename */
  221.   ss=strtok(l," \t");
  222.   for (i=0; (i<10) && (ss); i++)
  223.     ss=strtok(NULL," \t");
  224.  
  225.   if (ss) {
  226.     strcpy(s,stripfn(ss));
  227.     align(s);
  228.  
  229.     switch(*l) {
  230.       case 'Z':
  231.       case 'S':
  232.       case 'R':
  233.       case 'B':
  234.         /* received a file */
  235.         uploaded(s);
  236.         break;
  237.  
  238.       case 'z':
  239.       case 's':
  240.       case 'r':
  241.       case 'b':
  242.         /* sent a file */
  243.         downloaded(s);
  244.         break;
  245.  
  246.       case 'E':
  247.       case 'L':
  248.       case 'U':
  249.         /* error */
  250.         sprintf(s,"Error transferring '%s'",ss);
  251.         sysoplog(s);
  252.         break;
  253.     }
  254.   }
  255. }
  256.  
  257.  
  258.  
  259. double ratio1(long a)
  260. {
  261.   double r;
  262.  
  263.   if ((thisuser.dk==0) && (a==0))
  264.     return(99.999);
  265.   r=((float) thisuser.uk) / ((float) (thisuser.dk + a));
  266.   if (r>99.998)
  267.     r=99.998;
  268.   return(r);
  269. }
  270.  
  271. void process_dszlog()
  272. {
  273.   int f,i,i1;
  274.   char *ss;
  275.   char *lines[100];
  276.  
  277.   f=open(dszlog,O_RDONLY | O_TEXT);
  278.   if (f>0) {
  279.     i1=(int)filelength(f);
  280.     ss=malloca(i1);
  281.     if (ss) {
  282.       i=read(f,ss,i1);
  283.       if (i>0) {
  284.         ss[i]=0;
  285.         lines[0]=strtok(ss,"\n");
  286.         for (i=1; (i<90) && (lines[i-1]); i++)
  287.           lines[i]=strtok(NULL,"\n");
  288.  
  289.         lines[99]=NULL;
  290.  
  291.         for (i1=0; lines[i1]; i1++) {
  292.           handle_dszline(lines[i1]);
  293.         }
  294.  
  295.       }
  296.       farfree(ss);
  297.     }
  298.     close(f);
  299.   }
  300.   _chmod(dszlog,1,0);
  301.   unlink(dszlog);
  302. }
  303.  
  304.  
  305. void dszbatchdl(int had)
  306. {
  307.   char s[255],listfn[81],sx1[21],sx2[21],sx3[21],dl[100];
  308.   int i,i1,f,ok;
  309.   double at=0.0;
  310.   long addk=0,thisk;
  311.  
  312.  
  313.   sprintf(dl,"DSZBATCH, %d files, time=%s",numbatchdl, ctim(batchtime));
  314.   if (had)
  315.     strcat(dl,", HAD");
  316.   sysoplog(dl);
  317.  
  318.   sprintf(listfn,"%s\\FILES.DL",cdir);
  319.  
  320.   _chmod(listfn,1,0);
  321.   unlink(listfn);
  322.   _chmod(dszlog,1,0);
  323.   unlink(dszlog);
  324.  
  325.   f=open(listfn,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  326.   if (f<0)
  327.     return;
  328.  
  329.   for (i=0; i<numbatch; i++) {
  330.     if (batch[i].sending) {
  331.       sprintf(s,"%s%s\r\n",directories[batch[i].dir].path,stripfn(batch[i].filename));
  332.       ok=1;
  333.       if (nsl() < (batch[i].time + at))
  334.         ok=0;
  335.       thisk=(batch[i].len+1023)/1024;
  336.       if ((syscfg.req_ratio>0.0001) && (ratio1(addk+thisk)<syscfg.req_ratio) &&
  337.           (!(thisuser.exempt & exempt_ratio)))
  338.         ok=0;
  339.       if (ok) {
  340.         write(f,s,strlen(s));
  341.         at += batch[i].time;
  342.         addk += thisk;
  343.       }
  344.     }
  345.   }
  346.   close(f);
  347.  
  348.   ultoa(com_speed,sx1,10);
  349.   ultoa(modem_speed,sx3,10);
  350.   sx2[0]='0'+syscfg.primaryport;
  351.   sx2[1]=0;
  352.   stuff_in(s,syscfg.dszbatchdl,sx1,sx2,listfn,sx3,"");
  353.   if (s[0]) {
  354.     clrscrb();
  355.     outs(dl);
  356.     outs("\r\n");
  357.     outs(s);
  358.     outs("\r\n");
  359.     if (incom) {
  360.       run_external1(s);
  361.       process_dszlog();
  362.       topscreen();
  363.     }
  364.   }
  365.  
  366.   _chmod(listfn,1,0);
  367.   unlink(listfn);
  368.   _chmod(dszlog,1,0);
  369.   unlink(dszlog);
  370. }
  371.  
  372. void batchdl()
  373. {
  374.   int i,abort,done,i1,i2,had,dsz;
  375.   char s[81],ch,ch1;
  376.  
  377.   done=0;
  378.   if (numbatch==0) {
  379.     nl();
  380.     pl("No files in queue.");
  381.     nl();
  382.     return;
  383.   }
  384.   do {
  385.     nl();
  386.     prt(2,"Batch: L,D,R,Q,C,? : ");
  387.     ch=onek("Q?CLRD");
  388.     switch(ch) {
  389.       case '?':
  390.         printmenu(9);
  391.         break;
  392.       case 'Q':
  393.         done=1;
  394.         break;
  395.       case 'L':
  396.         listbatch();
  397.         break;
  398.       case 'R':
  399.         nl();
  400.         prt(2,"Remove which? ");
  401.         input(s,2);
  402.         i=atoi(s);
  403.         if ((i>0) && (i<=numbatch)) {
  404.           delbatch(i-1);
  405.         }
  406.         if (numbatch==0) {
  407.           nl();
  408.           pl("Batch queue empty.");
  409.           nl();
  410.           done=1;
  411.         }
  412.         break;
  413.       case 'C':
  414.         prt(5,"Clear queue? ");
  415.         if (yn()) {
  416.           numbatch=0;
  417.           numbatchdl=0;
  418.           batchtime=0.0;
  419.           done=1;
  420.           pl("Queue cleared.");
  421.         }
  422.         break;
  423.       case 'D':
  424.         nl();
  425.         if (!ratio_ok()) {
  426.           nl();
  427.           pl("Sorry, your ratio is too low.");
  428.           nl();
  429.           break;
  430.         }
  431.  
  432.         dsz=0;
  433.         if (syscfg.dszbatchdl[0]) {
  434.           nl();
  435.           pl("Please select protocol:");
  436.           nl();
  437.           prt(2,"Y)modem, Z)modem, Q)uit? ");
  438.           ch=onek("QYZ");
  439.           if (ch=='Q')
  440.             break;
  441.           else if (ch=='Z')
  442.             dsz=1;
  443.         }
  444.         nl();
  445.         prt(5,"Hang up after transfer? ");
  446.         had=yn();
  447.         nl();
  448.         sprintf(s,"Transmitting:  Files - %d  Time - %s",numbatch,ctim(batchtime));
  449.         pl(s);
  450.         nl();
  451.  
  452.         if (dsz)
  453.           dszbatchdl(had);
  454.         else
  455.           ymbatchdl(had);
  456.  
  457.         if (had)
  458.           hangup=1;
  459.         done=1;
  460.         break;
  461.     }
  462.   } while ((!done) && (!hangup));
  463. }
  464.  
  465.  
  466.