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

1.1     ! root        1: #line 1 "FILE.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: /*************************************************************************/
        !             6: /* Add/delete/edit/view/retrieve the file information for struct file_t  */
        !             7: /* Called only from functions within xfer.c                                                             */
        !             8: /*************************************************************************/
        !             9: 
        !            10: #include "sbbs.h"
        !            11: 
        !            12: long fdate_dir(char *filespec);
        !            13: 
        !            14: void getextdesc(uint dirnum, ulong datoffset, char *ext)
        !            15: {
        !            16:        char str[256];
        !            17:        int file;
        !            18: 
        !            19: memset(ext,0,513);
        !            20: sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code);
        !            21: if((file=nopen(str,O_RDONLY))==-1)
        !            22:        return;
        !            23: lseek(file,(datoffset/F_LEN)*512L,SEEK_SET);
        !            24: read(file,ext,512);
        !            25: close(file);
        !            26: }
        !            27: 
        !            28: void putextdesc(uint dirnum, ulong datoffset, char *ext)
        !            29: {
        !            30:        char str[256],nulbuf[512];
        !            31:        int file;
        !            32: 
        !            33: memset(nulbuf,0,512);
        !            34: sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code);
        !            35: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !            36:        return;
        !            37: lseek(file,0L,SEEK_END);
        !            38: while(filelength(file)<(datoffset/F_LEN)*512L)
        !            39:        write(file,nulbuf,512);
        !            40: lseek(file,(datoffset/F_LEN)*512L,SEEK_SET);
        !            41: write(file,ext,512);
        !            42: close(file);
        !            43: }
        !            44: 
        !            45: /****************************************************************************/
        !            46: /* Prints all information of file in file_t structure 'f'                                      */
        !            47: /****************************************************************************/
        !            48: void fileinfo(file_t f)
        !            49: {
        !            50:        char str[256],fname[13],ext[513];
        !            51:        uint i,j;
        !            52:        long t;
        !            53: 
        !            54: for(i=0;i<usrlibs;i++)
        !            55:        if(usrlib[i]==dir[f.dir]->lib)
        !            56:                break;
        !            57: for(j=0;j<usrdirs[i];j++)
        !            58:        if(usrdir[i][j]==f.dir)
        !            59:                break;
        !            60: unpadfname(f.name,fname);
        !            61: bprintf(text[FiLib],i+1,lib[dir[f.dir]->lib]->lname);
        !            62: bprintf(text[FiDir],j+1,dir[f.dir]->lname);
        !            63: bprintf(text[FiFilename],fname);
        !            64: if(f.size!=-1L)
        !            65:        bprintf(text[FiFileSize],ultoac(f.size,tmp));
        !            66: bprintf(text[FiCredits]
        !            67:        ,(dir[f.dir]->misc&DIR_FREE || !f.cdt) ? "FREE" : ultoac(f.cdt,tmp));
        !            68: bprintf(text[FiDescription],f.desc);
        !            69: bprintf(text[FiUploadedBy],f.misc&FM_ANON ? text[UNKNOWN_USER] : f.uler);
        !            70: if(f.date)
        !            71:        bprintf(text[FiFileDate],timestr(&f.date));
        !            72: bprintf(text[FiDateUled],timestr(&f.dateuled));
        !            73: bprintf(text[FiDateDled],f.datedled ? timestr(&f.datedled) : "Never");
        !            74: bprintf(text[FiTimesDled],f.timesdled);
        !            75: if(f.size!=-1L)
        !            76:        bprintf(text[FiTransferTime],sectostr(f.timetodl,tmp));
        !            77: if(f.altpath) {
        !            78:        if(f.altpath<=altpaths) {
        !            79:                if(SYSOP)
        !            80:                        bprintf(text[FiAlternatePath],altpath[f.altpath-1]); }
        !            81:        else
        !            82:                bprintf(text[InvalidAlternatePathN],f.altpath); }
        !            83: CRLF;
        !            84: if(f.misc&FM_EXTDESC) {
        !            85:        getextdesc(f.dir,f.datoffset,ext);
        !            86:        CRLF;
        !            87:        putmsg(ext,P_NOATCODES);
        !            88:        CRLF; }
        !            89: if(f.size==-1L)
        !            90:        bprintf(text[FileIsNotOnline],f.name);
        !            91: if(f.opencount)
        !            92:        bprintf(text[FileIsOpen],f.opencount,f.opencount>1 ? "s" : nulstr);
        !            93: 
        !            94: }
        !            95: 
        !            96: /****************************************************************************/
        !            97: /* Gets file data from dircode.IXB file                                                                                */
        !            98: /* Need fields .name and .dir filled.                                       */
        !            99: /* only fills .offset, .dateuled, and .datedled                             */
        !           100: /****************************************************************************/
        !           101: void getfileixb(file_t *f)
        !           102: {
        !           103:        uchar HUGE16 *ixbbuf,str[256],fname[13];
        !           104:        int file;
        !           105:        ulong l,length;
        !           106: 
        !           107: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code);
        !           108: if((file=nopen(str,O_RDONLY))==-1) {
        !           109:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !           110:        return; }
        !           111: length=filelength(file);
        !           112: if(length%F_IXBSIZE) {
        !           113:        close(file);
        !           114:        errormsg(WHERE,ERR_LEN,str,length);
        !           115:        return; }
        !           116: if((ixbbuf=MALLOC(length))==NULL) {
        !           117:        close(file);
        !           118:        errormsg(WHERE,ERR_ALLOC,str,length);
        !           119:        return; }
        !           120: if(lread(file,ixbbuf,length)!=length) {
        !           121:        close(file);
        !           122:        FREE((char *)ixbbuf);
        !           123:        errormsg(WHERE,ERR_READ,str,length);
        !           124:        return; }
        !           125: close(file);
        !           126: strcpy(fname,f->name);
        !           127: for(l=8;l<12;l++)      /* Turn FILENAME.EXT into FILENAMEEXT */
        !           128:        fname[l]=fname[l+1];
        !           129: for(l=0;l<length;l+=F_IXBSIZE) {
        !           130:        sprintf(str,"%11.11s",ixbbuf+l);
        !           131:        if(!strcmp(str,fname))
        !           132:                break; }
        !           133: if(l>=length) {
        !           134:        errormsg(WHERE,ERR_CHK,str,0);
        !           135:        FREE((char *)ixbbuf);
        !           136:        return; }
        !           137: l+=11;
        !           138: f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16);
        !           139: f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8)
        !           140:        |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24);
        !           141: f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8)
        !           142:        |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24);
        !           143: FREE((char *)ixbbuf);
        !           144: }
        !           145: 
        !           146: /****************************************************************************/
        !           147: /* Gets filedata from dircode.DAT file                                                                         */
        !           148: /* Need fields .name ,.dir and .offset to get other info                               */
        !           149: /* Does not fill .dateuled or .datedled fields.                             */
        !           150: /****************************************************************************/
        !           151: void getfiledat(file_t *f)
        !           152: {
        !           153:        char buf[F_LEN+1],str[256];
        !           154:        int file;
        !           155:        long length;
        !           156: 
        !           157: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code);
        !           158: if((file=nopen(str,O_RDONLY))==-1) {
        !           159:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !           160:        return; }
        !           161: length=filelength(file);
        !           162: if(f->datoffset>length) {
        !           163:        close(file);
        !           164:        errormsg(WHERE,ERR_LEN,str,length);
        !           165:        return; }
        !           166: if(length%F_LEN) {
        !           167:        close(file);
        !           168:        errormsg(WHERE,ERR_LEN,str,length);
        !           169:        return; }
        !           170: lseek(file,f->datoffset,SEEK_SET);
        !           171: if(read(file,buf,F_LEN)!=F_LEN) {
        !           172:        close(file);
        !           173:        errormsg(WHERE,ERR_READ,str,F_LEN);
        !           174:        return; }
        !           175: close(file);
        !           176: getrec(buf,F_ALTPATH,2,str);
        !           177: f->altpath=hptoi(str);
        !           178: getrec(buf,F_CDT,LEN_FCDT,str);
        !           179: f->cdt=atol(str);
        !           180: 
        !           181: if(!f->size) {                                 /* only read disk if this is null */
        !           182: //       if(dir[f->dir]->misc&DIR_FCHK) {
        !           183:                sprintf(str,"%s%s"
        !           184:                        ,f->altpath>0 && f->altpath<=altpaths ? altpath[f->altpath-1]
        !           185:                        : dir[f->dir]->path,unpadfname(f->name,tmp));
        !           186:                f->size=flength(str);
        !           187:                f->date=fdate_dir(str);
        !           188: /*
        !           189:                }
        !           190:        else {
        !           191:                f->size=f->cdt;
        !           192:                f->date=0; }
        !           193: */
        !           194:                }
        !           195: if((f->size>0L) && cur_cps)
        !           196:        f->timetodl=(f->size/(ulong)cur_cps);
        !           197: else
        !           198:        f->timetodl=0;
        !           199: 
        !           200: getrec(buf,F_DESC,LEN_FDESC,f->desc);
        !           201: getrec(buf,F_ULER,LEN_ALIAS,f->uler);
        !           202: getrec(buf,F_TIMESDLED,5,str);
        !           203: f->timesdled=atoi(str);
        !           204: getrec(buf,F_OPENCOUNT,3,str);
        !           205: f->opencount=atoi(str);
        !           206: if(buf[F_MISC]!=ETX)
        !           207:        f->misc=buf[F_MISC]-SP;
        !           208: else
        !           209:        f->misc=0;
        !           210: }
        !           211: 
        !           212: /****************************************************************************/
        !           213: /* Increments the opencount on the file data 'f' and adds the transaction      */
        !           214: /* to the backout.dab                                                                                                          */
        !           215: /****************************************************************************/
        !           216: void openfile(file_t f)
        !           217: {
        !           218:        char str1[256],str2[4],str3[4],ch;
        !           219:        int file;
        !           220: 
        !           221: /************************************/
        !           222: /* Increment open count in dat file */
        !           223: /************************************/
        !           224: sprintf(str1,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
        !           225: if((file=nopen(str1,O_RDWR))==-1) {
        !           226:        errormsg(WHERE,ERR_OPEN,str1,O_RDWR);
        !           227:        return; }
        !           228: lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET);
        !           229: if(read(file,str2,3)!=3) {
        !           230:        close(file);
        !           231:        errormsg(WHERE,ERR_READ,str1,3);
        !           232:        return; }
        !           233: str2[3]=0;
        !           234: itoa(atoi(str2)+1,str3,10);
        !           235: putrec(str2,0,3,str3);
        !           236: lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET);
        !           237: if(write(file,str2,3)!=3) {
        !           238:        close(file);
        !           239:        errormsg(WHERE,ERR_WRITE,str1,3);
        !           240:        return; }
        !           241: close(file);
        !           242: /**********************************/
        !           243: /* Add transaction to BACKOUT.DAB */
        !           244: /**********************************/
        !           245: sprintf(str1,"%sBACKOUT.DAB",node_dir);
        !           246: if((file=nopen(str1,O_WRONLY|O_APPEND|O_CREAT))==-1) {
        !           247:        errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_APPEND|O_CREAT);
        !           248:        return; }
        !           249: ch=BO_OPENFILE;
        !           250: write(file,&ch,1);                             /* backout type */
        !           251: write(file,dir[f.dir]->code,8); /* directory code */
        !           252: write(file,&f.datoffset,4);            /* offset into .dat file */
        !           253: write(file,&ch,BO_LEN-(1+8+4)); /* pad it */
        !           254: close(file);
        !           255: }
        !           256: 
        !           257: /****************************************************************************/
        !           258: /* Decrements the opencount on the file data 'f' and removes the backout       */
        !           259: /* from the backout.dab                                                                                                                */
        !           260: /****************************************************************************/
        !           261: void closefile(file_t f)
        !           262: {
        !           263:        uchar str1[256],str2[4],str3[4],ch,*buf;
        !           264:        int file;
        !           265:        long length,l,offset;
        !           266: 
        !           267: /************************************/
        !           268: /* Decrement open count in dat file */
        !           269: /************************************/
        !           270: sprintf(str1,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
        !           271: if((file=nopen(str1,O_RDWR))==-1) {
        !           272:        errormsg(WHERE,ERR_OPEN,str1,O_RDWR);
        !           273:        return; }
        !           274: lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET);
        !           275: if(read(file,str2,3)!=3) {
        !           276:        close(file);
        !           277:        errormsg(WHERE,ERR_READ,str1,3);
        !           278:        return; }
        !           279: str2[3]=0;
        !           280: ch=atoi(str2);
        !           281: if(ch) ch--;
        !           282: itoa(ch,str3,10);
        !           283: putrec(str2,0,3,str3);
        !           284: lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET);
        !           285: if(write(file,str2,3)!=3) {
        !           286:        close(file);
        !           287:        errormsg(WHERE,ERR_WRITE,str1,3);
        !           288:        return; }
        !           289: close(file);
        !           290: /*****************************************/
        !           291: /* Removing transaction from BACKOUT.DAB */
        !           292: /*****************************************/
        !           293: sprintf(str1,"%sBACKOUT.DAB",node_dir);
        !           294: if(flength(str1)<1L)   /* file is not there or empty */
        !           295:        return;
        !           296: if((file=nopen(str1,O_RDONLY))==-1) {
        !           297:        errormsg(WHERE,ERR_OPEN,str1,O_RDONLY);
        !           298:        return; }
        !           299: length=filelength(file);
        !           300: if((buf=MALLOC(length))==NULL) {
        !           301:        close(file);
        !           302:        errormsg(WHERE,ERR_ALLOC,str1,length);
        !           303:        return; }
        !           304: if(read(file,buf,length)!=length) {
        !           305:        close(file);
        !           306:        FREE(buf);
        !           307:        errormsg(WHERE,ERR_READ,str1,length);
        !           308:        return; }
        !           309: close(file);
        !           310: if((file=nopen(str1,O_WRONLY|O_TRUNC))==-1) {
        !           311:        errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_TRUNC);
        !           312:        return; }
        !           313: ch=0;                                                          /* 'ch' is a 'file already removed' flag */
        !           314: for(l=0;l<length;l+=BO_LEN) {       /* in case file is in backout.dab > 1 */
        !           315:        if(!ch && buf[l]==BO_OPENFILE) {
        !           316:                memcpy(str1,buf+l+1,8);
        !           317:                str1[8]=0;
        !           318:                memcpy(&offset,buf+l+9,4);
        !           319:                if(!stricmp(str1,dir[f.dir]->code) && offset==f.datoffset) {
        !           320:                        ch=1;
        !           321:                        continue; } }
        !           322:        write(file,buf+l,BO_LEN); }
        !           323: FREE(buf);
        !           324: close(file);
        !           325: }

unix.superglobalmegacorp.com

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