home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / XFER.C < prev    next >
Text File  |  1993-04-27  |  35KB  |  1,602 lines

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