diff --git a/src/sbbs3/delfiles.c b/src/sbbs3/delfiles.c index 19d0d6e4778d061dc87962be4fbc97a51b524838..3362bb1bfcc88eab1d548abc50dea7e642164e49 100644 --- a/src/sbbs3/delfiles.c +++ b/src/sbbs3/delfiles.c @@ -1,6 +1,39 @@ -#line 1 "delfiles.c" +/* delfiles.c */ -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ +/* Program to delete expired files from a Synchronet file database */ + +/* $Id$ */ + +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * See the GNU General Public License for more details: gpl.txt or * + * http://www.fsf.org/copyleft/gpl.html * + * * + * Anonymous FTP access to the most recent released source is available at * + * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * + * * + * Anonymous CVS access to the development source and modification history * + * is available at cvs.synchro.net:/cvsroot/sbbs, example: * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * + * (just hit return, no password is necessary) * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * You are encouraged to submit any modifications (preferably in Unix diff * + * format) via e-mail to mods@synchro.net * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ #include "sbbs.h" @@ -18,7 +51,7 @@ char *crlf="\r\n"; void bail(int code) { -exit(code); + exit(code); } long lputs(char *str) @@ -26,14 +59,14 @@ long lputs(char *str) char tmp[256]; int i,j,k; -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); + j=strlen(str); + for(i=k=0;i<j;i++) /* remove CRs */ + if(str[i]==CR && str[i+1]==LF) + continue; + else + tmp[k++]=str[i]; + tmp[k]=0; + return(fputs(tmp,stdout)); } /****************************************************************************/ @@ -46,18 +79,18 @@ int lprintf(char *fmat, ...) char sbuf[256]; int chcount; -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); + va_start(argptr,fmat); + chcount=vsprintf(sbuf,fmat,argptr); + va_end(argptr); + lputs(sbuf); + return(chcount); } int main(int argc, char **argv) { char str[256],fname[MAX_PATH+1],not[MAX_NOTS][9],nots=0,*p; int i,j,dirnum,libnum,file; - ulong l,m,n,length; + ulong l,m; long misc=0; time_t now; file_t workfile; @@ -65,199 +98,201 @@ int main(int argc, char **argv) glob_t gl; uchar *ixbbuf; -putenv("TZ=UCT0"); -setvbuf(stdout,NULL,_IONBF,0); + setvbuf(stdout,NULL,_IONBF,0); -fprintf(stderr,"\nDELFILES Version %s (%s) - Removes files from Synchronet " - "Filebase\n" ,DELFILES_VER, PLATFORM_DESC ); + fprintf(stderr,"\nDELFILES Version %s (%s) - Removes files from Synchronet " + "Filebase\n" ,DELFILES_VER, PLATFORM_DESC ); -if(argc<2) { - printf("\n usage: DELFILES <dir_code or * for ALL> [switches]\n"); - printf("\nswitches: /LIB name All directories of specified library\n"); - printf(" /NOT code Exclude specific directory\n"); - printf(" /OFF Remove files that are offline " - "(don't exist on disk)\n"); - printf(" /NOL Remove files with no link " - "(don't exist in database)\n"); - printf(" /RPT Report findings only " - "(don't delete any files)\n"); - return(0); } + if(argc<2) { + printf("\n usage: DELFILES <dir_code or * for ALL> [switches]\n"); + printf("\nswitches: -LIB name All directories of specified library\n"); + printf(" -NOT code Exclude specific directory\n"); + printf(" -OFF Remove files that are offline " + "(don't exist on disk)\n"); + printf(" -NOL Remove files with no link " + "(don't exist in database)\n"); + printf(" -RPT Report findings only " + "(don't delete any files)\n"); + return(0); } -p=getenv("SBBSCTRL"); -if(p==NULL) { - printf("\nSBBSCTRL environment variable not set.\n"); -#ifdef __unix__ - printf("\nExample: export SBBSCTRL=/sbbs/ctrl\n"); -#else - printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); -#endif - return(1); } + p=getenv("SBBSCTRL"); + if(p==NULL) { + printf("\nSBBSCTRL environment variable not set.\n"); + #ifdef __unix__ + printf("\nExample: export SBBSCTRL=/sbbs/ctrl\n"); + #else + printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); + #endif + return(1); } -putenv("TZ=UCT0"); + memset(&cfg, 0, sizeof(cfg)); + cfg.size=sizeof(cfg); + SAFECOPY(cfg.ctrl_dir, p); + backslash(cfg.ctrl_dir); -memset(&cfg, 0, sizeof(cfg)); -cfg.size=sizeof(cfg); -SAFECOPY(cfg.ctrl_dir, p); -backslash(cfg.ctrl_dir); + load_cfg(&cfg, NULL, TRUE, str); + chdir(cfg.ctrl_dir); -load_cfg(&cfg, NULL, TRUE, str); -chdir(cfg.ctrl_dir); + if(!(cfg.sys_misc&SM_LOCAL_TZ)) + putenv("TZ=UTC0"); -dirnum=libnum=-1; -if(argv[1][0]=='*') - misc|=ALL; -else if(argv[1][0]!='/' && argv[1][0]!='-') { - strupr(argv[1]); - for(i=0;i<cfg.total_dirs;i++) - if(!stricmp(argv[1],cfg.dir[i]->code)) - break; - if(i>=cfg.total_dirs) { - printf("\nDirectory code '%s' not found.\n",argv[1]); - return(1); } - dirnum=i; } -for(i=1;i<argc;i++) { - if(!stricmp(argv[i]+1,"LIB")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /LIB parameters were used.\n"); - return(1); } - i++; - if(i>=argc) { - printf("\nLibrary short name must follow /LIB parameter.\n"); - return(1); } - strupr(argv[i]); - for(j=0;j<cfg.total_libs;j++) - if(!stricmp(cfg.lib[j]->sname,argv[i])) + dirnum=libnum=-1; + if(argv[1][0]=='*') + misc|=ALL; + else if(argv[1][0]!='/' && argv[1][0]!='-') { + strupr(argv[1]); + for(i=0;i<cfg.total_dirs;i++) + if(!stricmp(argv[1],cfg.dir[i]->code)) break; - if(j>=cfg.total_libs) { - printf("\nLibrary short name '%s' not found.\n",argv[i]); + if(i>=cfg.total_dirs) { + printf("\nDirectory code '%s' not found.\n",argv[1]); return(1); } - libnum=j; } - else if(!stricmp(argv[i]+1,"NOT")) { - if(nots>=MAX_NOTS) { - printf("\nMaximum number of /NOT options (%u) exceeded.\n" - ,MAX_NOTS); - return(1); } - i++; - if(i>=argc) { - printf("\nDirectory internal code must follow /NOT parameter.\n"); - return(1); } - sprintf(not[nots++],"%.8s",argv[i]); } - else if(!stricmp(argv[i]+1,"OFF")) - misc|=OFFLINE; - else if(!stricmp(argv[i]+1,"NOL")) - misc|=NO_LINK; - else if(!stricmp(argv[i]+1,"RPT")) - misc|=REPORT; - else if(!stricmp(argv[i]+1,"ALL")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /ALL parameters were used.\n"); - return(1); } - if(libnum!=-1) { - printf("\nBoth library name and /ALL parameters were used.\n"); - return(1); } - misc|=ALL; } } + dirnum=i; } + for(i=1;i<argc;i++) { + if(!stricmp(argv[i]+1,"LIB")) { + if(dirnum!=-1) { + printf("\nBoth directory code and /LIB parameters were used.\n"); + return(1); } + i++; + if(i>=argc) { + printf("\nLibrary short name must follow /LIB parameter.\n"); + return(1); } + strupr(argv[i]); + for(j=0;j<cfg.total_libs;j++) + if(!stricmp(cfg.lib[j]->sname,argv[i])) + break; + if(j>=cfg.total_libs) { + printf("\nLibrary short name '%s' not found.\n",argv[i]); + return(1); } + libnum=j; } + else if(!stricmp(argv[i]+1,"NOT")) { + if(nots>=MAX_NOTS) { + printf("\nMaximum number of /NOT options (%u) exceeded.\n" + ,MAX_NOTS); + return(1); } + i++; + if(i>=argc) { + printf("\nDirectory internal code must follow /NOT parameter.\n"); + return(1); } + sprintf(not[nots++],"%.8s",argv[i]); } + else if(!stricmp(argv[i]+1,"OFF")) + misc|=OFFLINE; + else if(!stricmp(argv[i]+1,"NOL")) + misc|=NO_LINK; + else if(!stricmp(argv[i]+1,"RPT")) + misc|=REPORT; + else if(!stricmp(argv[i]+1,"ALL")) { + if(dirnum!=-1) { + printf("\nBoth directory code and /ALL parameters were used.\n"); + return(1); } + if(libnum!=-1) { + printf("\nBoth library name and /ALL parameters were used.\n"); + return(1); } + misc|=ALL; } } -for(i=0;i<cfg.total_dirs;i++) { - if(!(misc&ALL) && i!=dirnum && cfg.dir[i]->lib!=libnum) - continue; - for(j=0;j<nots;j++) - if(!stricmp(not[j],cfg.dir[i]->code)) - break; - if(j<nots) - continue; + for(i=0;i<cfg.total_dirs;i++) { + if(!(misc&ALL) && i!=dirnum && cfg.dir[i]->lib!=libnum) + continue; + for(j=0;j<nots;j++) + if(!stricmp(not[j],cfg.dir[i]->code)) + break; + if(j<nots) + continue; - if(misc&NO_LINK && cfg.dir[i]->misc&DIR_FCHK) { - strcpy(tmp,cfg.dir[i]->path); - sprintf(str,"%s*.*",tmp); - printf("\nSearching %s for unlinked files\n",str); - if(!glob(str, GLOB_MARK, NULL, &gl)) { - for(j=0; j<gl.gl_pathc; j++) { - /* emulate _A_NORMAL */ - if(isdir(gl.gl_pathv[j])) - continue; - if(access(gl.gl_pathv[j], R_OK|W_OK)) - continue; - padfname(gl.gl_pathv[j],str); - /* strupr(str); */ - if(!findfile(&cfg, i,str)) { - sprintf(str,"%s%s",tmp,gl.gl_pathv[j]); - printf("Removing %s (not in database)\n",gl.gl_pathv); - if(!(misc&REPORT) && remove(str)) - printf("Error removing %s\n",str); } } } - globfree(&gl); - } + if(misc&NO_LINK && cfg.dir[i]->misc&DIR_FCHK) { + strcpy(tmp,cfg.dir[i]->path); + sprintf(str,"%s*.*",tmp); + printf("\nSearching %s for unlinked files\n",str); + if(!glob(str, GLOB_MARK, NULL, &gl)) { + for(j=0; j<(int)gl.gl_pathc; j++) { + /* emulate _A_NORMAL */ + if(isdir(gl.gl_pathv[j])) + continue; + if(access(gl.gl_pathv[j], R_OK|W_OK)) + continue; + padfname(gl.gl_pathv[j],str); + /* strupr(str); */ + if(!findfile(&cfg, i,str)) { + sprintf(str,"%s%s",tmp,gl.gl_pathv[j]); + printf("Removing %s (not in database)\n",gl.gl_pathv); + if(!(misc&REPORT) && remove(str)) + printf("Error removing %s\n",str); } } } + globfree(&gl); + } - if(!cfg.dir[i]->maxage && !(misc&OFFLINE)) - continue; + if(!cfg.dir[i]->maxage && !(misc&OFFLINE)) + continue; - printf("\nScanning %s %s\n",cfg.lib[cfg.dir[i]->lib]->sname,cfg.dir[i]->lname); + printf("\nScanning %s %s\n",cfg.lib[cfg.dir[i]->lib]->sname,cfg.dir[i]->lname); - sprintf(str,"%s%s.ixb",cfg.dir[i]->data_dir,cfg.dir[i]->code); - if((file=nopen(str,O_RDONLY|O_BINARY))==-1) - continue; - l=filelength(file); - if(!l) { + sprintf(str,"%s%s.ixb",cfg.dir[i]->data_dir,cfg.dir[i]->code); + if((file=nopen(str,O_RDONLY|O_BINARY))==-1) + continue; + l=filelength(file); + if(!l) { + close(file); + continue; } + if((ixbbuf=(char *)malloc(l))==NULL) { + close(file); + printf("\7ERR_ALLOC %s %lu\n",str,l); + continue; } + if(read(file,ixbbuf,l)!=(int)l) { + close(file); + printf("\7ERR_READ %s %lu\n",str,l); + free((char *)ixbbuf); + continue; } close(file); - continue; } - if((ixbbuf=(char *)malloc(l))==NULL) { - close(file); - printf("\7ERR_ALLOC %s %lu\n",str,l); - continue; } - if(read(file,ixbbuf,l)!=l) { - close(file); - printf("\7ERR_READ %s %lu\n",str,l); - free((char *)ixbbuf); - continue; } - close(file); - m=0L; - now=time(NULL); - while(m<l) { - memset(&workfile,0,sizeof(file_t)); - for(j=0;j<12 && m<l;j++) - if(j==8) - fname[j]='.'; - else - fname[j]=ixbbuf[m++]; - fname[j]=0; - strcpy(workfile.name,fname); - unpadfname(workfile.name,fname); - workfile.dir=i; - sprintf(str,"%s%s" - ,workfile.altpath>0 && workfile.altpath<=cfg.altpaths - ? cfg.altpath[workfile.altpath-1] - : cfg.dir[workfile.dir]->path,fname); - workfile.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8) - |((long)ixbbuf[m+2]<<16); - workfile.dateuled=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) - |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24)); - workfile.datedled=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) - |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24)); - m+=11; - if(cfg.dir[i]->maxage && cfg.dir[i]->misc&DIR_SINCEDL && workfile.datedled - && (now-workfile.datedled)/86400L>cfg.dir[i]->maxage) { - printf("Deleting %s (%ld days since last download)\n",fname - ,(now-workfile.datedled)/86400L); - getfiledat(&cfg, &workfile); - if(!(misc&REPORT)) { - removefiledat(&cfg, &workfile); - if(remove(str)) - printf("Error removing %s\n",str); } } - else if(cfg.dir[i]->maxage - && !(workfile.datedled && cfg.dir[i]->misc&DIR_SINCEDL) - && (now-workfile.dateuled)/86400L>cfg.dir[i]->maxage) { - printf("Deleting %s (uploaded %ld days ago)\n",fname - ,(now-workfile.dateuled)/86400L); - getfiledat(&cfg, &workfile); - if(!(misc&REPORT)) { - removefiledat(&cfg, &workfile); - if(remove(str)) - printf("Error removing %s\n",str); } } - else if(misc&OFFLINE && cfg.dir[i]->misc&DIR_FCHK && !fexist(str)) { - printf("Removing %s (doesn't exist)\n",fname); - getfiledat(&cfg, &workfile); - if(!(misc&REPORT)) - removefiledat(&cfg, &workfile); } } + m=0L; + now=time(NULL); + while(m<l) { + memset(&workfile,0,sizeof(file_t)); + for(j=0;j<12 && m<l;j++) + if(j==8) + fname[j]='.'; + else + fname[j]=ixbbuf[m++]; + fname[j]=0; + strcpy(workfile.name,fname); + unpadfname(workfile.name,fname); + workfile.dir=i; + sprintf(str,"%s%s" + ,workfile.altpath>0 && workfile.altpath<=cfg.altpaths + ? cfg.altpath[workfile.altpath-1] + : cfg.dir[workfile.dir]->path,fname); + workfile.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8) + |((long)ixbbuf[m+2]<<16); + workfile.dateuled=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) + |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24)); + workfile.datedled=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) + |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24)); + m+=11; + if(cfg.dir[i]->maxage && cfg.dir[i]->misc&DIR_SINCEDL && workfile.datedled + && (now-workfile.datedled)/86400L>cfg.dir[i]->maxage) { + printf("Deleting %s (%ld days since last download)\n",fname + ,(now-workfile.datedled)/86400L); + getfiledat(&cfg, &workfile); + if(!(misc&REPORT)) { + removefiledat(&cfg, &workfile); + if(remove(str)) + printf("Error removing %s\n",str); } } + else if(cfg.dir[i]->maxage + && !(workfile.datedled && cfg.dir[i]->misc&DIR_SINCEDL) + && (now-workfile.dateuled)/86400L>cfg.dir[i]->maxage) { + printf("Deleting %s (uploaded %ld days ago)\n",fname + ,(now-workfile.dateuled)/86400L); + getfiledat(&cfg, &workfile); + if(!(misc&REPORT)) { + removefiledat(&cfg, &workfile); + if(remove(str)) + printf("Error removing %s\n",str); } } + else if(misc&OFFLINE && cfg.dir[i]->misc&DIR_FCHK && !fexist(str)) { + printf("Removing %s (doesn't exist)\n",fname); + getfiledat(&cfg, &workfile); + if(!(misc&REPORT)) + removefiledat(&cfg, &workfile); } } + + free((char *)ixbbuf); } - free((char *)ixbbuf); } + return(0); }