|
|
1.1 root 1: #line 1 "DELFILES.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: #define DELFILES_VER "1.01"
8:
9: char tmp[256];
10:
11: #define MAX_NOTS 25
12:
13: #define ALL (1L<<0)
14: #define OFFLINE (1L<<1)
15: #define NO_LINK (1L<<2)
16: #define REPORT (1L<<3)
17:
18: void bail(int code)
19: {
20: exit(code);
21: }
22:
23: long lputs(char FAR16 *str)
24: {
25: char tmp[256];
26: int i,j,k;
27:
28: j=strlen(str);
29: for(i=k=0;i<j;i++) /* remove CRs */
30: if(str[i]==CR && str[i+1]==LF)
31: continue;
32: else
33: tmp[k++]=str[i];
34: tmp[k]=0;
35: return(fputs(tmp,stdout));
36: }
37:
38: /****************************************************************************/
39: /* Performs printf() through local assembly routines */
40: /* Called from everywhere */
41: /****************************************************************************/
42: int lprintf(char *fmat, ...)
43: {
44: va_list argptr;
45: char sbuf[256];
46: int chcount;
47:
48: va_start(argptr,fmat);
49: chcount=vsprintf(sbuf,fmat,argptr);
50: va_end(argptr);
51: lputs(sbuf);
52: return(chcount);
53: }
54:
55: /****************************************************************************/
56: /* Truncates white-space chars off end of 'str' and terminates at first tab */
57: /****************************************************************************/
58: void truncsp(char *str)
59: {
60: int c;
61:
62: str[strcspn(str,"\t")]=0;
63: c=strlen(str);
64: while(c && (uchar)str[c-1]<=SP) c--;
65: str[c]=0;
66: }
67:
68: /****************************************************************************/
69: /* Puts a backslash on path strings */
70: /****************************************************************************/
71: void backslash(char *str)
72: {
73: int i;
74:
75: i=strlen(str);
76: if(i && str[i-1]!='\\') {
77: str[i]='\\'; str[i+1]=0; }
78: }
79:
80: /****************************************************************************/
81: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
82: /* number of times if the attempted file is aREADy open or denying access */
83: /* for some other reason. All files are opened in BINARY mode. */
84: /****************************************************************************/
85: int nopen(char *str, int access)
86: {
87: char logstr[256];
88: int file,share,count=0;
89:
90: if(access==O_RDONLY) share=SH_DENYWR;
91: else share=SH_DENYRW;
92: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1)
93: && errno==EACCES && count++<LOOP_NOPEN);
94: if(file==-1 && errno==EACCES)
95: lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
96: return(file);
97: }
98:
99: /****************************************************************************/
100: /* This function performs an nopen, but returns a file stream with a buffer */
101: /* allocated. */
102: /****************************************************************************/
103: FILE *fnopen(int *file, char *str, int access)
104: {
105: char mode[128];
106: FILE *stream;
107:
108: if(((*file)=nopen(str,access))==-1) {
109: printf("nopen -1\n");
110: return(NULL); }
111:
112: if(access&O_APPEND) {
113: if(access&O_RDONLY)
114: strcpy(mode,"a+");
115: else
116: strcpy(mode,"a"); }
117: else {
118: if(access&O_WRONLY)
119: strcpy(mode,"r+");
120: else
121: strcpy(mode,"r"); }
122: stream=fdopen((*file),mode);
123: if(stream==NULL) {
124: printf("fdopen NULL mode='%s'\n",mode);
125: close(*file);
126: return(NULL); }
127: setvbuf(stream,NULL,_IOFBF,16*1024);
128: return(stream);
129: }
130:
131: /****************************************************************************/
132: /* Checks the disk drive for the existence of a file. Returns 1 if it */
133: /* exists, 0 if it doesn't. */
134: /****************************************************************************/
135: char fexist(char *filespec)
136: {
137: struct find_t f;
138: uint i;
139:
140: i=_dos_findfirst(filespec,_A_NORMAL,&f);
141: #ifdef __WATCOMC__
142: _dos_findclose(&f);
143: #endif
144: if(!i)
145: return(1);
146: return(0);
147: }
148:
149: /****************************************************************************/
150: /* Returns the length of the file in 'filespec' */
151: /****************************************************************************/
152: long flength(char *filespec)
153: {
154: struct find_t f;
155: uint i;
156:
157: i=_dos_findfirst(filespec,_A_NORMAL,&f);
158: #ifdef __WATCOMC__
159: _dos_findclose(&f);
160: #endif
161: if(!i)
162: return(f.size);
163: return(-1L);
164: }
165:
166: #ifndef __FLAT__
167: /****************************************************************************/
168: /* This function reads files that are potentially larger than 32k. */
169: /* Up to one megabyte of data can be read with each call. */
170: /****************************************************************************/
171: long lread(int file, char HUGE16 *buf,long bytes)
172: {
173: long count;
174:
175: for(count=bytes;count>32767;count-=32767,buf+=32767)
176: if(read(file,(char *)buf,32767)!=32767)
177: return(-1L);
178: if(read(file,(char *)buf,(int)count)!=count)
179: return(-1L);
180: return(bytes);
181: }
182:
183: /****************************************************************************/
184: /* This function writes files that are potentially larger than 32767 bytes */
185: /* Up to one megabytes of data can be written with each call. */
186: /****************************************************************************/
187: long lwrite(int file, char HUGE16 *buf, long bytes)
188: {
189:
190: long count;
191:
192: for(count=bytes;count>32767;count-=32767,buf+=32767)
193: if(write(file,(char *)buf,32767)!=32767)
194: return(-1L);
195: if(write(file,(char *)buf,(int)count)!=count)
196: return(-1L);
197: return(bytes);
198: }
199: #endif
200:
201: /****************************************************************************/
202: /* Removes any files in the user transfer index (XFER.IXT) that match the */
203: /* specifications of dest, or source user, or filename or any combination. */
204: /****************************************************************************/
205: void rmuserxfers(int fromuser, int destuser, char *fname)
206: {
207: char str[256],*ixtbuf;
208: int file;
209: long l,length;
210:
211: sprintf(str,"%sXFER.IXT",data_dir);
212: if(!fexist(str))
213: return;
214: if(!flength(str)) {
215: remove(str);
216: return; }
217: if((file=nopen(str,O_RDONLY))==-1) {
218: printf("ERROR opening %s\r\n",str);
219: return; }
220: length=filelength(file);
221: if((ixtbuf=(char *)MALLOC(length))==NULL) {
222: close(file);
223: printf("ERROR allocating %lu bytes for %s\r\n",length,str);
224: return; }
225: if(read(file,ixtbuf,length)!=length) {
226: close(file);
227: FREE(ixtbuf);
228: printf("ERROR reading %lu bytes from %s\r\n",length,str);
229: return; }
230: close(file);
231: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
232: FREE(ixtbuf);
233: printf("ERROR opening %s\r\n",str);
234: return; }
235: for(l=0;l<length;l+=24) {
236: if(fname!=NULL && fname[0]) { /* fname specified */
237: if(!strncmp(ixtbuf+l+5,fname,12)) { /* this is the file */
238: if(destuser && fromuser) { /* both dest and from user */
239: if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser)
240: continue; } /* both match */
241: else if(fromuser) { /* from user */
242: if(atoi(ixtbuf+l+18)==fromuser) /* matches */
243: continue; }
244: else if(destuser) { /* dest user */
245: if(atoi(ixtbuf+l)==destuser) /* matches */
246: continue; }
247: else continue; } } /* no users, so match */
248: else if(destuser && fromuser) {
249: if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser)
250: continue; }
251: else if(destuser && atoi(ixtbuf+l)==destuser)
252: continue;
253: else if(fromuser && atoi(ixtbuf+l+18)==fromuser)
254: continue;
255: write(file,ixtbuf+l,24); }
256: close(file);
257: FREE(ixtbuf);
258: }
259:
260: /****************************************************************************/
261: /* Removes DAT and IXB entries for the file in the struct 'f' */
262: /****************************************************************************/
263: void removefiledat(file_t f)
264: {
265: char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13];
266: int file;
267: ulong l,length;
268:
269: strcpy(fname,f.name);
270: for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */
271: fname[c]=fname[c+1];
272: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
273: if((file=nopen(str,O_RDONLY))==-1) {
274: printf("ERROR opening %s\r\n",str);
275: return; }
276: length=filelength(file);
277: if(!length) {
278: close(file);
279: return; }
280: if((ixbbuf=(char *)MALLOC(length))==0) {
281: close(file);
282: printf("ERROR allocating %lu bytes for %s\r\n",length,str);
283: return; }
284: if(lread(file,ixbbuf,length)!=length) {
285: close(file);
286: printf("ERROR reading %lu bytes from %s\r\n",length,str);
287: FREE((char *)ixbbuf);
288: return; }
289: close(file);
290: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
291: printf("ERROR opening %s\r\n",str);
292: return; }
293: for(l=0;l<length;l+=F_IXBSIZE) {
294: for(c=0;c<11;c++)
295: ixbname[c]=ixbbuf[l+c];
296: ixbname[c]=0;
297: if(strcmp(ixbname,fname))
298: if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
299: close(file);
300: printf("ERROR writing %lu bytes to %s\r\n",F_IXBSIZE,str);
301: FREE((char *)ixbbuf);
302: return; } }
303: FREE((char *)ixbbuf);
304: close(file);
305: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
306: if((file=nopen(str,O_WRONLY))==-1) {
307: printf("ERROR opening %s\r\n",str);
308: return; }
309: lseek(file,f.datoffset,SEEK_SET);
310: c=ETX; /* If first char of record is ETX, record is unused */
311: if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */
312: close(file);
313: printf("ERROR writing to %s\r\n",str);
314: return; }
315: close(file);
316: if(f.dir==user_dir) /* remove file from index */
317: rmuserxfers(0,0,f.name);
318: }
319:
320: /****************************************************************************/
321: /* Places into 'strout' CR or ETX terminated string starting at */
322: /* 'start' and ending at 'start'+'length' or terminator from 'strin' */
323: /****************************************************************************/
324: void getrec(char *strin,int start,int length,char *strout)
325: {
326: int i=0,stop;
327:
328: stop=start+length;
329: while(start<stop) {
330: if(strin[start]==ETX)
331: break;
332: strout[i++]=strin[start++]; }
333: strout[i]=0;
334: }
335:
336: /****************************************************************************/
337: /* Turns FILE .EXT into FILE.EXT */
338: /****************************************************************************/
339: char *unpadfname(char *filename, char *str)
340: {
341: char c,d;
342:
343: for(c=0,d=0;c<strlen(filename);c++)
344: if(filename[c]!=SP) str[d++]=filename[c];
345: str[d]=0;
346: return(str);
347: }
348:
349: /****************************************************************************/
350: /* Returns the time/date of the file in 'filespec' in time_t (unix) format */
351: /****************************************************************************/
352: long fdate(char *filespec)
353: {
354: int file;
355: #ifdef __WATCOMC__
356: unsigned short ft,fd;
357: #else
358: unsigned ft,fd;
359: #endif
360: struct tm t;
361:
362: if((file=nopen(filespec,O_RDONLY))==-1)
363: return(0);
364: _dos_getftime(file,&fd,&ft);
365: close(file);
366: memset(&t,0,sizeof(t));
367: t.tm_year=((fd&0xfe00)>>9)+80;
368: t.tm_mon=((fd&0x01e0)>>5)-1;
369: t.tm_mday=fd&0x1f;
370: t.tm_hour=(ft&0xf800)>>11;
371: t.tm_min=(ft&0x07e0)>>5;
372: t.tm_sec=(ft&0x001f)<<1;
373: return(mktime(&t));
374: }
375:
376: /****************************************************************************/
377: /* Converts an ASCII Hex string into an ulong */
378: /****************************************************************************/
379: ulong ahtoul(char *str)
380: {
381: ulong l,val=0;
382:
383: while((l=(*str++)|0x20)!=0x20)
384: val=(l&0xf)+(l>>6&1)*9+val*16;
385: return(val);
386: }
387:
388: uint hptoi(char *str)
389: {
390: char tmp[128];
391: uint i;
392:
393: if(!str[1] || toupper(str[0])<='F')
394: return(ahtoul(str));
395: strcpy(tmp,str);
396: tmp[0]='F';
397: i=ahtoul(tmp)+((toupper(str[0])-'F')*0x10);
398: return(i);
399: }
400:
401: /****************************************************************************/
402: /* Gets filedata from dircode.DAT file */
403: /* Need fields .name ,.dir and .offset to get other info */
404: /* Does not fill .dateuled or .datedled fields. */
405: /****************************************************************************/
406: void getfiledat(file_t *f)
407: {
408: char buf[F_LEN+1],str[256],tmp[256];
409: int file;
410: long length;
411:
412: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code);
413: if((file=nopen(str,O_RDONLY))==-1) {
414: printf("ERROR opening %s\r\n",str);
415: return; }
416: length=filelength(file);
417: if(f->datoffset>length) {
418: close(file);
419: printf("ERROR %s filelength %ld is less than offset\r\n",str,length);
420: return; }
421: if(length%F_LEN) {
422: close(file);
423: printf("ERROR %s filelength %ld is not evenly divisible\r\n",str,length);
424: return; }
425: lseek(file,f->datoffset,SEEK_SET);
426: if(read(file,buf,F_LEN)!=F_LEN) {
427: close(file);
428: printf("ERROR reading %ld bytes from %s\r\n",F_LEN,str);
429: return; }
430: close(file);
431: getrec(buf,F_ALTPATH,2,str);
432: f->altpath=hptoi(str);
433: getrec(buf,F_CDT,7,str);
434: f->cdt=atol(str);
435:
436: if(!f->size) { /* only read disk if this is null */
437: if(dir[f->dir]->misc&DIR_FCHK) {
438: sprintf(str,"%s%s"
439: ,f->altpath>0 && f->altpath<=altpaths ? altpath[f->altpath-1]
440: : dir[f->dir]->path,unpadfname(f->name,tmp));
441: f->size=flength(str);
442: f->date=fdate(str); }
443: else {
444: f->size=f->cdt;
445: f->date=0; } }
446: //if((f->size>0L) && cur_cps)
447: // f->timetodl=(f->size/(ulong)cur_cps);
448: //else
449: f->timetodl=0;
450:
451: getrec(buf,F_DESC,LEN_FDESC,f->desc);
452: getrec(buf,F_ULER,LEN_ALIAS,f->uler);
453: getrec(buf,F_TIMESDLED,5,str);
454: f->timesdled=atoi(str);
455: getrec(buf,F_OPENCOUNT,3,str);
456: f->opencount=atoi(str);
457: if(buf[F_MISC]!=ETX)
458: f->misc=buf[F_MISC]-SP;
459: else
460: f->misc=0;
461: }
462:
463: /****************************************************************************/
464: /* Checks directory data file for 'filename' (must be padded). If found, */
465: /* it returns the 1, else returns 0. */
466: /* Called from upload and bulkupload */
467: /****************************************************************************/
468: char findfile(uint dirnum, char *filename)
469: {
470: char str[256],c,fname[128],HUGE16 *ixbbuf;
471: int file;
472: ulong length,l;
473:
474: strcpy(fname,filename);
475: for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */
476: fname[c]=fname[c+1];
477: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
478: if((file=nopen(str,O_RDONLY))==-1) return(0);
479: length=filelength(file);
480: if(!length) {
481: close(file);
482: return(0); }
483: if((ixbbuf=(char *)MALLOC(length))==NULL) {
484: close(file);
485: printf("ERR_ALLOC %s %lu\n",str,length);
486: return(0); }
487: if(lread(file,ixbbuf,length)!=length) {
488: close(file);
489: FREE((char *)ixbbuf);
490: return(0); }
491: close(file);
492: for(l=0;l<length;l+=F_IXBSIZE) {
493: for(c=0;c<11;c++)
494: if(fname[c]!=ixbbuf[l+c]) break;
495: if(c==11) break; }
496: FREE((char *)ixbbuf);
497: if(l<length)
498: return(1);
499: return(0);
500: }
501:
502: /****************************************************************************/
503: /* Turns FILE.EXT into FILE .EXT */
504: /* Called from upload */
505: /****************************************************************************/
506: char *padfname(char *filename, char *str)
507: {
508: char c,d;
509:
510: for(c=0;c<8;c++)
511: if(filename[c]=='.' || !filename[c]) break;
512: else str[c]=filename[c];
513: d=c;
514: if(filename[c]=='.') c++;
515: while(d<8)
516: str[d++]=SP;
517: str[d++]='.';
518: while(d<12)
519: if(!filename[c]) break;
520: else str[d++]=filename[c++];
521: while(d<12)
522: str[d++]=SP;
523: str[d]=0;
524: return(str);
525: }
526:
527: void main(int argc, char **argv)
528: {
529: char str[256],fname[256],not[MAX_NOTS][9],nots=0,*p;
530: uchar HUGE16 *ixbbuf;
531: int i,j,dirnum,libnum,file;
532: ulong l,m,n,length;
533: long misc=0;
534: time_t now;
535: read_cfg_text_t txt;
536: file_t workfile;
537: struct find_t ff;
538:
539: putenv("TZ=UCT0");
540: _fmode=O_BINARY;
541: setvbuf(stdout,NULL,_IONBF,0);
542:
543: fprintf(stderr,"\nDELFILES Version %s (%s) - Removes files from Synchronet "
544: "Filebase\n"
545: ,DELFILES_VER
546: #if defined(__OS2__)
547: ,"OS/2"
548: #elif defined(__NT__)
549: ,"Win32"
550: #elif defined(__DOS4G__)
551: ,"DOS4G"
552: #elif defined(__FLAT__)
553: ,"DOS32"
554: #else
555: ,"DOS16"
556: #endif
557: );
558:
559: if(argc<2) {
560: printf("\n usage: DELFILES <dir_code or * for ALL> [switches]\n");
561: printf("\nswitches: /LIB name All directories of specified library\n");
562: printf(" /NOT code Exclude specific directory\n");
563: printf(" /OFF Remove files that are offline "
564: "(don't exist on disk)\n");
565: printf(" /NOL Remove files with no link "
566: "(don't exist in database)\n");
567: printf(" /RPT Report findings only "
568: "(don't delete any files)\n");
569: exit(0); }
570:
571: p=getenv("SBBSNODE");
572: if(p==NULL) {
573: printf("\nSBBSNODE environment variable not set.\n");
574: printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n");
575: exit(1); }
576:
577: putenv("TZ=UCT0");
578:
579: strcpy(node_dir,p);
580: if(node_dir[strlen(node_dir)-1]!='\\')
581: strcat(node_dir,"\\");
582:
583: txt.openerr="\7\nError opening %s for read.\n";
584: txt.reading="\nReading %s...";
585: txt.readit="\rRead %s ";
586: txt.allocerr="\7\nError allocating %u bytes of memory\n";
587: txt.error="\7\nERROR: Offset %lu in %s\r\n\n";
588:
589: read_node_cfg(txt);
590: if(ctrl_dir[0]=='.') { /* Relative path */
591: strcpy(str,ctrl_dir);
592: sprintf(ctrl_dir,"%s%s",node_dir,str); }
593: read_main_cfg(txt);
594: if(data_dir[0]=='.') { /* Relative path */
595: strcpy(str,data_dir);
596: sprintf(data_dir,"%s%s",node_dir,str); }
597: if(temp_dir[1]!=':' && temp_dir[0]!='\\') {
598: strcpy(str,temp_dir);
599: sprintf(temp_dir,"%s%s",node_dir,str); }
600: read_file_cfg(txt);
601: printf("\n\n");
602:
603: dirnum=libnum=-1;
604: if(argv[1][0]=='*')
605: misc|=ALL;
606: else if(argv[1][0]!='/') {
607: strupr(argv[1]);
608: for(i=0;i<total_dirs;i++)
609: if(!stricmp(argv[1],dir[i]->code))
610: break;
611: if(i>=total_dirs) {
612: printf("\nDirectory code '%s' not found.\n",argv[1]);
613: exit(1); }
614: dirnum=i; }
615: for(i=1;i<argc;i++) {
616: if(!stricmp(argv[i],"/LIB")) {
617: if(dirnum!=-1) {
618: printf("\nBoth directory code and /LIB parameters were used.\n");
619: exit(1); }
620: i++;
621: if(i>=argc) {
622: printf("\nLibrary short name must follow /LIB parameter.\n");
623: exit(1); }
624: strupr(argv[i]);
625: for(j=0;j<total_libs;j++)
626: if(!stricmp(lib[j]->sname,argv[i]))
627: break;
628: if(j>=total_libs) {
629: printf("\nLibrary short name '%s' not found.\n",argv[i]);
630: exit(1); }
631: libnum=j; }
632: else if(!stricmp(argv[i],"/NOT")) {
633: if(nots>=MAX_NOTS) {
634: printf("\nMaximum number of /NOT options (%u) exceeded.\n"
635: ,MAX_NOTS);
636: exit(1); }
637: i++;
638: if(i>=argc) {
639: printf("\nDirectory internal code must follow /NOT parameter.\n");
640: exit(1); }
641: sprintf(not[nots++],"%.8s",argv[i]); }
642: else if(!stricmp(argv[i],"/OFF"))
643: misc|=OFFLINE;
644: else if(!stricmp(argv[i],"/NOL"))
645: misc|=NO_LINK;
646: else if(!stricmp(argv[i],"/RPT"))
647: misc|=REPORT;
648: else if(!stricmp(argv[i],"/ALL")) {
649: if(dirnum!=-1) {
650: printf("\nBoth directory code and /ALL parameters were used.\n");
651: exit(1); }
652: if(libnum!=-1) {
653: printf("\nBoth library name and /ALL parameters were used.\n");
654: exit(1); }
655: misc|=ALL; } }
656:
657: for(i=0;i<total_dirs;i++) {
658: if(!(misc&ALL) && i!=dirnum && dir[i]->lib!=libnum)
659: continue;
660: for(j=0;j<nots;j++)
661: if(!stricmp(not[j],dir[i]->code))
662: break;
663: if(j<nots)
664: continue;
665:
666: if(misc&NO_LINK && dir[i]->misc&DIR_FCHK) {
667: strcpy(tmp,dir[i]->path);
668: if(tmp[0]=='.') {
669: sprintf(str,"%s%s",node_dir,tmp);
670: strcpy(tmp,str); }
671: sprintf(str,"%s*.*",tmp);
672: printf("\nSearching %s for unlinked files\n",str);
673: for(j=_dos_findfirst(str,_A_NORMAL,&ff);!j
674: ;j=_dos_findnext(&ff)) {
675: strupr(ff.name);
676: padfname(ff.name,str);
677: if(!findfile(i,str)) {
678: sprintf(str,"%s%s",tmp,ff.name);
679: printf("Removing %s (not in database)\n",ff.name);
680: if(!(misc&REPORT) && remove(str))
681: printf("Error removing %s\n",str); } }
682: #ifdef __WATCOMC__
683: _dos_findclose(&ff);
684: #endif
685: }
686:
687: if(!dir[i]->maxage && !(misc&OFFLINE))
688: continue;
689:
690: printf("\nScanning %s %s\n",lib[dir[i]->lib]->sname,dir[i]->lname);
691:
692: sprintf(str,"%s%s.IXB",dir[i]->data_dir,dir[i]->code);
693: if((file=nopen(str,O_RDONLY))==-1)
694: continue;
695: l=filelength(file);
696: if(!l) {
697: close(file);
698: continue; }
699: if((ixbbuf=(char *)MALLOC(l))==NULL) {
700: close(file);
701: printf("\7ERR_ALLOC %s %lu\n",str,l);
702: continue; }
703: if(read(file,ixbbuf,l)!=l) {
704: close(file);
705: printf("\7ERR_READ %s %lu\n",str,l);
706: FREE((char *)ixbbuf);
707: continue; }
708: close(file);
709:
710: m=0L;
711: now=time(NULL);
712: while(m<l) {
713: memset(&workfile,0,sizeof(file_t));
714: for(j=0;j<12 && m<l;j++)
715: if(j==8)
716: fname[j]='.';
717: else
718: fname[j]=ixbbuf[m++];
719: fname[j]=0;
720: strcpy(workfile.name,fname);
721: unpadfname(workfile.name,fname);
722: workfile.dir=i;
723: sprintf(str,"%s%s"
724: ,workfile.altpath>0 && workfile.altpath<=altpaths
725: ? altpath[workfile.altpath-1]
726: : dir[workfile.dir]->path,fname);
727: if(str[0]=='.') {
728: sprintf(tmp,"%s%s",node_dir,str);
729: strcpy(str,tmp); }
730: workfile.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)
731: |((long)ixbbuf[m+2]<<16);
732: workfile.dateuled=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)
733: |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24));
734: workfile.datedled=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)
735: |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24));
736: m+=11;
737: if(dir[i]->maxage && dir[i]->misc&DIR_SINCEDL && workfile.datedled
738: && (now-workfile.datedled)/86400L>dir[i]->maxage) {
739: printf("Deleting %s (%ld days since last download)\n",fname
740: ,(now-workfile.datedled)/86400L);
741: getfiledat(&workfile);
742: if(!(misc&REPORT)) {
743: removefiledat(workfile);
744: if(remove(str))
745: printf("Error removing %s\n",str); } }
746: else if(dir[i]->maxage
747: && !(workfile.datedled && dir[i]->misc&DIR_SINCEDL)
748: && (now-workfile.dateuled)/86400L>dir[i]->maxage) {
749: printf("Deleting %s (uploaded %ld days ago)\n",fname
750: ,(now-workfile.dateuled)/86400L);
751: getfiledat(&workfile);
752: if(!(misc&REPORT)) {
753: removefiledat(workfile);
754: if(remove(str))
755: printf("Error removing %s\n",str); } }
756: else if(misc&OFFLINE && dir[i]->misc&DIR_FCHK && !fexist(str)) {
757: printf("Removing %s (doesn't exist)\n",fname);
758: getfiledat(&workfile);
759: if(!(misc&REPORT))
760: removefiledat(workfile); } }
761:
762: FREE((char *)ixbbuf); }
763: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.