Annotation of sbbs/sbbs3/filedat.c, revision 1.1.1.1

1.1       root        1: /* filedat.c */
                      2: 
                      3: /* Synchronet file database-related exported functions */
                      4: 
                      5: /* $Id: filedat.c,v 1.7 2000/11/04 12:03:50 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: /****************************************************************************/
                     41: /* Gets filedata from dircode.DAT file                                                                         */
                     42: /* Need fields .name ,.dir and .offset to get other info                               */
                     43: /* Does not fill .dateuled or .datedled fields.                             */
                     44: /****************************************************************************/
                     45: BOOL DLLCALL getfiledat(scfg_t* cfg, file_t* f)
                     46: {
                     47:        char buf[F_LEN+1],str[256],tmp[128];
                     48:        int file;
                     49:        long length;
                     50: 
                     51:        sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                     52:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
                     53:        //      errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                     54:                return(FALSE); 
                     55:        }
                     56:        length=filelength(file);
                     57:        if(f->datoffset>length) {
                     58:                close(file);
                     59:        //      errormsg(WHERE,ERR_LEN,str,length);
                     60:                return(FALSE); 
                     61:        }
                     62:        if(length%F_LEN) {
                     63:                close(file);
                     64:        //      errormsg(WHERE,ERR_LEN,str,length);
                     65:                return(FALSE); 
                     66:        }
                     67:        lseek(file,f->datoffset,SEEK_SET);
                     68:        if(read(file,buf,F_LEN)!=F_LEN) {
                     69:                close(file);
                     70:        //      errormsg(WHERE,ERR_READ,str,F_LEN);
                     71:                return(FALSE); 
                     72:        }
                     73:        close(file);
                     74:        getrec(buf,F_ALTPATH,2,str);
                     75:        f->altpath=hptoi(str);
                     76:        getrec(buf,F_CDT,LEN_FCDT,str);
                     77:        f->cdt=atol(str);
                     78: 
                     79:        if(!f->size) {                                  /* only read disk if this is null */
                     80:        //        if(dir[f->dir]->misc&DIR_FCHK) {
                     81:                        sprintf(str,"%s%s"
                     82:                                ,f->altpath>0 && f->altpath<=cfg->altpaths ? cfg->altpath[f->altpath-1]
                     83:                                : cfg->dir[f->dir]->path,unpadfname(f->name,tmp));
                     84:                        f->size=flength(str);
                     85:                        f->date=fdate(str);
                     86:        /*
                     87:                        }
                     88:                else {
                     89:                        f->size=f->cdt;
                     90:                        f->date=0; }
                     91:        */
                     92:                        }
                     93: #if 0
                     94:        if((f->size>0L) && cur_cps)
                     95:                f->timetodl=(ushort)(f->size/(ulong)cur_cps);
                     96:        else
                     97: #endif
                     98:                f->timetodl=0;
                     99: 
                    100:        getrec(buf,F_DESC,LEN_FDESC,f->desc);
                    101:        getrec(buf,F_ULER,LEN_ALIAS,f->uler);
                    102:        getrec(buf,F_TIMESDLED,5,str);
                    103:        f->timesdled=atoi(str);
                    104:        getrec(buf,F_OPENCOUNT,3,str);
                    105:        f->opencount=atoi(str);
                    106:        if(buf[F_MISC]!=ETX)
                    107:                f->misc=buf[F_MISC]-SP;
                    108:        else
                    109:                f->misc=0;
                    110:        return(TRUE);
                    111: }
                    112: 
                    113: /****************************************************************************/
                    114: /* Puts filedata into DIR_code.DAT file                                     */
                    115: /* Called from removefiles                                                  */
                    116: /****************************************************************************/
                    117: BOOL DLLCALL putfiledat(scfg_t* cfg, file_t* f)
                    118: {
                    119:     char buf[F_LEN+1],str[256],tmp[128];
                    120:     int file;
                    121:     long length;
                    122: 
                    123:        putrec(buf,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10));
                    124:        putrec(buf,F_DESC,LEN_FDESC,f->desc);
                    125:        putrec(buf,F_DESC+LEN_FDESC,2,crlf);
                    126:        putrec(buf,F_ULER,LEN_ALIAS+5,f->uler);
                    127:        putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf);
                    128:        putrec(buf,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
                    129:        putrec(buf,F_TIMESDLED+5,2,crlf);
                    130:        putrec(buf,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10));
                    131:        putrec(buf,F_OPENCOUNT+3,2,crlf);
                    132:        buf[F_MISC]=f->misc+SP;
                    133:        putrec(buf,F_ALTPATH,2,hexplus(f->altpath,tmp));
                    134:        putrec(buf,F_ALTPATH+2,2,crlf);
                    135:        sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    136:        if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) {
                    137: //             errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    138:                return(FALSE); 
                    139:        }
                    140:        length=filelength(file);
                    141:        if(length%F_LEN) {
                    142:                close(file);
                    143: //             errormsg(WHERE,ERR_LEN,str,length);
                    144:                return(FALSE); 
                    145:        }
                    146:        if(f->datoffset>length) {
                    147:                close(file);
                    148: //             errormsg(WHERE,ERR_LEN,str,length);
                    149:                return(FALSE); 
                    150:        }
                    151:        lseek(file,f->datoffset,SEEK_SET);
                    152:        if(write(file,buf,F_LEN)!=F_LEN) {
                    153:                close(file);
                    154: //             errormsg(WHERE,ERR_WRITE,str,F_LEN);
                    155:                return(FALSE); 
                    156:        }
                    157:        length=filelength(file);
                    158:        close(file);
                    159:        if(length%F_LEN) {
                    160: //             errormsg(WHERE,ERR_LEN,str,length);
                    161:                return(FALSE);
                    162:        }
                    163:        return(TRUE);
                    164: }
                    165: 
                    166: /****************************************************************************/
                    167: /* Adds the data for struct filedat to the directory's data base.           */
                    168: /* changes the .datoffset field only                                        */
                    169: /* returns 1 if added successfully, 0 if not.                                                          */
                    170: /****************************************************************************/
                    171: BOOL DLLCALL addfiledat(scfg_t* cfg, file_t* f)
                    172: {
                    173:        char    str[256],fname[13],c,fdat[F_LEN+1];
                    174:        char    tmp[128];
                    175:        uchar   HUGE16 *ixbbuf,idx[3];
                    176:     int                i,file;
                    177:        long    l,length;
                    178:        time_t  now;
                    179:        time_t  uldate;
                    180: 
                    181:        /************************/
                    182:        /* Add data to DAT File */
                    183:        /************************/
                    184:        sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    185:        if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYRW))==-1) {
                    186: //             errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT);
                    187:                return(FALSE); 
                    188:        }
                    189:        length=filelength(file);
                    190:        if(length==0L)
                    191:                l=0L;
                    192:        else {
                    193:                if(length%F_LEN) {
                    194:                        close(file);
                    195: //                     errormsg(WHERE,ERR_LEN,str,length);
                    196:                        return(FALSE); 
                    197:                }
                    198:                for(l=0;l<length;l+=F_LEN) {    /* Find empty slot */
                    199:                        lseek(file,l,SEEK_SET);
                    200:                        read(file,&c,1);
                    201:                        if(c==ETX) break; 
                    202:                }
                    203:                if(l/F_LEN>=MAX_FILES || l/F_LEN>=cfg->dir[f->dir]->maxfiles) {
                    204:                        close(file);
                    205: #if 0
                    206:                        bputs(text[DirFull]);
                    207:                        sprintf(str,"Directory Full: %s %s"
                    208:                                ,cfg->lib[cfg->dir[f->dir]->lib]->sname,cfg->dir[f->dir]->sname);
                    209:                        logline("U!",str);
                    210: #endif
                    211:                        return(FALSE); 
                    212:                } 
                    213:        }
                    214:        putrec(fdat,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10));
                    215:        putrec(fdat,F_DESC,LEN_FDESC,f->desc);
                    216:        putrec(fdat,F_DESC+LEN_FDESC,2,crlf);
                    217:        putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler);
                    218:        putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf);
                    219:        putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
                    220:        putrec(fdat,F_TIMESDLED+5,2,crlf);
                    221:        putrec(fdat,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10));
                    222:        putrec(fdat,F_OPENCOUNT+3,2,crlf);
                    223:        fdat[F_MISC]=f->misc+SP;
                    224:        putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp));
                    225:        putrec(fdat,F_ALTPATH+2,2,crlf);
                    226:        f->datoffset=l;
                    227:        idx[0]=(uchar)(l&0xff);          /* Get offset within DAT file for IXB file */
                    228:        idx[1]=(uchar)((l>>8)&0xff);
                    229:        idx[2]=(uchar)((l>>16)&0xff);
                    230:        lseek(file,l,SEEK_SET);
                    231:        if(write(file,fdat,F_LEN)!=F_LEN) {
                    232:                close(file);
                    233: //             errormsg(WHERE,ERR_WRITE,str,F_LEN);
                    234:                return(FALSE); 
                    235:        }
                    236:        length=filelength(file);
                    237:        close(file);
                    238:        if(length%F_LEN) {
                    239: //             errormsg(WHERE,ERR_LEN,str,length);
                    240:                return(FALSE);
                    241:        }
                    242: 
                    243:        /*******************************************/
                    244:        /* Update last upload date/time stamp file */
                    245:        /*******************************************/
                    246:        sprintf(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    247:        if((file=sopen(str,O_WRONLY|O_CREAT|O_BINARY,SH_DENYRW))!=-1) {
                    248:                now=time(NULL);
                    249:                write(file,&now,4);
                    250:                close(file); 
                    251:        }
                    252: 
                    253:        /************************/
                    254:        /* Add data to IXB File */
                    255:        /************************/
                    256:        strcpy(fname,f->name);
                    257:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    258:                fname[i]=fname[i+1];
                    259:        sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    260:        if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW))==-1) {
                    261: //             errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT);
                    262:                return(FALSE); 
                    263:        }
                    264:        length=filelength(file);
                    265:        if(length) {    /* IXB file isn't empty */
                    266:                if(length%F_IXBSIZE) {
                    267:                        close(file);
                    268: //                     errormsg(WHERE,ERR_LEN,str,length);
                    269:                        return(FALSE); 
                    270:                }
                    271:                if((ixbbuf=(uchar *)MALLOC(length))==NULL) {
                    272:                        close(file);
                    273: //                     errormsg(WHERE,ERR_ALLOC,str,length);
                    274:                        return(FALSE); 
                    275:                }
                    276:                if(lread(file,ixbbuf,length)!=length) {
                    277:                        close(file);
                    278: //                     errormsg(WHERE,ERR_READ,str,length);
                    279:                        FREE((char *)ixbbuf);
                    280:                        return(FALSE); 
                    281:                }
                    282:        /************************************************/
                    283:        /* Sort by Name or Date, Assending or Decending */
                    284:        /************************************************/
                    285:                if(cfg->dir[f->dir]->sort==SORT_NAME_A || cfg->dir[f->dir]->sort==SORT_NAME_D) {
                    286:                        for(l=0;l<length;l+=F_IXBSIZE) {
                    287:                                for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++);
                    288:                                if(i==12) {     /* file already in directory index */
                    289:                                        close(file);
                    290: //                                     errormsg(WHERE,ERR_CHK,str,0);
                    291:                                        FREE((char *)ixbbuf);
                    292:                                        return(FALSE); 
                    293:                                }
                    294:                                if(cfg->dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i])
                    295:                                        break;
                    296:                                if(cfg->dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i])
                    297:                                        break; 
                    298:                        } 
                    299:                }
                    300:                else {  /* sort by date */
                    301:                        for(l=0;l<length;l+=F_IXBSIZE) {
                    302:                                uldate=(ixbbuf[l+14]|((long)ixbbuf[l+15]<<8)
                    303:                                        |((long)ixbbuf[l+16]<<16)|((long)ixbbuf[l+17]<<24));
                    304:                                if(cfg->dir[f->dir]->sort==SORT_DATE_A && f->dateuled<uldate)
                    305:                                        break;
                    306:                                if(cfg->dir[f->dir]->sort==SORT_DATE_D && f->dateuled>uldate)
                    307:                                        break; 
                    308:                        } 
                    309:                }
                    310:                lseek(file,l,SEEK_SET);
                    311:                if(write(file,fname,11)!=11) {  /* Write filename to IXB file */
                    312:                        close(file);
                    313: //                     errormsg(WHERE,ERR_WRITE,str,11);
                    314:                        FREE((char *)ixbbuf);
                    315:                        return(FALSE); 
                    316:                }
                    317:                if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    318:                        close(file);
                    319: //                     errormsg(WHERE,ERR_WRITE,str,3);
                    320:                        FREE((char *)ixbbuf);
                    321:                        return(FALSE); 
                    322:                }
                    323:                write(file,&f->dateuled,sizeof(time_t));
                    324:                write(file,&f->datedled,4);              /* Write 0 for datedled */
                    325:                if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
                    326:                        close(file);
                    327: //                     errormsg(WHERE,ERR_WRITE,str,length-l);
                    328:                        FREE((char *)ixbbuf);
                    329:                        return(FALSE); 
                    330:                }
                    331:                FREE((char *)ixbbuf); }
                    332:        else {              /* IXB file is empty... No files */
                    333:                if(write(file,fname,11)!=11) {  /* Write filename it IXB file */
                    334:                        close(file);
                    335: //                     errormsg(WHERE,ERR_WRITE,str,11);
                    336:                        return(FALSE); 
                    337:                }
                    338:                if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    339:                        close(file);
                    340: //                     errormsg(WHERE,ERR_WRITE,str,3);
                    341:                        return(FALSE); 
                    342:                }
                    343:                write(file,&f->dateuled,sizeof(time_t));
                    344:                write(file,&f->datedled,4); 
                    345:        }
                    346:        length=filelength(file);
                    347:        close(file);
                    348: ///    if(length%F_IXBSIZE)
                    349: //             errormsg(WHERE,ERR_LEN,str,length);
                    350:        return(TRUE);
                    351: }
                    352: 
                    353: /****************************************************************************/
                    354: /* Gets file data from dircode.ixb file                                                                                */
                    355: /* Need fields .name and .dir filled.                                       */
                    356: /* only fills .offset, .dateuled, and .datedled                             */
                    357: /****************************************************************************/
                    358: BOOL DLLCALL getfileixb(scfg_t* cfg, file_t* f)
                    359: {
                    360:        char                    str[256],fname[13];
                    361:        uchar HUGE16 *  ixbbuf;
                    362:        int                             file;
                    363:        long                    l,length;
                    364: 
                    365:        sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    366:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
                    367:        //      errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    368:                return(FALSE); 
                    369:        }
                    370:        length=filelength(file);
                    371:        if(length%F_IXBSIZE) {
                    372:                close(file);
                    373:        //      errormsg(WHERE,ERR_LEN,str,length);
                    374:                return(FALSE); 
                    375:        }
                    376:        if((ixbbuf=(uchar *)MALLOC(length))==NULL) {
                    377:                close(file);
                    378:        //      errormsg(WHERE,ERR_ALLOC,str,length);
                    379:                return(FALSE); 
                    380:        }
                    381:        if(lread(file,ixbbuf,length)!=length) {
                    382:                close(file);
                    383:                FREE((char *)ixbbuf);
                    384:        //      errormsg(WHERE,ERR_READ,str,length);
                    385:                return(FALSE); 
                    386:        }
                    387:        close(file);
                    388:        strcpy(fname,f->name);
                    389:        for(l=8;l<12;l++)       /* Turn FILENAME.EXT into FILENAMEEXT */
                    390:                fname[l]=fname[l+1];
                    391:        for(l=0;l<length;l+=F_IXBSIZE) {
                    392:                sprintf(str,"%11.11s",ixbbuf+l);
                    393:                if(!strcmp(str,fname))
                    394:                        break; 
                    395:        }
                    396:        if(l>=length) {
                    397:        //      errormsg(WHERE,ERR_CHK,str,0);
                    398:                FREE((char *)ixbbuf);
                    399:                return(FALSE); 
                    400:        }
                    401:        l+=11;
                    402:        f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16);
                    403:        f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8)
                    404:                |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24);
                    405:        f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8)
                    406:                |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24);
                    407:        FREE((char *)ixbbuf);
                    408:        return(TRUE);
                    409: }
                    410: 
                    411: /****************************************************************************/
                    412: /* Removes DAT and IXB entries for the file in the struct 'f'               */
                    413: /****************************************************************************/
                    414: BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f)
                    415: {
                    416:        char    c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13];
                    417:     int                file;
                    418:        long    l,length;
                    419: 
                    420:        strcpy(fname,f->name);
                    421:        for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    422:                fname[c]=fname[c+1];
                    423:        sprintf(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    424:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
                    425: //             errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    426:                return(FALSE); 
                    427:        }
                    428:        length=filelength(file);
                    429:        if(!length) {
                    430:                close(file);
                    431:                return(FALSE); 
                    432:        }
                    433:        if((ixbbuf=(char *)MALLOC(length))==0) {
                    434:                close(file);
                    435: //             errormsg(WHERE,ERR_ALLOC,str,length);
                    436:                return(FALSE); 
                    437:        }
                    438:        if(lread(file,ixbbuf,length)!=length) {
                    439:                close(file);
                    440: //             errormsg(WHERE,ERR_READ,str,length);
                    441:                FREE((char *)ixbbuf);
                    442:                return(FALSE); 
                    443:        }
                    444:        close(file);
                    445:        if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) {
                    446: //             errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC);
                    447:                return(FALSE); 
                    448:        }
                    449:        for(l=0;l<length;l+=F_IXBSIZE) {
                    450:                for(c=0;c<11;c++)
                    451:                        ixbname[c]=ixbbuf[l+c];
                    452:                ixbname[c]=0;
                    453:                if(strcmp(ixbname,fname))
                    454:                        if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
                    455:                                close(file);
                    456: //                             errormsg(WHERE,ERR_WRITE,str,F_IXBSIZE);
                    457:                                FREE((char *)ixbbuf);
                    458:                                return(FALSE); 
                    459:                } 
                    460:        }
                    461:        FREE((char *)ixbbuf);
                    462:        close(file);
                    463:        sprintf(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
                    464:        if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) {
                    465: //             errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    466:                return(FALSE); 
                    467:        }
                    468:        lseek(file,f->datoffset,SEEK_SET);
                    469:        c=ETX;          /* If first char of record is ETX, record is unused */
                    470:        if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */
                    471:                close(file);
                    472: //             errormsg(WHERE,ERR_WRITE,str,1);
                    473:                return(FALSE); 
                    474:        }
                    475:        close(file);
                    476:        if(f->dir==cfg->user_dir)  /* remove file from index */
                    477:                rmuserxfers(cfg,0,0,f->name);
                    478:        return(TRUE);
                    479: }
                    480: 
                    481: /****************************************************************************/
                    482: /* Checks  directory data file for 'filename' (must be padded). If found,   */
                    483: /* it returns the 1, else returns 0.                                        */
                    484: /* Called from upload and bulkupload                                        */
                    485: /****************************************************************************/
                    486: BOOL DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename)
                    487: {
                    488:        char str[256],c,fname[13],HUGE16 *ixbbuf;
                    489:     int file;
                    490:     long length,l;
                    491: 
                    492:        sprintf(fname,"%.12s",filename);
                    493:        strupr(fname);
                    494:        for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    495:                fname[c]=fname[c+1];
                    496:        sprintf(str,"%s%s.ixb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code);
                    497:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) return(FALSE);
                    498:        length=filelength(file);
                    499:        if(!length) {
                    500:                close(file);
                    501:                return(FALSE); }
                    502:        if((ixbbuf=(char *)MALLOC(length))==NULL) {
                    503:                close(file);
                    504:        //    errormsg(WHERE,ERR_ALLOC,str,length);
                    505:                return(FALSE); }
                    506:        if(lread(file,ixbbuf,length)!=length) {
                    507:                close(file);
                    508:        //    errormsg(WHERE,ERR_READ,str,length);
                    509:                FREE((char *)ixbbuf);
                    510:                return(FALSE); }
                    511:        close(file);
                    512:        for(l=0;l<length;l+=F_IXBSIZE) {
                    513:                for(c=0;c<11;c++)
                    514:                        if(fname[c]!=toupper(ixbbuf[l+c])) break;
                    515:                if(c==11) break; }
                    516:        FREE((char *)ixbbuf);
                    517:        if(l!=length)
                    518:                return(TRUE);
                    519:        return(FALSE);
                    520: }
                    521: 
                    522: /****************************************************************************/
                    523: /* Turns FILE.EXT into FILE    .EXT                                         */
                    524: /****************************************************************************/
                    525: char* DLLCALL padfname(char *filename, char *str)
                    526: {
                    527:     char c,d;
                    528: 
                    529:        for(c=0;c<8;c++)
                    530:                if(filename[c]=='.' || !filename[c]) break;
                    531:                else str[c]=filename[c];
                    532:        d=c;
                    533:        if(filename[c]=='.') c++;
                    534:        while(d<8)
                    535:                str[d++]=SP;
                    536:        str[d++]='.';
                    537:        while(d<12)
                    538:                if(!filename[c]) break;
                    539:                else str[d++]=filename[c++];
                    540:        while(d<12)
                    541:                str[d++]=SP;
                    542:        str[d]=0;
                    543:        return(str);
                    544: }
                    545: 
                    546: char* DLLCALL getfname(char* path)
                    547: {
                    548:        char *fname;
                    549: 
                    550:        fname=strrchr(path,'/');
                    551:        if(fname==NULL) 
                    552:                fname=strrchr(path,'\\');
                    553:        if(fname!=NULL) 
                    554:                fname++;
                    555:        else 
                    556:                fname=path;
                    557:        return(fname);
                    558: }
                    559: 
                    560: 
                    561: /****************************************************************************/
                    562: /* Turns FILE    .EXT into FILE.EXT                                         */
                    563: /****************************************************************************/
                    564: char* DLLCALL unpadfname(char *filename, char *str)
                    565: {
                    566:     char c,d;
                    567: 
                    568:        for(c=0,d=0;filename[c];c++)
                    569:                if(filename[c]!=SP) str[d++]=filename[c];
                    570:        str[d]=0;
                    571:        return(str);
                    572: }
                    573: 
                    574: /****************************************************************************/
                    575: /* Removes any files in the user transfer index (XFER.IXT) that match the   */
                    576: /* specifications of dest, or source user, or filename or any combination.  */
                    577: /****************************************************************************/
                    578: BOOL DLLCALL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname)
                    579: {
                    580:     char str[256],*ixtbuf;
                    581:     int file;
                    582:     long l,length;
                    583: 
                    584:        sprintf(str,"%sxfer.ixt", cfg->data_dir);
                    585:        if(!fexist(str))
                    586:                return(FALSE);
                    587:        if(!flength(str)) {
                    588:                remove(str);
                    589:                return(FALSE); 
                    590:        }
                    591:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
                    592: //             errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    593:                return(FALSE); 
                    594:        }
                    595:        length=filelength(file);
                    596:        if((ixtbuf=(char *)MALLOC(length))==NULL) {
                    597:                close(file);
                    598: //             errormsg(WHERE,ERR_ALLOC,str,length);
                    599:                return(FALSE); 
                    600:        }
                    601:        if(read(file,ixtbuf,length)!=length) {
                    602:                close(file);
                    603:                FREE(ixtbuf);
                    604: //             errormsg(WHERE,ERR_READ,str,length);
                    605:                return(FALSE); 
                    606:        }
                    607:        close(file);
                    608:        if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) {
                    609:                FREE(ixtbuf);
                    610: //             errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC);
                    611:                return(FALSE); 
                    612:        }
                    613:        for(l=0;l<length;l+=24) {
                    614:                if(fname!=NULL && fname[0]) {               /* fname specified */
                    615:                        if(!strncmp(ixtbuf+l+5,fname,12)) {     /* this is the file */
                    616:                                if(destuser && fromuser) {          /* both dest and from user */
                    617:                                        if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser)
                    618:                                                continue; }                 /* both match */
                    619:                                else if(fromuser) {                 /* from user */
                    620:                                        if(atoi(ixtbuf+l+18)==fromuser) /* matches */
                    621:                                                continue; }
                    622:                                else if(destuser) {                 /* dest user */
                    623:                                        if(atoi(ixtbuf+l)==destuser)    /* matches */
                    624:                                                continue; }
                    625:                                else continue; } }                  /* no users, so match */
                    626:                else if(destuser && fromuser) {
                    627:                        if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser)
                    628:                                continue; }
                    629:                else if(destuser && atoi(ixtbuf+l)==destuser)
                    630:                        continue;
                    631:                else if(fromuser && atoi(ixtbuf+l+18)==fromuser)
                    632:                        continue;
                    633:                write(file,ixtbuf+l,24); }
                    634:        close(file);
                    635:        FREE(ixtbuf);
                    636: 
                    637:        return(TRUE);
                    638: }
                    639: 

unix.superglobalmegacorp.com

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