Annotation of sbbs/sbbs2/xfer_mid.c, revision 1.1.1.1

1.1       root        1: #line 1 "XFER_MID.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: 
                      7: /****************************************************************************/
                      8: /* This function is called when a file is unsuccessfully downloaded.        */
                      9: /* It logs the tranfer time and checks for possible leech protocol use.     */
                     10: /****************************************************************************/
                     11: void notdownloaded(ulong size, time_t start, time_t end)
                     12: {
                     13:     char str[256],tmp2[256];
                     14: 
                     15: sprintf(str,"Estimated Time: %s  Transfer Time: %s"
                     16:     ,sectostr(cur_cps ? size/cur_cps : 0,tmp)
                     17:     ,sectostr((uint)end-start,tmp2));
                     18: logline(nulstr,str);
                     19: if(leech_pct && cur_cps                 /* leech detection */
                     20:     && end-start>=leech_sec
                     21:     && end-start>=(double)(size/cur_cps)*(double)leech_pct/100.0) {
                     22:     sprintf(str,"Possible use of leech protocol (leech=%u  downloads=%u)"
                     23:         ,useron.leech+1,useron.dls);
                     24:     errorlog(str);
                     25:     useron.leech=adjustuserrec(useron.number,U_LEECH,2,1); }
                     26: }
                     27: 
                     28: /****************************************************************************/
                     29: /* List detailed information about the files in 'filespec'. Prompts for     */
                     30: /* action depending on 'mode.'                                              */
                     31: /* Returns number of files matching filespec that were found                */
                     32: /****************************************************************************/
                     33: int listfileinfo(uint dirnum, char *filespec, char mode)
                     34: {
                     35:        uchar str[258],path[258],dirpath[256],done=0,ch,fname[13],ext[513];
                     36:        uchar HUGE16 *ixbbuf,*usrxfrbuf=NULL,*p;
                     37:     int i,j,found=0,file;
                     38:     ulong l,m,usrcdt,usrxfrlen;
                     39:     time_t start,end;
                     40:     file_t f;
                     41: 
                     42: sprintf(str,"%sXFER.IXT",data_dir);
                     43: if(mode==FI_USERXFER && flength(str)>0L) {
                     44:     if((file=nopen(str,O_RDONLY))==-1) {
                     45:         errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                     46:         return(0); }
                     47:     usrxfrlen=filelength(file);
                     48:        if((usrxfrbuf=MALLOC(usrxfrlen))==NULL) {
                     49:         close(file);
                     50:         errormsg(WHERE,ERR_ALLOC,str,usrxfrlen);
                     51:         return(0); }
                     52:     if(read(file,usrxfrbuf,usrxfrlen)!=usrxfrlen) {
                     53:         close(file);
                     54:                FREE(usrxfrbuf);
                     55:         errormsg(WHERE,ERR_READ,str,usrxfrlen);
                     56:         return(0); }
                     57:     close(file); }
                     58: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                     59: if((file=nopen(str,O_RDONLY))==-1)
                     60:     return(0);
                     61: l=filelength(file);
                     62: if(!l) {
                     63:     close(file);
                     64:     return(0); }
                     65: if((ixbbuf=(char *)MALLOC(l))==NULL) {
                     66:     close(file);
                     67:     errormsg(WHERE,ERR_ALLOC,str,l);
                     68:     return(0); }
                     69: if(lread(file,ixbbuf,l)!=l) {
                     70:     close(file);
                     71:     errormsg(WHERE,ERR_READ,str,l);
                     72:        FREE((char *)ixbbuf);
                     73:     if(usrxfrbuf)
                     74:                FREE(usrxfrbuf);
                     75:     return(0); }
                     76: close(file);
                     77: sprintf(str,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code);
                     78: if((file=nopen(str,O_RDONLY))==-1) {
                     79:     errormsg(WHERE,ERR_READ,str,O_RDONLY);
                     80:        FREE((char *)ixbbuf);
                     81:     if(usrxfrbuf)
                     82:                FREE(usrxfrbuf);
                     83:     return(0); }
                     84: close(file);
                     85: m=0;
                     86: while(online && !done && m<l) {
                     87:        if(mode==FI_REMOVE && dir_op(dirnum))
                     88:         action=NODE_SYSP;
                     89:     else action=NODE_LFIL;
                     90:     if(msgabort()) {
                     91:         found=-1;
                     92:         break; }
                     93:     for(i=0;i<12 && m<l;i++)
                     94:         if(i==8)
                     95:             str[i]='.';
                     96:         else
                     97:             str[i]=ixbbuf[m++];     /* Turns FILENAMEEXT into FILENAME.EXT */
                     98:     str[i]=0;
                     99:     unpadfname(str,fname);
                    100:     if(filespec[0] && !filematch(str,filespec)) {
                    101:         m+=11;
                    102:         continue; }
                    103:     f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16);
                    104:     f.dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)
                    105:         |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24);
                    106:     f.datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)
                    107:         |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24);
                    108:     m+=11;
                    109:     if(mode==FI_OLD && f.datedled>ns_time)
                    110:         continue;
                    111:     if((mode==FI_OLDUL || mode==FI_OLD) && f.dateuled>ns_time)
                    112:         continue;
                    113:        f.dir=curdirnum=dirnum;
                    114:     strcpy(f.name,str);
                    115:        f.size=0;
                    116:     getfiledat(&f);
                    117:        if(mode==FI_OFFLINE && f.size>=0)
                    118:                continue;
                    119:     if(f.altpath>0 && f.altpath<=altpaths)
                    120:         strcpy(dirpath,altpath[f.altpath-1]);
                    121:     else
                    122:         strcpy(dirpath,dir[f.dir]->path);
                    123:     if(mode==FI_CLOSE && !f.opencount)
                    124:         continue;
                    125:     if(mode==FI_USERXFER) {
                    126:         for(p=usrxfrbuf;p<usrxfrbuf+usrxfrlen;p+=24) {
                    127:             sprintf(str,"%17.17s",p);   /* %4.4u %12.12s */
                    128:             if(!strcmp(str+5,f.name) && useron.number==atoi(str))
                    129:                 break; }
                    130:         if(p>=usrxfrbuf+usrxfrlen) /* file wasn't found */
                    131:             continue; }
                    132:        if((mode==FI_REMOVE) && (!dir_op(dirnum) && strcmpi(f.uler
                    133:                ,useron.alias) && !(useron.exempt&FLAG('R'))))
                    134:                continue;
                    135:     found++;
                    136:        if(mode==FI_INFO) {
                    137:                if(!viewfile(f,1)) {
                    138:                        done=1;
                    139:                        found=-1; } }
                    140:        else
                    141:                fileinfo(f);
                    142:     if(mode==FI_CLOSE) {
                    143:         if(!noyes(text[CloseFileRecordQ])) {
                    144:             f.opencount=0;
                    145:             putfiledat(f); } }
                    146:     else if(mode==FI_REMOVE || mode==FI_OLD || mode==FI_OLDUL
                    147:         || mode==FI_OFFLINE) {
                    148:         SYNC;
                    149:         CRLF;
                    150:         if(f.opencount) {
                    151:             mnemonics(text[QuitOrNext]);
                    152:             strcpy(str,"Q\r"); }
                    153:                else if(dir_op(dirnum)) {
                    154:             mnemonics(text[SysopRemoveFilePrompt]);
                    155:                        strcpy(str,"VEFMCQR\r"); }
                    156:         else if(useron.exempt&FLAG('R')) {
                    157:             mnemonics(text[RExemptRemoveFilePrompt]);
                    158:                        strcpy(str,"VEMQR\r"); }
                    159:         else {
                    160:             mnemonics(text[UserRemoveFilePrompt]);
                    161:                        strcpy(str,"VEQR\r"); }
                    162:         switch(getkeys(str,0)) {
                    163:                        case 'V':
                    164:                                viewfilecontents(f);
                    165:                                CRLF;
                    166:                                ASYNC;
                    167:                                pause();
                    168:                                m-=F_IXBSIZE;
                    169:                                continue;
                    170:             case 'E':   /* edit file information */
                    171:                                if(dir_op(dirnum)) {
                    172:                     bputs(text[EditFilename]);
                    173:                     strcpy(str,fname);
                    174:                                        getstr(str,12,K_EDIT|K_AUTODEL|K_UPPER);
                    175:                     if(strcmp(str,fname)) { /* rename */
                    176:                         padfname(str,path);
                    177:                         if(findfile(f.dir,path))
                    178:                             bprintf(text[FileAlreadyThere],path);
                    179:                         else {
                    180:                             sprintf(path,"%s%s",dirpath,fname);
                    181:                             sprintf(tmp,"%s%s",dirpath,str);
                    182:                             if(rename(path,tmp))
                    183:                                 bprintf(text[CouldntRenameFile],path,tmp);
                    184:                             else {
                    185:                                 bprintf(text[FileRenamed],path,tmp);
                    186:                                 strcpy(fname,str);
                    187:                                 removefiledat(f);
                    188:                                 strcpy(f.name,padfname(str,tmp));
                    189:                                 addfiledat(&f); } } } }
                    190:                 bputs(text[EditDescription]);
                    191:                                getstr(f.desc,LEN_FDESC,K_LINE|K_EDIT|K_AUTODEL);
                    192:                 if(f.misc&FM_EXTDESC) {
                    193:                                        if(!noyes(text[DeleteExtDescriptionQ])) {
                    194:                         remove(str);
                    195:                         f.misc&=~FM_EXTDESC; } }
                    196:                                if(!dir_op(dirnum)) {
                    197:                     putfiledat(f);
                    198:                     break; }
                    199:                 bputs(text[EditUploader]);
                    200:                                getstr(f.uler,LEN_ALIAS,K_UPRLWR|K_EDIT|K_AUTODEL);
                    201:                 ultoa(f.cdt,str,10);
                    202:                 bputs(text[EditCreditValue]);
                    203:                                getstr(str,7,K_NUMBER|K_EDIT|K_AUTODEL);
                    204:                 f.cdt=atol(str);
                    205:                 itoa(f.timesdled,str,10);
                    206:                 bputs(text[EditTimesDownloaded]);
                    207:                                getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL);
                    208:                 f.timesdled=atoi(str);
                    209:                 if(f.opencount) {
                    210:                     itoa(f.opencount,str,10);
                    211:                     bputs(text[EditOpenCount]);
                    212:                                        getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
                    213:                     f.opencount=atoi(str); }
                    214:                 if(altpaths || f.altpath) {
                    215:                     itoa(f.altpath,str,10);
                    216:                     bputs(text[EditAltPath]);
                    217:                                        getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
                    218:                     f.altpath=atoi(str);
                    219:                     if(f.altpath>altpaths)
                    220:                         f.altpath=0; }
                    221:                 putfiledat(f);
                    222:                                inputnstime(&f.dateuled);
                    223:                                update_uldate(f);
                    224:                 break;
                    225:             case 'F':   /* delete file only */
                    226:                 sprintf(str,"%s%s",dirpath,fname);
                    227:                 if(!fexist(str))
                    228:                     bputs(text[FileNotThere]);
                    229:                 else {
                    230:                     if(!noyes(text[AreYouSureQ])) {
                    231:                         if(remove(str))
                    232:                             bprintf(text[CouldntRemoveFile],str);
                    233:                         else {
                    234:                             sprintf(tmp,"Deleted %s",str);
                    235:                             logline(nulstr,tmp); } } }
                    236:                 break;
                    237:             case 'R':   /* remove file from database */
                    238:                 if(noyes(text[AreYouSureQ]))
                    239:                     break;
                    240:                 removefiledat(f);
                    241:                 sprintf(str,"Removed %s from %s %s",f.name
                    242:                     ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    243:                 logline("U-",str);
                    244:                 sprintf(str,"%s%s",dirpath,fname);
                    245:                 if(fexist(str)) {
                    246:                                        if(dir_op(dirnum)) {
                    247:                         if(!noyes(text[DeleteFileQ])) {
                    248:                             if(remove(str))
                    249:                                 bprintf(text[CouldntRemoveFile],str);
                    250:                             else {
                    251:                                 sprintf(tmp,"Deleted %s",str);
                    252:                                 logline(nulstr,tmp); } } }
                    253:                     else if(remove(str))    /* always remove if not sysop */
                    254:                         bprintf(text[CouldntRemoveFile],str); }
                    255:                                if(dir_op(dirnum) || useron.exempt&FLAG('R')) {
                    256:                     i=lib[dir[f.dir]->lib]->offline_dir;
                    257:                     if(i!=dirnum && i!=(int)INVALID_DIR
                    258:                         && !findfile(i,f.name)) {
                    259:                         sprintf(str,text[AddToOfflineDirQ]
                    260:                             ,fname,lib[dir[i]->lib]->sname,dir[i]->sname);
                    261:                         if(yesno(str)) {
                    262:                                                        getextdesc(f.dir,f.datoffset,ext);
                    263:                             f.dir=i;
                    264:                                                        addfiledat(&f);
                    265:                                                        if(f.misc&FM_EXTDESC)
                    266:                                                                putextdesc(f.dir,f.datoffset,ext); } } }
                    267:                                if(dir_op(dirnum) || strcmpi(f.uler,useron.alias)) {
                    268:                     if(noyes(text[RemoveCreditsQ]))
                    269: /* Fall through */      break; }
                    270:             case 'C':   /* remove credits only */
                    271:                 if((i=matchuser(f.uler))==0) {
                    272:                                        bputs(text[UnknownUser]);
                    273:                     break; }
                    274:                                if(dir_op(dirnum)) {
                    275:                                        usrcdt=(ulong)(f.cdt*(dir[f.dir]->up_pct/100.0));
                    276:                     if(f.timesdled)     /* all downloads */
                    277:                         usrcdt+=(ulong)((long)f.timesdled
                    278:                                                        *f.cdt*(dir[f.dir]->dn_pct/100.0));
                    279:                     ultoa(usrcdt,str,10);
                    280:                     bputs(text[CreditsToRemove]);
                    281:                                        getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL);
                    282:                     f.cdt=atol(str); }
                    283:                 usrcdt=adjustuserrec(i,U_CDT,10,-f.cdt);
                    284:                 if(i==useron.number)
                    285:                     useron.cdt=usrcdt;
                    286:                 sprintf(str,text[FileRemovedUserMsg]
                    287:                                        ,f.name,f.cdt ? ultoac(f.cdt,tmp) : text[No]);
                    288:                 putsmsg(i,str);
                    289:                 usrcdt=adjustuserrec(i,U_ULB,10,-f.size);
                    290:                 if(i==useron.number)
                    291:                     useron.ulb=usrcdt;
                    292:                 usrcdt=adjustuserrec(i,U_ULS,5,-1);
                    293:                 if(i==useron.number)
                    294:                     useron.uls=usrcdt;
                    295:                 break;
                    296:             case 'M':   /* move the file to another dir */
                    297:                                CRLF;
                    298:                 for(i=0;i<usrlibs;i++)
                    299:                     bprintf(text[MoveToLibLstFmt],i+1,lib[usrlib[i]]->lname);
                    300:                 SYNC;
                    301:                 bprintf(text[MoveToLibPrompt],dir[dirnum]->lib+1);
                    302:                                if((i=getnum(usrlibs))==-1)
                    303:                     continue;
                    304:                 if(!i)
                    305:                     i=dir[dirnum]->lib;
                    306:                 else
                    307:                     i--;
                    308:                 CRLF;
                    309:                 for(j=0;j<usrdirs[i];j++)
                    310:                     bprintf(text[MoveToDirLstFmt]
                    311:                         ,j+1,dir[usrdir[i][j]]->lname);
                    312:                 SYNC;
                    313:                 bprintf(text[MoveToDirPrompt],usrdirs[i]);
                    314:                 if((j=getnum(usrdirs[i]))==-1)
                    315:                     continue;
                    316:                 if(!j)
                    317:                     j=usrdirs[i]-1;
                    318:                 else j--;
                    319:                 CRLF;
                    320:                 if(findfile(usrdir[i][j],f.name)) {
                    321:                     bprintf(text[FileAlreadyThere],f.name);
                    322:                     break; }
                    323:                                getextdesc(f.dir,f.datoffset,ext);
                    324:                 removefiledat(f);
                    325:                                if(f.dir==upload_dir || f.dir==sysop_dir)
                    326:                                        f.dateuled=time(NULL);
                    327:                 f.dir=usrdir[i][j];
                    328:                 addfiledat(&f);
                    329:                 bprintf(text[MovedFile],f.name
                    330:                     ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    331:                 sprintf(str,"Moved %s to %s %s",f.name
                    332:                     ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    333:                 logline(nulstr,str);
                    334:                 if(!f.altpath) {    /* move actual file */
                    335:                     sprintf(str,"%s%s",dir[dirnum]->path,fname);
                    336:                     if(fexist(str)) {
                    337:                         sprintf(path,"%s%s",dir[f.dir]->path,fname);
                    338:                         mv(str,path,0); } }
                    339:                                if(f.misc&FM_EXTDESC)
                    340:                                        putextdesc(f.dir,f.datoffset,ext);
                    341:                 break;
                    342:             case 'Q':   /* quit */
                    343:                 found=-1;
                    344:                 done=1;
                    345:                 break; } }
                    346:     else if(mode==FI_DOWNLOAD || mode==FI_USERXFER) {
                    347:         sprintf(path,"%s%s",dirpath,fname);
                    348:         if(f.size<1L) { /* getfiledat will set this to -1 if non-existant */
                    349:             SYNC;       /* and 0 byte files shouldn't be d/led */
                    350:             mnemonics(text[QuitOrNext]);
                    351:             if(getkeys("\rQ",0)=='Q') {
                    352:                 found=-1;
                    353:                 break; }
                    354:             continue; }
                    355:         if(!(dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))
                    356:                        && f.cdt>(useron.cdt+useron.freecdt)) {
                    357:             SYNC;
                    358:                        bprintf(text[YouOnlyHaveNCredits]
                    359:                                ,ultoac(useron.cdt+useron.freecdt,tmp));
                    360:             mnemonics(text[QuitOrNext]);
                    361:             if(getkeys("\rQ",0)=='Q') {
                    362:                 found=-1;
                    363:                 break; }
                    364:             continue; }
                    365:                if(!chk_ar(dir[f.dir]->dl_ar,useron)) {
                    366:                        SYNC;
                    367:                        bputs(text[CantDownloadFromDir]);
                    368:                        mnemonics(text[QuitOrNext]);
                    369:             if(getkeys("\rQ",0)=='Q') {
                    370:                 found=-1;
                    371:                 break; }
                    372:             continue; }
                    373:                if(!(dir[f.dir]->misc&DIR_TFREE) && f.timetodl>timeleft && !dir_op(dirnum)
                    374:                        && !(useron.exempt&FLAG('T'))) {
                    375:             SYNC;
                    376:             bputs(text[NotEnoughTimeToDl]);
                    377:             mnemonics(text[QuitOrNext]);
                    378:             if(getkeys("\rQ",0)=='Q') {
                    379:                 found=-1;
                    380:                 break; }
                    381:             continue; }
                    382:         menu("DLPROT");
                    383:         openfile(f);
                    384:         SYNC;
                    385:         mnemonics(text[ProtocolBatchQuitOrNext]);
                    386:         strcpy(str,"BQ\r");
                    387:         for(i=0;i<total_prots;i++)
                    388:                        if(prot[i]->dlcmd[0]
                    389:                                && chk_ar(prot[i]->ar,useron)) {
                    390:                 sprintf(tmp,"%c",prot[i]->mnemonic);
                    391:                 strcat(str,tmp); }
                    392: //               ungetkey(useron.prot);
                    393:                ch=getkeys(str,0);
                    394:         if(ch=='Q') {
                    395:             found=-1;
                    396:             done=1; }
                    397:         else if(ch=='B') {
                    398:             if(!addtobatdl(f)) {
                    399:                 closefile(f);
                    400:                 break; } }
                    401:         else if(ch!=CR) {
                    402:             for(i=0;i<total_prots;i++)
                    403:                                if(prot[i]->dlcmd[0] && prot[i]->mnemonic==ch
                    404:                                        && chk_ar(prot[i]->ar,useron))
                    405:                     break;
                    406:             if(i<total_prots) {
                    407:                                if(online==ON_LOCAL) {
                    408:                                        bputs(text[EnterPath]);
                    409:                                        if(getstr(path,60,K_UPPER|K_LINE)) {
                    410:                                                backslash(path);
                    411:                                                strcat(path,fname);
                    412:                                                sprintf(str,"%s%s",dirpath,fname);
                    413:                                                if(!mv(str,path,1))
                    414:                                                        downloadfile(f);
                    415:                                                for(j=0;j<total_dlevents;j++)
                    416:                                                        if(!stricmp(dlevent[j]->ext,f.name+9)
                    417:                                                                && chk_ar(dlevent[j]->ar,useron)) {
                    418:                                                                bputs(dlevent[j]->workstr);
                    419:                                                                external(cmdstr(dlevent[j]->cmd,path,nulstr
                    420:                                                                        ,NULL)
                    421:                                                                        ,EX_OUTL);
                    422:                                                                CRLF; }
                    423:                                                        } }
                    424:                                else {
                    425:                                        delfiles(temp_dir,"*.*");
                    426:                                        if(dir[f.dir]->seqdev) {
                    427:                                                lncntr=0;
                    428:                                                seqwait(dir[f.dir]->seqdev);
                    429:                                                bprintf(text[RetrievingFile],fname);
                    430:                                                sprintf(str,"%s%s",dirpath,fname);
                    431:                                                sprintf(path,"%s%s",temp_dir,fname);
                    432:                                                mv(str,path,1); /* copy the file to temp dir */
                    433:                                                getnodedat(node_num,&thisnode,1);
                    434:                                                thisnode.aux=0xf0;
                    435:                                                putnodedat(node_num,thisnode);
                    436:                                                CRLF; }
                    437:                                        for(j=0;j<total_dlevents;j++)
                    438:                                                if(!stricmp(dlevent[j]->ext,f.name+9)
                    439:                                                        && chk_ar(dlevent[j]->ar,useron)) {
                    440:                                                        bputs(dlevent[j]->workstr);
                    441:                                                        external(cmdstr(dlevent[j]->cmd,path,nulstr,NULL)
                    442:                                                                ,EX_OUTL);
                    443:                                                        CRLF; }
                    444:                                        getnodedat(node_num,&thisnode,1);
                    445:                                        action=NODE_DLNG;
                    446:                                        unixtodos(now+f.timetodl,&date,&curtime);
                    447:                                        thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min;
                    448:                                        putnodedat(node_num,thisnode); /* calculate ETA */
                    449:                                        start=time(NULL);
                    450:                                        j=protocol(cmdstr(prot[i]->dlcmd,path,nulstr,NULL),0);
                    451:                                        end=time(NULL);
                    452:                                        if(dir[f.dir]->misc&DIR_TFREE)
                    453:                                                starttime+=end-start;
                    454:                                        if(prot[i]->misc&PROT_DSZLOG) {
                    455:                                                if(checkprotlog(f))
                    456:                                                        downloadfile(f);
                    457:                                                else
                    458:                                                        notdownloaded(f.size,start,end); }
                    459:                                        else {
                    460:                                                if(!j)
                    461:                                                        downloadfile(f);
                    462:                                                else {
                    463:                                                        bprintf(text[FileNotSent],f.name);
                    464:                                                        notdownloaded(f.size,start,end); } }
                    465:                                        delfiles(temp_dir,"*.*");
                    466:                                        autohangup(); } } }
                    467:         closefile(f); }
                    468:     if(filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?')) break; }
                    469: FREE((char *)ixbbuf);
                    470: if(usrxfrbuf)
                    471:        FREE(usrxfrbuf);
                    472: return(found);
                    473: }
                    474: 
                    475: 
                    476: /****************************************************************************/
                    477: /* Checks  directory data file for 'filename' (must be padded). If found,   */
                    478: /* it returns the 1, else returns 0.                                        */
                    479: /* Called from upload and bulkupload                                        */
                    480: /****************************************************************************/
                    481: char findfile(uint dirnum, char *filename)
                    482: {
                    483:        char str[256],c,fname[13],HUGE16 *ixbbuf;
                    484:     int file;
                    485:     ulong length,l;
                    486: 
                    487: sprintf(fname,"%.12s",filename);
                    488: strupr(fname);
                    489: for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    490:     fname[c]=fname[c+1];
                    491: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                    492: if((file=nopen(str,O_RDONLY))==-1) return(0);
                    493: length=filelength(file);
                    494: if(!length) {
                    495:     close(file);
                    496:     return(0); }
                    497: if((ixbbuf=(char *)MALLOC(length))==NULL) {
                    498:     close(file);
                    499:     errormsg(WHERE,ERR_ALLOC,str,length);
                    500:     return(0); }
                    501: if(lread(file,ixbbuf,length)!=length) {
                    502:     close(file);
                    503:     errormsg(WHERE,ERR_READ,str,length);
                    504:        FREE((char *)ixbbuf);
                    505:     return(0); }
                    506: close(file);
                    507: for(l=0;l<length;l+=F_IXBSIZE) {
                    508:     for(c=0;c<11;c++)
                    509:         if(fname[c]!=toupper(ixbbuf[l+c])) break;
                    510:     if(c==11) break; }
                    511: FREE((char *)ixbbuf);
                    512: if(l!=length)
                    513:     return(1);
                    514: return(0);
                    515: }
                    516: 
                    517: /****************************************************************************/
                    518: /* Prints one file's information on a single line to a file 'file'          */
                    519: /****************************************************************************/
                    520: void listfiletofile(char *fname, char HUGE16 *buf, uint dirnum, int file)
                    521: {
                    522:     char str[256],exist=1;
                    523:     uchar alt;
                    524:     ulong cdt;
                    525: 
                    526: strcpy(str,fname);
                    527: if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC)
                    528:     strcat(str,"+");
                    529: else
                    530:     strcat(str," ");
                    531: write(file,str,13);
                    532: getrec((char *)buf,F_ALTPATH,2,str);
                    533: alt=(uchar)ahtoul(str);
                    534: sprintf(str,"%s%s",alt>0 && alt<=altpaths ? altpath[alt-1]
                    535:     : dir[dirnum]->path,unpadfname(fname,tmp));
                    536: if(dir[dirnum]->misc&DIR_FCHK && !fexist(str))
                    537:     exist=0;
                    538: getrec((char *)buf,F_CDT,LEN_FCDT,str);
                    539: cdt=atol(str);
                    540: if(!cdt)
                    541:     strcpy(str,"   FREE");
                    542: else
                    543:     sprintf(str,"%7lu",cdt);
                    544: if(exist)
                    545:     strcat(str," ");
                    546: else
                    547:     strcat(str,"-");
                    548: write(file,str,8);
                    549: getrec((char *)buf,F_DESC,LEN_FDESC,str);
                    550: write(file,str,strlen(str));
                    551: write(file,crlf,2);
                    552: }
                    553: 
                    554: 
                    555: 
                    556: /****************************************************************************/
                    557: /* Handles start and stop routines for transfer protocols                   */
                    558: /****************************************************************************/
                    559: int protocol(char *cmdline, int cd)
                    560: {
                    561:        char tmp[128];
                    562:     int i;
                    563: 
                    564: sprintf(tmp,"%sPROTOCOL.LOG",node_dir);
                    565: remove(tmp);                            /* Deletes the protocol log */
                    566: if(useron.misc&AUTOHANG)
                    567:        autohang=1;
                    568: else
                    569:        autohang=yesno(text[HangUpAfterXferQ]);
                    570: if(sys_status&SS_ABORT) {                              /* if ctrl-c */
                    571:        autohang=0;
                    572:        return(-1); }
                    573: bputs(text[StartXferNow]);
                    574: RIOSYNC(0);
                    575: lprintf("%s\r\n",cmdline);
                    576: if(cd) {
                    577:        if(temp_dir[1]==':')    /* fix for DSZ */
                    578:                setdisk(toupper(temp_dir[0])-'A');
                    579:        strcpy(tmp,temp_dir);
                    580:        tmp[strlen(tmp)-1]=0;   /* take off '\' */
                    581:        if(chdir(tmp))
                    582:                errormsg(WHERE,ERR_CHDIR,tmp,0); }
                    583: i=external(cmdline,EX_OUTL);   /* EX_CC removed because of error level prob */
                    584: if(online==ON_REMOTE)
                    585:     rioctl(IOFB);
                    586: CRLF;
                    587: if(autohang) sys_status|=SS_PAUSEOFF;  /* Pause off after download */
                    588: return(i);
                    589: }
                    590: 
                    591: /****************************************************************************/
                    592: /* Invokes the timed auto-hangup after transfer routine                     */
                    593: /****************************************************************************/
                    594: void autohangup()
                    595: {
                    596:     char a,c,k;
                    597: 
                    598: SYNC;
                    599: sys_status&=~SS_PAUSEOFF;              /* turn pause back on */
                    600: rioctl(IOFI);
                    601: if(!autohang) return;
                    602: lncntr=0;
                    603: bputs(text[Disconnecting]);
                    604: attr(GREEN);
                    605: outchar('[');
                    606: for(c=9,a=0;c>-1 && online && !a;c--) {
                    607:     checkline();
                    608:     attr(LIGHTGRAY|HIGH);
                    609:     bputs(itoa(c,tmp,10));
                    610:     attr(GREEN);
                    611:     outchar(']');
                    612:        while((k=inkey(0))!=0 && online) {
                    613:         if(toupper(k)=='H') {
                    614:             c=0;
                    615:             break; }
                    616:         if(toupper(k)=='A') {
                    617:             a=1;
                    618:             break; } }
                    619:        mswait(DELAY_AUTOHG);
                    620:        if(!a) {
                    621:                outchar(BS);
                    622:                outchar(BS); } }
                    623: if(c==-1) {
                    624:     bputs(text[Disconnected]);
                    625:     hangup(); }
                    626: else
                    627:     CRLF;
                    628: }
                    629: 
                    630: /****************************************************************************/
                    631: /* Checks dsz compatible log file for errors in transfer                    */
                    632: /* Returns 1 if the file in the struct file_t was successfuly transfered    */
                    633: /****************************************************************************/
                    634: char checkprotlog(file_t f)
                    635: {
                    636:        char str[256],size[128];
                    637:     int file;
                    638:     FILE *stream;
                    639: 
                    640: sprintf(str,"%sPROTOCOL.LOG",node_dir);
                    641: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
                    642:     bprintf(text[FileNotSent],f.name);
                    643:     if(f.dir<total_dirs)
                    644:                sprintf(str,"Attempted to download %s (%s) from %s %s"
                    645:                        ,f.name,ultoac(f.size,size)
                    646:             ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    647:        else if(f.dir==total_dirs)
                    648:         strcpy(str,"Attempted to download QWK packet");
                    649:        else if(f.dir==total_dirs+1)
                    650:                sprintf(str,"Attempted to download attached file: %s",f.name);
                    651:     logline("D!",str);
                    652:     return(0); }
                    653: unpadfname(f.name,tmp);
                    654: if(tmp[strlen(tmp)-1]=='.')     /* DSZ log uses FILE instead of FILE. */
                    655:     tmp[strlen(tmp)-1]=0;       /* when there isn't an extension.     */
                    656: while(!ferror(stream)) {
                    657:     if(!fgets(str,256,stream))
                    658:         break;
                    659:     if(str[strlen(str)-2]==CR)
                    660:         str[strlen(str)-2]=0;       /* chop off CRLF */
                    661:     strupr(str);
                    662:     if(strstr(str,tmp)) {   /* Only check for name, Bimodem doesn't put path */
                    663:         logline(nulstr,str);
                    664:                if(str[0]=='E' || str[0]=='L' || (str[6]==SP && str[7]=='0'))
                    665:             break;          /* E for Error or L for Lost Carrier */
                    666:         fclose(stream);     /* or only sent 0 bytes! */
                    667:         return(1); } }
                    668: fclose(stream);
                    669: bprintf(text[FileNotSent],f.name);
                    670: if(f.dir<total_dirs)
                    671:     sprintf(str,"Attempted to download %s (%s) from %s %s",f.name
                    672:         ,ultoac(f.size,tmp),lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    673: else
                    674:     strcpy(str,"Attempted to download QWK packet");
                    675: logline("D!",str);
                    676: return(0);
                    677: }
                    678: 
                    679: /*****************************************************************************/
                    680: /* View viewable file types from dir 'dirnum'                                */
                    681: /* 'fspec' must be padded                                                    */
                    682: /*****************************************************************************/
                    683: void viewfiles(uint dirnum, char *fspec)
                    684: {
                    685:     char viewcmd[256];
                    686:     int i;
                    687: 
                    688: curdirnum=dirnum;      /* for ARS */
                    689: sprintf(viewcmd,"%s%s",dir[dirnum]->path,fspec);
                    690: if(!fexist(viewcmd)) {
                    691:     bputs(text[FileNotFound]);
                    692:     return; }
                    693: padfname(fspec,tmp);
                    694: truncsp(tmp);
                    695: for(i=0;i<total_fviews;i++)
                    696:        if(!strcmp(tmp+9,fview[i]->ext) && chk_ar(fview[i]->ar,useron)) {
                    697:         strcpy(viewcmd,fview[i]->cmd);
                    698:         break; }
                    699: if(i==total_fviews) {
                    700:        bprintf(text[NonviewableFile],tmp+9);
                    701:     return; }
                    702: sprintf(tmp,"%s%s",dir[dirnum]->path,fspec);
                    703: if((i=external(cmdstr(viewcmd,tmp,tmp,NULL),EX_OUTL|EX_OUTR|EX_INR|EX_CC))!=0)
                    704:        errormsg(WHERE,ERR_EXEC,viewcmd,i);    /* must of EX_CC to ^C */
                    705: }
                    706: 
                    707: /****************************************************************************/
                    708: /* Compares filenames for ascending name sort                                                          */
                    709: /****************************************************************************/
                    710: int fnamecmp_a(char **str1, char **str2)
                    711: {
                    712: return(strncmp(*str1,*str2,11));
                    713: }
                    714: 
                    715: /****************************************************************************/
                    716: /* Compares filenames for descending name sort                                                         */
                    717: /****************************************************************************/
                    718: int fnamecmp_d(char **str1, char **str2)
                    719: {
                    720: return(strncmp(*str2,*str1,11));
                    721: }
                    722: 
                    723: /****************************************************************************/
                    724: /* Compares file upload dates for ascending date sort                                          */
                    725: /****************************************************************************/
                    726: int fdatecmp_a(uchar **buf1, uchar **buf2)
                    727: {
                    728:        time_t date1,date2;
                    729: 
                    730: date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16)
                    731:        |((long)(*buf1)[17]<<24));
                    732: date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16)
                    733:        |((long)(*buf2)[17]<<24));
                    734: if(date1>date2)        return(1);
                    735: if(date1<date2)        return(-1);
                    736: return(0);
                    737: }
                    738: 
                    739: /****************************************************************************/
                    740: /* Compares file upload dates for descending date sort                                         */
                    741: /****************************************************************************/
                    742: int fdatecmp_d(uchar **buf1, uchar **buf2)
                    743: {
                    744:        time_t date1,date2;
                    745: 
                    746: date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16)
                    747:        |((long)(*buf1)[17]<<24));
                    748: date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16)
                    749:        |((long)(*buf2)[17]<<24));
                    750: if(date1>date2)        return(-1);
                    751: if(date1<date2)        return(1);
                    752: return(0);
                    753: }
                    754: 
                    755: /************************************************************************/
                    756: /* Wait (for a limited period of time) for sequential dev to become    */
                    757: /* available for file retrieval                                                                                */
                    758: /************************************************************************/
                    759: void seqwait(uint devnum)
                    760: {
                    761:        char loop=0;
                    762:        int i;
                    763:        time_t start;
                    764:        node_t node;
                    765: 
                    766: 
                    767: if(!devnum)
                    768:        return;
                    769: for(start=now=time(NULL);online && now-start<90;now=time(NULL)) {
                    770:        if(msgabort())                          /* max wait ^^^^ sec */
                    771:                break;
                    772:        getnodedat(node_num,&thisnode,1);       /* open and lock this record */
                    773:        for(i=1;i<=sys_nodes;i++) {
                    774:                if(i==node_num) continue;
                    775:                getnodedat(i,&node,1);
                    776:                if((node.status==NODE_INUSE || node.status==NODE_QUIET)
                    777:                        && node.action==NODE_RFSD && node.aux==devnum) {
                    778:                        putnodedat(i,node);
                    779:                        break; }
                    780:                putnodedat(i,node); }
                    781:        if(i>sys_nodes) {
                    782:                thisnode.action=NODE_RFSD;
                    783:                thisnode.aux=devnum;
                    784:                putnodedat(node_num,thisnode);  /* write devnum, unlock, and ret */
                    785:                return; }
                    786:        putnodedat(node_num,thisnode);
                    787:        if(!loop)
                    788:                bprintf(text[WaitingForDeviceN],devnum);
                    789:        loop=1;
                    790:        mswait(100); }
                    791: 
                    792: }

unix.superglobalmegacorp.com

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