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