home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / WWIV2.ZIP / XFER.C < prev    next >
C/C++ Source or Header  |  1993-01-10  |  38KB  |  1,788 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1993 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. #include <dir.h>
  22.  
  23.  
  24.  
  25. #define SETREC(i)  lseek(dlf,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  26.  
  27.  
  28. /* How far to indent extended descriptions */
  29. #define INDENTION 24
  30.  
  31. /* Max # of lines for extended description */
  32. #define MAX_LINES 10
  33.  
  34. /* If its OK to use the FSED for editing extended descriptions */
  35. #define FSED_OK ((okfsed()) && (0))
  36.  
  37. /* If this is defined, the system will put in "ASK" if a file isn't there */
  38. #define CHECK_FOR_EXISTANCE
  39.  
  40. /* the archive type to use */
  41. #define ARC_NUMBER 0
  42.  
  43. int foundany;
  44.  
  45.  
  46. int check_batch_queue(char *fn)
  47. {
  48.   int i;
  49.  
  50.   for (i=0; i<numbatch; i++) {
  51.     if (strcmp(fn,batch[i].filename)==0)
  52.       if (batch[i].sending)
  53.         return(1);
  54.       else
  55.         return(-1);
  56.   }
  57.  
  58.   return(0);
  59. }
  60.  
  61.  
  62. int check_ul_event(int dn, uploadsrec *u)
  63. {
  64.   char s[161];
  65.  
  66.   if (syscfg.upload_c[0]) {
  67.     stuff_in(s,syscfg.upload_c,create_chain_file("CHAIN.TXT"),
  68.              directories[dn].path,stripfn(u->filename),"","");
  69.     run_external_ul(s);
  70.     topscreen();
  71.     sprintf(s,"%s%s",directories[dn].path, stripfn(u->filename));
  72.     if (!exist(s)) {
  73.       sprintf(s,get_stringx(1,40),
  74.               u->filename, directories[dn].name);
  75.       sysoplog(s);
  76.       outstr(u->filename);
  77.       pl(get_string(727));
  78.       return(1);
  79.     }
  80.   }
  81.  
  82.   return(0);
  83. }
  84.  
  85. char (*devices)[9];
  86. int num_devices;
  87.  
  88. void finddevs(char (*devs)[9], int *count)
  89. {
  90.   char s[9];
  91.   int i;
  92.   char far *ss;
  93.   long far *l;
  94.   union REGS regs;
  95.   struct SREGS sregs;
  96.  
  97.   *count=0;
  98.   regs.x.ax=0x5200;
  99.   int86x(INT_REAL_DOS, ®s, ®s, &sregs);
  100.   ss=MK_FP(sregs.es, regs.x.bx);
  101.   ss += 34;
  102.   l=(long far *) ss;
  103.  
  104.   while (((unsigned short) l) != 0xffff) {
  105.     ss=(char far *) l;
  106.     ss += 10;
  107.     if (*ss>32) {
  108.       strncpy(s,ss,8);
  109.       s[8]=0;
  110.       for (i=7; i; i--)
  111.         if (s[i]==' ')
  112.           s[i]=0;
  113.         else
  114.           break;
  115.       if (devs) {
  116.         strcpy(devs[*count],s);
  117.       }
  118.       ++(*count);
  119.     }
  120.     l=(long far *) *l;
  121.   }
  122. }
  123.  
  124. void find_devices(void)
  125. {
  126.   finddevs(NULL, &num_devices);
  127.   devices=farmalloc((num_devices+2)*9);
  128.   finddevs(devices,&num_devices);
  129. }
  130.  
  131. int okfn(char *s)
  132. {
  133.   int i,l;
  134.   unsigned char ch;
  135.  
  136.   l=strlen(s);
  137.   if ((s[0]=='-') || (s[0]==' ') || (s[0]=='.') || (s[0]=='@'))
  138.     return(0);
  139.   for (i=0; i<l; i++) {
  140.     ch=s[i];
  141.     if ((ch==' ') || (ch=='/') || (ch=='\\') || (ch==':') ||
  142.         (ch=='>') || (ch=='<') || (ch=='|')  || (ch=='+') ||
  143.         (ch==',') || (ch==';') || (ch=='^')  || (ch=='\"') ||
  144.         (ch=='\'') || (ch>126))
  145.       return(0);
  146.   }
  147.  
  148.   for (i=0; i<num_devices; i++) {
  149.     l=strlen(devices[i]);
  150.     if (strncmp(devices[i],s,l)==0) {
  151.       if ((s[l]==0) || (s[l]=='.') || (l==8))
  152.         return(0);
  153.     }
  154.   }
  155.   return(1);
  156. }
  157.  
  158. void print_devices(void)
  159. {
  160.   int i;
  161.   for (i=0; i<num_devices; i++)
  162.     npr("%s\r\n",devices[i]);
  163. }
  164.  
  165.  
  166. char *make_abs_cmd(char *out)
  167. {
  168.   char s[161],s1[161],*ss,*ss1;
  169.  
  170.   strcpy(s1,out);
  171.   ss=strchr(s1,' ');
  172.   if (ss)
  173.     *ss=0;
  174.   strcpy(s,s1);
  175.   ss1=searchpath(s);
  176.   if (!ss1) {
  177.     sprintf(s,"%s.COM",s1);
  178.     ss1=searchpath(s);
  179.   }
  180.   if (!ss1) {
  181.     sprintf(s,"%s.EXE",s1);
  182.     ss1=searchpath(s);
  183.   }
  184.   if (!ss1) {
  185.     sprintf(s,"%s.BAT",s1);
  186.     ss1=searchpath(s);
  187.   }
  188.   if (ss1)
  189.     strcpy(s,ss1);
  190.   else {
  191.     strcpy(s,cdir);
  192.     strcat(s,s1);
  193.   }
  194.   if (ss) {
  195.     strcat(s," ");
  196.     strcat(s,ss+1);
  197.   }
  198.   strcpy(out,s);
  199.  
  200.   return(out);
  201. }
  202.  
  203. void get_arc_cmd(char *out, char *arcfn, int cmd, char *ofn)
  204. {
  205.   char *ss,*ss1,s[161],s1[161];
  206.   int i;
  207.  
  208.   out[0]=0;
  209.   ss=strchr(arcfn,'.');
  210.   if (ss==NULL)
  211.     return;
  212.   ++ss;
  213.   ss1=strchr(ss,'.');
  214.   while (ss1!=NULL) {
  215.     ss=ss1;
  216.     ++ss1;
  217.     ss1=strchr(ss,'.');
  218.   }
  219.   for (i=0; i<4; i++)
  220.     if (stricmp(ss,syscfg.arcs[i].extension)==0) {
  221.       switch(cmd) {
  222.         case 0: strcpy(s,syscfg.arcs[i].arcl); break;
  223.         case 1: strcpy(s,syscfg.arcs[i].arce); break;
  224.         case 2: strcpy(s,syscfg.arcs[i].arca); break;
  225.       }
  226.       if (s[0]==0)
  227.         return;
  228.       stuff_in(out,s,arcfn,ofn,"","","");
  229.       make_abs_cmd(out);
  230.       return;
  231.     }
  232.  
  233. }
  234.  
  235.  
  236. int list_arc_out(char *fn, char *dir)
  237. {
  238.   char s[161],s1[81];
  239.   int i=0;
  240.  
  241.   sprintf(s1,"%s%s",dir,fn);
  242.   get_arc_cmd(s,s1,0,"");
  243.   if (!okfn(fn))
  244.     s[0]=0;
  245.   if (exist(s1) && (s[0]!=0)) {
  246.     nl();
  247.     nl();
  248.     outstr(get_string(728));
  249.     pl(fn);
  250.     nl();
  251.     i=do_external(s,1);
  252.     nl();
  253.   } else {
  254.     nl();
  255.     outs(get_string(729));
  256.     pl(fn);
  257.     nl();
  258.     i=0;
  259.   }
  260.   return(i);
  261. }
  262.  
  263.  
  264. int ratio_ok(void)
  265. {
  266.   int ok=1;
  267.   char s[101];
  268.  
  269.   if (!(thisuser.exempt & exempt_ratio))
  270.     if ((syscfg.req_ratio>0.0001) && (ratio()<syscfg.req_ratio)) {
  271.       ok=0;
  272.       nl();
  273.       nl();
  274.       sprintf(s,"%s %-5.3f.  %s %-5.3f %s.",
  275.               get_string(730), ratio(),
  276.               get_string(731), syscfg.req_ratio,
  277.               get_string(732));
  278.       pl(s);
  279.       nl();
  280.     }
  281.  
  282.   if (!(thisuser.exempt & exempt_post))
  283.     if ((syscfg.post_call_ratio>0.0001) && (post_ratio()<syscfg.post_call_ratio)) {
  284.       ok=0;
  285.       nl();
  286.       nl();
  287.       sprintf(s,"%s %-5.3f.  %s %-5.3f %s.",
  288.               get_string(733), post_ratio(),
  289.               get_string(731), syscfg.post_call_ratio,
  290.               get_string(732));
  291.       pl(s);
  292.       nl();
  293.     }
  294.  
  295.  
  296.   return(ok);
  297. }
  298.  
  299.  
  300. int dcs(void)
  301. {
  302.   if (cs())
  303.     return(1);
  304.   if (thisuser.dsl>=100)
  305.     return(1);
  306.   else
  307.     return(0);
  308. }
  309.  
  310.  
  311. void dliscan1(int dn)
  312. {
  313.   char s[81];
  314.   int i;
  315.   uploadsrec u;
  316.   long l;
  317.  
  318.   closedl();
  319.  
  320.   sprintf(s,"%s%s.DIR",syscfg.datadir,directories[dn].filename);
  321.   dlf=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  322.   i=filelength(dlf)/sizeof(uploadsrec);
  323.   if (i==0) {
  324.     memset(&u, 0, sizeof(uploadsrec));
  325.     strcpy(u.filename,"|MARKER|");
  326.     time(&l);
  327.     u.daten=l;
  328.     SETREC(0);
  329.     write(dlf,(void *)&u,sizeof(uploadsrec));
  330.   } else {
  331.     SETREC(0);
  332.     read(dlf,(void *)&u,sizeof(uploadsrec));
  333.     if (strcmp(u.filename,"|MARKER|")) {
  334.       numf=u.numbytes;
  335.       memset(&u, 0, sizeof(uploadsrec));
  336.       strcpy(u.filename,"|MARKER|");
  337.       time(&l);
  338.       u.daten=l;
  339.       u.numbytes = numf;
  340.       SETREC(0);
  341.       write(dlf, &u, sizeof(uploadsrec));
  342.     }
  343.   }
  344.   numf=u.numbytes;
  345.   this_date = u.daten;
  346.   dir_dates[dn]=this_date;
  347.  
  348.   sprintf(s,"%s%s.EXT",syscfg.datadir,directories[dn].filename);
  349.   edlf=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  350. }
  351.  
  352. void dliscan_hash(int dn)
  353. {
  354.   char s[81];
  355.   int i,dlf;
  356.   uploadsrec u;
  357.  
  358.   if ((dn>=num_dirs) || (dir_dates[dn]))
  359.     return;
  360.  
  361.   sprintf(s,"%s%s.DIR",syscfg.datadir,directories[dn].filename);
  362.   dlf=open(s,O_RDWR | O_BINARY);
  363.   if (dlf<0) {
  364.     time(&(dir_dates[dn]));
  365.     return;
  366.   }
  367.   i=filelength(dlf)/sizeof(uploadsrec);
  368.   if (i<1) {
  369.     time(&(dir_dates[dn]));
  370.   } else {
  371.     SETREC(0);
  372.     read(dlf,(void *)&u,sizeof(uploadsrec));
  373.     if (strcmp(u.filename,"|MARKER|")==0) {
  374.       dir_dates[dn]=u.daten;
  375.     } else {
  376.       time(&(dir_dates[dn]));
  377.     }
  378.   }
  379.   close(dlf);
  380. }
  381.  
  382.  
  383. void dliscan(void)
  384. {
  385.   dliscan1(udir[curdir].subnum);
  386. }
  387.  
  388.  
  389. void closedl(void)
  390. {
  391.   if (dlf>0) {
  392.     close(dlf);
  393.     dlf=-1;
  394.   }
  395.   if (edlf>0) {
  396.     close(edlf);
  397.     edlf=-1;
  398.   }
  399. }
  400.  
  401. void add_extended_description(char *fn, char *desc)
  402. {
  403.   ext_desc_type ed;
  404.  
  405.   strcpy(ed.name,fn);
  406.   ed.len=strlen(desc);
  407.   lseek(edlf,0L,SEEK_END);
  408.   write(edlf,&ed,sizeof(ext_desc_type));
  409.   write(edlf,desc,ed.len);
  410. }
  411.  
  412.  
  413. void delete_extended_description(char *fn)
  414. {
  415.   ext_desc_type ed;
  416.   long r,w,l1;
  417.   char *ss=NULL;
  418.  
  419.   r=w=0;
  420.   if ((ss=malloca(10240L))==NULL)
  421.     return;
  422.   l1=filelength(edlf);
  423.   while (r<l1) {
  424.     lseek(edlf,r,SEEK_SET);
  425.     read(edlf,&ed,sizeof(ext_desc_type));
  426.     if (ed.len<10000) {
  427.       read(edlf,ss,ed.len);
  428.       if (strcmp(fn,ed.name)) {
  429.         if (r!=w) {
  430.           lseek(edlf,w,SEEK_SET);
  431.           write(edlf,&ed,sizeof(ext_desc_type));
  432.           write(edlf,ss,ed.len);
  433.         }
  434.         w +=(sizeof(ext_desc_type) + ed.len);
  435.       }
  436.     }
  437.     r += (sizeof(ext_desc_type) + ed.len);
  438.   }
  439.   farfree(ss);
  440.   chsize(edlf,w);
  441. }
  442.  
  443.  
  444. char *read_extended_description(char *fn)
  445. {
  446.   ext_desc_type ed;
  447.   long l,l1;
  448.   char *ss=NULL;
  449.  
  450.   l=0;
  451.   l1=filelength(edlf);
  452.   while (l<l1) {
  453.     lseek(edlf,l,SEEK_SET);
  454.     l += (long) read(edlf,&ed,sizeof(ext_desc_type));
  455.     if (strcmp(fn,ed.name)==0) {
  456.       ss=malloca((long) ed.len+10);
  457.       if (ss) {
  458.         read(edlf,ss,ed.len);
  459.         ss[ed.len]=0;
  460.       }
  461.       return(ss);
  462.     } else
  463.       l += (long) ed.len;
  464.   }
  465.   return(NULL);
  466. }
  467.  
  468.  
  469.  
  470. void print_extended(char *fn, int *abort, unsigned char numlist, int indent)
  471. {
  472.   char *ss;
  473.   int next=0;
  474.   unsigned char numl=0;
  475.   int cpos=0;
  476.   char ch,s[81];
  477.   int i;
  478.  
  479.   ss=read_extended_description(fn);
  480.   if (ss) {
  481.     ch=10;
  482.     while ((ss[cpos]) && (!(*abort)) && (numl<numlist)) {
  483.       if ((ch==10) && (indent)) {
  484.         if (okansi())
  485.           sprintf(s,"\x1b[%dC",INDENTION);
  486.         else {
  487.           for (i=0; i<INDENTION; i++)
  488.             s[i]=32;
  489.           s[INDENTION]=0;
  490.         }
  491.         osan(s,abort,&next);
  492.         if ((thisuser.sysstatus & sysstatus_funky_colors) && (!(*abort)))
  493.           ansic(2);
  494.       }
  495.       outchr(ch=ss[cpos++]);
  496.       checka(abort,&next);
  497.       if (ch==10)
  498.         ++numl;
  499.       else
  500.         if ((ch!=13) && (wherex()>=78)) {
  501.           osan("\r\n",abort,&next);
  502.           ch=10;
  503.         }
  504.     }
  505.     if (wherex())
  506.       nl();
  507.   }
  508.   farfree(ss);
  509. }
  510.  
  511.  
  512.  
  513. void modify_extended_description(char **sss, char *dest, char *title)
  514. {
  515.   char s[161],s1[161];
  516.   int f,ii,i,i1,i2;
  517.  
  518.   if (*sss)
  519.     ii=1;
  520.   else
  521.     ii=0;
  522.   do {
  523.     if (ii) {
  524.       nl();
  525.       if (FSED_OK)
  526.         prt(5,get_string(734));
  527.       else
  528.         prt(5,get_string(735));
  529.       if (!yn())
  530.         return;
  531.     } else {
  532.       nl();
  533.       prt(5,get_string(736));
  534.       if (!yn())
  535.         return;
  536.     }
  537.     if (FSED_OK) {
  538.       sprintf(s,"%sEXTENDED.DSC", syscfg.tempdir);
  539.       if (*sss) {
  540.         f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  541.         write(f,*sss,strlen(*sss));
  542.         close(f);
  543.         farfree(*sss);
  544.         *sss=NULL;
  545.       } else
  546.         unlink(s);
  547.       i=thisuser.screenchars;
  548.       if (thisuser.screenchars>(76-INDENTION))
  549.         thisuser.screenchars=76-INDENTION;
  550.       i1=external_edit("extended.dsc",syscfg.tempdir,(int) thisuser.defed-1,
  551.         MAX_LINES, dest, title, 1);
  552.       thisuser.screenchars=i;
  553.       if (i1) {
  554.         if ((*sss=malloca(10240))==NULL)
  555.           return;
  556.         f=open(s,O_RDWR | O_BINARY);
  557.         read(f,*sss,(int) filelength(f));
  558.         (*sss)[filelength(f)]=0;
  559.         close(f);
  560.       }
  561.     } else {
  562.       if (*sss)
  563.         farfree(*sss);
  564.       if ((*sss=malloca(10240))==NULL)
  565.         return;
  566.       *sss[0]=0;
  567.       i=1;
  568.       nl();
  569.       sprintf(s,"%s %d %s, %d %s",
  570.               get_string(737), MAX_LINES,
  571.               get_string(738), 78-INDENTION, get_string(739));
  572.       pl(s);
  573.       nl();
  574.       s[0]=0;
  575.       i1=thisuser.screenchars;
  576.       if (thisuser.screenchars>(76-INDENTION))
  577.         thisuser.screenchars=76-INDENTION;
  578.       do {
  579.         ansic(2);
  580.         npr("%d: ",i);
  581.         ansic(0);
  582.         s1[0]=0;
  583.         inli(s1,s,90,1);
  584.         i2=strlen(s1);
  585.         if (i2 && (s1[i2-1]==1))
  586.           s1[i2-1]=0;
  587.         if (s1[0]) {
  588.           strcat(s1,"\r\n");
  589.           strcat(*sss,s1);
  590.         }
  591.       } while ((i++<10) && (s1[0]));
  592.       thisuser.screenchars=i1;
  593.       if (*sss[0]==0) {
  594.         farfree(*sss);
  595.         *sss=NULL;
  596.       }
  597.     }
  598.     prt(5,get_string(740));
  599.     i=!yn();
  600.     if (i) {
  601.       farfree(*sss);
  602.       *sss=NULL;
  603.     }
  604.   } while (i);
  605. }
  606.  
  607.  
  608. void align(char *s)
  609. {
  610.   char f[40],e[40],s1[20],*s2;
  611.   int i,i1,i2;
  612.  
  613.   i1=0;
  614.   if (s[0]=='.')
  615.     i1=1;
  616.   for (i=0; i<strlen(s); i++)
  617.     if ((s[i]=='\\') || (s[i]=='/') || (s[i]==':') || (s[i]=='<') ||
  618.       (s[i]=='>') || (s[i]=='|'))
  619.       i1=1;
  620.   if (i1) {
  621.     strcpy(s,"        .   ");
  622.     return;
  623.   }
  624.   s2=strchr(s,'.');
  625.   if (s2==NULL) {
  626.     e[0]=0;
  627.   } else {
  628.     strcpy(e,&(s2[1]));
  629.     e[3]=0;
  630.     s2[0]=0;
  631.   }
  632.   strcpy(f,s);
  633.  
  634.   for (i=strlen(f); i<8; i++)
  635.     f[i]=32;
  636.   f[8]=0;
  637.   i1=0;
  638.   i2=0;
  639.   for (i=0; i<8; i++) {
  640.     if (f[i]=='*')
  641.       i1=1;
  642.     if (f[i]==' ')
  643.       i2=1;
  644.     if (i2)
  645.       f[i]=' ';
  646.     if (i1)
  647.       f[i]='?';
  648.   }
  649.  
  650.   for (i=strlen(e); i<3; i++)
  651.     e[i]=32;
  652.   e[3]=0;
  653.   i1=0;
  654.   for (i=0; i<3; i++) {
  655.     if (e[i]=='*')
  656.       i1=1;
  657.     if (i1)
  658.       e[i]='?';
  659.   }
  660.  
  661.   for (i=0; i<12; i++)
  662.     s1[i]=32;
  663.   strcpy(s1,f);
  664.   s1[8]='.';
  665.   strcpy(&(s1[9]),e);
  666.   strcpy(s,s1);
  667.   for (i=0; i<12; i++)
  668.     s[i]=upcase(s[i]);
  669. }
  670.  
  671.  
  672. int compare(char *s1, char *s2)
  673. {
  674.   int ok,i;
  675.  
  676.   ok=1;
  677.   for (i=0; i<12; i++)
  678.     if ((s1[i]!=s2[i]) && (s1[i]!='?') && (s2[i]!='?'))
  679.       ok=0;
  680.   return(ok);
  681. }
  682.  
  683.  
  684. void printinfo(uploadsrec *u, int *abort)
  685. {
  686.   char s[85],s1[40],s2[81];
  687.   int i,next,fc;
  688.  
  689.   fc=thisuser.sysstatus & sysstatus_funky_colors;
  690.  
  691.   if (fc)
  692.     ansic(1);
  693.   strncpy(s,u->filename,8);
  694.   s[8]=0;
  695.   osan(s,abort,&next);
  696.   strncpy(s,&((u->filename)[8]),4);
  697.   s[4]=0;
  698.   if (fc)
  699.     ansic(2);
  700.   osan(s,abort,&next);
  701.   if (fc)
  702.     ansic(0);
  703.   osan(": ",abort,&next);
  704.  
  705.   ltoa((((u->numbytes)+1023)/1024),s1,10);
  706.   strcat(s1,"k");
  707.  
  708. #ifdef CHECK_FOR_EXISTANCE
  709.   strcpy(s2,directories[udir[curdir].subnum].path);
  710.   strcat(s2,u->filename);
  711.   if (!exist(s2))
  712.     strcpy(s1,get_string(741));
  713. #endif
  714.  
  715.   for (i=0; i<5-strlen(s1); i++)
  716.     s[i]=32;
  717.   s[i]=0;
  718.   strcat(s,s1);
  719.   if (fc)
  720.     ansic(3);
  721.   osan(s,abort,&next);
  722.  
  723.   if (fc)
  724.     ansic(0);
  725.   osan(" :",abort,&next);
  726.   if (fc)
  727.     ansic(5);
  728.   pla(u->description,abort);
  729.   if ((!*abort) && (thisuser.num_extended) && (u->mask & mask_extended))
  730.     print_extended(u->filename,abort,thisuser.num_extended,1);
  731.   if (!(*abort))
  732.     ++num_listed;
  733. }
  734.  
  735.  
  736. void printtitle(int *abort)
  737. {
  738.   char s[81],s1[20];
  739.   int i,i1;
  740.  
  741.   pla("",abort);
  742.   pla("",abort);
  743.   sprintf(s,"%s - #%s, %d %s.",directories[udir[curdir].subnum].name,
  744.                                   udir[curdir].keys,numf, get_string(742));
  745.   i=strlen(s);
  746.   if (thisuser.sysstatus & sysstatus_funky_colors)
  747.     ansic(2);
  748.   pla(s,abort);
  749.   for (i1=0; i1<i; i1++)
  750.     s[i1]='=';
  751.   s[i]=0;
  752.   if (thisuser.sysstatus & sysstatus_funky_colors)
  753.     ansic(2);
  754.   pla(s,abort);
  755.   pla("",abort);
  756. }
  757.  
  758.  
  759. void file_mask(char *s)
  760. {
  761.   nl();
  762.   helpl=9;
  763.   prt(2,get_string(743));
  764.   input(s,12);
  765.   if (s[0]==0)
  766.     strcpy(s,"*.*");
  767.   if (strchr(s,'.')==NULL)
  768.     strcat(s,".*");
  769.   align(s);
  770.   nl();
  771. }
  772.  
  773.  
  774. void listfiles(void)
  775. {
  776.   char s[81];
  777.   int i,abort,next=0;
  778.   uploadsrec u;
  779.  
  780.   dliscan();
  781.   file_mask(s);
  782.   abort=0;
  783.   num_listed=0;
  784.   printtitle(&abort);
  785.   for (i=1; (i<=numf) && (!abort) && (!hangup); i++) {
  786.     SETREC(i);
  787.     read(dlf,(void *)&u,sizeof(uploadsrec));
  788.     if (compare(s,u.filename))
  789.       printinfo(&u,&abort);
  790.     else if (!empty())
  791.       checka(&abort,&next);
  792.   }
  793.   closedl();
  794.   if (!abort) {
  795.     nl();
  796.     nl();
  797.     sprintf(s,"%s: %d",get_string(744), num_listed);
  798.     pl(s);
  799.     nl();
  800.   }
  801. }
  802.  
  803.  
  804. void nscandir(int d, int *abort,int title)
  805. {
  806.   int i,od,dt,next=0;
  807.   uploadsrec u;
  808.   char s[81];
  809.  
  810.   if ((dir_dates[udir[d].subnum]) && (dir_dates[udir[d].subnum]<nscandate))
  811.     return;
  812.  
  813.   od=curdir;
  814.   curdir=d;
  815.   dt=title;
  816.   dliscan();
  817.   if (this_date>=nscandate) {
  818.     for (i=1; (i<=numf) && (!(*abort)) && (!hangup); i++) {
  819.       SETREC(i);
  820.       read(dlf,(void *)&u,sizeof(uploadsrec));
  821.       if (u.daten>=nscandate) {
  822.         if (dt) {
  823.           printtitle(abort);
  824.           dt=0;
  825.         }
  826.         printinfo(&u,abort);
  827.       } else if (!empty())
  828.         checka(abort,&next);
  829.  
  830.     }
  831.   }
  832.   closedl();
  833.   curdir=od;
  834. }
  835.  
  836.  
  837. void nscanall(void)
  838. {
  839.   int abort,i,i1;
  840.   char s[81];
  841.  
  842.   abort=0;
  843.   num_listed=0;
  844.   for (i=0; (i<num_dirs) && (!abort) && (udir[i].subnum!=-1); i++) {
  845.     i1=udir[i].subnum;
  846.     if (qsc_n[i1/32]&(1L<<(i1%32)))
  847.       nscandir(i,&abort,1);
  848.   }
  849.   if ((num_listed) && (!abort)) {
  850.     nl();
  851.     nl();
  852.     sprintf(s,"%s: %d",get_string(744),num_listed);
  853.     pl(s);
  854.     nl();
  855.   }
  856. }
  857.  
  858.  
  859. void searchall(void)
  860. {
  861.   int i,i1,pts,abort,pty,ocd,next=0;
  862.   char s[81],s1[81];
  863.   uploadsrec u;
  864.  
  865.   abort=0;
  866.   ocd=curdir;
  867.   if (x_only) {
  868.     strcpy(s,"*.*");
  869.     align(s);
  870.   } else {
  871.     nl();
  872.     nl();
  873.     pl(get_string(745));
  874.     file_mask(s);
  875.   }
  876.   num_listed=0;
  877.   for (i=0; (i<num_dirs) && (!abort) && (!hangup) && (udir[i].subnum!=-1); i++) {
  878.     i1=udir[i].subnum;
  879.     pts=0;
  880.     if (qsc_n[i1/32]&(1L<<(i1%32)))
  881.       pts=1;
  882.     pts=1;
  883.     /* remove pts=1 to search only marked directories */
  884.     if (pts) {
  885.       curdir=i;
  886.       dliscan();
  887.       pty=1;
  888.       for (i1=1; (i1<=numf) && (!abort) && (!hangup); i1++) {
  889.         SETREC(i1);
  890.         read(dlf,(void *)&u,sizeof(uploadsrec));
  891.         if (compare(s,u.filename)) {
  892.           if (pty) {
  893.             printtitle(&abort);
  894.             pty=0;
  895.           }
  896.           printinfo(&u,&abort);
  897.         } else if (!empty())
  898.           checka(&abort,&next);
  899.       }
  900.       closedl();
  901.     }
  902.   }
  903.   curdir=ocd;
  904.   if ((num_listed) && (!abort)) {
  905.     nl();
  906.     nl();
  907.     sprintf(s,"%s: %d",get_string(744), num_listed);
  908.     pl(s);
  909.     nl();
  910.   }
  911. }
  912.  
  913.  
  914.  
  915. int recno(char *s)
  916. {
  917.   int i;
  918.   uploadsrec u;
  919.  
  920.   i=1;
  921.   if (numf<1)
  922.     return(-1);
  923.   SETREC(i);
  924.   read(dlf,(void *)&u,sizeof(uploadsrec));
  925.   while ((i<numf) && (compare(s,u.filename)==0)) {
  926.     ++i;
  927.     SETREC(i);
  928.     read(dlf,(void *)&u,sizeof(uploadsrec));
  929.   }
  930.   if (compare(s,u.filename))
  931.     return(i);
  932.   else
  933.     return(-1);
  934. }
  935.  
  936.  
  937. int nrecno(char *s,int i1)
  938. {
  939.   int i;
  940.   uploadsrec u;
  941.  
  942.   i=i1+1;
  943.   if ((numf<1) || (i1>=numf))
  944.     return(-1);
  945.  
  946.   SETREC(i);
  947.   read(dlf,(void *)&u,sizeof(uploadsrec));
  948.   while ((i<numf) && (compare(s,u.filename)==0)) {
  949.     ++i;
  950.     SETREC(i);
  951.     read(dlf,(void *)&u,sizeof(uploadsrec));
  952.   }
  953.   if (compare(s,u.filename))
  954.     return(i);
  955.   else
  956.     return(-1);
  957. }
  958.  
  959.  
  960. int printfileinfo(uploadsrec *u, int dn)
  961. {
  962.   char s[81];
  963.   double d;
  964.   int i,abort;
  965.  
  966.   if (modem_speed)
  967.     d=((double) (((u->numbytes)+127)/128)) *
  968.       (1620.0) /
  969.       ((double) (modem_speed));
  970.   else
  971.     d=0.0;
  972.   outstr(get_string(746)); pl(stripfn(u->filename));
  973.   outstr(get_string(747)); pl(u->description);
  974.   outstr(get_string(748)); npr("%dk\r\n", ((u->numbytes)+1023)/1024);
  975.   outstr(get_string(749)); pl(ctim(d));
  976.   outstr(get_string(750)); pl(u->date);
  977.   outstr(get_string(751)); pl(u->upby);
  978.   outstr(get_string(752)); pln(u->numdloads);
  979.   nl();
  980.   abort=0;
  981.   if (u->mask & mask_extended) {
  982.     pl(get_string(753));
  983.     print_extended(u->filename,&abort,255,0);
  984.   }
  985.  
  986.   sprintf(s,"%s%s",directories[dn].path,u->filename);
  987.   if (!exist(s)) {
  988.     nl();
  989.     pl(get_string(754));
  990.     nl();
  991.     return(-1);
  992.   }
  993.  
  994.   if (nsl()>=d)
  995.     return(1);
  996.   else
  997.     return(0);
  998. }
  999.  
  1000.  
  1001. void upload(int dn)
  1002. {
  1003.   directoryrec d;
  1004.   uploadsrec u,u1;
  1005.   int i,i1,i2,i3,i4,ok,xfer,f;
  1006.   char s[255],s1[81],*ss;
  1007.   long l;
  1008.   double ti;
  1009.  
  1010.   dliscan1(dn);
  1011.   d=directories[dn];
  1012.   if (numf>=d.maxfiles) {
  1013.     nl();
  1014.     nl();
  1015.     pl(get_string(755));
  1016.     nl();
  1017.     closedl();
  1018.     return;
  1019.   }
  1020.   if ((d.mask & mask_no_uploads) && (!dcs())) {
  1021.     nl();
  1022.     nl();
  1023.     pl(get_string(756));
  1024.     nl();
  1025.     closedl();
  1026.     return;
  1027.   }
  1028.   nl();
  1029.   l=(long)freek1(d.path);
  1030.   sprintf(s,"%s - %ldk %s.",get_string(757), l, get_string(758));
  1031.   pl(s);
  1032.   nl();
  1033.   if (l<100) {
  1034.     pl(get_string(759));
  1035.     nl();
  1036.     closedl();
  1037.     return;
  1038.   }
  1039.   prt(2,get_string(44));
  1040.   input(s,12);
  1041.   if (!okfn(s))
  1042.     s[0]=0;
  1043.   align(s);
  1044.   if (strchr(s,'?')) {
  1045.     closedl();
  1046.     return;
  1047.   }
  1048.   if (d.mask & mask_archive) {
  1049.     ok=0;
  1050.     s1[0]=0;
  1051.     for (i=0; i<4; i++) {
  1052.       if (syscfg.arcs[i].extension[0] && syscfg.arcs[i].extension[0]!=' ') {
  1053.         if (s1[0])
  1054.           strcat(s1,", ");
  1055.         strcat(s1,syscfg.arcs[i].extension);
  1056.         if (strcmp(s+9,syscfg.arcs[i].extension)==0)
  1057.           ok=1;
  1058.       }
  1059.     }
  1060.     if (!ok) {
  1061.       nl();
  1062.       pl(get_string(760));
  1063.       pl(get_string(761));
  1064.       pl(s1);
  1065.       nl();
  1066.       closedl();
  1067.       return;
  1068.     }
  1069.   }
  1070.   strcpy(u.filename,s);
  1071.   u.ownerusr=usernum;
  1072.   u.ownersys=0;
  1073.   u.numdloads=0;
  1074.   u.filetype=0;
  1075.   u.mask=0;
  1076.   strcpy(u.upby,nam(&thisuser,usernum));
  1077.   strcpy(u.date,date());
  1078.   nl();
  1079.   ok=1;
  1080.   xfer=1;
  1081.   if (check_batch_queue(u.filename)) {
  1082.     ok=0;
  1083.     nl();
  1084.     pl(get_string(762));
  1085.     nl();
  1086.   } else {
  1087.     sprintf(s1,"%s '%s' %s %s? ",get_string(757), s,get_string(763),d.name);
  1088.     if (strcmp(s,"        .   "))
  1089.       prt(5,s1);
  1090.     else
  1091.       ok=0;
  1092.   }
  1093.   if ((ok) && (yn())) {
  1094.     sprintf(s1,"%s%s",d.path,s);
  1095.     if (exist(s1)) {
  1096.       if (dcs()) {
  1097.         xfer=0;
  1098.         nl();
  1099.         nl();
  1100.         pl(get_string(764));
  1101.         prt(5,get_string(765));
  1102.         if (yn()==0)
  1103.           ok=0;
  1104.       } else {
  1105.         nl();
  1106.         nl();
  1107.         pl(get_string(766));
  1108.         nl();
  1109.         ok=0;
  1110.       }
  1111.     } else
  1112.       if (!incom) {
  1113.         nl();
  1114.         pl(get_string(767));
  1115.         pl(get_string(768));
  1116.         nl();
  1117.         ok=0;
  1118.       }
  1119.     if ((d.mask & mask_PD) && (ok)) {
  1120.       nl();
  1121.       prt(5,get_string(769));
  1122.       if (!yn()) {
  1123.         nl();
  1124.         pl(get_string(770));
  1125.         pl(get_string(771));
  1126.         pl(get_string(772));
  1127.         pl(get_string(773));
  1128.         pl(get_string(774));
  1129.         nl();
  1130.         sprintf(s,get_stringx(1,41),u.filename);
  1131.         add_ass(5,s);
  1132.         ok=0;
  1133.       } else
  1134.         u.mask=mask_PD;
  1135.     }
  1136.     if (ok) {
  1137.       nl();
  1138.       pl(get_string(775));
  1139.       nl();
  1140.       closedl();
  1141.       i2=0;
  1142.       for (i=0; (i<num_dirs) && (udir[i].subnum!=-1); i++) {
  1143.         strcpy(s,get_string(776));
  1144.         strcat(s,directories[udir[i].subnum].name);
  1145.         for (i3=i4=strlen(s); i3<i2; i3++) {
  1146.           s[i3]=' ';
  1147.           s[i3+1]=0;
  1148.         }
  1149.         i2=i4;
  1150.         npr("%s\r",s);
  1151.  
  1152.         dliscan1(udir[i].subnum);
  1153.         i1=recno(u.filename);
  1154.         closedl();
  1155.         if (i1>=0) {
  1156.           nl();
  1157.           outstr(get_string(777));
  1158.           pl(directories[udir[i].subnum].name);
  1159.           if (dcs()) {
  1160.             nl();
  1161.             prt(5,get_string(778));
  1162.             if (!yn()) {
  1163.               ok=0;
  1164.               break;
  1165.             }
  1166.             nl();
  1167.           } else {
  1168.             ok=0;
  1169.             break;
  1170.           }
  1171.         }
  1172.       }
  1173.       for (i1=0; i1<i2; i1++)
  1174.         s[i1]=' ';
  1175.       s[i1]=0;
  1176.       npr("%s\r",s);
  1177.       if (ok)
  1178.         dliscan1(dn);
  1179.       nl();
  1180.     }
  1181.     if (ok) {
  1182.       nl();
  1183.       pl(get_string(779));
  1184.       outstr(": ");
  1185.       inputl(u.description,58);
  1186.       nl();
  1187.       ss=NULL;
  1188.       modify_extended_description(&ss, directories[dn].name,u.filename);
  1189.       if (ss) {
  1190.         add_extended_description(u.filename,ss);
  1191.         u.mask |= mask_extended;
  1192.         farfree(ss);
  1193.       }
  1194.       nl();
  1195.       if (xfer) {
  1196.         ti=timer();
  1197.         receive_file(s1,&ok,&u.filetype, u.filename, dn);
  1198.         ti=timer()-ti;
  1199.         if (ti<0)
  1200.           ti += 24.0*3600.0;
  1201.         thisuser.extratime += ti;
  1202.       }
  1203.       if (ok) {
  1204.         if (ok==1) {
  1205.           f=open(s1,O_RDONLY | O_BINARY);
  1206.           if (f<0) {
  1207.             ok=0;
  1208.             nl();
  1209.             nl();
  1210.             pl(get_string(780));
  1211.             nl();
  1212.             if (u.mask & mask_extended)
  1213.               delete_extended_description(u.filename);
  1214.           }
  1215.           if (ok && syscfg.upload_c[0]) {
  1216.             close(f);
  1217.             pl(get_string(26));
  1218.             if (check_ul_event(dn,&u)) {
  1219.               if (u.mask & mask_extended)
  1220.                 delete_extended_description(u.filename);
  1221.               ok=0;
  1222.             } else {
  1223.               f=open(s1,O_RDONLY | O_BINARY);
  1224.             }
  1225.           }
  1226.         }
  1227.         if (ok) {
  1228.           if (ok==1) {
  1229.             l=filelength(f);
  1230.             u.numbytes=l;
  1231.             close(f);
  1232.             ++thisuser.uploaded;
  1233.             thisuser.uk += ((l+1023)/1024);
  1234.           } else
  1235.             u.numbytes=0;
  1236.           time(&l);
  1237.           u.daten=l;
  1238.           for (i=numf; i>=1; i--) {
  1239.             SETREC(i);
  1240.             read(dlf,(void *)&u1,sizeof(uploadsrec));
  1241.             SETREC(i+1);
  1242.             write(dlf,(void *)&u1,sizeof(uploadsrec));
  1243.           }
  1244.           SETREC(1);
  1245.           write(dlf,(void *)&u,sizeof(uploadsrec));
  1246.           ++numf;
  1247.           SETREC(0);
  1248.           read(dlf, &u1, sizeof(uploadsrec));
  1249.           u1.numbytes=numf;
  1250.           u1.daten=l;
  1251.           dir_dates[dn]=l;
  1252.           SETREC(0);
  1253.           write(dlf,(void *)&u1,sizeof(uploadsrec));
  1254.           if (ok==1) {
  1255.             ++status.uptoday;
  1256.             save_status();
  1257.             sprintf(s,get_stringx(1,42),u.filename,directories[dn].name);
  1258.             sysoplog(s);
  1259.             nl();
  1260.             nl();
  1261.             pl(get_string(781));
  1262.             nl();
  1263.             outstr(get_string(782));
  1264.             npr("%-6.3f\r\n", ratio());
  1265.             nl();
  1266.             nl();
  1267.             if (useron)
  1268.               topscreen();
  1269.           }
  1270.         }
  1271.       } else {
  1272.         nl();
  1273.         nl();
  1274.         pl(get_string(783));
  1275.         nl();
  1276.         if (u.mask & mask_extended)
  1277.           delete_extended_description(u.filename);
  1278.       }
  1279.     }
  1280.   }
  1281.   closedl();
  1282. }
  1283.  
  1284.  
  1285. /****************************************************************************/
  1286.  
  1287. long date_to_daten(char *datet)
  1288. {
  1289.   struct time t;
  1290.   struct date d;
  1291.  
  1292.   if (strlen(datet)!=8)
  1293.     return(0);
  1294.  
  1295.   memset(&d, 0, sizeof(struct date));
  1296.   memset(&t, 0, sizeof(struct time));
  1297.  
  1298.   d.da_mon=atoi(datet);
  1299.   d.da_day=atoi(datet+3);
  1300.   d.da_year=1900+atoi(datet+6);
  1301.  
  1302.   return(dostounix(&d, &t));
  1303. }
  1304.  
  1305.  
  1306. /****************************************************************************/
  1307.  
  1308. int try_to_download(char *s, int dn,int title)
  1309. {
  1310.   int i,ok,sent,abort=0,next=0,i1;
  1311.   uploadsrec u;
  1312.   char s1[81];
  1313.   userrec ur;
  1314.  
  1315.   dliscan1(dn);
  1316.   i=recno(s);
  1317.   if (i<=0) {
  1318.     closedl();
  1319.     abort=next=0;
  1320.     checka(&abort,&next);
  1321.     if (abort)
  1322.       return(-1);
  1323.     else
  1324.       return(0);
  1325.   }
  1326.   ok=1;
  1327.   foundany=1;
  1328.   while ((i>0) && (ok) && (!hangup)) {
  1329.     if (!ratio_ok()) {
  1330.       closedl();
  1331.       return(-1);
  1332.     }
  1333.     tleft(1);
  1334.     SETREC(i);
  1335.     read(dlf,(void *)&u,sizeof(uploadsrec));
  1336.     nl();
  1337.     if (title) {
  1338.       outstr(get_string(784));
  1339.       pl(directories[dn].name);
  1340.     }
  1341.     i1=printfileinfo(&u,dn);
  1342.     if ((i1) || (strncmp(u.filename,"WWIV4",5)==0)) {
  1343.       sprintf(s1,"%s%s",directories[dn].path,u.filename);
  1344.       sent=0;
  1345.       abort=0;
  1346.       if (i1==-1)
  1347.         send_file(s1,&sent,&abort,u.filetype,u.filename,dn, -2L);
  1348.       else
  1349.         send_file(s1,&sent,&abort,u.filetype,u.filename,dn, u.numbytes);
  1350.       if (sent) {
  1351.         ++thisuser.downloaded;
  1352.         thisuser.dk += (int) ((u.numbytes+1023)/1024);
  1353.         ++u.numdloads;
  1354.         SETREC(i);
  1355.         write(dlf,(void *)&u,sizeof(uploadsrec));
  1356.         sprintf(s1,get_stringx(1,43),u.filename);
  1357.         sysoplog(s1);
  1358.         nl();
  1359.         nl();
  1360.         outstr(get_string(782)); npr("%-6.3f\r\n", ratio());
  1361.         if (syscfg.sysconfig & sysconfig_log_dl) {
  1362.           read_user(u.ownerusr, &ur);
  1363.           if (!(ur.inact & inact_deleted)) {
  1364.             if (date_to_daten(ur.firston) < u.daten) {
  1365.               sprintf(s1,"%s %s '%s' %s %s",
  1366.                 nam(&thisuser,usernum), get_string(785), u.filename, get_string(786),date());
  1367.               ssm(u.ownerusr,0,s1);
  1368.             }
  1369.           }
  1370.         }
  1371.         if (useron)
  1372.           topscreen();
  1373.       }
  1374.     } else {
  1375.       nl();
  1376.       nl();
  1377.       pl(get_string(787));
  1378.       nl();
  1379.     }
  1380.     if (abort)
  1381.       ok=0;
  1382.     else
  1383.       i=nrecno(s,i);
  1384.   }
  1385.   closedl();
  1386.   if (abort)
  1387.     return(-1);
  1388.   else
  1389.     return(1);
  1390. }
  1391. /****************************************************************************/
  1392.  
  1393.  
  1394. void download(void)
  1395. {
  1396.   char s[81];
  1397.   int dn;
  1398.  
  1399.   nl();
  1400.   pl(get_string(788));
  1401.   nl();
  1402.   prt(2,get_string(44));
  1403.   input(s,12);
  1404.   if (s[0]==0)
  1405.     return;
  1406.   if (strchr(s,'.')==NULL)
  1407.     strcat(s,".*");
  1408.   align(s);
  1409.   if (try_to_download(s,udir[curdir].subnum,0)==0) {
  1410.     nl();
  1411.     pl(get_string(789));
  1412.     nl();
  1413.     foundany=dn=0;
  1414.     while ((dn<num_dirs) && (udir[dn].subnum!=-1)) {
  1415.       if (try_to_download(s,udir[dn].subnum,1)<0)
  1416.         dn=100;
  1417.       else
  1418.         dn++;
  1419.     }
  1420.     if (!foundany) {
  1421.       pl(get_string(89));
  1422.       nl();
  1423.     }
  1424.   }
  1425. }
  1426.  
  1427.  
  1428. void setldate(void)
  1429. {
  1430.   struct date d;
  1431.   struct time t;
  1432.   char s[81];
  1433.   int m,dd,y;
  1434.  
  1435.   nl();
  1436.   nl();
  1437.   unixtodos(nscandate,&d,&t);
  1438.   nl();
  1439.   outstr(get_string(790));
  1440.   npr("%02d/%02d/%02d\r\n",d.da_mon,d.da_day,(d.da_year-1900));
  1441.   nl();
  1442.   pl(get_string(791));
  1443.   pl(get_string(792));
  1444.   outstr(":");
  1445.   input(s,8);
  1446.   m=atoi(s);
  1447.   dd=atoi(&(s[3]));
  1448.   y=atoi(&(s[6]))+1900;
  1449.   if ((strlen(s)==8) && (m>0) && (m<=12) && (dd>0) && (dd<32) && (y>=1980)) {
  1450.     t.ti_min=0;
  1451.     t.ti_hour=0;
  1452.     t.ti_hund=0;
  1453.     t.ti_sec=0;
  1454.     d.da_year=y;
  1455.     d.da_day=dd;
  1456.     d.da_mon=m;
  1457.     nl();
  1458.     outstr(get_string(790));
  1459.     npr("%02d/%02d/%02d\r\n",m,dd,(y-1900));
  1460.     nl();
  1461.     nscandate=dostounix(&d,&t);
  1462.   }
  1463. }
  1464.  
  1465.  
  1466. void finddescription(void)
  1467. {
  1468.   uploadsrec u;
  1469.   int i,i1,i2,abort,pty,d,ocd,pts,next=0;
  1470.   char s[81],s1[81];
  1471.  
  1472.   nl();
  1473.   nl();
  1474.   pl(get_string(793));
  1475.   nl();
  1476.   pl(get_string(794));
  1477.   outstr(":");
  1478.   input(s1,58);
  1479.   if (s1[0]==0)
  1480.     return;
  1481.  
  1482.   ocd=curdir;
  1483.   abort=0;
  1484.   num_listed=0;
  1485.   for (i=0; (i<num_dirs) && (!abort) && (!hangup) && (udir[i].subnum!=-1); i++) {
  1486.     i1=udir[i].subnum;
  1487.     pts=0;
  1488.     if (qsc_n[i1/32]&(1L<<(i1%32)))
  1489.       pts=1;
  1490.     pts=1;
  1491.     /* remove pts=1 to search only marked directories */
  1492.     if (pts) {
  1493.       curdir=i;
  1494.       dliscan();
  1495.       pty=1;
  1496.       for (i1=1; (i1<=numf) && (!abort) && (!hangup); i1++) {
  1497.         SETREC(i1);
  1498.         read(dlf,(void *)&u,sizeof(uploadsrec));
  1499.         strcpy(s,u.description);
  1500.         for (i2=0; i2<strlen(s); i2++)
  1501.           s[i2]=upcase(s[i2]);
  1502.         if (strstr(s,s1)!=NULL) {
  1503.           if (pty) {
  1504.             printtitle(&abort);
  1505.             pty=0;
  1506.           }
  1507.           printinfo(&u,&abort);
  1508.         } else if (!empty())
  1509.           checka(&abort,&next);
  1510.       }
  1511.       closedl();
  1512.     }
  1513.   }
  1514.   curdir=ocd;
  1515.   if ((num_listed) && (!abort)) {
  1516.     nl();
  1517.     nl();
  1518.     sprintf(s,"%s: %d",get_string(744), num_listed);
  1519.     pl(s);
  1520.     nl();
  1521.   }
  1522. }
  1523.  
  1524.  
  1525. void arc_l(void)
  1526. {
  1527.   char s[81],s1[81],s2[81];
  1528.   int i,abort,next,i1;
  1529.   uploadsrec u;
  1530.  
  1531.   nl();
  1532.   prt(2,get_string(795));
  1533.   input(s,12);
  1534.   if (strchr(s,'.')==NULL)
  1535.     strcat(s,".*");
  1536.   if (!okfn(s))
  1537.     s[0]=0;
  1538.   align(s);
  1539.   dliscan();
  1540.   abort=0;
  1541.   next=0;
  1542.   i=recno(s);
  1543.   do {
  1544.     if (i>0) {
  1545.       SETREC(i);
  1546.       read(dlf,(void *)&u,sizeof(uploadsrec));
  1547.       i1=list_arc_out(stripfn(u.filename),directories[udir[curdir].subnum].path);
  1548.       if (i1)
  1549.         abort=1;
  1550.       checka(&abort,&next);
  1551.       i=nrecno(s,i);
  1552.     }
  1553.   } while ((i>0) && (!hangup) && (!abort));
  1554.   closedl();
  1555. }
  1556.  
  1557.  
  1558. /****************************************************************************/
  1559.  
  1560.  
  1561. void yourinfodl(void)
  1562. {
  1563.  
  1564.   nl();
  1565.   nl();
  1566.   outstr(get_string(796));
  1567.   npr("%ldk",thisuser.uk);
  1568.   outstr(get_string(797));
  1569.   npr("%d",thisuser.uploaded);
  1570.   pl(get_string(798));
  1571.   outstr(get_string(799));
  1572.   npr("%ldk",thisuser.dk);
  1573.   outstr(get_string(797));
  1574.   npr("%d",thisuser.downloaded);
  1575.   pl(get_string(798));
  1576.   outstr(get_string(800)); npr("%-6.3f\r\n",ratio());
  1577.   outstr(get_string(801)); pln(thisuser.dsl);
  1578.   nl();
  1579. }
  1580.  
  1581. void l_config_nscan(void)
  1582. {
  1583.   int i,abort,i1;
  1584.   char s[81], s2[81];
  1585.  
  1586.   abort=0;
  1587.   nl();
  1588.   pl(get_string(802));
  1589.   nl();
  1590.   for (i=0; (i<num_dirs) && (udir[i].subnum!=-1) && (!abort); i++) {
  1591.     i1=udir[i].subnum;
  1592.     if (qsc_n[i1/32]&(1L<<(i1%32)))
  1593.       strcpy(s,"* ");
  1594.     else
  1595.       strcpy(s,"  ");
  1596.     sprintf(s2,"%s%s. %s",s,udir[i].keys, directories[i1].name);
  1597.     pla(s2,&abort);
  1598.   }
  1599.   nl();
  1600.   nl();
  1601. }
  1602.  
  1603. void config_nscan(void)
  1604. {
  1605.   char *s;
  1606.   int i,done,i1;
  1607.  
  1608.   l_config_nscan();
  1609.   done=0;
  1610.   do {
  1611.     nl();
  1612.     pl(get_string(803));
  1613.     prt(2,get_string(443));
  1614.     s=mmkey(1);
  1615.     if (s[0])
  1616.       for (i=0; i<num_dirs; i++)
  1617.         if (strcmp(udir[i].keys,s)==0) {
  1618.           i1=udir[i].subnum;
  1619.           qsc_n[i1/32] ^= 1L<<(i1%32);
  1620.         }
  1621.     if (strcmp(s,"Q")==0)
  1622.       done=1;
  1623.     if (strcmp(s,"?")==0)
  1624.       l_config_nscan();
  1625.   } while ((!done) && (!hangup));
  1626. }
  1627.  
  1628.  
  1629. void xfer_defaults(void)
  1630. {
  1631.   char s[81],s1[81],ch;
  1632.   int i,i1,i2,done;
  1633.  
  1634.   done=0;
  1635.   do {
  1636.     outchr(12);
  1637.     pl(get_string(804));
  1638.     pl(get_string(805));
  1639.     outstr(get_string(806));
  1640.     npr(" (%s).\r\n", thisuser.sysstatus & sysstatus_nscan_file_system?str_yes:str_no);
  1641.     outstr(get_string(807));
  1642.     npr(" (%d %s%s).\r\n", thisuser.num_extended, get_string(808),
  1643.         thisuser.num_extended==1?"":"s");
  1644.     pl(get_string(809));
  1645.     nl();
  1646.     prt(2,get_string(297));
  1647.     helpl=32;
  1648.     ch=onek("Q1234");
  1649.     switch(ch) {
  1650.       case 'Q':
  1651.         done=1;
  1652.         break;
  1653.       case '1':
  1654.         helpl=24;
  1655.         config_nscan();
  1656.         break;
  1657.       case '2':
  1658.         nl();
  1659.         nl();
  1660.         pl(get_string(810));
  1661.         nl();
  1662.         helpl=40;
  1663.         i=get_protocol(xf_down);
  1664.         if (i>=0)
  1665.           thisuser.defprot=i;
  1666.         break;
  1667.       case '3':
  1668.         nl();
  1669.         nl();
  1670.         pl(get_string(811));
  1671.         outstr(get_string(812));
  1672.         if (thisuser.sysstatus & sysstatus_nscan_file_system)
  1673.           thisuser.sysstatus -= sysstatus_nscan_file_system;
  1674.         if (yn())
  1675.           thisuser.sysstatus += sysstatus_nscan_file_system;
  1676.         break;
  1677.       case '4':
  1678.         nl();
  1679.         nl();
  1680.         pl(get_string(813));
  1681.         pl(get_string(814));
  1682.         outstr(get_string(815));
  1683.         pln(thisuser.num_extended);
  1684.         prt(5,"? ");
  1685.         helpl=41;
  1686.         input(s,3);
  1687.         if (s[0]) {
  1688.           i=atoi(s);
  1689.           if ((i>=0) && (i<=10))
  1690.             thisuser.num_extended=i;
  1691.         }
  1692.         break;
  1693.     }
  1694.   } while ((!done) && (!hangup));
  1695.  
  1696. }
  1697.  
  1698.  
  1699. void removefile(void)
  1700. {
  1701.   int i,i1,ok,rm,abort,rdlp;
  1702.   char ch,s[81],s1[81];
  1703.   uploadsrec u;
  1704.   userrec uu;
  1705.  
  1706.   dliscan();
  1707.   nl();
  1708.   pl(get_string(816));
  1709.   outstr(":");
  1710.   mpl(12);
  1711.   input(s,12);
  1712.   if (s[0]==0) {
  1713.     closedl();
  1714.     return;
  1715.   }
  1716.   if (strchr(s,'.')==NULL)
  1717.     strcat(s,".*");
  1718.   align(s);
  1719.   i=recno(s);
  1720.   abort=0;
  1721.   while ((!hangup) && (i>0) && (!abort)) {
  1722.     SETREC(i);
  1723.     read(dlf,(void *)&u,sizeof(uploadsrec));
  1724.     if ((dcs()) || ((u.ownersys==0) && (u.ownerusr==usernum))) {
  1725.       nl();
  1726.       if (check_batch_queue(u.filename)) {
  1727.         pl(get_string(817));
  1728.         nl();
  1729.       } else {
  1730.         printfileinfo(&u,udir[curdir].subnum);
  1731.         prt(2,get_string(818));
  1732.         ch=ynq();
  1733.         if (ch=='Q')
  1734.           abort=1;
  1735.         else if (ch=='Y') {
  1736.           rdlp=1;
  1737.           if (dcs()) {
  1738.             prt(5,get_string(819));
  1739.             rm=yn();
  1740.             if (rm) {
  1741.               prt(5,get_string(820));
  1742.               rdlp=yn();
  1743.             }
  1744.           } else
  1745.             rm=1;
  1746.           if (rm) {
  1747.             sprintf(s1,"%s%s",directories[udir[curdir].subnum].path,u.filename);
  1748.             unlink(s1);
  1749.             if ((rdlp) && (u.ownersys==0)) {
  1750.               read_user(u.ownerusr,&uu);
  1751.               if ((uu.inact & inact_deleted)==0) {
  1752.                 if (date_to_daten(uu.firston) < u.daten) {
  1753.                   --uu.uploaded;
  1754.                   uu.uk -= ((u.numbytes+1023)/1024);
  1755.                   write_user(u.ownerusr,&uu);
  1756.                 }
  1757.               }
  1758.               close_user();
  1759.             }
  1760.           }
  1761.           if (u.mask & mask_extended)
  1762.             delete_extended_description(u.filename);
  1763.           sprintf(s1,get_stringx(1,44),u.filename,
  1764.                             directories[udir[curdir].subnum].name);
  1765.           sysoplog(s1);
  1766.           for (i1=i; i1<numf; i1++) {
  1767.             SETREC(i1+1);
  1768.             read(dlf,(void *)&u,sizeof(uploadsrec));
  1769.             SETREC(i1);
  1770.             write(dlf,(void *)&u,sizeof(uploadsrec));
  1771.           }
  1772.           --i;
  1773.           --numf;
  1774.           SETREC(0);
  1775.           read(dlf, &u, sizeof(uploadsrec));
  1776.           u.numbytes=numf;
  1777.           SETREC(0);
  1778.           write(dlf,(void *)&u,sizeof(uploadsrec));
  1779.         }
  1780.       }
  1781.     }
  1782.     i=nrecno(s,i);
  1783.   }
  1784.   closedl();
  1785. }
  1786.  
  1787.  
  1788.