home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / XFER_LO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  6.5 KB  |  210 lines

  1. #line 1 "XFER_LO.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6.  
  7. /****************************************************************************/
  8. /* Prompts user for file specification. <CR> is *.* and .* is assumed.      */
  9. /* Returns padded file specification.                                       */
  10. /* Returns NULL if input was aborted.                                       */
  11. /****************************************************************************/
  12. char *getfilespec(char *str)
  13. {
  14. bputs(text[FileSpecStarDotStar]);
  15. if(!getstr(str,12,K_UPPER))
  16.     strcpy(str,"*.*");
  17. else if(!strchr(str,'.') && strlen(str)<=8)
  18.     strcat(str,".*");
  19. if(sys_status&SS_ABORT)
  20.     return(0);
  21. return(str);
  22. }
  23.  
  24. /****************************************************************************/
  25. /* Turns FILE.EXT into FILE    .EXT                                         */
  26. /****************************************************************************/
  27. char *padfname(char *filename, char *str)
  28. {
  29.     char c,d;
  30.  
  31. for(c=0;c<8;c++)
  32.     if(filename[c]=='.' || !filename[c]) break;
  33.     else str[c]=filename[c];
  34. d=c;
  35. if(filename[c]=='.') c++;
  36. while(d<8)
  37.     str[d++]=SP;
  38. str[d++]='.';
  39. while(d<12)
  40.     if(!filename[c]) break;
  41.     else str[d++]=filename[c++];
  42. while(d<12)
  43.     str[d++]=SP;
  44. str[d]=0;
  45. return(str);
  46. }
  47.  
  48. /****************************************************************************/
  49. /* Turns FILE    .EXT into FILE.EXT                                         */
  50. /****************************************************************************/
  51. char *unpadfname(char *filename, char *str)
  52. {
  53.     char c,d;
  54.  
  55. for(c=0,d=0;c<strlen(filename);c++)
  56.     if(filename[c]!=SP) str[d++]=filename[c];
  57. str[d]=0;
  58. return(str);
  59. }
  60.  
  61. /****************************************************************************/
  62. /* Checks to see if filename matches filespec. Returns 1 if yes, 0 if no    */
  63. /****************************************************************************/
  64. char filematch(char *filename, char *filespec)
  65. {
  66.     char c;
  67.  
  68. for(c=0;c<8;c++) /* Handle Name */
  69.     if(filespec[c]=='*') break;
  70.     else if(filespec[c]=='?') continue;
  71.     else if(filename[c]!=filespec[c]) return(0);
  72. for(c=9;c<12;c++)
  73.     if(filespec[c]=='*') break;
  74.     else if(filespec[c]=='?') continue;
  75.     else if(filename[c]!=filespec[c]) return(0);
  76. return(1);
  77. }
  78.  
  79. /****************************************************************************/
  80. /* Deletes all files in dir 'path' that match file spec 'spec'              */
  81. /****************************************************************************/
  82. int delfiles(char *inpath, char *spec)
  83. {
  84.     char str[256],path[128],done;
  85.     int files=0;
  86.     struct ffblk ff;
  87.  
  88. strcpy(path,inpath);
  89. backslash(path);
  90. sprintf(str,"%s%s",path,spec);
  91. done=findfirst(str,&ff,0);
  92. while(!done) {
  93.     sprintf(str,"%s%s",path,ff.ff_name);
  94.     _chmod(str,1,FA_NORMAL);    // Incase it's been marked RDONLY
  95.     if(remove(str))
  96.         errormsg(WHERE,ERR_REMOVE,str,0);
  97.     else
  98.         files++;
  99.     done=findnext(&ff); }
  100. return(files);
  101. }
  102.  
  103. /*****************************************************************************/
  104. /* Checks the filename 'fname' for invalid symbol or character sequences     */
  105. /*****************************************************************************/
  106. char checkfname(char *fname)
  107. {
  108.     char str[256],c=0,d;
  109.  
  110. if(strcspn(fname,"\\/|<>+[]:=\";,%")!=strlen(fname)) {
  111.     sprintf(str,"Suspicious filename attempt: '%s'",fname);
  112.     errorlog(str);
  113.     return(0); }
  114. if(strstr(fname,".."))
  115.     return(0);
  116. if(strcspn(fname,".")>8)
  117.     return(0);
  118. d=strlen(fname);
  119. while(c<d) {
  120.     if(fname[c]<=SP || fname[c]&0x80)
  121.         return(0);
  122.     c++; }
  123. return(1);
  124. }
  125.  
  126. /**************************************************************************/
  127. /* Add file 'f' to batch download queue. Return 1 if successful, 0 if not */
  128. /**************************************************************************/
  129. char addtobatdl(file_t f)
  130. {
  131.     char str[256],tmp2[256];
  132.     uint i;
  133.     ulong totalcdt, totalsize, totaltime;
  134.  
  135. if(useron.rest&FLAG('D')) {
  136.     bputs(text[R_Download]);
  137.     return(0); }
  138. /***
  139. sprintf(str,"%s%s",f.altpath>0 && f.altpath<=altpaths ? altpath[f.altpath-1]
  140.     : dir[f.dir]->path,unpadfname(f.name,tmp));
  141. ***/
  142. for(i=0;i<batdn_total;i++) {
  143.     if(!strcmp(batdn_name[i],f.name) && f.dir==batdn_dir[i]) {
  144.         bprintf(text[FileAlreadyInQueue],f.name);
  145.         return(0); } }
  146. if(f.size<=0 /* !fexist(str) */) {
  147.     bprintf(text[CantAddToQueue],f.name);
  148.     bputs(text[FileIsNotOnline]);
  149.     return(0); }
  150. if(batdn_total>=max_batdn) {
  151.     bprintf(text[CantAddToQueue],f.name);
  152.     bputs(text[BatchDlQueueIsFull]);
  153.     return(0); }
  154. for(i=0,totalcdt=0;i<batdn_total;i++)
  155.     totalcdt+=batdn_cdt[i];
  156. if(dir[f.dir]->misc&DIR_FREE) f.cdt=0L;
  157. totalcdt+=f.cdt;
  158. if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) {
  159.     bprintf(text[CantAddToQueue],f.name);
  160.     bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp));
  161.     return(0); }
  162. if(!chk_ar(dir[f.dir]->dl_ar,useron)) {
  163.     bprintf(text[CantAddToQueue],f.name);
  164.     bputs(text[CantDownloadFromDir]);
  165.     return(0); }
  166. for(i=0,totalsize=totaltime=0;i<batdn_total;i++) {
  167.     totalsize+=batdn_size[i];
  168.     if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
  169.         totaltime+=batdn_size[i]/(ulong)cur_cps; }
  170. totalsize+=f.size;
  171. if(!(dir[f.dir]->misc&DIR_TFREE) && cur_cps)
  172.     totaltime+=f.size/(ulong)cur_cps;
  173. if(!(useron.exempt&FLAG('T')) && totaltime>timeleft) {
  174.     bprintf(text[CantAddToQueue],f.name);
  175.     bputs(text[NotEnoughTimeToDl]);
  176.     return(0); }
  177. strcpy(batdn_name[batdn_total],f.name);
  178. batdn_dir[batdn_total]=f.dir;
  179. batdn_cdt[batdn_total]=f.cdt;
  180. batdn_offset[batdn_total]=f.datoffset;
  181. batdn_size[batdn_total]=f.size;
  182. batdn_alt[batdn_total]=f.altpath;
  183. batdn_total++;
  184. openfile(f);
  185. bprintf(text[FileAddedToBatDlQueue]
  186.     ,f.name,batdn_total,max_batdn,ultoac(totalcdt,tmp)
  187.     ,ultoac(totalsize,tmp2)
  188.     ,sectostr(totalsize/(ulong)cur_cps,str));
  189. return(1);
  190. }
  191.  
  192. /****************************************************************************/
  193. /* This function returns the command line for the temp file extension for    */
  194. /* current user online.                                                     */
  195. /****************************************************************************/
  196. char *temp_cmd(void)
  197. {
  198.     int i;
  199.  
  200. if(!total_fcomps) {
  201.     errormsg(WHERE,ERR_CHK,"compressable file types",0);
  202.     return(nulstr); }
  203. for(i=0;i<total_fcomps;i++)
  204.     if(!stricmp(useron.tmpext,fcomp[i]->ext)
  205.         && chk_ar(fcomp[i]->ar,useron))
  206.         return(fcomp[i]->cmd);
  207. return(fcomp[0]->cmd);
  208. }
  209.  
  210.