"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "lastlog.c" between
sarg-2.3.11.tar.gz and sarg-2.4.0.tar.gz

About: SARG ia a Squid Analysis Report Generator.

lastlog.c  (sarg-2.3.11):lastlog.c  (sarg-2.4.0)
/* /*
* SARG Squid Analysis Report Generator http://sarg.sourceforge.net * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
* 1998, 2013 * 1998, 2015
* *
* SARG donations: * SARG donations:
* please look at http://sarg.sourceforge.net/donations.php * please look at http://sarg.sourceforge.net/donations.php
* Support: * Support:
* http://sourceforge.net/projects/sarg/forums/forum/363374 * http://sourceforge.net/projects/sarg/forums/forum/363374
* --------------------------------------------------------------------- * ---------------------------------------------------------------------
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
skipping to change at line 30 skipping to change at line 30
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
* *
*/ */
#include "include/conf.h" #include "include/conf.h"
#include "include/defs.h" #include "include/defs.h"
void mklastlog(const char *outdir) struct DirEntry
{
struct DirEntry *Next;
time_t Time;
char *Name;
};
static void DeleteDirList(struct DirEntry *List)
{
struct DirEntry *Next;
while (List)
{
Next=List->Next;
if (List->Name) free(List->Name);
free(List);
List=Next;
}
}
static struct DirEntry *AppendDirEntry(struct DirEntry *List,time_t CreationTime
,const char *Name,int NameLen)
{
struct DirEntry *entry;
struct DirEntry *prev;
struct DirEntry *ptr;
entry=malloc(sizeof(*entry));
if (!entry) {
debuga(__FILE__,__LINE__,_("Not enough memory to store a report t
o purge\n"));
DeleteDirList(List);
return(NULL);
}
entry->Name=malloc((NameLen+1)*sizeof(char));
if (!entry->Name) {
free(entry);
debuga(__FILE__,__LINE__,_("Not enough memory to store a report t
o purge\n"));
DeleteDirList(List);
return(NULL);
}
entry->Time=CreationTime;
strcpy(entry->Name,Name);
// store most recent file first
prev=NULL;
for (ptr=List ; ptr ; ptr=ptr->Next)
{
if (ptr->Time>CreationTime) break;
prev=ptr;
}
entry->Next=ptr;
if (prev)
prev->Next=entry;
else
List=entry;
return(List);
}
static struct DirEntry *BuildDirDateList(struct DirEntry *List,char *Path,int Pa
thSize,int RootPos,int Length,int Level)
{ {
FILE *fp_in, *fp_ou;
DIR *dirp; DIR *dirp;
struct dirent *direntp; struct dirent *direntp;
char buf[MAXLEN];
char temp[MAXLEN];
char warea[MAXLEN];
char ftime[128];
int ftot=0;
time_t t;
struct tm *local;
struct stat statb; struct stat statb;
int cstatus; int name_len;
struct getwordstruct gwarea;
if(LastLog <= 0)
return;
if (snprintf(temp,sizeof(temp),"%s/lastlog1",tmp)>=sizeof(temp)) { if ((dirp = opendir(Path)) == NULL) {
debuga(_("Path too long: ")); debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\": %s\n"),
debuga_more("%s/lastlog1\n",tmp); Path,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if((fp_ou=fopen(temp,"w"))==NULL) { while ((direntp = readdir( dirp )) != NULL )
debugapos("lastlog",_("Cannot open file \"%s\": %s\n"),temp,strer {
ror(errno)); name_len=strlen(direntp->d_name);
exit(EXIT_FAILURE); if (RootPos+name_len+1>=PathSize) {
debuga(__FILE__,__LINE__,_("Directory entry \"%s%s\" too
long to purge the old reports\n"),Path,direntp->d_name);
exit(EXIT_FAILURE);
}
strcpy(Path+Length,direntp->d_name);
if (stat(Path,&statb) == -1) {
debuga(__FILE__,__LINE__,_("Failed to get the statistics
of file \"%s\": %s\n"),Path,strerror(errno));
continue;
}
if (!S_ISDIR(statb.st_mode)) continue;
if (Level==0)
{
if (IsTreeMonthFileName(direntp->d_name))
{
Path[Length+name_len]='/';
Path[Length+name_len+1]='\0';
List=BuildDirDateList(List,Path,PathSize,RootPos,
Length+name_len+1,1);
if (!List)
{
debuga(__FILE__,__LINE__,_("Old reports d
eletion not undertaken due to previous error\n"));
break;
}
}
}
else if (Level==1)
{
if (IsTreeDayFileName(direntp->d_name))
{
List=AppendDirEntry(List,statb.st_mtime,Path+Root
Pos,Length-RootPos+name_len);
if (!List)
{
debuga(__FILE__,__LINE__,_("Old reports d
eletion not undertaken due to previous error\n"));
break;
}
}
}
} }
closedir(dirp);
return(List);
}
static struct DirEntry *BuildDirList(const char *Path)
{
DIR *dirp;
struct dirent *direntp;
struct stat statb;
char warea[MAXLEN];
int name_pos;
int name_len;
struct DirEntry *List=NULL;
name_pos=strlen(Path);
if (name_pos>=sizeof(warea)) {
debuga(__FILE__,__LINE__,_("The directory name \"%s\" containing
the old reports to purge is too long\n"),Path);
exit(EXIT_FAILURE);
}
strcpy(warea,Path);
if ((dirp = opendir(outdir)) == NULL) { if ((dirp = opendir(outdir)) == NULL) {
debuga(_("Cannot open directory \"%s\": %s\n"),outdir,strerror(er rno)); debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\": %s\n"), outdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
while ((direntp = readdir( dirp )) != NULL ){ while ((direntp = readdir( dirp )) != NULL )
if(strchr(direntp->d_name,'-') == 0) {
continue; name_len=strlen(direntp->d_name);
if (name_pos+name_len+1>=sizeof(warea)) {
snprintf(warea,sizeof(warea),"%s%s",outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Directory entry \"%s%s\" too
long to purge the old reports\n"),Path,direntp->d_name);
exit(EXIT_FAILURE);
}
strcpy(warea+name_pos,direntp->d_name);
if (stat(warea,&statb) == -1) { if (stat(warea,&statb) == -1) {
debuga(_("Failed to get the creation time of \"%s\": %s\n "),warea,strerror(errno)); debuga(__FILE__,__LINE__,_("Failed to get the statistics of file \"%s\": %s\n"),warea,strerror(errno));
continue; continue;
} }
t=statb.st_ctime; if (!S_ISDIR(statb.st_mode)) continue;
local = localtime(&t); if (IsTreeFileDirName(direntp->d_name))
strftime(ftime, sizeof(ftime), "%Y%m%d%H%M%S", local); {
fprintf(fp_ou,"%s\t%s\n",ftime,direntp->d_name); List=AppendDirEntry(List,statb.st_mtime,direntp->d_name,n
ftot++; ame_len);
if (!List)
{
debuga(__FILE__,__LINE__,_("Old reports deletion
not undertaken due to previous error\n"));
break;
}
}
else if (IsTreeYearFileName(direntp->d_name))
{
warea[name_pos+name_len]='/';
warea[name_pos+name_len+1]='\0';
List=BuildDirDateList(List,warea,sizeof(warea),name_pos,n
ame_pos+name_len+1,0);
if (!List)
{
debuga(__FILE__,__LINE__,_("Old reports deletion
not undertaken due to previous error\n"));
break;
}
}
} }
closedir( dirp ); closedir(dirp);
fclose(fp_ou); return(List);
}
static void DeleteEmptyDirs(char *Path,int PathSize,int BasePos)
{
char *Dir;
DIR *dirp;
struct dirent *direntp;
bool index;
if(ftot<=LastLog) { while ((Dir=strrchr(Path,'/'))!=NULL)
if (debug) { {
debuga(ngettext("No old reports to delete as only %d repo if (Dir-Path<=BasePos) break;
rt currently exist\n", *Dir='\0';
"No old reports to delete as only if ((dirp = opendir(Path)) == NULL) {
%d reports currently exists\n",ftot),ftot); debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\":
%s\n"),Path,strerror(errno));
return;
} }
if (!KeepTempLog && unlink(temp)) { index=false;
debuga(_("Cannot delete \"%s\": %s\n"),temp,strerror(errn while ((direntp = readdir( dirp )) != NULL )
o)); {
if (direntp->d_name[0]=='.' && (direntp->d_name[1]=='\0'
|| (direntp->d_name[1]=='.' && direntp->d_name[2]=='\0'))) continue;
if (!strcmp(direntp->d_name,INDEX_HTML_FILE))
{
index=true;
continue;
}
break;
}
closedir(dirp);
if (direntp!=NULL) {
// at least one file exists in the directory, don't delet
e the directory
break;
}
if (debug)
debuga(__FILE__,__LINE__,_("Deleting empty directory \"%s
\"\n"),Path);
if (index) {
if (strlen(Path)+strlen(INDEX_HTML_FILE)+2>=PathSize) {
debuga(__FILE__,__LINE__,_("Buffer too small to d
elete index file \"%s/%s\""),Path,INDEX_HTML_FILE);
exit(EXIT_FAILURE);
}
strcat(Path,"/"INDEX_HTML_FILE);
if (unlink(Path)==-1) {
debuga(__FILE__,__LINE__,_("Failed to delete \"%s
\": %s\n"),Path,strerror(errno));
exit(EXIT_FAILURE);
}
*Dir='\0';
}
if (rmdir(Path)) {
debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),
Path,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return;
} }
//! \todo Rebuild the surviving index file
}
snprintf(buf,sizeof(buf),"sort -n -t \"\t\" -k 1,1 -o \"%s/lastlog\" \"%s void mklastlog(const char *outdir)
\"",tmp,temp); {
cstatus=system(buf); char warea[MAXLEN];
if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { int name_pos;
debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)) int ftot=0;
; struct DirEntry *List;
debuga(_("sort command: %s\n"),buf); struct DirEntry *ptr;
exit(EXIT_FAILURE);
}
if (!KeepTempLog && unlink(temp)) { if (LastLog <= 0)
debuga(_("Cannot delete \"%s\": %s\n"),temp,strerror(errno)); return;
exit(EXIT_FAILURE);
}
List=BuildDirList(outdir);
if (!List) return;
for (ptr=List ; ptr ; ptr=ptr->Next) ftot++;
if (debug) if (debug)
debuga(ngettext("%d report directory found\n","%d report director debuga(__FILE__,__LINE__,ngettext("%d report directory found\n","
ies found\n",ftot),ftot); %d report directories found\n",ftot),ftot);
if (ftot<=LastLog) {
DeleteDirList(List);
if (debug) {
debuga(__FILE__,__LINE__,ngettext("No old reports to dele
te as only %d report currently exists\n",
"No old reports to delete as only
%d reports currently exist\n",ftot),ftot);
}
return;
}
ftot-=LastLog; ftot-=LastLog;
if (debug) if (debug)
debuga(ngettext("%d old report to delete\n","%d old reports to de lete\n",ftot),ftot); debuga(__FILE__,__LINE__,ngettext("%d old report to delete\n","%d old reports to delete\n",ftot),ftot);
snprintf(temp,sizeof(temp),"%s/lastlog",tmp); name_pos=strlen(outdir);
if((fp_in=fopen(temp,"r"))==NULL) { if (name_pos>=sizeof(warea)) {
debugapos("lastlog",_("Cannot open file \"%s\": %s\n"),temp,strer DeleteDirList(List);
ror(errno)); debuga(__FILE__,__LINE__,_("The directory name \"%s\" containing
the old reports to purge is too long\n"),outdir);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
strcpy(warea,outdir);
while(ftot>0 && fgets(buf,sizeof(buf),fp_in)!=NULL) { for (ptr=List ; ptr && ftot>0 ; ptr=ptr->Next)
fixendofline(buf); {
getword_start(&gwarea,buf); if (debug)
if (getword(warea,sizeof(warea),&gwarea,'\t')<0) { debuga(__FILE__,__LINE__,_("Removing old report file %s\n
debuga(_("Invalid record in file \"%s\"\n"),temp); "),ptr->Name);
if (name_pos+strlen(ptr->Name)+1>=sizeof(warea)) {
DeleteDirList(List);
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s\n",outdir,ptr->Name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
strcpy(warea+name_pos,ptr->Name);
if(debug) unlinkdir(warea,0);
debuga(_("Removing old report file \"%s\"\n"),gwarea.curr DeleteEmptyDirs(warea,sizeof(warea),name_pos);
ent);
if (snprintf(temp,sizeof(temp),"%s%s",outdir,gwarea.current)>=siz
eof(temp)) {
debuga(_("Path too long: "));
debuga_more("%s%s\n",outdir,gwarea.current);
exit(EXIT_FAILURE);
}
unlinkdir(temp,0);
ftot--; ftot--;
} }
fclose(fp_in); DeleteDirList(List);
if (!KeepTempLog) {
snprintf(temp,sizeof(temp),"%s/lastlog",tmp);
if (unlink(temp) == -1)
debuga(_("Cannot delete \"%s\": %s\n"),temp,strerror(errn
o));
}
return; return;
} }
 End of changes. 26 change blocks. 
91 lines changed or deleted 275 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)