Annotation of sbbs/src/sbbs3/filedat.c, revision 1.1

1.1     ! root        1: /* filedat.c */
        !             2: 
        !             3: /* Synchronet file database-related exported functions */
        !             4: 
        !             5: /* $Id: filedat.c,v 1.27 2006/12/29 08:41: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 2006 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[MAX_PATH+1];
        !            48:        int file;
        !            49:        long length;
        !            50: 
        !            51:        SAFEPRINTF2(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:                return(FALSE); 
        !            54:        }
        !            55:        length=filelength(file);
        !            56:        if(f->datoffset>length) {
        !            57:                close(file);
        !            58:                return(FALSE); 
        !            59:        }
        !            60:        if(length%F_LEN) {
        !            61:                close(file);
        !            62:                return(FALSE); 
        !            63:        }
        !            64:        lseek(file,f->datoffset,SEEK_SET);
        !            65:        if(read(file,buf,F_LEN)!=F_LEN) {
        !            66:                close(file);
        !            67:                return(FALSE); 
        !            68:        }
        !            69:        close(file);
        !            70:        getrec(buf,F_ALTPATH,2,str);
        !            71:        f->altpath=hptoi(str);
        !            72:        getrec(buf,F_CDT,LEN_FCDT,str);
        !            73:        f->cdt=atol(str);
        !            74: 
        !            75:        if(!f->size) {                                  /* only read disk if this is null */
        !            76:                        getfilepath(cfg,f,str);
        !            77:                        f->size=flength(str);
        !            78:                        f->date=fdate(str);
        !            79:        /*
        !            80:                        }
        !            81:                else {
        !            82:                        f->size=f->cdt;
        !            83:                        f->date=0; }
        !            84:        */
        !            85:                        }
        !            86: #if 0
        !            87:        if((f->size>0L) && cur_cps)
        !            88:                f->timetodl=(ushort)(f->size/(ulong)cur_cps);
        !            89:        else
        !            90: #endif
        !            91:                f->timetodl=0;
        !            92: 
        !            93:        getrec(buf,F_DESC,LEN_FDESC,f->desc);
        !            94:        getrec(buf,F_ULER,LEN_ALIAS,f->uler);
        !            95:        getrec(buf,F_TIMESDLED,5,str);
        !            96:        f->timesdled=atoi(str);
        !            97:        getrec(buf,F_OPENCOUNT,3,str);
        !            98:        f->opencount=atoi(str);
        !            99:        if(buf[F_MISC]!=ETX)
        !           100:                f->misc=buf[F_MISC]-' ';
        !           101:        else
        !           102:                f->misc=0;
        !           103:        return(TRUE);
        !           104: }
        !           105: 
        !           106: /****************************************************************************/
        !           107: /* Puts filedata into DIR_code.DAT file                                     */
        !           108: /* Called from removefiles                                                  */
        !           109: /****************************************************************************/
        !           110: BOOL DLLCALL putfiledat(scfg_t* cfg, file_t* f)
        !           111: {
        !           112:     char buf[F_LEN+1],str[MAX_PATH+1],tmp[128];
        !           113:     int file;
        !           114:     long length;
        !           115: 
        !           116:        putrec(buf,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10));
        !           117:        putrec(buf,F_DESC,LEN_FDESC,f->desc);
        !           118:        putrec(buf,F_DESC+LEN_FDESC,2,crlf);
        !           119:        putrec(buf,F_ULER,LEN_ALIAS+5,f->uler);
        !           120:        putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf);
        !           121:        putrec(buf,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
        !           122:        putrec(buf,F_TIMESDLED+5,2,crlf);
        !           123:        putrec(buf,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10));
        !           124:        putrec(buf,F_OPENCOUNT+3,2,crlf);
        !           125:        buf[F_MISC]=f->misc+' ';
        !           126:        putrec(buf,F_ALTPATH,2,hexplus(f->altpath,tmp));
        !           127:        putrec(buf,F_ALTPATH+2,2,crlf);
        !           128:        SAFEPRINTF2(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           129:        if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) {
        !           130:                return(FALSE); 
        !           131:        }
        !           132:        length=filelength(file);
        !           133:        if(length%F_LEN) {
        !           134:                close(file);
        !           135:                return(FALSE); 
        !           136:        }
        !           137:        if(f->datoffset>length) {
        !           138:                close(file);
        !           139:                return(FALSE); 
        !           140:        }
        !           141:        lseek(file,f->datoffset,SEEK_SET);
        !           142:        if(write(file,buf,F_LEN)!=F_LEN) {
        !           143:                close(file);
        !           144:                return(FALSE); 
        !           145:        }
        !           146:        length=filelength(file);
        !           147:        close(file);
        !           148:        if(length%F_LEN) {
        !           149:                return(FALSE);
        !           150:        }
        !           151:        return(TRUE);
        !           152: }
        !           153: 
        !           154: /****************************************************************************/
        !           155: /* Adds the data for struct filedat to the directory's data base.           */
        !           156: /* changes the .datoffset field only                                        */
        !           157: /* returns 1 if added successfully, 0 if not.                                                          */
        !           158: /****************************************************************************/
        !           159: BOOL DLLCALL addfiledat(scfg_t* cfg, file_t* f)
        !           160: {
        !           161:        char    str[MAX_PATH+1],fname[13],c,fdat[F_LEN+1];
        !           162:        char    tmp[128];
        !           163:        uchar   *ixbbuf,idx[3];
        !           164:     int                i,file;
        !           165:        long    l,length;
        !           166:        time_t  now;
        !           167:        time_t  uldate;
        !           168: 
        !           169:        /************************/
        !           170:        /* Add data to DAT File */
        !           171:        /************************/
        !           172:        SAFEPRINTF2(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           173:        if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) {
        !           174:                return(FALSE); 
        !           175:        }
        !           176:        length=filelength(file);
        !           177:        if(length==0L)
        !           178:                l=0L;
        !           179:        else {
        !           180:                if(length%F_LEN) {
        !           181:                        close(file);
        !           182:                        return(FALSE); 
        !           183:                }
        !           184:                for(l=0;l<length;l+=F_LEN) {    /* Find empty slot */
        !           185:                        lseek(file,l,SEEK_SET);
        !           186:                        read(file,&c,1);
        !           187:                        if(c==ETX) break; 
        !           188:                }
        !           189:                if(l/F_LEN>=MAX_FILES || l/F_LEN>=cfg->dir[f->dir]->maxfiles) {
        !           190:                        close(file);
        !           191:                        return(FALSE); 
        !           192:                } 
        !           193:        }
        !           194:        putrec(fdat,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10));
        !           195:        putrec(fdat,F_DESC,LEN_FDESC,f->desc);
        !           196:        putrec(fdat,F_DESC+LEN_FDESC,2,crlf);
        !           197:        putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler);
        !           198:        putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf);
        !           199:        putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
        !           200:        putrec(fdat,F_TIMESDLED+5,2,crlf);
        !           201:        putrec(fdat,F_OPENCOUNT,3,ultoa(f->opencount,tmp,10));
        !           202:        putrec(fdat,F_OPENCOUNT+3,2,crlf);
        !           203:        fdat[F_MISC]=f->misc+' ';
        !           204:        putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp));
        !           205:        putrec(fdat,F_ALTPATH+2,2,crlf);
        !           206:        f->datoffset=l;
        !           207:        idx[0]=(uchar)(l&0xff);          /* Get offset within DAT file for IXB file */
        !           208:        idx[1]=(uchar)((l>>8)&0xff);
        !           209:        idx[2]=(uchar)((l>>16)&0xff);
        !           210:        lseek(file,l,SEEK_SET);
        !           211:        if(write(file,fdat,F_LEN)!=F_LEN) {
        !           212:                close(file);
        !           213:                return(FALSE); 
        !           214:        }
        !           215:        length=filelength(file);
        !           216:        close(file);
        !           217:        if(length%F_LEN) {
        !           218:                return(FALSE);
        !           219:        }
        !           220: 
        !           221:        /*******************************************/
        !           222:        /* Update last upload date/time stamp file */
        !           223:        /*******************************************/
        !           224:        SAFEPRINTF2(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           225:        if((file=sopen(str,O_WRONLY|O_CREAT|O_BINARY,SH_DENYRW,S_IREAD|S_IWRITE))!=-1) {
        !           226:                now=time(NULL);
        !           227:                write(file,&now,4);
        !           228:                close(file); 
        !           229:        }
        !           230: 
        !           231:        /************************/
        !           232:        /* Add data to IXB File */
        !           233:        /************************/
        !           234:        SAFECOPY(fname,f->name);
        !           235:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
        !           236:                fname[i]=fname[i+1];
        !           237:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           238:        if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IREAD|S_IWRITE))==-1) {
        !           239:                return(FALSE); 
        !           240:        }
        !           241:        length=filelength(file);
        !           242:        if(length) {    /* IXB file isn't empty */
        !           243:                if(length%F_IXBSIZE) {
        !           244:                        close(file);
        !           245:                        return(FALSE); 
        !           246:                }
        !           247:                if((ixbbuf=(uchar *)malloc(length))==NULL) {
        !           248:                        close(file);
        !           249:                        return(FALSE); 
        !           250:                }
        !           251:                if(lread(file,ixbbuf,length)!=length) {
        !           252:                        close(file);
        !           253:                        free((char *)ixbbuf);
        !           254:                        return(FALSE); 
        !           255:                }
        !           256:        /************************************************/
        !           257:        /* Sort by Name or Date, Assending or Decending */
        !           258:        /************************************************/
        !           259:                if(cfg->dir[f->dir]->sort==SORT_NAME_A || cfg->dir[f->dir]->sort==SORT_NAME_D) {
        !           260:                        for(l=0;l<length;l+=F_IXBSIZE) {
        !           261:                                for(i=0;i<12 && toupper(fname[i])==toupper(ixbbuf[l+i]);i++);
        !           262:                                if(i==12) {     /* file already in directory index */
        !           263:                                        close(file);
        !           264:                                        free((char *)ixbbuf);
        !           265:                                        return(FALSE); 
        !           266:                                }
        !           267:                                if(cfg->dir[f->dir]->sort==SORT_NAME_A 
        !           268:                                        && toupper(fname[i])<toupper(ixbbuf[l+i]))
        !           269:                                        break;
        !           270:                                if(cfg->dir[f->dir]->sort==SORT_NAME_D 
        !           271:                                        && toupper(fname[i])>toupper(ixbbuf[l+i]))
        !           272:                                        break; 
        !           273:                        } 
        !           274:                }
        !           275:                else {  /* sort by date */
        !           276:                        for(l=0;l<length;l+=F_IXBSIZE) {
        !           277:                                uldate=(ixbbuf[l+14]|((long)ixbbuf[l+15]<<8)
        !           278:                                        |((long)ixbbuf[l+16]<<16)|((long)ixbbuf[l+17]<<24));
        !           279:                                if(cfg->dir[f->dir]->sort==SORT_DATE_A && f->dateuled<uldate)
        !           280:                                        break;
        !           281:                                if(cfg->dir[f->dir]->sort==SORT_DATE_D && f->dateuled>uldate)
        !           282:                                        break; 
        !           283:                        } 
        !           284:                }
        !           285:                lseek(file,l,SEEK_SET);
        !           286:                if(write(file,fname,11)!=11) {  /* Write filename to IXB file */
        !           287:                        close(file);
        !           288:                        free((char *)ixbbuf);
        !           289:                        return(FALSE); 
        !           290:                }
        !           291:                if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
        !           292:                        close(file);
        !           293:                        free((char *)ixbbuf);
        !           294:                        return(FALSE); 
        !           295:                }
        !           296:                write(file,&f->dateuled,sizeof(time_t));
        !           297:                write(file,&f->datedled,4);              /* Write 0 for datedled */
        !           298:                if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
        !           299:                        close(file);
        !           300:                        free((char *)ixbbuf);
        !           301:                        return(FALSE); 
        !           302:                }
        !           303:                free((char *)ixbbuf); }
        !           304:        else {              /* IXB file is empty... No files */
        !           305:                if(write(file,fname,11)!=11) {  /* Write filename it IXB file */
        !           306:                        close(file);
        !           307:                        return(FALSE); 
        !           308:                }
        !           309:                if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
        !           310:                        close(file);
        !           311:                        return(FALSE); 
        !           312:                }
        !           313:                write(file,&f->dateuled,sizeof(time_t));
        !           314:                write(file,&f->datedled,4); 
        !           315:        }
        !           316:        length=filelength(file);
        !           317:        close(file);
        !           318:        return(TRUE);
        !           319: }
        !           320: 
        !           321: /****************************************************************************/
        !           322: /* Gets file data from dircode.ixb file                                                                                */
        !           323: /* Need fields .name and .dir filled.                                       */
        !           324: /* only fills .offset, .dateuled, and .datedled                             */
        !           325: /****************************************************************************/
        !           326: BOOL DLLCALL getfileixb(scfg_t* cfg, file_t* f)
        !           327: {
        !           328:        char                    str[MAX_PATH+1],fname[13];
        !           329:        uchar * ixbbuf;
        !           330:        int                             file;
        !           331:        long                    l,length;
        !           332: 
        !           333:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           334:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
        !           335:                return(FALSE); 
        !           336:        }
        !           337:        length=filelength(file);
        !           338:        if(length%F_IXBSIZE) {
        !           339:                close(file);
        !           340:                return(FALSE); 
        !           341:        }
        !           342:        if((ixbbuf=(uchar *)malloc(length))==NULL) {
        !           343:                close(file);
        !           344:                return(FALSE); 
        !           345:        }
        !           346:        if(lread(file,ixbbuf,length)!=length) {
        !           347:                close(file);
        !           348:                free((char *)ixbbuf);
        !           349:                return(FALSE); 
        !           350:        }
        !           351:        close(file);
        !           352:        SAFECOPY(fname,f->name);
        !           353:        for(l=8;l<12;l++)       /* Turn FILENAME.EXT into FILENAMEEXT */
        !           354:                fname[l]=fname[l+1];
        !           355:        for(l=0;l<length;l+=F_IXBSIZE) {
        !           356:                SAFEPRINTF(str,"%11.11s",ixbbuf+l);
        !           357:                if(!stricmp(str,fname))
        !           358:                        break; 
        !           359:        }
        !           360:        if(l>=length) {
        !           361:                free((char *)ixbbuf);
        !           362:                return(FALSE); 
        !           363:        }
        !           364:        l+=11;
        !           365:        f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16);
        !           366:        f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8)
        !           367:                |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24);
        !           368:        f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8)
        !           369:                |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24);
        !           370:        free((char *)ixbbuf);
        !           371:        return(TRUE);
        !           372: }
        !           373: 
        !           374: /****************************************************************************/
        !           375: /* Updates the datedled and dateuled index record fields for a file                    */
        !           376: /****************************************************************************/
        !           377: BOOL DLLCALL putfileixb(scfg_t* cfg, file_t* f)
        !           378: {
        !           379:        char    str[MAX_PATH+1],fname[13];
        !           380:        uchar*  ixbbuf;
        !           381:        int             file;
        !           382:        long    l,length;
        !           383: 
        !           384:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           385:        if((file=sopen(str,O_RDWR|O_BINARY,SH_DENYRW))==-1) {
        !           386:                return(FALSE); 
        !           387:        }
        !           388:        length=filelength(file);
        !           389:        if(length%F_IXBSIZE) {
        !           390:                close(file);
        !           391:                return(FALSE); 
        !           392:        }
        !           393:        if((ixbbuf=(uchar *)malloc(length))==NULL) {
        !           394:                close(file);
        !           395:                return(FALSE); 
        !           396:        }
        !           397:        if(lread(file,ixbbuf,length)!=length) {
        !           398:                close(file);
        !           399:                free(ixbbuf);
        !           400:                return(FALSE); 
        !           401:        }
        !           402:        SAFECOPY(fname,f->name);
        !           403:        for(l=8;l<12;l++)       /* Turn FILENAME.EXT into FILENAMEEXT */
        !           404:                fname[l]=fname[l+1];
        !           405:        for(l=0;l<length;l+=F_IXBSIZE) {
        !           406:                SAFEPRINTF(str,"%11.11s",ixbbuf+l);
        !           407:                if(!stricmp(str,fname))
        !           408:                        break; 
        !           409:        }
        !           410:        free(ixbbuf);
        !           411: 
        !           412:        if(l>=length) {
        !           413:                close(file);
        !           414:                return(FALSE); 
        !           415:        }
        !           416:        
        !           417:        lseek(file,l+11+3,SEEK_SET);
        !           418: 
        !           419:        write(file,&f->dateuled,sizeof(f->dateuled));
        !           420:        write(file,&f->datedled,sizeof(f->datedled));
        !           421: 
        !           422:        close(file);
        !           423: 
        !           424:        return(TRUE);
        !           425: }
        !           426: 
        !           427: 
        !           428: /****************************************************************************/
        !           429: /* Removes DAT and IXB entries for the file in the struct 'f'               */
        !           430: /****************************************************************************/
        !           431: BOOL DLLCALL removefiledat(scfg_t* cfg, file_t* f)
        !           432: {
        !           433:        char    c,str[MAX_PATH+1],ixbname[12],*ixbbuf,fname[13];
        !           434:     int                i,file;
        !           435:        long    l,length;
        !           436: 
        !           437:        SAFECOPY(fname,f->name);
        !           438:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
        !           439:                fname[i]=fname[i+1];
        !           440:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           441:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
        !           442:                return(FALSE); 
        !           443:        }
        !           444:        length=filelength(file);
        !           445:        if(!length) {
        !           446:                close(file);
        !           447:                return(FALSE); 
        !           448:        }
        !           449:        if((ixbbuf=(char *)malloc(length))==0) {
        !           450:                close(file);
        !           451:                return(FALSE); 
        !           452:        }
        !           453:        if(lread(file,ixbbuf,length)!=length) {
        !           454:                close(file);
        !           455:                free((char *)ixbbuf);
        !           456:                return(FALSE); 
        !           457:        }
        !           458:        close(file);
        !           459:        if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) {
        !           460:                return(FALSE); 
        !           461:        }
        !           462:        for(l=0;l<length;l+=F_IXBSIZE) {
        !           463:                for(i=0;i<11;i++)
        !           464:                        ixbname[i]=ixbbuf[l+i];
        !           465:                ixbname[i]=0;
        !           466:                if(stricmp(ixbname,fname))
        !           467:                        if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
        !           468:                                close(file);
        !           469:                                free((char *)ixbbuf);
        !           470:                                return(FALSE); 
        !           471:                } 
        !           472:        }
        !           473:        free((char *)ixbbuf);
        !           474:        close(file);
        !           475:        SAFEPRINTF2(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           476:        if((file=sopen(str,O_WRONLY|O_BINARY,SH_DENYRW))==-1) {
        !           477:                return(FALSE); 
        !           478:        }
        !           479:        lseek(file,f->datoffset,SEEK_SET);
        !           480:        c=ETX;          /* If first char of record is ETX, record is unused */
        !           481:        if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */
        !           482:                close(file);
        !           483:                return(FALSE); 
        !           484:        }
        !           485:        close(file);
        !           486:        if(f->dir==cfg->user_dir)  /* remove file from index */
        !           487:                rmuserxfers(cfg,0,0,f->name);
        !           488:        return(TRUE);
        !           489: }
        !           490: 
        !           491: /****************************************************************************/
        !           492: /* Checks  directory data file for 'filename' (must be padded). If found,   */
        !           493: /* it returns the 1, else returns 0.                                        */
        !           494: /* Called from upload and bulkupload                                        */
        !           495: /****************************************************************************/
        !           496: BOOL DLLCALL findfile(scfg_t* cfg, uint dirnum, char *filename)
        !           497: {
        !           498:        char str[MAX_PATH+1],fname[13],*ixbbuf;
        !           499:     int i,file;
        !           500:     long length,l;
        !           501: 
        !           502:        SAFECOPY(fname,filename);
        !           503:        strupr(fname);
        !           504:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
        !           505:                fname[i]=fname[i+1];
        !           506:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code);
        !           507:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) return(FALSE);
        !           508:        length=filelength(file);
        !           509:        if(!length) {
        !           510:                close(file);
        !           511:                return(FALSE); }
        !           512:        if((ixbbuf=(char *)malloc(length))==NULL) {
        !           513:                close(file);
        !           514:                return(FALSE); }
        !           515:        if(lread(file,ixbbuf,length)!=length) {
        !           516:                close(file);
        !           517:                free((char *)ixbbuf);
        !           518:                return(FALSE); }
        !           519:        close(file);
        !           520:        for(l=0;l<length;l+=F_IXBSIZE) {
        !           521:                for(i=0;i<11;i++)
        !           522:                        if(toupper(fname[i])!=toupper(ixbbuf[l+i])) break;
        !           523:                if(i==11) break; }
        !           524:        free((char *)ixbbuf);
        !           525:        if(l!=length)
        !           526:                return(TRUE);
        !           527:        return(FALSE);
        !           528: }
        !           529: 
        !           530: /****************************************************************************/
        !           531: /* Turns FILE.EXT into FILE    .EXT                                         */
        !           532: /****************************************************************************/
        !           533: char* DLLCALL padfname(char *filename, char *str)
        !           534: {
        !           535:     int c,d;
        !           536: 
        !           537:        for(c=0;c<8;c++)
        !           538:                if(filename[c]=='.' || !filename[c]) break;
        !           539:                else str[c]=filename[c];
        !           540:        d=c;
        !           541:        if(filename[c]=='.') c++;
        !           542:        while(d<8)
        !           543:                str[d++]=' ';
        !           544:        if(filename[c]>' ')     /* Change "FILE" to "FILE        " */
        !           545:                str[d++]='.';   /* (don't add a dot if there's no extension) */
        !           546:        else
        !           547:                str[d++]=' ';
        !           548:        while(d<12)
        !           549:                if(!filename[c]) break;
        !           550:                else str[d++]=filename[c++];
        !           551:        while(d<12)
        !           552:                str[d++]=' ';
        !           553:        str[d]=0;
        !           554:        return(str);
        !           555: }
        !           556: 
        !           557: /****************************************************************************/
        !           558: /* Turns FILE    .EXT into FILE.EXT                                         */
        !           559: /****************************************************************************/
        !           560: char* DLLCALL unpadfname(char *filename, char *str)
        !           561: {
        !           562:     int c,d;
        !           563: 
        !           564:        for(c=0,d=0;filename[c];c++)
        !           565:                if(filename[c]!=' ') str[d++]=filename[c];
        !           566:        str[d]=0;
        !           567:        return(str);
        !           568: }
        !           569: 
        !           570: /****************************************************************************/
        !           571: /* Removes any files in the user transfer index (XFER.IXT) that match the   */
        !           572: /* specifications of dest, or source user, or filename or any combination.  */
        !           573: /****************************************************************************/
        !           574: BOOL DLLCALL rmuserxfers(scfg_t* cfg, int fromuser, int destuser, char *fname)
        !           575: {
        !           576:     char str[MAX_PATH+1],*ixtbuf;
        !           577:     int file;
        !           578:     long l,length;
        !           579: 
        !           580:        SAFEPRINTF(str,"%sxfer.ixt", cfg->data_dir);
        !           581:        if(!fexist(str))
        !           582:                return(FALSE);
        !           583:        if(!flength(str)) {
        !           584:                remove(str);
        !           585:                return(FALSE); 
        !           586:        }
        !           587:        if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) {
        !           588:                return(FALSE); 
        !           589:        }
        !           590:        length=filelength(file);
        !           591:        if((ixtbuf=(char *)malloc(length))==NULL) {
        !           592:                close(file);
        !           593:                return(FALSE); 
        !           594:        }
        !           595:        if(read(file,ixtbuf,length)!=length) {
        !           596:                close(file);
        !           597:                free(ixtbuf);
        !           598:                return(FALSE); 
        !           599:        }
        !           600:        close(file);
        !           601:        if((file=sopen(str,O_WRONLY|O_TRUNC|O_BINARY,SH_DENYRW))==-1) {
        !           602:                free(ixtbuf);
        !           603:                return(FALSE); 
        !           604:        }
        !           605:        for(l=0;l<length;l+=24) {
        !           606:                if(fname!=NULL && fname[0]) {               /* fname specified */
        !           607:                        if(!strncmp(ixtbuf+l+5,fname,12)) {     /* this is the file */
        !           608:                                if(destuser && fromuser) {          /* both dest and from user */
        !           609:                                        if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser)
        !           610:                                                continue; }                 /* both match */
        !           611:                                else if(fromuser) {                 /* from user */
        !           612:                                        if(atoi(ixtbuf+l+18)==fromuser) /* matches */
        !           613:                                                continue; }
        !           614:                                else if(destuser) {                 /* dest user */
        !           615:                                        if(atoi(ixtbuf+l)==destuser)    /* matches */
        !           616:                                                continue; }
        !           617:                                else continue; } }                  /* no users, so match */
        !           618:                else if(destuser && fromuser) {
        !           619:                        if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser)
        !           620:                                continue; }
        !           621:                else if(destuser && atoi(ixtbuf+l)==destuser)
        !           622:                        continue;
        !           623:                else if(fromuser && atoi(ixtbuf+l+18)==fromuser)
        !           624:                        continue;
        !           625:                write(file,ixtbuf+l,24); }
        !           626:        close(file);
        !           627:        free(ixtbuf);
        !           628: 
        !           629:        return(TRUE);
        !           630: }
        !           631: 
        !           632: void DLLCALL getextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
        !           633: {
        !           634:        char str[MAX_PATH+1];
        !           635:        int file;
        !           636: 
        !           637:        memset(ext,0,F_EXBSIZE+1);
        !           638:        SAFEPRINTF2(str,"%s%s.exb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code);
        !           639:        if((file=nopen(str,O_RDONLY))==-1)
        !           640:                return;
        !           641:        lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET);
        !           642:        read(file,ext,F_EXBSIZE);
        !           643:        close(file);
        !           644: }
        !           645: 
        !           646: void DLLCALL putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
        !           647: {
        !           648:        char str[MAX_PATH+1],nulbuf[F_EXBSIZE];
        !           649:        int file;
        !           650: 
        !           651:        strip_invalid_attr(ext);        /* eliminate bogus ctrl-a codes */
        !           652:        memset(nulbuf,0,sizeof(nulbuf));
        !           653:        SAFEPRINTF2(str,"%s%s.exb",cfg->dir[dirnum]->data_dir,cfg->dir[dirnum]->code);
        !           654:        if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !           655:                return;
        !           656:        lseek(file,0L,SEEK_END);
        !           657:        while(filelength(file)<(long)(datoffset/F_LEN)*F_EXBSIZE)
        !           658:                write(file,nulbuf,sizeof(nulbuf));
        !           659:        lseek(file,(datoffset/F_LEN)*F_EXBSIZE,SEEK_SET);
        !           660:        write(file,ext,F_EXBSIZE);
        !           661:        close(file);
        !           662: }
        !           663: 
        !           664: /****************************************************************************/
        !           665: /* Update the upload date for the file 'f'                                  */
        !           666: /****************************************************************************/
        !           667: int DLLCALL update_uldate(scfg_t* cfg, file_t* f)
        !           668: {
        !           669:        char str[MAX_PATH+1],fname[13];
        !           670:        int i,file;
        !           671:        long l,length;
        !           672: 
        !           673:        /*******************/
        !           674:        /* Update IXB File */
        !           675:        /*******************/
        !           676:        SAFEPRINTF2(str,"%s%s.ixb",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           677:        if((file=nopen(str,O_RDWR))==-1)
        !           678:                return(errno); 
        !           679:        length=filelength(file);
        !           680:        if(length%F_IXBSIZE) {
        !           681:                close(file);
        !           682:                return(-1); 
        !           683:        }
        !           684:        SAFECOPY(fname,f->name);
        !           685:        for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
        !           686:                fname[i]=fname[i+1];
        !           687:        for(l=0;l<length;l+=F_IXBSIZE) {
        !           688:                read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
        !           689:                str[11]=0;
        !           690:                if(!strcmp(fname,str)) break; }
        !           691:        if(l>=length) {
        !           692:                close(file);
        !           693:                return(-2); 
        !           694:        }
        !           695:        lseek(file,l+14,SEEK_SET);
        !           696:        write(file,&f->dateuled,4);
        !           697:        close(file);
        !           698: 
        !           699:        /*******************************************/
        !           700:        /* Update last upload date/time stamp file */
        !           701:        /*******************************************/
        !           702:        SAFEPRINTF2(str,"%s%s.dab",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code);
        !           703:        if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !           704:                return(errno);
        !           705: 
        !           706:        write(file,&f->dateuled,4);
        !           707:        close(file); 
        !           708:        return(0);
        !           709: }
        !           710: 
        !           711: /****************************************************************************/
        !           712: /* Returns full path to specified file                                                                         */
        !           713: /****************************************************************************/
        !           714: char* DLLCALL getfilepath(scfg_t* cfg, file_t* f, char* path)
        !           715: {
        !           716:        char    fname[MAX_PATH+1];
        !           717: 
        !           718:        unpadfname(f->name,fname);
        !           719:        if(f->dir>=cfg->total_dirs)
        !           720:                safe_snprintf(path,MAX_PATH,"%s%s",cfg->temp_dir,fname);
        !           721:        else
        !           722:                safe_snprintf(path,MAX_PATH,"%s%s",f->altpath>0 && f->altpath<=cfg->altpaths 
        !           723:                        ? cfg->altpath[f->altpath-1] : cfg->dir[f->dir]->path
        !           724:                        ,fname);
        !           725: 
        !           726:        return(path);
        !           727: }

unix.superglobalmegacorp.com

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