Annotation of sbbs/sbbs2/file.c, revision 1.1.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.