Annotation of sbbs/sbbs2/file_ovl.c, revision 1.1.1.1

1.1       root        1: #line 1 "FILE_OVL.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: 
                      7: /****************************************************************************/
                      8: /* Adds file data in 'f' to DIR#.DAT and DIR#.IXB   and updates user        */
                      9: /* info for uploader. Must have .name, .desc and .dir fields filled prior   */
                     10: /* to a call to this function.                                              */
                     11: /* Returns 1 if file uploaded sucessfully, 0 if not.                        */
                     12: /****************************************************************************/
                     13: char uploadfile(file_t *f)
                     14: {
                     15:        uchar path[256],str[256],fname[25],ext[513],desc[513],tmp[128],*p;
                     16:        static uchar sbbsfilename[128],sbbsfiledesc[128];
                     17:        int  file;
                     18:     uint i;
                     19:     long length;
                     20:        FILE *stream;
                     21: 
                     22: f->misc=0;
                     23: curdirnum=f->dir;
                     24: if(findfile(f->dir,f->name)) {
                     25:        errormsg(WHERE,ERR_CHK,f->name,f->dir);
                     26:     return(0); }
                     27: sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths
                     28:        ? altpath[f->altpath-1]
                     29:        : dir[f->dir]->path,unpadfname(f->name,fname));
                     30: if(!fexist(path)) {
                     31:        bprintf(text[FileNotReceived],f->name);
                     32:        sprintf(str,"Attempted to upload %s to %s %s (Not received)",f->name
                     33:                ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname);
                     34:     logline("U!",str);
                     35:     return(0); }
                     36: strcpy(tmp,f->name);
                     37: truncsp(tmp);
                     38: for(i=0;i<total_ftests;i++)
                     39:        if(ftest[i]->ext[0]=='*' || !strcmp(tmp+9,ftest[i]->ext)) {
                     40:                if(!chk_ar(ftest[i]->ar,useron))
                     41:                        continue;
                     42:                attr(LIGHTGRAY);
                     43:         bputs(ftest[i]->workstr);
                     44: 
                     45:                sprintf(sbbsfilename,"SBBSFILENAME=%.12s",unpadfname(f->name,fname));
                     46:                putenv(sbbsfilename);
                     47:                sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc);
                     48:                putenv(sbbsfiledesc);
                     49:                sprintf(str,"%sSBBSFILE.NAM",node_dir);
                     50:         if((stream=fopen(str,"w"))!=NULL) {
                     51:                        fwrite(fname,1,strlen(fname),stream);
                     52:                        fclose(stream); }
                     53:         sprintf(str,"%sSBBSFILE.DES",node_dir);
                     54:                if((stream=fopen(str,"w"))!=NULL) {
                     55:                        fwrite(f->desc,1,strlen(f->desc),stream);
                     56:             fclose(stream); }
                     57:                if(external(cmdstr(ftest[i]->cmd,path,f->desc,NULL),0)) { /* EX_OUTL */
                     58:                        bprintf(text[FileHadErrors],f->name,ftest[i]->ext);
                     59:             if(SYSOP) {
                     60:                 if(!yesno(text[DeleteFileQ])) return(0); }
                     61:             remove(path);
                     62:                        sprintf(str,"Attempted to upload %s to %s %s (%s Errors)",f->name
                     63:                                ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname,ftest[i]->ext);
                     64:             logline("U!",str);
                     65:             return(0); }
                     66:         else {
                     67:                        sprintf(str,"%sSBBSFILE.NAM",node_dir);
                     68:                        if((stream=fopen(str,"r"))!=NULL) {
                     69:                                if(fgets(str,128,stream)) {
                     70:                                        truncsp(str);
                     71:                                        strupr(str);
                     72:                                        padfname(str,f->name);
                     73:                                        strcpy(tmp,f->name);
                     74:                                        truncsp(tmp);
                     75:                                        sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths
                     76:                                                ? altpath[f->altpath-1] : dir[f->dir]->path
                     77:                                                ,unpadfname(f->name,fname)); }
                     78:                 fclose(stream);
                     79:                                }
                     80:                        sprintf(str,"%sSBBSFILE.DES",node_dir);
                     81:                        if((stream=fopen(str,"r"))!=NULL) {
                     82:                                if(fgets(str,128,stream)) {
                     83:                                        truncsp(str);
                     84:                                        sprintf(f->desc,"%.*s",LEN_FDESC,str); }
                     85:                                fclose(stream); }
                     86:             CRLF; } }
                     87: 
                     88: if((length=flength(path))<=0L) {
                     89:        bprintf(text[FileZeroLength],f->name);
                     90:     remove(path);
                     91:        sprintf(str,"Attempted to upload %s to %s %s (Zero length)",f->name
                     92:                ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname);
                     93:     logline("U!",str);
                     94:     return(0); }
                     95: if(dir[f->dir]->misc&DIR_DIZ) {
                     96:        for(i=0;i<total_fextrs;i++)
                     97:                if(!stricmp(fextr[i]->ext,tmp+9) && chk_ar(fextr[i]->ar,useron))
                     98:                        break;
                     99:        if(i<total_fextrs) {
                    100:                sprintf(str,"%sFILE_ID.DIZ",temp_dir);
                    101:                remove(str);
                    102:                external(cmdstr(fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OUTL);
                    103:                if(!fexist(str)) {
                    104:                        sprintf(str,"%sDESC.SDI",temp_dir);
                    105:                        remove(str);
                    106:                        external(cmdstr(fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OUTL); }
                    107:                if((file=nopen(str,O_RDONLY))!=-1) {
                    108:                        memset(ext,0,513);
                    109:                        read(file,ext,512);
                    110:                        for(i=512;i;i--)
                    111:                                if(ext[i-1]>SP)
                    112:                                        break;
                    113:                        ext[i]=0;
                    114:                        if(!f->desc[0]) {
                    115:                                strcpy(desc,ext);
                    116:                                strip_exascii(desc);
                    117:                                strip_ctrl(desc);
                    118:                                for(i=0;desc[i];i++)
                    119:                                        if(isalnum(desc[i]))
                    120:                                                break;
                    121:                                sprintf(f->desc,"%.*s",LEN_FDESC,desc+i); }
                    122:                        close(file);
                    123:                        remove(str);
                    124:                        f->misc|=FM_EXTDESC; } } }
                    125: 
                    126: logon_ulb+=length;  /* Update 'this call' stats */
                    127: logon_uls++;
                    128: if(dir[f->dir]->misc&DIR_AONLY)  /* Forced anonymous */
                    129:        f->misc|=FM_ANON;
                    130: f->cdt=length;
                    131: f->dateuled=time(NULL);
                    132: f->timesdled=0;
                    133: f->datedled=0L;
                    134: f->opencount=0;
                    135: strcpy(f->uler,useron.alias);
                    136: bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp));
                    137: if(!f->desc[0])
                    138:        sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]);
                    139: if(!addfiledat(f))
                    140:        return(0);
                    141: 
                    142: if(f->misc&FM_EXTDESC)
                    143:        putextdesc(f->dir,f->datoffset,ext);
                    144: 
                    145: sprintf(str,"Uploaded %s to %s %s",f->name,lib[dir[f->dir]->lib]->sname
                    146:        ,dir[f->dir]->sname);
                    147: if(dir[f->dir]->upload_sem[0])
                    148:        if((file=nopen(dir[f->dir]->upload_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
                    149:         close(file);
                    150: logline("U+",str);
                    151: /**************************/
                    152: /* Update Uploader's Info */
                    153: /**************************/
                    154: useron.uls=adjustuserrec(useron.number,U_ULS,5,1);
                    155: useron.ulb=adjustuserrec(useron.number,U_ULB,10,length);
                    156: if(dir[f->dir]->up_pct && dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */
                    157:        if(dir[f->dir]->misc&DIR_CDTMIN && cur_cps)    /* Give min instead of cdt */
                    158:                useron.min=adjustuserrec(useron.number,U_MIN,10
                    159:                        ,((ulong)(length*(dir[f->dir]->up_pct/100.0))/cur_cps)/60);
                    160:        else
                    161:                useron.cdt=adjustuserrec(useron.number,U_CDT,10
                    162:                        ,(ulong)(f->cdt*(dir[f->dir]->up_pct/100.0))); }
                    163: return(1);
                    164: }
                    165: 
                    166: 
                    167: /****************************************************************************/
                    168: /* Updates downloader, uploader and downloaded file data                    */
                    169: /* Must have offset, dir and name fields filled prior to call.              */
                    170: /****************************************************************************/
                    171: void downloadfile(file_t f)
                    172: {
                    173:     char str[256],str2[256],fname[13];
                    174:     int i,file;
                    175:        long length,mod;
                    176:     ulong l;
                    177:        user_t uploader;
                    178: 
                    179: getfiledat(&f); /* Get current data - right after download */
                    180: if((length=f.size)<0L)
                    181:     length=0L;
                    182: logon_dlb+=length;  /* Update 'this call' stats */
                    183: logon_dls++;
                    184: bprintf(text[FileNBytesSent],f.name,ultoac(length,tmp));
                    185: sprintf(str,"Downloaded %s from %s %s",f.name,lib[dir[f.dir]->lib]->sname
                    186:     ,dir[f.dir]->sname);
                    187: logline("D-",str);
                    188: /****************************/
                    189: /* Update Downloader's Info */
                    190: /****************************/
                    191: useron.dls=adjustuserrec(useron.number,U_DLS,5,1);
                    192: useron.dlb=adjustuserrec(useron.number,U_DLB,10,length);
                    193: if(!(dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')))
                    194:        subtract_cdt(f.cdt);
                    195: /**************************/
                    196: /* Update Uploader's Info */
                    197: /**************************/
                    198: i=matchuser(f.uler);
                    199: uploader.number=i;
                    200: getuserdat(&uploader);
                    201: if(i && i!=useron.number && uploader.firston<f.dateuled) {
                    202:        l=f.cdt;
                    203:        if(!(dir[f.dir]->misc&DIR_CDTDL))       /* Don't give credits on d/l */
                    204:                l=0;
                    205:        if(dir[f.dir]->misc&DIR_CDTMIN && cur_cps) { /* Give min instead of cdt */
                    206:                mod=((ulong)(l*(dir[f.dir]->dn_pct/100.0))/cur_cps)/60;
                    207:                adjustuserrec(i,U_MIN,10,mod);
                    208:                sprintf(tmp,"%lu minute",mod);
                    209:                sprintf(str,text[DownloadUserMsg]
                    210:                        ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name
                    211:                        ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr
                    212:                        ,useron.alias,tmp); }
                    213:        else {
                    214:                mod=(ulong)(l*(dir[f.dir]->dn_pct/100.0));
                    215:                adjustuserrec(i,U_CDT,10,mod);
                    216:                ultoac(mod,tmp);
                    217:                sprintf(str,text[DownloadUserMsg]
                    218:                        ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name
                    219:                        ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr
                    220:                        ,useron.alias,tmp); }
                    221:     putsmsg(i,str); }
                    222: /*******************/
                    223: /* Update IXB File */
                    224: /*******************/
                    225: f.datedled=time(NULL);
                    226: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    227: if((file=nopen(str,O_RDWR))==-1) {
                    228:     errormsg(WHERE,ERR_OPEN,str,O_RDWR);
                    229:     return; }
                    230: length=filelength(file);
                    231: if(length%F_IXBSIZE) {
                    232:     close(file);
                    233:     errormsg(WHERE,ERR_LEN,str,length);
                    234:     return; }
                    235: strcpy(fname,f.name);
                    236: for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    237:     fname[i]=fname[i+1];
                    238: for(l=0;l<length;l+=F_IXBSIZE) {
                    239:     read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
                    240:     str[11]=0;
                    241:     if(!strcmp(fname,str)) break; }
                    242: if(l>=length) {
                    243:     close(file);
                    244:     errormsg(WHERE,ERR_CHK,f.name,0);
                    245:     return; }
                    246: lseek(file,l+18,SEEK_SET);
                    247: write(file,&f.datedled,4);  /* Write the current time stamp for datedled */
                    248: close(file);
                    249: /*******************/
                    250: /* Update DAT File */
                    251: /*******************/
                    252: f.timesdled++;
                    253: putfiledat(f);
                    254: /******************************************/
                    255: /* Update User to User index if necessary */
                    256: /******************************************/
                    257: if(f.dir==user_dir) {
                    258:     rmuserxfers(0,useron.number,f.name);
                    259:     if(!getuserxfers(0,0,f.name)) { /* check if any ixt entries left */
                    260:         sprintf(str,"%s%s",f.altpath>0 && f.altpath<=altpaths ?
                    261:             altpath[f.altpath-1] : dir[f.dir]->path,unpadfname(f.name,tmp));
                    262:         remove(str);
                    263:         removefiledat(f); } }
                    264: }
                    265: 
                    266: /****************************************************************************/
                    267: /* Removes DAT and IXB entries for the file in the struct 'f'               */
                    268: /****************************************************************************/
                    269: void removefiledat(file_t f)
                    270: {
                    271:        char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13];
                    272:     int file;
                    273:     ulong l,length;
                    274: 
                    275: strcpy(fname,f.name);
                    276: for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    277:     fname[c]=fname[c+1];
                    278: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    279: if((file=nopen(str,O_RDONLY))==-1) {
                    280:     errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    281:     return; }
                    282: length=filelength(file);
                    283: if(!length) {
                    284:        close(file);
                    285:        return; }
                    286: if((ixbbuf=(char *)MALLOC(length))==0) {
                    287:     close(file);
                    288:     errormsg(WHERE,ERR_ALLOC,str,length);
                    289:     return; }
                    290: if(lread(file,ixbbuf,length)!=length) {
                    291:     close(file);
                    292:     errormsg(WHERE,ERR_READ,str,length);
                    293:        FREE((char *)ixbbuf);
                    294:     return; }
                    295: close(file);
                    296: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
                    297:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC);
                    298:     return; }
                    299: for(l=0;l<length;l+=F_IXBSIZE) {
                    300:     for(c=0;c<11;c++)
                    301:         ixbname[c]=ixbbuf[l+c];
                    302:     ixbname[c]=0;
                    303:     if(strcmp(ixbname,fname))
                    304:                if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
                    305:             close(file);
                    306:             errormsg(WHERE,ERR_WRITE,str,F_IXBSIZE);
                    307:                        FREE((char *)ixbbuf);
                    308:             return; } }
                    309: FREE((char *)ixbbuf);
                    310: close(file);
                    311: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
                    312: if((file=nopen(str,O_WRONLY))==-1) {
                    313:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    314:     return; }
                    315: lseek(file,f.datoffset,SEEK_SET);
                    316: c=ETX;          /* If first char of record is ETX, record is unused */
                    317: if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */
                    318:     close(file);
                    319:     errormsg(WHERE,ERR_WRITE,str,1);
                    320:     return; }
                    321: close(file);
                    322: if(f.dir==user_dir)  /* remove file from index */
                    323:     rmuserxfers(0,0,f.name);
                    324: 
                    325: }
                    326: 
                    327: /****************************************************************************/
                    328: /* Puts filedata into DIR_code.DAT file                                     */
                    329: /* Called from removefiles                                                  */
                    330: /****************************************************************************/
                    331: void putfiledat(file_t f)
                    332: {
                    333:     char buf[F_LEN+1],str[256];
                    334:     int file;
                    335:     long length;
                    336: 
                    337: putrec(buf,F_CDT,LEN_FCDT,ultoa(f.cdt,tmp,10));
                    338: putrec(buf,F_DESC,LEN_FDESC,f.desc);
                    339: putrec(buf,F_DESC+LEN_FDESC,2,crlf);
                    340: putrec(buf,F_ULER,LEN_ALIAS+5,f.uler);
                    341: putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf);
                    342: putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10));
                    343: putrec(buf,F_TIMESDLED+5,2,crlf);
                    344: putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10));
                    345: putrec(buf,F_OPENCOUNT+3,2,crlf);
                    346: buf[F_MISC]=f.misc+SP;
                    347: putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp));
                    348: putrec(buf,F_ALTPATH+2,2,crlf);
                    349: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
                    350: if((file=nopen(str,O_WRONLY))==-1) {
                    351:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
                    352:     return; }
                    353: length=filelength(file);
                    354: if(length%F_LEN) {
                    355:     close(file);
                    356:     errormsg(WHERE,ERR_LEN,str,length);
                    357:     return; }
                    358: if(f.datoffset>length) {
                    359:     close(file);
                    360:     errormsg(WHERE,ERR_LEN,str,length);
                    361:     return; }
                    362: lseek(file,f.datoffset,SEEK_SET);
                    363: if(write(file,buf,F_LEN)!=F_LEN) {
                    364:     close(file);
                    365:     errormsg(WHERE,ERR_WRITE,str,F_LEN);
                    366:     return; }
                    367: length=filelength(file);
                    368: close(file);
                    369: if(length%F_LEN)
                    370:     errormsg(WHERE,ERR_LEN,str,length);
                    371: }
                    372: 
                    373: /****************************************************************************/
                    374: /* Adds the data for struct filedat to the directory's data base.           */
                    375: /* changes the .datoffset field only                                        */
                    376: /* returns 1 if added successfully, 0 if not.                                                          */
                    377: /****************************************************************************/
                    378: char addfiledat(file_t *f)
                    379: {
                    380:        uchar str[256],fdat[F_LEN+1],fname[13],idx[3],c,HUGE16 *ixbbuf;
                    381:     int i,file;
                    382:        ulong length,l;
                    383:        time_t uldate;
                    384: 
                    385: /************************/
                    386: /* Add data to DAT File */
                    387: /************************/
                    388: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code);
                    389: if((file=nopen(str,O_RDWR|O_CREAT))==-1) {
                    390:     errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT);
                    391:        return(0); }
                    392: length=filelength(file);
                    393: if(length==0L)
                    394:     l=0L;
                    395: else {
                    396:     if(length%F_LEN) {
                    397:         close(file);
                    398:         errormsg(WHERE,ERR_LEN,str,length);
                    399:                return(0); }
                    400:     for(l=0;l<length;l+=F_LEN) {    /* Find empty slot */
                    401:         lseek(file,l,SEEK_SET);
                    402:         read(file,&c,1);
                    403:                if(c==ETX) break; }
                    404:        if(l/F_LEN>=MAX_FILES || l/F_LEN>=dir[f->dir]->maxfiles) {
                    405:                bputs(text[DirFull]);
                    406:                close(file);
                    407:                sprintf(str,"Directory Full: %s %s"
                    408:                        ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname);
                    409:                logline("U!",str);
                    410:                return(0); } }
                    411: putrec(fdat,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10));
                    412: putrec(fdat,F_DESC,LEN_FDESC,f->desc);
                    413: putrec(fdat,F_DESC+LEN_FDESC,2,crlf);
                    414: putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler);
                    415: putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf);
                    416: putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
                    417: putrec(fdat,F_TIMESDLED+5,2,crlf);
                    418: putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10));
                    419: putrec(fdat,F_OPENCOUNT+3,2,crlf);
                    420: fdat[F_MISC]=f->misc+SP;
                    421: putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp));
                    422: putrec(fdat,F_ALTPATH+2,2,crlf);
                    423: f->datoffset=l;
                    424: idx[0]=l&0xff;          /* Get offset within DAT file for IXB file */
                    425: idx[1]=(l>>8)&0xff;
                    426: idx[2]=(l>>16)&0xff;
                    427: lseek(file,l,SEEK_SET);
                    428: if(write(file,fdat,F_LEN)!=F_LEN) {
                    429:     close(file);
                    430:     errormsg(WHERE,ERR_WRITE,str,F_LEN);
                    431:        return(0); }
                    432: length=filelength(file);
                    433: close(file);
                    434: if(length%F_LEN)
                    435:     errormsg(WHERE,ERR_LEN,str,length);
                    436: 
                    437: /*******************************************/
                    438: /* Update last upload date/time stamp file */
                    439: /*******************************************/
                    440: sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code);
                    441: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    442:     errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
                    443: else {
                    444:     now=time(NULL);
                    445:     write(file,&now,4);
                    446:     close(file); }
                    447: 
                    448: /************************/
                    449: /* Add data to IXB File */
                    450: /************************/
                    451: strcpy(fname,f->name);
                    452: for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    453:     fname[i]=fname[i+1];
                    454: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code);
                    455: if((file=nopen(str,O_RDWR|O_CREAT))==-1) {
                    456:     errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT);
                    457:        return(0); }
                    458: length=filelength(file);
                    459: if(length) {    /* IXB file isn't empty */
                    460:     if(length%F_IXBSIZE) {
                    461:         close(file);
                    462:         errormsg(WHERE,ERR_LEN,str,length);
                    463:                return(0); }
                    464:        if((ixbbuf=(char *)MALLOC(length))==NULL) {
                    465:         close(file);
                    466:         errormsg(WHERE,ERR_ALLOC,str,length);
                    467:                return(0); }
                    468:        if(lread(file,ixbbuf,length)!=length) {
                    469:         close(file);
                    470:         errormsg(WHERE,ERR_READ,str,length);
                    471:                FREE((char *)ixbbuf);
                    472:                return(0); }
                    473: /************************************************/
                    474: /* Sort by Name or Date, Assending or Decending */
                    475: /************************************************/
                    476:     if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) {
                    477:         for(l=0;l<length;l+=F_IXBSIZE) {
                    478:             for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++);
                    479:             if(i==12) {     /* file already in directory index */
                    480:                 close(file);
                    481:                 errormsg(WHERE,ERR_CHK,str,0);
                    482:                                FREE((char *)ixbbuf);
                    483:                                return(0); }
                    484:             if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i])
                    485:                 break;
                    486:             if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i])
                    487:                 break; } }
                    488:     else {  /* sort by date */
                    489:         for(l=0;l<length;l+=F_IXBSIZE) {
                    490:                        uldate=(ixbbuf[l+14]|((long)ixbbuf[l+15]<<8)
                    491:                                |((long)ixbbuf[l+16]<<16)|((long)ixbbuf[l+17]<<24));
                    492:                        if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled<uldate)
                    493:                 break;
                    494:                        if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled>uldate)
                    495:                 break; } }
                    496:     lseek(file,l,SEEK_SET);
                    497:     if(write(file,fname,11)!=11) {  /* Write filename to IXB file */
                    498:         close(file);
                    499:         errormsg(WHERE,ERR_WRITE,str,11);
                    500:                FREE((char *)ixbbuf);
                    501:                return(0); }
                    502:     if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    503:         close(file);
                    504:         errormsg(WHERE,ERR_WRITE,str,3);
                    505:                FREE((char *)ixbbuf);
                    506:                return(0); }
                    507:     write(file,&f->dateuled,sizeof(time_t));
                    508:     write(file,&f->datedled,4);              /* Write 0 for datedled */
                    509:        if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
                    510:         close(file);
                    511:         errormsg(WHERE,ERR_WRITE,str,length-l);
                    512:                FREE((char *)ixbbuf);
                    513:                return(0); }
                    514:        FREE((char *)ixbbuf); }
                    515: else {              /* IXB file is empty... No files */
                    516:     if(write(file,fname,11)!=11) {  /* Write filename it IXB file */
                    517:         close(file);
                    518:         errormsg(WHERE,ERR_WRITE,str,11);
                    519:                return(0); }
                    520:     if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    521:         close(file);
                    522:         errormsg(WHERE,ERR_WRITE,str,3);
                    523:                return(0); }
                    524:     write(file,&f->dateuled,sizeof(time_t));
                    525:     write(file,&f->datedled,4); }
                    526: length=filelength(file);
                    527: close(file);
                    528: if(length%F_IXBSIZE)
                    529:     errormsg(WHERE,ERR_LEN,str,length);
                    530: return(1);
                    531: }
                    532: 
                    533: /****************************************************************************/
                    534: /* Update the upload date for the file 'f'                                  */
                    535: /****************************************************************************/
                    536: void update_uldate(file_t f)
                    537: {
                    538:        char str[256],fname[13];
                    539:        int i,file;
                    540:        long l,length;
                    541: 
                    542: /*******************/
                    543: /* Update IXB File */
                    544: /*******************/
                    545: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    546: if((file=nopen(str,O_RDWR))==-1) {
                    547:        errormsg(WHERE,ERR_OPEN,str,O_RDWR);
                    548:     return; }
                    549: length=filelength(file);
                    550: if(length%F_IXBSIZE) {
                    551:     close(file);
                    552:        errormsg(WHERE,ERR_LEN,str,length);
                    553:     return; }
                    554: strcpy(fname,f.name);
                    555: for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    556:     fname[i]=fname[i+1];
                    557: for(l=0;l<length;l+=F_IXBSIZE) {
                    558:     read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
                    559:     str[11]=0;
                    560:     if(!strcmp(fname,str)) break; }
                    561: if(l>=length) {
                    562:     close(file);
                    563:        errormsg(WHERE,ERR_CHK,f.name,length);
                    564:     return; }
                    565: lseek(file,l+14,SEEK_SET);
                    566: write(file,&f.dateuled,4);
                    567: close(file);
                    568: 
                    569: /*******************************************/
                    570: /* Update last upload date/time stamp file */
                    571: /*******************************************/
                    572: sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    573: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    574:        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
                    575: else {
                    576:        write(file,&f.dateuled,4);
                    577:     close(file); }
                    578: 
                    579: }
                    580: 

unix.superglobalmegacorp.com

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