Annotation of sbbs/src/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.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.