/* * Deleted daemon source * Copyright (c)2004-2005 by Marek Zelem */ #include #include #include #include #include #include "libdare.h" #define DEFAULT_DAYS 7 #define DEFAULT_MAX 90 #define DEFAULT_MIN 85 #define DEFAULT_INTERVAL (5*60) struct darefs { struct darefs *next; char mount[PATH_MAX+1]; int days; int max; int min; time_t interval; time_t lasttime; }; struct darefs *darefs=NULL; struct darefs **darefsp=&darefs; static void set_darefs(char *mount,int change, int days,int max,int min,time_t interval) { struct darefs *p; for(p=darefs;p!=NULL;p=p->next) { if( !strcmp(p->mount,mount) ) { if( change ) { p->days=days; p->max=max; p->min=min; p->interval=interval; } return; } } if( (*darefsp=malloc(sizeof(struct darefs)))==NULL ) { fprintf(stderr,"Out of memory!\n"); exit(254); } (*darefsp)->next=NULL; strncpy((*darefsp)->mount,mount,PATH_MAX); (*darefsp)->days=days; (*darefsp)->max=max; (*darefsp)->min=min; (*darefsp)->interval=interval; (*darefsp)->lasttime=0; darefsp=&((*darefsp)->next); } int auto_init_darefs( void ) { FILE *f; char buf[1024+1]; char *p; int x; if( (f=fopen("/proc/mounts","r"))==NULL ) { if( (f=fopen("/etc/mtab","r"))==NULL ) { return(-1); } } while( (p=fgets(buf,1024,f))!=NULL ) { p+=strcspn(p," "); p+=strspn(p," "); x=strcspn(p," "); p[x]=0; if( x==0 ) continue; if( dare_is_supported(p) ) set_darefs(p,0,DEFAULT_DAYS,DEFAULT_MAX,DEFAULT_MIN,DEFAULT_INTERVAL); } fclose(f); return(0); } int test_usage( struct darefs *dare, int deleting ) { struct statfs st; int usage,iusage; if( statfs(dare->mount,&st)!=0 ) return(0); usage=((st.f_blocks-st.f_bfree)*100)/st.f_blocks; iusage=((st.f_files-st.f_ffree)*100)/st.f_files; if( (!deleting && usage>dare->max) || (deleting && usage>dare->min) ) return(1); if( (!deleting && iusage>dare->max) || (deleting && iusage>dare->min) ) return(1); return(0); } time_t actual_time; int delete_deleted( char *mountpoint, unsigned long dirnum, dare_info_do_t function, void *arg ) { if( (actual_time-dirnum > ((struct darefs *)arg)->days*86400) || (test_usage((struct darefs *)arg,1)) ) { dare_remove_dirnum(mountpoint,dirnum); return(1); } return(-1); /* stop processing another dirnums */ } int delete_deleted_only_old( char *mountpoint, unsigned long dirnum, dare_info_do_t function, void *arg ) { if( (actual_time-dirnum > ((struct darefs *)arg)->days*86400) ) { dare_remove_dirnum(mountpoint,dirnum); return(1); } return(-1); /* stop processing another dirnums */ } time_t test_all( int force_old_remove ) { struct darefs *dare; time_t tosleep,tmp; time(&actual_time); tosleep=315360000; /* 10 years ;-) */ for(dare=darefs;dare!=NULL;dare=dare->next) { if( actual_time-dare->lasttime >= dare->interval ) { if( test_usage(dare,0) ) dare_info_foreach_inf(dare->mount,delete_deleted,(dare_info_do_t)NULL,(void *)dare); else if( force_old_remove ) dare_info_foreach_inf(dare->mount,delete_deleted_only_old,(dare_info_do_t)NULL,(void *)dare); dare->lasttime=actual_time; } if( (tmp=dare->lasttime+dare->interval-actual_time)=argc ) goto usage; a++; config=argv[a]; } else if( !strcmp(argv[a],"-o") ) { once=1; } else { usage: printf("usage: %s [-o] [-c config]",argv[0]); return(0); } a++; } else goto usage; } /* loadnut config */ if( once ) { test_all(1); return(0); } main_loop(); return(0); }