home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / XFEROVL2.C < prev    next >
Text File  |  1995-05-12  |  32KB  |  1,287 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 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.  
  22. #define SETREC(f,i)  sh_lseek(f,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  23.  
  24. /* number of dots for searching */
  25. #define DOTS 5
  26.  
  27. /* color for frame */
  28. #define FRAME 7
  29.  
  30. /* How far to indent extended descriptions */
  31. #define INDENTION 24
  32.  
  33. /* the archive type to use */
  34. #define ARC_NUMBER 0
  35.  
  36. extern int foundany;
  37.  
  38. /****************************************************************************/
  39.  
  40. void modify_extended_description(char **sss, char *dest, char *title)
  41. {
  42.   char s[161],s1[161];
  43.   int f,ii,i,i1,i2,i3,i4;
  44.  
  45.   if (*sss)
  46.     ii=1;
  47.   else
  48.     ii=0;
  49.   i4=0;
  50.   do {
  51.     if (ii) {
  52.       nl();
  53.       if (okfsed() && (sysinfo.flags & OP_FLAGS_FSED_EXT_DESC))
  54.         prt(5,get_string(734));
  55.       else
  56.         prt(5,get_string(735));
  57.       if (!yn())
  58.         return;
  59.     } else {
  60.       nl();
  61.       prt(5,get_string(736));
  62.       if (!yn())
  63.         return;
  64.     }
  65.     if (okfsed() && (sysinfo.flags & OP_FLAGS_FSED_EXT_DESC)) {
  66.       sprintf(s,"%sEXTENDED.DSC", syscfgovr.tempdir);
  67.       if (*sss) {
  68.         f=sh_open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  69.         sh_write(f,*sss,strlen(*sss));
  70.         sh_close(f);
  71.         bbsfree(*sss);
  72.         *sss=NULL;
  73.       } else
  74.         unlink(s);
  75.       i=thisuser.screenchars;
  76.       if (thisuser.screenchars>(76-INDENTION))
  77.         thisuser.screenchars=76-INDENTION;
  78.       i1=external_edit("extended.dsc",syscfgovr.tempdir,(int) thisuser.defed-1,
  79.         sysinfo.max_extend_lines, dest, title, 1);
  80.       thisuser.screenchars=i;
  81.       if (i1) {
  82.         if ((*sss=malloca(10240))==NULL)
  83.           return;
  84.         f=sh_open1(s,O_RDWR | O_BINARY);
  85.         sh_read(f,*sss,(int) filelength(f));
  86.         (*sss)[filelength(f)]=0;
  87.         sh_close(f);
  88.       }
  89.       for (i3=strlen(*sss)-1; i3>=0; i3--)
  90.         if ((*sss)[i3]==1)
  91.           (*sss)[i3]=' ';
  92.     } else {
  93.       if (*sss)
  94.         bbsfree(*sss);
  95.       if ((*sss=malloca(10240))==NULL)
  96.         return;
  97.       *sss[0]=0;
  98.       i=1;
  99.       nl();
  100.       sprintf(s,"%s %d %s, %d %s",
  101.               get_string(737), sysinfo.max_extend_lines,
  102.               get_string(738), 78-INDENTION, get_string(739));
  103.       pl(s);
  104.       nl();
  105.       s[0]=0;
  106.       i1=thisuser.screenchars;
  107.       if (thisuser.screenchars>(76-INDENTION))
  108.         thisuser.screenchars=76-INDENTION;
  109.       do {
  110.         ansic(2);
  111.         npr("%d: ",i);
  112.         ansic(0);
  113.         s1[0]=0;
  114.         while (inli2(s1,s,90,1,i4)) {
  115.           if (i>1)
  116.             --i;
  117.           itoa(i,s1,10);
  118.           strcat(s1,": ");
  119.           prt(2,s1);
  120.           i2=0;
  121.           i4-=2;
  122.           do {
  123.             s[i2]=*(sss[0]+i4-1);
  124.             ++i2;
  125.             --i4;
  126.           } while ((*(sss[0]+i4)!=10) && (i4!=0));
  127.           if (i4)
  128.             ++i4;
  129.           *(sss[0]+i4)=0;
  130.           s[i2]=0;
  131.           strrev(s);
  132.           if (strlen(s)>thisuser.screenchars-1)
  133.             s[thisuser.screenchars-2]=0;
  134.         }
  135.         i2=strlen(s1);
  136.         if (i2 && (s1[i2-1]==1))
  137.           s1[i2-1]=0;
  138.         if (s1[0]) {
  139.           strcat(s1,"\r\n");
  140.           strcat(*sss,s1);
  141.           i4 += strlen(s1);
  142.         }
  143.       } while ((i++<10) && (s1[0]));
  144.       thisuser.screenchars=i1;
  145.       if (*sss[0]==0) {
  146.         bbsfree(*sss);
  147.         *sss=NULL;
  148.       }
  149.     }
  150.     prt(5,get_string(740));
  151.     i=!yn();
  152.     if (i) {
  153.       bbsfree(*sss);
  154.       *sss=NULL;
  155.     }
  156.   } while (i);
  157. }
  158.  
  159. /****************************************************************************/
  160.  
  161. void upload(int dn)
  162. {
  163.   directoryrec d;
  164.   uploadsrec u,u1;
  165.   int i,i1,i2,i3,i4,ok,xfer,f;
  166.   char s[255],s1[81],*ss;
  167.   long l;
  168.   double ti;
  169.  
  170.   if ((numbatch!=0) && (numbatch-numbatchdl>0)) {
  171.     npr(get_string(1529));
  172.     if (ny()) {
  173.       batchdl(2);
  174.       return;
  175.     }
  176.   }
  177.   dliscan1(dn);
  178.   d=directories[dn];
  179.   if (numf>=d.maxfiles) {
  180.     nl();
  181.     nl();
  182.     pl(get_string(755));
  183.     nl();
  184.     return;
  185.   }
  186.   if ((d.mask & mask_no_uploads) && (!dcs())) {
  187.     nl();
  188.     nl();
  189.     pl(get_string(756));
  190.     nl();
  191.     return;
  192.   }
  193.   nl();
  194.   l=(long)freek1(d.path);
  195.   sprintf(s,"%s - %ldk %s.",get_string(757), l, get_string(758));
  196.   pl(s);
  197.   nl();
  198.   if (l<100) {
  199.     pl(get_string(759));
  200.     nl();
  201.     return;
  202.   }
  203.   if (menu_on()) {
  204.     rip_saveall();
  205.     printmenu(361);
  206.     input(s,12);
  207.     rip_restoreall();
  208.   } else {
  209.     prt(2,get_string(44));
  210.     input(s,12);
  211.   }
  212.   if (!okfn(s))
  213.     s[0]=0;
  214.   else {
  215.     if (!is_uploadable(s)) {
  216.       if (so()) {
  217.         nl();
  218.         prt(5,get_string(1322));
  219.         if (!yn()) {
  220.           s[0]=0;
  221.         }
  222.       } else {
  223.         nl();
  224.         pl(get_string(1323));
  225.         s[0]=0;
  226.       }
  227.     }
  228.   }
  229.   if (!s[0])
  230.     return;
  231.   align(s);
  232.   if (strchr(s,'?')) {
  233.     return;
  234.   }
  235.   if (d.mask & mask_archive) {
  236.     ok=0;
  237.     s1[0]=0;
  238.     for (i=0; i<4; i++) {
  239.       if (syscfg.arcs[i].extension[0] && syscfg.arcs[i].extension[0]!=' ') {
  240.         if (s1[0])
  241.           strcat(s1,", ");
  242.         strcat(s1,syscfg.arcs[i].extension);
  243.         if (strcmp(s+9,syscfg.arcs[i].extension)==0)
  244.           ok=1;
  245.       }
  246.     }
  247.     if (!ok) {
  248.       nl();
  249.       pl(get_string(760));
  250.       pl(get_string(761));
  251.       pl(s1);
  252.       nl();
  253.       return;
  254.     }
  255.   }
  256.   strcpy(u.filename,s);
  257.   u.ownerusr=usernum;
  258.   u.ownersys=0;
  259.   u.numdloads=0;
  260.   u.filetype=0;
  261.   u.mask=0;
  262.   strcpy(u.upby,nam(&thisuser,usernum));
  263.   strcpy(u.date,date());
  264.   nl();
  265.   ok=1;
  266.   xfer=1;
  267.   if (check_batch_queue(u.filename)) {
  268.     ok=0;
  269.     nl();
  270.     pl(get_string(762));
  271.     nl();
  272.   } else {
  273.     sprintf(s1,"%s '%s' %s %s? ",get_string(757), s,get_string(763),d.name);
  274.     if (strcmp(s,"        .   "))
  275.       prt(5,s1);
  276.     else
  277.       ok=0;
  278.   }
  279.   if ((ok) && (yn())) {
  280.     sprintf(s1,"%s%s",d.path,s);
  281.     if (exist(s1)) {
  282.       if (dcs()) {
  283.         xfer=0;
  284.         nl();
  285.         nl();
  286.         pl(get_string(764));
  287.         prt(5,get_string(765));
  288.         if (yn()==0)
  289.           ok=0;
  290.       } else {
  291.         nl();
  292.         nl();
  293.         pl(get_string(766));
  294.         nl();
  295.         ok=0;
  296.       }
  297.     } else
  298.       if (!incom) {
  299.         nl();
  300.         pl(get_string(767));
  301.         pl(get_string(768));
  302.         nl();
  303.         ok=0;
  304.       }
  305.     if ((d.mask & mask_PD) && (ok)) {
  306.       nl();
  307.       prt(5,get_string(769));
  308.       if (!yn()) {
  309.         nl();
  310.         pl(get_string(770));
  311.         pl(get_string(771));
  312.         pl(get_string(772));
  313.         pl(get_string(773));
  314.         pl(get_string(774));
  315.         nl();
  316.         sprintf(s,get_stringx(1,41),u.filename);
  317.         add_ass(5,s);
  318.         ok=0;
  319.       } else
  320.         u.mask=mask_PD;
  321.     }
  322.     if (ok && (!(sysinfo.flags & OP_FLAGS_FAST_SEARCH))) {
  323.       nl();
  324.       pl(get_string(775));
  325.       nl();
  326.       i2=0;
  327.       for (i=0; (i<num_dirs) && (udir[i].subnum!=-1); i++) {
  328.         strcpy(s,get_string(776));
  329.         strcat(s,directories[udir[i].subnum].name);
  330.         for (i3=i4=strlen(s); i3<i2; i3++) {
  331.           s[i3]=' ';
  332.           s[i3+1]=0;
  333.         }
  334.         i2=i4;
  335.         npr("%s\r",s);
  336.  
  337.         dliscan1(udir[i].subnum);
  338.         i1=recno(u.filename);
  339.         if (i1>=0) {
  340.           nl();
  341.           outstr(get_string(777));
  342.           pl(directories[udir[i].subnum].name);
  343.           if (dcs()) {
  344.             nl();
  345.             prt(5,get_string(778));
  346.             if (!yn()) {
  347.               ok=0;
  348.               break;
  349.             }
  350.             nl();
  351.           } else {
  352.             ok=0;
  353.             break;
  354.           }
  355.         }
  356.       }
  357.       for (i1=0; i1<i2; i1++)
  358.         s[i1]=' ';
  359.       s[i1]=0;
  360.       npr("%s\r",s);
  361.       if (ok)
  362.         dliscan1(dn);
  363.       nl();
  364.     }
  365.     if (ok) {
  366.       nl();
  367.       pl(get_string(779));
  368.       outstr(": ");
  369.       inputl(u.description,58);
  370.       nl();
  371.       ss=NULL;
  372.       modify_extended_description(&ss, directories[dn].name,u.filename);
  373.       if (ss) {
  374.         add_extended_description(u.filename,ss);
  375.         u.mask |= mask_extended;
  376.         bbsfree(ss);
  377.       }
  378.       nl();
  379.       if (xfer) {
  380.         write_inst(INST_LOC_UPLOAD,udir[curdir].subnum,INST_FLAGS_NONE);
  381.         ti=timer();
  382.         receive_file(s1,&ok,&u.filetype, u.filename, dn);
  383.         ti=timer()-ti;
  384.         if (ti<0)
  385.           ti += 24.0*3600.0;
  386.         thisuser.extratime += ti;
  387.       }
  388.       if (ok) {
  389.         if (ok==1) {
  390.           f=sh_open1(s1,O_RDONLY | O_BINARY);
  391.           if (f<0) {
  392.             ok=0;
  393.             nl();
  394.             nl();
  395.             pl(get_string(780));
  396.             nl();
  397.             if (u.mask & mask_extended)
  398.               delete_extended_description(u.filename);
  399.           }
  400.           if (ok && syscfg.upload_c[0]) {
  401.             sh_close(f);
  402.             pl(get_string(26));
  403.             if (check_ul_event(dn,&u)) {
  404.               if (u.mask & mask_extended)
  405.                 delete_extended_description(u.filename);
  406.               ok=0;
  407.             } else {
  408.               f=sh_open1(s1,O_RDONLY | O_BINARY);
  409.             }
  410.           }
  411.         }
  412.         if (ok) {
  413.           if (ok==1) {
  414.             l=filelength(f);
  415.             u.numbytes=l;
  416.             sh_close(f);
  417.             ++thisuser.uploaded;
  418.             modify_database(u.filename,1);
  419.             thisuser.uk += bytes_to_k(l);
  420.             get_file_idz(&u,dn);
  421.             if (sysinfo.flags & OP_FLAGS_PACKSCAN_FREQ)
  422.               remotenotify(u.filename,u.description);
  423.           } else
  424.             u.numbytes=0;
  425.           time(&l);
  426.           u.daten=l;
  427.           f=sh_open(dlfn,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  428.           for (i=numf; i>=1; i--) {
  429.             SETREC(f,i);
  430.             sh_read(f,(void *)&u1,sizeof(uploadsrec));
  431.             SETREC(f,i+1);
  432.             sh_write(f,(void *)&u1,sizeof(uploadsrec));
  433.           }
  434.           SETREC(f,1);
  435.           sh_write(f,(void *)&u,sizeof(uploadsrec));
  436.           ++numf;
  437.           SETREC(f,0);
  438.           sh_read(f, &u1, sizeof(uploadsrec));
  439.           u1.numbytes=numf;
  440.           u1.daten=l;
  441.           dir_dates[dn]=l;
  442.           SETREC(f,0);
  443.           sh_write(f,(void *)&u1,sizeof(uploadsrec));
  444.           f=sh_close(f);
  445.           if (ok==1) {
  446.             lock_status();
  447.             ++status.uptoday;
  448.             ++status.filechange[filechange_upload];
  449.             save_status();
  450.             sprintf(s,get_stringx(1,42),u.filename,directories[dn].name);
  451.             sysoplog(s);
  452.             nl();
  453.             nl();
  454.             pl(get_string(781));
  455.             nl();
  456.             outstr(get_string(782));
  457.             npr("%-6.3f\r\n", ratio());
  458.             nl();
  459.             nl();
  460.             if (useron)
  461.               topscreen();
  462.           }
  463.         }
  464.       } else {
  465.         nl();
  466.         nl();
  467.         pl(get_string(783));
  468.         nl();
  469.         if (u.mask & mask_extended)
  470.           delete_extended_description(u.filename);
  471.       }
  472.     }
  473.   }
  474. }
  475.  
  476.  
  477. /****************************************************************************/
  478.  
  479. /****************************************************************************/
  480.  
  481. void get_file_idz(uploadsrec *u, int dn)
  482. {
  483.   char *b,*ss,cmd[161],s[81];
  484.   int f,i,ok=0;
  485.  
  486.   if (sysinfo.flags & OP_FLAGS_READ_CD_IDZ) {
  487.     if (directories[dn].mask & mask_cdrom)
  488.       return;
  489.   }
  490.   ss=strchr(stripfn(u->filename),'.');
  491.   if (ss==NULL)
  492.     return;
  493.   ++ss;
  494.   for (i=0; i<4; i++)
  495.     if (!ok)
  496.       ok=(stricmp(ss,syscfg.arcs[i].extension)==0);
  497.   if (!ok)
  498.     return;
  499.  
  500.   sprintf(s,"%sFILE_ID.DIZ",syscfgovr.tempdir);
  501.   unlink(s);
  502.   sprintf(s,"%sDESC.SDI",syscfgovr.tempdir);
  503.   unlink(s);
  504.  
  505.   cd_to(directories[dn].path);
  506.   get_dir(s,1);
  507.   strcat(s,stripfn(u->filename));
  508.   cd_to(cdir);
  509.   get_arc_cmd(cmd,s,1,"FILE_ID.DIZ DESC.SDI");
  510.   cd_to(syscfgovr.tempdir);
  511.   extern_prog(cmd, (sysinfo.spawn_opts[9]&EFLAG_SHRINK) |EFLAG_NOHUP);
  512.   cd_to(cdir);
  513.   sprintf(s,"%sFILE_ID.DIZ",syscfgovr.tempdir);
  514.   if (!exist(s))
  515.     sprintf(s,"%sDESC.SDI",syscfgovr.tempdir);
  516.   if (exist(s)) {
  517.     nl();
  518.     ansic(9); npr(get_string(995));
  519.     ansic(2); outstr(stripfn(s));
  520.     ansic(9); npr(get_string(996));
  521.     ss=read_extended_description(u->filename);
  522.     if (ss) {
  523.       bbsfree(ss);
  524.       delete_extended_description(u->filename);
  525.     }
  526.     if ((b=malloca((long)sysinfo.max_extend_lines*256+1))==NULL)
  527.       return;
  528.     f=sh_open1(s,O_RDONLY | O_BINARY);
  529.     if (filelength(f)<(sysinfo.max_extend_lines*256)) {
  530.       sh_read(f,b,(int) filelength(f));
  531.       b[filelength(f)]=0;
  532.     } else {
  533.       sh_read(f,b,(int)sysinfo.max_extend_lines*256);
  534.       b[(int)sysinfo.max_extend_lines*256]=0;
  535.     }
  536.     sh_close(f);
  537.     if (sysinfo.flags & OP_FLAGS_IDZ_DESC) {
  538.       ss=strtok(b,"\n");
  539.       sprintf(u->description,"   %.56s",ss);
  540.       ss=strtok(NULL,"");
  541.     } else {
  542.       ss=b;
  543.     }
  544.     if (ss) {
  545.       for (i=strlen(ss)-1; i>0; i--) {
  546.         if ((ss[i]==26) || (ss[i]==12))
  547.           ss[i]=32;
  548.       }
  549.       add_extended_description(u->filename,ss);
  550.       u->mask |= mask_extended;
  551.     }
  552.     bbsfree(b);
  553.     pl(get_string(997));
  554.   }
  555.   sprintf(s,"%sFILE_ID.DIZ",syscfgovr.tempdir);
  556.   unlink(s);
  557.   sprintf(s,"%sDESC.SDI",syscfgovr.tempdir);
  558.   unlink(s);
  559. }
  560.  
  561.  
  562. void read_idz(void)
  563. {
  564.   char s[81],s1[161];
  565.   int i,f,abort=0,next=0;
  566.   uploadsrec u;
  567.  
  568.   tmp_disable_pause(1);
  569.   set_protect(0);
  570.   dliscan();
  571.   file_mask(s);
  572.   sprintf(s1,"9%s2%s #%s...",get_string(998),
  573.      directories[udir[curdir].subnum].name,
  574.      udir[curdir].keys);
  575.   pl(s1);
  576.   f=sh_open(dlfn,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  577.   for (i=1; (i<=numf) && (!hangup) && !abort; i++) {
  578.     SETREC(f,i);
  579.     sh_read(f,(void *)&u,sizeof(uploadsrec));
  580.     if (compare(s,u.filename))
  581.       get_file_idz(&u,udir[curdir].subnum);
  582.     SETREC(f,i);
  583.     sh_write(f,(void *)&u,sizeof(uploadsrec));
  584.     checka(&abort, &next);
  585.   }
  586.   f=sh_close(f);
  587.   topscreen();
  588.   tmp_disable_pause(0);
  589. }
  590.  
  591.  
  592. void tag_it(void)
  593. {
  594.   int i,i2,i3,i4,bad,fp;
  595.   char s[161],s1[161],s2[81],s3[400];
  596.   double t;
  597.   long fs;
  598.  
  599.   if (numbatch>=sysinfo.max_batch) {
  600.     prt(6,get_string(1325));
  601.     getkey();
  602.     return;
  603.   }
  604.   outstr(get_string(1326));
  605.   npr("%d",tagptr);
  606.   outstr(get_string(1327));
  607.   mpl(30);
  608.   input(s3,30);
  609.   if (s3[0]=='*') {
  610.     s3[0]=0;
  611.     for(i2=0;i2<tagptr && i2<78;i2++) {
  612.       sprintf(s2,"%d ",i2+1);
  613.       strcat(s3,s2);
  614.       if (strlen(s3)>sizeof(s3)-10)
  615.         break;
  616.     }
  617.     nl();
  618.     outstr(get_string(1328));
  619.     pl(s3);
  620.   }
  621.   for(i2=0;i2<strlen(s3);i2++) {
  622.     sprintf(s1,"%s",s3+i2);
  623.     i4=0;
  624.     bad=0;
  625.     for(i3=0;i3<strlen(s1);i3++) {
  626.       if ((s1[i3]==' ') || (s1[i3]==',') || (s1[i3]==';')) {
  627.         s1[i3]=0;
  628.         i4=1;
  629.       } else {
  630.         if (i4==0)
  631.           i2++;
  632.       }
  633.     }
  634.     i=atoi(s1);
  635.     if (i==0)
  636.       break;
  637.     i--;
  638.     if ((s1[0]) && (i>=0) && (i<tagptr)) {
  639.       if (check_batch_queue(filelist[i].u.filename)) {
  640.         ansic(6);
  641.         outstr(filelist[i].u.filename);
  642.         pl(get_string(1329));
  643.         bad=1;
  644.       }
  645.       if (numbatch>=sysinfo.max_batch) {
  646.         ansic(6);
  647.         outstr(get_string(1330));
  648.         npr("%d",sysinfo.max_batch);
  649.         pl(get_string(1331));
  650.         bad=1;
  651.       }
  652.       if ((syscfg.req_ratio>0.0001)
  653.         && (ratio()<syscfg.req_ratio)
  654.         && (!thisuser.exempt & exempt_ratio)
  655.         && (bad==0)) {
  656.         ansic(2);
  657.         outstr(get_string(730));
  658.         sprintf(s," %-5.3f.  ",ratio());
  659.         outstr(s);
  660.         outstr(get_string(731));
  661.         sprintf(s," %-5.3f ",syscfg.req_ratio);
  662.         outstr(s);
  663.         outstr(get_string(732));
  664.         nl();
  665.         bad=1;
  666.       }
  667.       if (bad==0) {
  668.         sprintf(s,"%s%s",directories[filelist[i].directory].path,
  669.           stripfn(filelist[i].u.filename));
  670.         if (filelist[i].dir_mask & mask_cdrom) {
  671.           sprintf(s2,"%s%s",
  672.             directories[filelist[i].directory].path,
  673.             stripfn(filelist[i].u.filename));
  674.           sprintf(s,"%s%s",
  675.             syscfgovr.tempdir,stripfn(filelist[i].u.filename));
  676.          if (!exist(s))
  677.            copy_file(s2,s);
  678.         }
  679.         fp=sh_open1(s,O_RDONLY | O_BINARY);
  680.         if (fp<0) {
  681.           ansic(6);
  682.           outstr(get_string(1332));
  683.           outstr(stripfn(filelist[i].u.filename));
  684.           pl(get_string(1333));
  685.           bad=1;
  686.         } else {
  687.           fs=filelength(fp);
  688.           fp=sh_close(fp);
  689.         }
  690.       }
  691.       if (bad==0) {
  692.         t=(12.656) / ((double) (modem_speed)) * ((double)(fs));
  693.         if (nsl()<=(batchtime + t)) {
  694.           ansic(6);
  695.           outstr(get_string(1334));
  696.           outstr(filelist[i].u.filename);
  697.           pl(".");
  698.           bad=1;
  699.         }
  700.       }
  701.       if (bad==0) {
  702.         batchtime += t;
  703.         strcpy(batch[numbatch].filename,filelist[i].u.filename);
  704.         batch[numbatch].dir=filelist[i].directory;
  705.         batch[numbatch].time=t;
  706.         batch[numbatch].sending=1;
  707.         batch[numbatch].len=fs;
  708.         numbatch++;
  709.         ++numbatchdl;
  710.         ansic(1);
  711.         outstr(filelist[i].u.filename);
  712.         pl(get_string(1335));
  713.       }
  714.     } else {
  715.       ansic(6);
  716.       outstr(get_string(1336));
  717.       npr("%d.",i+1);
  718.       nl();
  719.     }
  720.     lines_listed=0;
  721.   }
  722. }
  723.  
  724.  
  725. void tag_files(void)
  726. {
  727.   int i, i1, done=0, abort, had, oh, fc, ohl;
  728.   char s[161],s1[161],s2[81],ch;
  729.   double d;
  730.  
  731.   fc=thisuser.sysstatus & sysstatus_extra_color;
  732.   if ((lines_listed==0) || (tagging==0) || (num_listed==0))
  733.     return;
  734.   abort=0;
  735.   if ((x_only) || (tagging==2)) {
  736.     tagptr=0;
  737.     return;
  738.   }
  739.   tleft(1);
  740.   if (hangup)
  741.     return;
  742.   if (thisuser.sysstatus & sysstatus_no_tag) {
  743.     if (thisuser.sysstatus & sysstatus_pause_on_page)
  744.       pausescr();
  745.     ansic(fc ? FRAME : 0);
  746.     if (okansi())
  747.       npr("\r%s\r\n",get_string(1337));
  748.     else
  749.       npr("\r%s\r\n",get_string(1338));
  750.     tagptr=0;
  751.     return;
  752.   }
  753.   if (menu_on())
  754.     printmenu(17);
  755.  
  756.   lines_listed=0;
  757.   ansic(fc ? FRAME : 0);
  758.   if (okansi())
  759.     npr("\r%s\r\n",get_string(1339));
  760.   else
  761.     npr("\r%s\r\n",get_string(1340));
  762.  
  763.   oh=helpl;
  764.   helpl=43;
  765.   done=0;
  766.   while ((!done) && (!hangup)) {
  767.     ohl=helpl;
  768.     helpl=43;
  769.     lines_listed=0;
  770.     ch=fancy_prompt(get_string(1341),"CDEMNQRTV?");
  771.     lines_listed=0;
  772.     helpl=ohl;
  773.     switch (ch) {
  774.       case '?':
  775.         i=tagging;
  776.         tagging=0;
  777.         printmenu(17);
  778.         pausescr();
  779.         tagging=i;
  780.         relist();
  781.       break;
  782.       case 'C':
  783.       case ' ':
  784.       case '\r':
  785.         lines_listed=0;
  786.         tagptr=0;
  787.         titled=2;
  788.         outchr(12);
  789.         done=1;
  790.       break;
  791.       case 'D':
  792.         batchdl(1);
  793.         tagging=0;
  794.         if (!had) {
  795.           nl();
  796.           pausescr();
  797.           outchr(12);
  798.         }
  799.         done=1;
  800.       break;
  801.       case 'E':
  802.         lines_listed=0;
  803.         i1=tagging;
  804.         tagging=0;
  805.         prt(2,get_string(1342));
  806.         npr("2%d)? ",tagptr);
  807.         mpl(2);
  808.         input(s,2);
  809.         i=atoi(s)-1;
  810.         if ((s[0]) && (i>=0) && (i<tagptr)) {
  811.           d=XFER_TIME(filelist[i].u.numbytes);
  812.           nl();
  813.           if (menu_on()) {
  814.             i1 = rip_printfileinfo(&filelist[i].u,filelist[i].directory);
  815.             getkey();
  816.             rip_restoreall();
  817.           } else {
  818.             npr("%s%s, %s\r\n",
  819.               get_string(1343),
  820.               udir[filelist[i].directory].keys,
  821.               directories[filelist[i].directory].name);
  822.             ansic(1);
  823.             outstr(get_string(746));
  824.             ansic(2);
  825.             pl(filelist[i].u.filename);
  826.             ansic(1);
  827.             outstr(get_string(747));
  828.             ansic(2);
  829.             pl(filelist[i].u.description);
  830.             if (filelist[i].u.mask & mask_extended) {
  831.               strcpy(s1,edlfn);
  832.               sprintf(edlfn,"%s%s.EXT",syscfg.datadir,
  833.                 directories[filelist[i].directory].filename);
  834.               zap_ed_info();
  835.               npr(get_string(1344));
  836.               print_extended(filelist[i].u.filename,&abort,sysinfo.max_extend_lines,2);
  837.               zap_ed_info();
  838.               strcpy(edlfn, s1);
  839.             }
  840.             ansic(1);
  841.             outstr(get_string(748));
  842.             ansic(2);
  843.             npr("%dk\r\n", bytes_to_k(filelist[i].u.numbytes));
  844.             ansic(1);
  845.             outstr(get_string(749));
  846.             ansic(2);
  847.             pl(ctim(d));
  848.             ansic(1);
  849.             outstr(get_string(750));
  850.             ansic(2);
  851.             pl(filelist[i].u.date);
  852.             ansic(1);
  853.             outstr(get_string(751));
  854.             ansic(2);
  855.             pl(filelist[i].u.upby);
  856.             ansic(1);
  857.             outstr(get_string(752));
  858.             ansic(2);
  859.             pln(filelist[i].u.numdloads);
  860.             if (directories[filelist[i].directory].mask & mask_cdrom) {
  861.               nl();
  862.               pl(get_string(1345));
  863.             } else {
  864.               sprintf(s,"%s%s",directories[filelist[i].directory].path,
  865.                 filelist[i].u.filename);
  866.               if (!exist(s)) {
  867.                 nl();
  868.                 pl(get_string(754));
  869.               }
  870.             }
  871.             nl();
  872.             pausescr();
  873.             tagging=i1;
  874.             relist();
  875.           }
  876.         }
  877.       break;
  878.       case 'N':
  879.         tagging=2;
  880.         done=1;
  881.       break;
  882.       case 'M':
  883.         if (dcs()) {
  884.           i=tagging;
  885.           tagging=0;
  886.             move_file_t();
  887.           tagging=i;
  888.           if (num_listed==0) {
  889.             done=1;
  890.             return;
  891.           }
  892.           relist();
  893.         }
  894.       break;
  895.       case 'Q':
  896.         tagging=0;
  897.         titled=0;
  898.         tagptr=0;
  899.         lines_listed=0;
  900.         done=1;
  901.         return;
  902.       case 'R':
  903.         relist();
  904.       break;
  905.       case 'T':
  906.         tag_it();
  907.       break;
  908.       case 'V':
  909.         prt(2,get_string(1342));
  910.         npr("2%d)? ",tagptr);
  911.         mpl(2);
  912.         input(s,2);
  913.         i=atoi(s)-1;
  914.         if ((s[0]) && (i>=0) && (i<tagptr)) {
  915.           sprintf(s1,"%s%s",directories[filelist[i].directory].path,
  916.             stripfn(filelist[i].u.filename));
  917.           if (directories[filelist[i].directory].mask & mask_cdrom) {
  918.             sprintf(s2,"%s%s",directories[filelist[i].directory].path,
  919.               stripfn(filelist[i].u.filename));
  920.             sprintf(s1,"%s%s",syscfgovr.tempdir,
  921.                stripfn(filelist[i].u.filename));
  922.             if (!exist(s1))
  923.               copy_file(s2,s1);
  924.           }
  925.           if (!exist(s1)) {
  926.             prt(6,get_string(1346));
  927.             nl();
  928.             pausescr();
  929.             break;
  930.           }
  931.           get_arc_cmd(s,s1,0,"");
  932.           if (!okfn(stripfn(filelist[i].u.filename)))
  933.             s[0]=0;
  934.           if (s[0]!=0) {
  935.             nl();
  936.             tagging=0;
  937.             extern_prog(s, sysinfo.spawn_opts[10]);
  938.             nl();
  939.             pausescr();
  940.             tagging=1;
  941.             topscreen();
  942.             outchr(12);
  943.             relist();
  944.           } else {
  945.             prt(6,get_string(1347));
  946.             nl();
  947.             pausescr();
  948.             break;
  949.           }
  950.         }
  951.       break;
  952.       default:
  953.         outchr(12);
  954.         done=1;
  955.       break;
  956.     }
  957.   }
  958.   helpl=oh;
  959.   tagptr=0;
  960.   lines_listed=0;
  961. }
  962.  
  963. /****************************************************************************/
  964.  
  965.  
  966. int try_to_download(char *s, int dn,int title)
  967. {
  968.   int i,ok,sent,abort=0,next=0,i1,f;
  969.   uploadsrec u;
  970.   char s1[81],s2[81];
  971.   userrec ur;
  972.  
  973.   dliscan1(dn);
  974.   i=recno(s);
  975.   if (i<=0) {
  976.     abort=next=0;
  977.     checka(&abort,&next);
  978.     if (abort)
  979.       return(-1);
  980.     else
  981.       return(0);
  982.   }
  983.   ok=1;
  984.   foundany=1;
  985.   while ((i>0) && (ok) && (!hangup)) {
  986.     tleft(1);
  987.     f=sh_open1(dlfn,O_RDONLY | O_BINARY);
  988.     SETREC(f,i);
  989.     sh_read(f,(void *)&u,sizeof(uploadsrec));
  990.     f=sh_close(f);
  991.     nl();
  992.     if (title) {
  993.       outstr(get_string(784));
  994.       pl(directories[dn].name);
  995.     }
  996.     if (menu_on()) {
  997.       i1 = rip_printfileinfo(&u,dn);
  998.     } else
  999.       i1=printfileinfo(&u,dn);
  1000.     if ((strncmp(u.filename,"WWIV4",5)==0) &&
  1001.         (!(sysinfo.flags & OP_FLAGS_NO_EASY_DL)))
  1002.       i1=1;
  1003.     else {
  1004.       if (!ratio_ok()) {
  1005.         if (menu_on())
  1006.           rip_restoreall();
  1007.         return(-1);
  1008.       }
  1009.     }
  1010.     if (i1) {
  1011.       write_inst(INST_LOC_DOWNLOAD,udir[curdir].subnum,INST_FLAGS_NONE);
  1012.       sprintf(s1,"%s%s",directories[dn].path,u.filename);
  1013.       if (directories[dn].mask & mask_cdrom) {
  1014.         sprintf(s2,"%s%s",directories[dn].path,u.filename);
  1015.         sprintf(s1,"%s%s",syscfgovr.tempdir,u.filename);
  1016.         if (!exist(s1))
  1017.           copy_file(s2,s1);
  1018.       }
  1019.       sent=0;
  1020.       abort=0;
  1021.       if (i1==-1)
  1022.         send_file(s1,&sent,&abort,u.filetype,u.filename,dn, -2L);
  1023.       else
  1024.         send_file(s1,&sent,&abort,u.filetype,u.filename,dn, u.numbytes);
  1025.       if (sent) {
  1026.         ++thisuser.downloaded;
  1027.         thisuser.dk += (int) (bytes_to_k(u.numbytes));
  1028.         ++u.numdloads;
  1029.         f=sh_open(dlfn,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  1030.         SETREC(f,i);
  1031.         sh_write(f,(void *)&u,sizeof(uploadsrec));
  1032.         f=sh_close(f);
  1033.         sprintf(s1,get_stringx(1,43),u.filename);
  1034.         sysoplog(s1);
  1035.         nl();
  1036.         nl();
  1037.         outstr(get_string(782)); npr("%-6.3f\r\n", ratio());
  1038.         if (syscfg.sysconfig & sysconfig_log_dl) {
  1039.           read_user(u.ownerusr, &ur);
  1040.           if (!(ur.inact & inact_deleted)) {
  1041.             if (date_to_daten(ur.firston) < u.daten) {
  1042.               sprintf(s1,"%s %s '%s' %s %s",
  1043.                 nam(&thisuser,usernum), get_string(785), u.filename, get_string(786),date());
  1044.               ssm(u.ownerusr,0,s1);
  1045.             }
  1046.           }
  1047.         }
  1048.         if (useron)
  1049.           topscreen();
  1050.       }
  1051.     } else {
  1052.       nl();
  1053.       nl();
  1054.       pl(get_string(787));
  1055.       nl();
  1056.     }
  1057.     if (abort)
  1058.       ok=0;
  1059.     else
  1060.       i=nrecno(s,i);
  1061.   }
  1062.   if (menu_on())
  1063.     rip_restoreall();
  1064.   if (abort)
  1065.     return(-1);
  1066.   else
  1067.     return(1);
  1068. }
  1069. /****************************************************************************/
  1070.  
  1071.  
  1072. void download(void)
  1073. {
  1074.   char s[81];
  1075.   int dn,count,color;
  1076.  
  1077.   if (numbatchdl!=0) {
  1078.     nl();
  1079.     outstr(get_string(1324));
  1080.     if (ny()) {
  1081.       batchdl(1);
  1082.       return;
  1083.     }
  1084.   }
  1085.   if (menu_on()) {
  1086.     rip_saveall();
  1087.     printmenu(360);
  1088.     input(s,12);
  1089.     rip_restoreall();
  1090.   } else {
  1091.     nl();
  1092.     pl(get_string(788));
  1093.     nl();
  1094.     prt(2,get_string(44));
  1095.     input(s,12);
  1096.   }
  1097.   if (s[0]==0)
  1098.     return;
  1099.   if (strchr(s,'.')==NULL)
  1100.     strcat(s,".*");
  1101.   align(s);
  1102.   if (try_to_download(s,udir[curdir].subnum,0)==0) {
  1103.     nl();
  1104.     pl(get_string(789));
  1105.     nl();
  1106.     foundany=dn=0;
  1107.     count=0;
  1108.     color=3;
  1109.     if (!x_only) {
  1110.        outstr("\r");
  1111.        outstr(get_string(1184));
  1112.     }
  1113.     while ((dn<num_dirs) && (udir[dn].subnum!=-1)) {
  1114.       count++;
  1115.       if (!x_only) {
  1116.         npr("%d.",color);
  1117.         if (count==DOTS) {
  1118.           outstr("\r");
  1119.           outstr(get_string(1184));
  1120.           color++;
  1121.           count=0;
  1122.           if (color==4)
  1123.             color++;
  1124.           if (color==10)
  1125.             color=0;
  1126.         }
  1127.       }
  1128.       if (try_to_download(s,udir[dn].subnum,1)<0)
  1129.         break;
  1130.       else
  1131.         dn++;
  1132.     }
  1133.     if (!foundany) {
  1134.       pl(get_string(89));
  1135.       nl();
  1136.     }
  1137.   }
  1138. }
  1139.  
  1140. /****************************************************************************/
  1141.  
  1142.  
  1143. char fancy_prompt(char *prompt,char *accept)
  1144. {
  1145.   int i,i1;
  1146.   char s1[81],s2[81],s3[81];
  1147.   char ch;
  1148.  
  1149.   tleft(1);
  1150.   sprintf(s1,"\r2%s (1%s2)? ",prompt,accept);
  1151.   sprintf(s2,"%s (%s)? ",prompt,accept);
  1152.   i1=strlen(s2);
  1153.   sprintf(s3,"%s%s",accept," \r");
  1154.   tleft(1);
  1155.   if (okansi()) {
  1156.     outstr(s1);
  1157.     ch=onek1(s3);
  1158.     npr("\x1b[%dD",i1);
  1159.     for (i=0; i<i1; i++)
  1160.       outchr(' ');
  1161.     npr("\x1b[%dD",i1);
  1162.   } else {
  1163.     outstr(s2);
  1164.     ch=onek1(s3);
  1165.     for (i = 0; i<i1; i++)
  1166.       backspace();
  1167.   }
  1168.   return(ch);
  1169. }
  1170.  
  1171.  
  1172. void endlist(int mode)
  1173. {
  1174.   char s[81];
  1175.   int fc;
  1176.  
  1177.   fc=thisuser.sysstatus & sysstatus_extra_color;
  1178.   if (tagging!=0) {
  1179.     if (num_listed)  {
  1180.       if ((tagging==1) && (!(thisuser.sysstatus&sysstatus_no_tag)) && filelist) {
  1181.         tag_files();
  1182.         return;
  1183.       } else {
  1184.         ansic(fc ? FRAME : 0);
  1185.         if ((titled!=2) && (tagging==1)
  1186.           && !(thisuser.sysstatus & sysstatus_no_tag)) {
  1187.           if (okansi())
  1188.             npr("\r%s\r\n",get_string(1348));
  1189.           else
  1190.             npr("\r%s\r\n",get_string(1349));
  1191.         } else {
  1192.           if (okansi())
  1193.             npr("\r%s\r\n",get_string(1350));
  1194.           else
  1195.             npr("\r%s\r\n",get_string(1351));
  1196.         }
  1197.       }
  1198.       switch(mode) {
  1199.         case 1:
  1200.           sprintf(s,"\r%s %ld",get_string(744), num_listed);
  1201.         break;
  1202.         case 2:
  1203.           sprintf(s,"\r%s %ld",get_string(744), num_listed);
  1204.         break;
  1205.       }
  1206.       pl(s);
  1207.     } else {
  1208.       switch(mode) {
  1209.         case 1:
  1210.           outstr("\r");
  1211.           pl(get_string(1352));
  1212.           nl();
  1213.           break;
  1214.         case 2:
  1215.           outstr("\r");
  1216.           pl(get_string(1353));
  1217.           nl();
  1218.           break;
  1219.       }
  1220.     }
  1221.   }
  1222. }
  1223.  
  1224.  
  1225. void yourinfodl(void)
  1226. {
  1227.   nl();
  1228.   ansic_x(1); outstr(get_string(796));
  1229.   ansic_x(2); npr("%ldk",thisuser.uk);
  1230.   ansic_x(1); outstr(get_string(797));
  1231.   ansic_x(2); npr("%d",thisuser.uploaded);
  1232.   pl(get_string(798));
  1233.   ansic_x(1); outstr(get_string(799));
  1234.   ansic_x(2); npr("%ldk",thisuser.dk);
  1235.   ansic_x(1); outstr(get_string(797));
  1236.   ansic_x(2); npr("%d",thisuser.downloaded);
  1237.   pl(get_string(798));
  1238.   ansic_x(1); outstr(get_string(800));
  1239.   ansic_x(2); npr("%-6.3f\r\n",ratio());
  1240.   ansic_x(1); outstr(get_string(801));
  1241.   ansic_x(2); pln(thisuser.dsl);
  1242. }
  1243.  
  1244.  
  1245. void setldate(void)
  1246. {
  1247.   struct date d;
  1248.   struct time t;
  1249.   char s[81];
  1250.   int m,dd,y;
  1251.  
  1252.   nl();
  1253.   nl();
  1254.   unixtodos(nscandate,&d,&t);
  1255.   nl();
  1256.   outstr(get_string(790));
  1257.   npr("%02d/%02d/%02d\r\n",d.da_mon,d.da_day,
  1258.     (d.da_year-2000) > 0 ? (d.da_year-2000) : (d.da_year-1900));
  1259.   nl();
  1260.   pl(get_string(791));
  1261.   pl(get_string(792));
  1262.   outstr(":");
  1263.   input(s,8);
  1264.   m=atoi(s);
  1265.   dd=atoi(&(s[3]));
  1266.   y=atoi(&(s[6]))+1900;                          /* fixed for 1980-2099 */
  1267.   if (s[6]<'8')
  1268.     y+=100;
  1269.   if ((strlen(s)==8) && (m>0) && (m<=12) && (dd>0) && (dd<32) && (y>=1980)) {
  1270.     t.ti_min=0;
  1271.     t.ti_hour=0;
  1272.     t.ti_hund=0;
  1273.     t.ti_sec=0;
  1274.     d.da_year=y;
  1275.     d.da_day=dd;
  1276.     d.da_mon=m;
  1277.     nl();
  1278.     outstr(get_string(790));
  1279.     npr("%02d/%02d/%02d\r\n",m,dd,
  1280.       (d.da_year-2000) > 0 ? (d.da_year-2000) : (d.da_year-1900));
  1281.     nl();
  1282.     nscandate=dostounix(&d,&t);
  1283.   }
  1284. }
  1285.  
  1286. /****************************************************************************/
  1287.