Annotation of sbbs/sbbs2/xfer_lo.c, revision 1.1

1.1     ! root        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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.