"Fossies" - the Fresh Open Source Software Archive  

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

About: SARG ia a Squid Analysis Report Generator.

index.c  (sarg-2.3.11):index.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"
#ifdef HAVE_LSTAT
#define MY_LSTAT lstat
#else
#define MY_LSTAT stat
#endif
static void make_date_index(void); static void make_date_index(void);
static void make_file_index(void); static void make_file_index(void);
static void file_index_to_date_index(const char *entry); static void file_index_to_date_index(const char *entry);
static void date_index_to_file_index(const char *entry); static void date_index_to_file_index(const char *entry);
void make_index(void) void make_index(void)
{ {
DIR *dirp; DIR *dirp;
struct dirent *direntp; struct dirent *direntp;
char wdir[MAXLEN]; char wdir[MAXLEN];
if(LastLog > 0) mklastlog(outdir); if (LastLog > 0) mklastlog(outdir);
if(Index == INDEX_NO) { if (Index == INDEX_NO) {
sprintf(wdir,"%sindex.html",outdir); if (snprintf(wdir,sizeof(wdir),"%s"INDEX_HTML_FILE,outdir)>=sizeo
if(access(wdir, R_OK) == 0) { f(wdir)) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s"INDEX_HTML_FILE,outdir);
exit(EXIT_FAILURE);
}
if (access(wdir, R_OK) == 0) {
if (unlink(wdir)) { if (unlink(wdir)) {
debuga(_("Cannot delete \"%s\": %s\n"),wdir,strer ror(errno)); debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),wdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
return; return;
} }
if(debug) debuga(_("Making index.html\n")); if (debug) {
// TRANSLATORS: The %s is the name of the html index file (index.
html).
debuga(__FILE__,__LINE__,_("Making %s\n"),INDEX_HTML_FILE);
}
// convert any old report hierarchy // convert any old report hierarchy
if ((dirp = opendir(outdir)) == NULL) { if ((dirp = opendir(outdir)) == NULL) {
debuga(_("Failed to open directory \"%s\": %s\n"),outdir,strerror (errno)); 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(isdigit(direntp->d_name[0]) && isdigit(direntp->d_name[1])) { if (isdigit(direntp->d_name[0]) && isdigit(direntp->d_name[1])) {
if(IndexTree == INDEX_TREE_DATE) if (IndexTree == INDEX_TREE_DATE)
file_index_to_date_index(direntp->d_name); file_index_to_date_index(direntp->d_name);
else else
date_index_to_file_index(direntp->d_name); date_index_to_file_index(direntp->d_name);
} }
} }
closedir(dirp); closedir(dirp);
if(IndexTree == INDEX_TREE_DATE) { if (IndexTree == INDEX_TREE_DATE) {
make_date_index(); make_date_index();
} else { } else {
make_file_index(); make_file_index();
} }
} }
/*!
* Get the effective size of a regular file or directory.
*
* \param statb The structure filled by lstat(2).
*
* \return The size occupied on the disk (more or less).
*
* The actual size occupied on disk by a file or a directory table is not a
* trivial computation. It must take into account sparse files, compression,
* deduplication and probably many more.
*
* Here, we assume the file takes a whole number of blocks (which is not the
* case of ReiserFS); the block size is constant (which is not the case of
* ZFS); every data block is stored in one individal block (no deduplication as
* is done by btrfs); data are not compressed (unlike ReiserFS and ZFS).
*
* As we are dealing with directories containing mostly text and a few
* compressed pictures, we don't worry about sparse files with lot of zeros
* that would take less blocks than the actual file size.
*/
static long long int get_file_size(struct stat *statb)
{
#ifdef __linux__
long long int blocks;
//return(statb->st_size);//the size of the file content
//return(statb->st_blocks*512);//what is the purpose of this size?
if (statb->st_blksize==0) return(statb->st_size);
blocks=(statb->st_size+statb->st_blksize-1)/statb->st_blksize;
return(blocks*statb->st_blksize);//how many bytes occupied on disk
#else
return(statb->st_size);
#endif
}
/*!
* Get the size of a directory.
*
* The size is the size of the directory content excluding the directory table.
* The "du" tool on Linux returns the content size including the directory
* table.
*
* \param path The directory whose size is computed. This is a buffer that must
be
* big enough to contains the deepest path as directory entries are appended to
* the string this buffer contains.
* \param path_size The number of bytes available in the \a path buffer.
*
* \return The number of bytes occupied by the directory content.
*/
static long long int get_size(char *path,int path_size)
{
int path_len;
DIR *dirp;
struct dirent *direntp;
struct stat statb;
int name_len;
long long int total_size=0;
char *dir_list=NULL;
int dir_filled=0;
int dir_allocated=0;
path_len=strlen(path);
if (path_len+2>=path_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s\n",path);
exit(EXIT_FAILURE);
}
if ((dirp=opendir(path))==NULL) {
debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\": %s\n"),
path,strerror(errno));
exit(EXIT_FAILURE);
}
path[path_len++]='/';
while ((direntp=readdir(dirp))!=NULL) {
if (direntp->d_name[0]=='.' && (direntp->d_name[1]=='\0' || (dire
ntp->d_name[1]=='.' && direntp->d_name[2]=='\0'))) continue;
name_len=strlen(direntp->d_name);
if (path_len+name_len+1>=path_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s\n",path,direntp->d_name);
exit(EXIT_FAILURE);
}
strcpy(path+path_len,direntp->d_name);
if (MY_LSTAT(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))
{
if (!dir_list || dir_filled+name_len>=dir_allocated)
{
int size=3*(name_len+1);//make room for three fil
e names like this one
if (size<256) size=256;
dir_allocated+=size;
dir_list=realloc(dir_list,dir_allocated);
if (!dir_list) {
debuga(__FILE__,__LINE__,_("Not enough me
mory to recurse into subdirectory \"%s\"\n"),path);
exit(EXIT_FAILURE);
}
}
strcpy(dir_list+dir_filled,direntp->d_name);
dir_filled+=name_len+1;
total_size+=get_file_size(&statb);
}
else if (S_ISREG(statb.st_mode))
{
total_size+=get_file_size(&statb);
}
}
closedir(dirp);
if (dir_list)
{
int start=0;
while (start<dir_filled)
{
name_len=strlen(dir_list+start);
strcpy(path+path_len,dir_list+start);
total_size+=get_size(path,path_size);
start+=name_len+1;
}
free(dir_list);
}
path[path_len-1]='\0';//restore original string
return (total_size);
}
/*!
* Rebuild the html index file for a day when the reports are grouped in a date
tree.
*
* \param monthdir The buffer containing the path where the html index file must
be rebuild.
* The buffer must be big enough to contain the deepest path in that directory a
s the buffer is
* used to concatenate the directory entries.
* \param monthdir_size The size, in byte, of the \a monthdir buffer.
* \param order A postive number to sort the index file in positive order. A neg
ative value sort it
* in decreasing order.
* \param yearnum The string naming the year in the date tree.
* \param monthnum The string naming the month in the date tree.
*
* \return The approximate size occupied by the directory.
*/
static long long int make_date_index_day(char *monthdir,int monthdir_size,int or
der,const char *yearnum,const char *monthnum)
{
int monthdir_len;
int ndays;
DIR *dirp3;
struct dirent *direntp;
struct stat statb;
int i;
int daysort[31*31];
int d1, d2, day;
FILE *fp_ou;
char title[80];
char daynum[10];
int d;
long long int total_size=0;
long long int sub_size;
int name_len;
ndays=0;
if ((dirp3 = opendir(monthdir)) == NULL) {
debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\": %s\n"),
monthdir,strerror(errno));
exit(EXIT_FAILURE);
}
monthdir_len=strlen(monthdir);
if (monthdir_len+strlen(INDEX_HTML_FILE)+2>=monthdir_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s/%s\n",monthdir,INDEX_HTML_FILE);
exit(EXIT_FAILURE);
}
monthdir[monthdir_len++]='/';
while ((direntp = readdir( dirp3 )) != NULL) {
if (direntp->d_name[0]=='.' && (direntp->d_name[1]=='\0' || (dire
ntp->d_name[1]=='.' && direntp->d_name[2]=='\0'))) continue;
name_len=strlen(direntp->d_name);
if (monthdir_len+name_len+1>=monthdir_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s\n",monthdir,direntp->d_name);
exit(EXIT_FAILURE);
}
strcpy(monthdir+monthdir_len,direntp->d_name);
if (MY_LSTAT(monthdir,&statb) == -1) {
debuga(__FILE__,__LINE__,_("Failed to get the statistics
of file \"%s\": %s\n"),monthdir,strerror(errno));
continue;
}
if (S_ISDIR(statb.st_mode))
{
if (!isdigit(direntp->d_name[0]) && !isdigit(direntp->d_n
ame[1])) continue;
i=-1;
if (sscanf(direntp->d_name,"%d%n",&d1,&i)!=1 || d1<1 || d
1>31 || i<0) continue;
if (direntp->d_name[i]=='-') {
if (sscanf(direntp->d_name+i+1,"%d",&d2)!=1 || d2
<1 || d2>31) continue;
} else if (direntp->d_name[i]!='\0') {
continue;
} else {
d2=0;
}
if (ndays>=sizeof(daysort)/sizeof(daysort[0])) {
debuga(__FILE__,__LINE__,_("Too many day director
ies in %s\nSupernumerary entries are ignored\n"),monthdir);
break;
}
day=(d1 << 5) | d2;
for (i=ndays ; i>0 && day<daysort[i-1] ; i--) {
daysort[i]=daysort[i-1];
}
daysort[i]=day;
ndays++;
total_size+=get_file_size(&statb);
}
else if (S_ISREG(statb.st_mode))
{
total_size+=get_file_size(&statb);
}
}
closedir(dirp3);
strcpy(monthdir+monthdir_len,INDEX_HTML_FILE);
if ((fp_ou=fopen(monthdir,"w"))==NULL) {
debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),month
dir,strerror(errno));
exit(EXIT_FAILURE);
}
snprintf(title,sizeof(title),ngettext("SARG: report for %s/%s","SARG: rep
orts for %s/%s",ndays),yearnum,monthnum);
write_html_header(fp_ou,2,title,HTML_JS_NONE);
close_html_header(fp_ou);
fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n
<tr><td></td><td></td></tr>\n",fp_ou);
fprintf(fp_ou,"<tr><th class=\"header_l\">%s/%s/%s</th>",_("YEAR"),_("MON
TH"),_("DAYS"));
if (IndexFields & INDEXFIELDS_DIRSIZE)
fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("SIZE"));
fputs("</tr>\n",fp_ou);
for (d=0 ; d<ndays ; d++) {
if (order>0)
day=daysort[d];
else
day=daysort[ndays-1-d];
d1=(day >> 5) & 0x1F;
if ((day & 0x1F) != 0) {
d2=day & 0x1F;
snprintf(daynum,sizeof(daynum),"%02d-%02d",d1,d2);
} else {
snprintf(daynum,sizeof(daynum),"%02d",d1);
}
strcpy(monthdir+monthdir_len,daynum);
sub_size=get_size(monthdir,monthdir_size);
fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/%s\">%s %s %s
</a></td>",daynum,INDEX_HTML_FILE,yearnum,monthnum,daynum);
if (IndexFields & INDEXFIELDS_DIRSIZE)
{
char size_str[40];
strncpy(size_str,fixnum(sub_size,1),sizeof(size_str)-1);
size_str[sizeof(size_str)-1]='\0';
fprintf(fp_ou,"<td class=\"data2\">%s</td>",size_str);
}
fputs("</tr>\n",fp_ou);
total_size+=sub_size;
}
fputs("</table></div>\n",fp_ou);
monthdir[monthdir_len-1]='\0';
write_html_trailer(fp_ou);
if (fclose(fp_ou)==EOF) {
strcpy(monthdir+monthdir_len,INDEX_HTML_FILE);
debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),monthdi
r,strerror(errno));
exit(EXIT_FAILURE);
}
return(total_size);
}
/*!
* Get the name of a month based on its number.
*
* \param month The month number starting from one.
* \param month_name The buffer to store the month name.
* \param month_size The size of the \a month_name buffer.
*/
static void name_month(int month,char *month_name,int month_size)
{
const char *m[12]={N_("January"),N_("February"),N_("March"),N_("April"),N
_("May"),N_("June"),N_("July"),
N_("August"),N_("September"),N_("Octob
er"),N_("November"),N_("December")};
if (month<1 || month>12) {
debuga(__FILE__,__LINE__,_("The internal list of month names is i
nvalid. Please report this bug to the translator.\n"));
exit(EXIT_FAILURE);
}
strncpy(month_name,_(m[month-1]),month_size-1);
month_name[month_size-1]='\0';
}
/*!
* Rebuild the html index file for a month when the reports are grouped in a dat
e tree.
*
* \param yeardir The buffer containing the path where the html index file must
be rebuild.
* The buffer must be big enough to contain the deepest path in that directory a
s the buffer is
* used to concatenate the directory entries.
* \param yeardir_size The size, in byte, of the \a yeardir buffer.
* \param order A postive number to sort the index file in positive order. A neg
ative value sort it
* in decreasing order.
* \param yearnum The string naming the year in the date tree.
*
* \return The approximate size occupied by the directory.
*/
static long long int make_date_index_month(char *yeardir,int yeardir_size,int or
der,const char *yearnum)
{
int yeardir_len;
int nmonths;
DIR *dirp2;
struct dirent *direntp;
struct stat statb;
int i;
int monthsort[144];
int m1, m2, month;
FILE *fp_ou;
char title[80];
char monthname1[9], monthname2[9];
char nmonth[30];
char monthnum[10];
int m;
long long int total_size=0;
long long int sub_size;
int name_len;
nmonths=0;
if ((dirp2 = opendir(yeardir)) == NULL) {
debuga(__FILE__,__LINE__,_("Cannot open directory \"%s\": %s\n"),
yeardir,strerror(errno));
exit(EXIT_FAILURE);
}
yeardir_len=strlen(yeardir);
if (yeardir_len+strlen(INDEX_HTML_FILE)+2>=yeardir_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s/%s\n",yeardir,INDEX_HTML_FILE);
exit(EXIT_FAILURE);
}
yeardir[yeardir_len++]='/';
while ((direntp = readdir( dirp2 )) != NULL) {
if (direntp->d_name[0]=='.' && (direntp->d_name[1]=='\0' || (dire
ntp->d_name[1]=='.' && direntp->d_name[2]=='\0'))) continue;
name_len=strlen(direntp->d_name);
if (yeardir_len+name_len+1>=yeardir_size) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s\n",yeardir,direntp->d_name);
exit(EXIT_FAILURE);
}
strcpy(yeardir+yeardir_len,direntp->d_name);
if (MY_LSTAT(yeardir,&statb) == -1) {
debuga(__FILE__,__LINE__,_("Failed to get the statistics
of file \"%s\": %s\n"),yeardir,strerror(errno));
continue;
}
if (S_ISDIR(statb.st_mode))
{
if (!isdigit(direntp->d_name[0]) || !isdigit(direntp->d_n
ame[1])) continue;
i=-1;
if (sscanf(direntp->d_name,"%d%n",&m1,&i)!=1 || m1<1 || m
1>12 || i<0) continue;
if (direntp->d_name[i]=='-') {
if (sscanf(direntp->d_name+i+1,"%d",&m2)!=1 || m2
<1 || m2>12) continue;
} else if (direntp->d_name[i]!='\0') {
continue;
} else {
m2=0;
}
if (nmonths>=sizeof(monthsort)/sizeof(monthsort[0])) {
debuga(__FILE__,__LINE__,_("Too many month direct
ories in %s\nSupernumerary entries are ignored\n"),yeardir);
break;
}
month=(m1<<4) | m2;
for (i=nmonths ; i>0 && month<monthsort[i-1] ; i--) {
monthsort[i]=monthsort[i-1];
}
monthsort[i]=month;
nmonths++;
total_size+=get_file_size(&statb);
}
else if (S_ISREG(statb.st_mode))
{
total_size+=get_file_size(&statb);
}
}
closedir(dirp2);
strcpy(yeardir+yeardir_len,INDEX_HTML_FILE);
if ((fp_ou=fopen(yeardir,"w"))==NULL) {
debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),yeard
ir,strerror(errno));
exit(EXIT_FAILURE);
}
snprintf(title,sizeof(title),ngettext("SARG: report for %s","SARG: report
s for %s",nmonths),yearnum);
write_html_header(fp_ou,1,title,HTML_JS_NONE);
close_html_header(fp_ou);
fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n
<tr><td></td><td></td></tr>\n",fp_ou);
fprintf(fp_ou,"<tr><th class=\"header_l\">%s/%s</th>",_("YEAR"),_("MONTH"
));
if (IndexFields & INDEXFIELDS_DIRSIZE)
fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("SIZE"));
fputs("</tr>\n",fp_ou);
for (m=0 ; m<nmonths ; m++) {
if (order>0)
month=monthsort[m];
else
month=monthsort[nmonths-1-m];
m1=(month >> 4) & 0x0F;
if ((month & 0x0F) != 0) {
m2=month & 0x0F;
snprintf(monthnum,sizeof(monthnum),"%02d-%02d",m1,m2);
name_month(m1,monthname1,sizeof(monthname1));
name_month(m2,monthname2,sizeof(monthname2));
snprintf(nmonth,sizeof(nmonth),"%s-%s",monthname1,monthna
me2);
} else {
snprintf(monthnum,sizeof(monthnum),"%02d",m1);
name_month(m1,nmonth,sizeof(nmonth));
}
if (yeardir_len+strlen(monthnum)+1>=yeardir_size) {
yeardir[yeardir_len]='\0';
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s\n",yeardir,monthnum);
exit(EXIT_FAILURE);
}
strcpy(yeardir+yeardir_len,monthnum);
sub_size=make_date_index_day(yeardir,yeardir_size,order,yearnum,n
month);
fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/%s\">%s %s</a
></td>",monthnum,INDEX_HTML_FILE,yearnum,nmonth);
if (IndexFields & INDEXFIELDS_DIRSIZE)
{
char size_str[40];
strncpy(size_str,fixnum(sub_size,1),sizeof(size_str)-1);
size_str[sizeof(size_str)-1]='\0';
fprintf(fp_ou,"<td class=\"data2\">%s</td>",size_str);
}
fputs("</tr>\n",fp_ou);
total_size+=sub_size;
}
fputs("</table></div>\n",fp_ou);
yeardir[yeardir_len-1]='\0';
write_html_trailer(fp_ou);
if (fclose(fp_ou)==EOF) {
strcpy(yeardir+yeardir_len,INDEX_HTML_FILE);
debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),yeardir
,strerror(errno));
exit(EXIT_FAILURE);
}
return(total_size);
}
/*!
* Rebuild a date index tree in the output directory.
*/
static void make_date_index(void) static void make_date_index(void)
{ {
FILE *fp_ou, *fp_ou2, *fp_ou3; FILE *fp_ou;
DIR *dirp, *dirp2, *dirp3; DIR *dirp;
struct dirent *direntp; struct dirent *direntp;
struct dirent *direntp2;
struct dirent *direntp3;
char yearindex[MAXLEN]; char yearindex[MAXLEN];
char yeardir[MAXLEN]; char yeardir[MAXLEN];
char yearnum[10]; char yearnum[10];
char monthindex[MAXLEN];
char monthdir[MAXLEN];
char monthname1[9], monthname2[9];
char nmonth[30];
char monthnum[10];
char dayindex[MAXLEN];
char daynum[10];
char title[80];
int yearsort[150]; int yearsort[150];
int nyears; int nyears;
int year; int year;
int monthsort[144]; int i, y;
int nmonths;
int m1, m2, month;
int daysort[31*31];
int ndays;
int d1, d2, day;
int i, y, m, d;
int order; int order;
int yeardirlen;
sprintf(yearindex,"%sindex.html",outdir); long long int total_size;
nyears=0; nyears=0;
if ((dirp = opendir(outdir)) == NULL) { if ((dirp = opendir(outdir)) == NULL) {
debuga(_("Failed to open directory \"%s\": %s\n"),outdir,strerror (errno)); 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(strlen(direntp->d_name) > 4 || !isdigit(direntp->d_name[0]) || !isdigit(direntp->d_name[1]) || if (!isdigit(direntp->d_name[0]) || !isdigit(direntp->d_name[1]) ||
!isdigit(direntp->d_name[2]) || !isdigit(direntp->d_name[3])) continue; !isdigit(direntp->d_name[2]) || !isdigit(direntp->d_name[3])) continue;
year=atoi(direntp->d_name); year=atoi(direntp->d_name) << 10;
if (direntp->d_name[4]=='-')
{
if (!isdigit(direntp->d_name[5]) || !isdigit(direntp->d_n
ame[6]) ||
!isdigit(direntp->d_name[7]) || !isdigit(direntp->d_na
me[8])) continue;
if (direntp->d_name[9]) continue;
year|=atoi(direntp->d_name+5);
}
else
{
if (direntp->d_name[4]) continue;
}
if (nyears>=sizeof(yearsort)/sizeof(yearsort[0])) { if (nyears>=sizeof(yearsort)/sizeof(yearsort[0])) {
/* /*
If too many years are listed in the directory, we ignore the earliest years. The yearsort array If too many years are listed in the directory, we ignore the earliest years. The yearsort array
is big enough to accomodate the most ambitious use of sar g but this safety is added to prevent is big enough to accomodate the most ambitious use of sar g but this safety is added to prevent
a crash should the directory be polluted by other entries . a crash should the directory be polluted by other entries .
*/ */
if (year>yearsort[0]) { if (year>yearsort[0]) {
for (i=1 ; i<nyears && year>yearsort[i] ; i++) for (i=1 ; i<nyears && year>yearsort[i] ; i++)
yearsort[i-1]=yearsort[i]; yearsort[i-1]=yearsort[i];
yearsort[i-1]=year; yearsort[i-1]=year;
skipping to change at line 142 skipping to change at line 589
yearsort[i]=yearsort[i-1]; yearsort[i]=yearsort[i-1];
} }
yearsort[i]=year; yearsort[i]=year;
nyears++; nyears++;
} }
} }
closedir( dirp ); closedir( dirp );
order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1; order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
if((fp_ou=fopen(yearindex,"w"))==NULL) { if (snprintf(yearindex,sizeof(yearindex),"%s"INDEX_HTML_FILE,outdir)>=siz
debugapos("index",_("Cannot open file \"%s\": %s\n"),yearindex,st eof(yearindex)) {
rerror(errno)); debuga(__FILE__,__LINE__,_("Resulting index file name too long. F
ile name is \"%s/%s\""),outdir,INDEX_HTML_FILE);
exit(EXIT_FAILURE);
}
if ((fp_ou=fopen(yearindex,"w"))==NULL) {
debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),yeari
ndex,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nyears),H TML_JS_NONE); write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nyears),H TML_JS_NONE);
close_html_header(fp_ou); close_html_header(fp_ou);
fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n ",fp_ou); fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n ",fp_ou);
fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th>",_("YEAR")); fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th>",_("YEAR"));
if (IndexFields & INDEXFIELDS_DIRSIZE) if (IndexFields & INDEXFIELDS_DIRSIZE)
fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("SIZE")); fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("SIZE"));
fputs("</tr>\n",fp_ou); fputs("</tr>\n",fp_ou);
yeardirlen=strlen(outdir);
if (yeardirlen>=sizeof(yeardir)) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s",outdir);
exit(EXIT_FAILURE);
}
strcpy(yeardir,outdir);
for (y=0 ; y<nyears ; y++) { for (y=0 ; y<nyears ; y++) {
if (order>0) if (order>0)
year=yearsort[y]; year=yearsort[y];
else else
year=yearsort[nyears-1-y]; year=yearsort[nyears-1-y];
sprintf(yearnum,"%04d",year); if ((year & 0x3FF)==0)
fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/index.html\"> snprintf(yearnum,sizeof(yearnum),"%04d",year>>10);
%s</a></td>",yearnum,yearnum); else
snprintf(yearnum,sizeof(yearnum),"%04d-%04d",year>>10,yea
r & 0x3FF);
strcpy(yeardir+yeardirlen,yearnum);
total_size=make_date_index_month(yeardir,sizeof(yeardir),order,ye
arnum);
fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/%s\">%s</a></
td>",yearnum,INDEX_HTML_FILE,yearnum);
if (IndexFields & INDEXFIELDS_DIRSIZE) if (IndexFields & INDEXFIELDS_DIRSIZE)
fprintf(fp_ou,"<td class=\"data2\">%s</td>",get_size(outd {
ir,yearnum)); char size_str[40];
fputs("</tr>\n",fp_ou);
sprintf(yeardir,"%s%s",outdir,yearnum); strncpy(size_str,fixnum(total_size,1),sizeof(size_str)-1)
// Year dir ;
nmonths=0; size_str[sizeof(size_str)-1]='\0';
if ((dirp2 = opendir(yeardir)) == NULL) { fprintf(fp_ou,"<td class=\"data2\">%s</td>",size_str);
debuga(_("Failed to open directory \"%s\": %s\n"),yeardir
,strerror(errno));
exit(EXIT_FAILURE);
}
while ((direntp2 = readdir( dirp2 )) != NULL) {
if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_
name[1])) continue;
i=-1;
if (sscanf(direntp2->d_name,"%d%n",&m1,&i)!=1 || m1<=0 ||
m1>12 || i<0) continue;
if (direntp2->d_name[i]=='-') {
if (sscanf(direntp2->d_name+i+1,"%d",&m2)!=1 || m
2<m1 || m2>12) continue;
} else if (direntp2->d_name[i]!='\0') {
continue;
} else {
m2=0;
}
if (nmonths>=sizeof(monthsort)/sizeof(monthsort[0])) {
debuga(_("Too many month directories in %s\nSuper
numerary entries are ignored\n"),yeardir);
break;
}
month=m1*16+m2;
for (i=nmonths ; i>0 && month<monthsort[i-1] ; i--) {
monthsort[i]=monthsort[i-1];
}
monthsort[i]=month;
nmonths++;
}
closedir(dirp2);
sprintf(monthindex,"%s/index.html",yeardir);
if((fp_ou2=fopen(monthindex,"w"))==NULL) {
debugapos("index",_("Cannot open file \"%s\": %s\n"),mont
hindex,strerror(errno));
exit(EXIT_FAILURE);
} }
snprintf(title,sizeof(title),ngettext("SARG: report for %04d","SA fputs("</tr>\n",fp_ou);
RG: reports for %04d",nmonths),year);
write_html_header(fp_ou2,1,title,HTML_JS_NONE);
close_html_header(fp_ou2);
fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=
\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou2);
fprintf(fp_ou2,"<tr><th class=\"header_l\">%s/%s</th></tr>\n",_("
YEAR"),_("MONTH"));
for (m=0 ; m<nmonths ; m++) {
if (order>0)
month=monthsort[m];
else
month=monthsort[nmonths-1-m];
m1=month / 16;
if(month % 16 != 0) {
m2=month % 16;
sprintf(monthnum,"%02d-%02d",m1,m2);
sprintf(monthname1,"%02d",m1);
sprintf(monthname2,"%02d",m2);
name_month(monthname1,sizeof(monthname1));
name_month(monthname2,sizeof(monthname2));
sprintf(nmonth,"%s-%s",monthname1,monthname2);
} else {
sprintf(nmonth,"%02d",m1);
sprintf(monthnum,"%02d",m1);
name_month(nmonth,sizeof(nmonth));
}
fprintf(fp_ou2,"<tr><td class=\"data2\"><a href=\"%s/inde
x.html\">%s %s</a></td></tr>\n",monthnum,yearnum,nmonth);
sprintf(monthdir,"%s/%s",yeardir,monthnum);
// month dir
ndays=0;
if ((dirp3 = opendir(monthdir)) == NULL) {
debuga(_("Cannot open directory \"%s\": %s\n"),mo
nthdir,strerror(errno));
exit(EXIT_FAILURE);
}
while ((direntp3 = readdir( dirp3 )) != NULL) {
if(!isdigit(direntp3->d_name[0]) && !isdigit(dire
ntp3->d_name[1])) continue;
i=-1;
if (sscanf(direntp3->d_name,"%d%n",&d1,&i)!=1 ||
d1<=0 || d1>31 || i<0) continue;
if (direntp3->d_name[i]=='-') {
if (sscanf(direntp3->d_name+i+1,"%d",&d2)
!=1 || d2<d1 || d2>31) continue;
} else if (direntp3->d_name[i]!='\0') {
continue;
} else {
d2=0;
}
if (ndays>=sizeof(daysort)/sizeof(daysort[0])) {
debuga(_("Too many day directories in %s\
nSupernumerary entries are ignored\n"),monthdir);
break;
}
day=d1*32+d2;
for (i=ndays ; i>0 && day<daysort[i-1] ; i--) {
daysort[i]=daysort[i-1];
}
daysort[i]=day;
ndays++;
}
closedir(dirp3);
sprintf(dayindex,"%s/index.html",monthdir);
if((fp_ou3=fopen(dayindex,"w"))==NULL) {
debugapos("index",_("Cannot open file \"%s\": %s\
n"),dayindex,strerror(errno));
exit(EXIT_FAILURE);
}
snprintf(title,sizeof(title),ngettext("SARG: report for %
04d/%02d","SARG: reports for %04d/%02d",ndays),year,month);
write_html_header(fp_ou3,2,title,HTML_JS_NONE);
close_html_header(fp_ou3);
fputs("<div class=\"index\"><table cellpadding=\"1\" cell
spacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou3);
fprintf(fp_ou3,"<tr><th class=\"header_l\">%s/%s/%s</th><
/tr>\n",_("YEAR"),_("MONTH"),_("DAYS"));
for (d=0 ; d<ndays ; d++) {
if (order>0)
day=daysort[d];
else
day=daysort[ndays-1-d];
d1=day / 32;
if(day % 32 != 0) {
d2=day % 32;
sprintf(daynum,"%02d-%02d",d1,d2);
} else {
sprintf(daynum,"%02d",d1);
}
fprintf(fp_ou3,"<tr><td class=\"data2\"><a href=\
"%s/index.html\">%s %s %s</a></td></tr>\n",daynum,yearnum,nmonth,daynum);
}
fputs("</table></div>\n",fp_ou3);
if (write_html_trailer(fp_ou3)<0)
debuga(_("Write error in the index %s\n"),dayinde
x);
if (fclose(fp_ou3)==EOF)
debuga(_("Failed to close file \"%s\": %s\n"),day
index,strerror(errno));
}
fputs("</table></div>\n",fp_ou2);
if (write_html_trailer(fp_ou2)<0)
debuga(_("Write error in the index %s\n"),monthindex);
if (fclose(fp_ou2)==EOF)
debuga(_("Failed to close file \"%s\": %s\n"),monthindex,
strerror(errno));
} }
fputs("</table></div>\n",fp_ou); fputs("</table></div>\n",fp_ou);
if (write_html_trailer(fp_ou)<0) write_html_trailer(fp_ou);
debuga(_("Write error in the index %s\n"),yearindex); if (fclose(fp_ou)==EOF) {
if (fclose(fp_ou)==EOF) debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),yearind
debuga(_("Failed to close file \"%s\": %s\n"),yearindex,strerror( ex,strerror(errno));
errno)); exit(EXIT_FAILURE);
}
} }
static void make_file_index(void) static void make_file_index(void)
{ {
#define MAX_CREATION_DATE 15 #define MAX_CREATION_DATE 15
FILE *fp_ou; FILE *fp_ou;
DIR *dirp; DIR *dirp;
struct dirent *direntp; struct dirent *direntp;
char wdir[MAXLEN]; char wdir[MAXLEN];
char data[80]; char data[80];
char ftime[128]; char ftime[9];
char day[6], mon[8], year[40], hour[10]; char day[6], mon[8], year[40], hour[10];
long long int tbytes; long long int tbytes;
long long int media; long long int media;
int iyear, imonth, iday, ihour, iminute, isecond, idst; int iyear, imonth, iday, ihour, iminute, isecond, idst;
int nsort; int nsort;
int nallocated; int nallocated;
int order; int order;
int i; int i;
int tuser; int tuser;
struct getwordstruct gwarea; struct getwordstruct gwarea;
struct sortstruct struct sortstruct
{ {
int year, month, day, sortnum; int year, month, day, sortnum;
char creationdate[MAX_CREATION_DATE]; char creationdate[MAX_CREATION_DATE];
char *dirname; char *dirname;
char date[60]; char date[60];
} **sortlist, *item, **tempsort; } **sortlist, *item, **tempsort;
sprintf(wdir,"%sindex.html",outdir); if (snprintf(wdir,sizeof(wdir),"%s"INDEX_HTML_FILE,outdir)>=sizeof(wdir))
{
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s"INDEX_HTML_FILE,outdir);
exit(EXIT_FAILURE);
}
order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1; order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
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);
} }
nsort=0; nsort=0;
nallocated=0; nallocated=0;
sortlist=NULL; sortlist=NULL;
while ((direntp = readdir( dirp )) != NULL) { while ((direntp = readdir( dirp )) != NULL) {
if (strchr(direntp->d_name,'-') == 0) continue; if (strchr(direntp->d_name,'-') == 0) continue;
if (obtdate(outdir,direntp->d_name,data)<0) { if (obtdate(outdir,direntp->d_name,data)<0) {
debuga(_("The directory \"%s%s\" looks like a report dire ctory but doesn't contain a sarg-date file. You should delete it\n"),outdir,dire ntp->d_name); debuga(__FILE__,__LINE__,_("The directory \"%s%s\" looks like a report directory but doesn't contain a sarg-date file. You should delete it\n"),outdir,direntp->d_name);
continue; continue;
} }
item=malloc(sizeof(*item)); item=malloc(sizeof(*item));
if (!item) { if (!item) {
debuga(_("not enough memory to sort the index\n")); debuga(__FILE__,__LINE__,_("not enough memory to sort the index\n"));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(strcmp(df,"u") == 0) { if (df=='u') {
item->year=atoi(direntp->d_name); item->year=atoi(direntp->d_name);
item->month=conv_month(direntp->d_name+4); item->month=conv_month(direntp->d_name+4);
item->day=atoi(direntp->d_name+7); item->day=atoi(direntp->d_name+7);
} else { } else {
item->year=atoi(direntp->d_name+5); item->year=atoi(direntp->d_name+5);
item->month=conv_month(direntp->d_name+2); item->month=conv_month(direntp->d_name+2);
item->day=atoi(direntp->d_name); item->day=atoi(direntp->d_name);
} }
item->sortnum=(item->year*16+item->month)*32+item->day; item->sortnum=(item->year*16+item->month)*32+item->day;
if (sscanf(data,"%d-%d-%d %d:%d:%d %d",&iyear,&imonth,&iday,&ihou r,&iminute,&isecond,&idst)==7) { if (sscanf(data,"%d-%d-%d %d:%d:%d %d",&iyear,&imonth,&iday,&ihou r,&iminute,&isecond,&idst)==7) {
formatdate(data,sizeof(data),iyear,imonth,iday,ihour,imin ute,isecond,idst); formatdate(data,sizeof(data),iyear,imonth,iday,ihour,imin ute,isecond,idst);
snprintf(item->creationdate,sizeof(item->creationdate),"% 04d%02d%02d%02d%02d%02d",iyear,imonth,iday,ihour,iminute,isecond); snprintf(item->creationdate,sizeof(item->creationdate),"% 04d%02d%02d%02d%02d%02d",iyear,imonth,iday,ihour,iminute,isecond);
} else { } else {
/* /*
Old code to parse a date stored by sarg before 2.2.6.1 in the sarg-date file of each report directory. Old code to parse a date stored by sarg before 2.2.6.1 in the sarg-date file of each report directory.
*/ */
getword_start(&gwarea,data); getword_start(&gwarea,data);
if (getword_skip(16,&gwarea,' ')<0) { if (getword_skip(16,&gwarea,' ')<0) {
debuga(_("Invalid week day in file \"%s%s/sarg-da te\"\n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid date in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) { if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) {
debuga(_("Invalid month in file \"%s%s/sarg-date\ "\n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid date in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) { if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) {
debuga(_("Invalid day in file \"%s%s/sarg-date\"\ n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid date in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) { if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) {
debuga(_("Invalid time in file \"%s%s/sarg-date\" \n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid time in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
do { do {
if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) { if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) {
debuga(_("Invalid year in file \"%s%s/sar g-date\"\n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid date in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} while (year[0] && !isdigit(year[0])); //skip time zone information with spaces until the year is found } while (year[0] && !isdigit(year[0])); //skip time zone information with spaces until the year is found
if (sscanf(hour,"%d:%d:%d",&ihour,&iminute,&isecond)!=3) { if (sscanf(hour,"%d:%d:%d",&ihour,&iminute,&isecond)!=3) {
debuga(_("Invalid time in file \"%s%s/sarg-date\" \n"),outdir,direntp->d_name); debuga(__FILE__,__LINE__,_("Invalid time in file \"%s%s/sarg-date\"\n"),outdir,direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
buildymd(day,mon,year,ftime,sizeof(ftime)); buildymd(day,mon,year,ftime,sizeof(ftime));
snprintf(item->creationdate,sizeof(item->creationdate),"% s%02d%02d%02d",ftime, ihour, iminute, isecond); snprintf(item->creationdate,sizeof(item->creationdate),"% s%02d%02d%02d",ftime, ihour, iminute, isecond);
} }
item->dirname=strdup(direntp->d_name); item->dirname=strdup(direntp->d_name);
if (!item->dirname) { if (!item->dirname) {
debuga(_("Not enough memory to store the directory name \ "%s\" in the index\n"),direntp->d_name); debuga(__FILE__,__LINE__,_("Not enough memory to store th e directory name \"%s\" in the index\n"),direntp->d_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
safe_strcpy(item->date,data,sizeof(item->date)); safe_strcpy(item->date,data,sizeof(item->date));
if (nsort+1>nallocated) { if (nsort+1>nallocated) {
nallocated+=10; nallocated+=10;
tempsort=realloc(sortlist,nallocated*sizeof(*item)); tempsort=realloc(sortlist,nallocated*sizeof(*item));
if (!tempsort) { if (!tempsort) {
debuga(_("not enough memory to sort the index\n") ); debuga(__FILE__,__LINE__,_("not enough memory to sort the index\n"));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
sortlist=tempsort; sortlist=tempsort;
} }
for (i=nsort ; i>0 ; i--) { for (i=nsort ; i>0 ; i--) {
if (item->sortnum>sortlist[i-1]->sortnum) break; if (item->sortnum>sortlist[i-1]->sortnum) break;
if (item->sortnum==sortlist[i-1]->sortnum) { if (item->sortnum==sortlist[i-1]->sortnum) {
if (strcmp(item->creationdate,sortlist[i-1]->crea tiondate)>=0) break; if (strcmp(item->creationdate,sortlist[i-1]->crea tiondate)>=0) break;
} }
sortlist[i]=sortlist[i-1]; sortlist[i]=sortlist[i-1];
} }
sortlist[i]=item; sortlist[i]=item;
nsort++; nsort++;
} }
closedir( dirp ); closedir( dirp );
if((fp_ou=fopen(wdir,"w"))==NULL) { if ((fp_ou=fopen(wdir,"w"))==NULL) {
debugapos("index",_("Cannot open file \"%s\": %s\n"),wdir,strerro debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),wdir,
r(errno)); strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nsort),HT ML_JS_SORTTABLE); write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nsort),HT ML_JS_SORTTABLE);
close_html_header(fp_ou); close_html_header(fp_ou);
fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\"",f p_ou); fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\"",f p_ou);
if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou); if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
fputs(">\n",fp_ou); fputs(">\n",fp_ou);
fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"heade fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"heade
r_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th cla r_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th cla
ss=\"header_l\">%s</th></tr></thead>\n",_("FILE/PERIOD"),_("CREATION DATE"),_("U ss=\"header_l\">%s</th></tr></thead>\n",
SERS"),_("BYTES"),_("AVERAGE")); _("FILE/PERIOD"),_("CREATION DATE"),_("USERS"),_("BYTES")
,_("AVERAGE"));
for (i=0 ; i<nsort ; i++) { for (i=0 ; i<nsort ; i++) {
if (order>0) if (order>0)
item=sortlist[i]; item=sortlist[i];
else else
item=sortlist[nsort-i-1]; item=sortlist[nsort-i-1];
tuser=obtuser(outdir,item->dirname); tuser=obtuser(outdir,item->dirname);
obttotal(outdir,item->dirname,tuser,&tbytes,&media); obttotal(outdir,item->dirname,tuser,&tbytes,&media);
fputs("<tr><td class=\"data2\"",fp_ou); fputs("<tr><td class=\"data2\"",fp_ou);
if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%d\"",i tem->sortnum); if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%d\"",i tem->sortnum);
fprintf(fp_ou,"><a href='%s/%s'>%s</a></td>",item->dirname,Replac eIndex,item->dirname); fprintf(fp_ou,"><a href='%s/%s'>%s</a></td>",item->dirname,Replac eIndex,item->dirname);
skipping to change at line 455 skipping to change at line 807
fprintf(fp_ou,">%s</td>",item->date); fprintf(fp_ou,">%s</td>",item->date);
fprintf(fp_ou,"<td class=\"data\">%d</td>",tuser); fprintf(fp_ou,"<td class=\"data\">%d</td>",tuser);
fputs("<td class=\"data\"",fp_ou); fputs("<td class=\"data\"",fp_ou);
if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId6 4"\"",(int64_t)tbytes); if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId6 4"\"",(int64_t)tbytes);
fprintf(fp_ou,">%s</td>",fixnum(tbytes,1)); fprintf(fp_ou,">%s</td>",fixnum(tbytes,1));
fputs("<td class=\"data\"",fp_ou); fputs("<td class=\"data\"",fp_ou);
if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId6 4"\"",(int64_t)media); if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId6 4"\"",(int64_t)media);
fprintf(fp_ou,">%s</td></tr>\n",fixnum(media,1)); fprintf(fp_ou,">%s</td></tr>\n",fixnum(media,1));
} }
fputs("</table></div>\n",fp_ou); fputs("</table></div>\n",fp_ou);
if (write_html_trailer(fp_ou)<0) write_html_trailer(fp_ou);
debuga(_("Write error in the index %s\n"),wdir);
if (fclose(fp_ou)==EOF) if (fclose(fp_ou)==EOF)
debuga(_("Failed to close file \"%s\": %s\n"),wdir,strerror(errno )); debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),wdir,st rerror(errno));
if (sortlist) { if (sortlist) {
for (i=0 ; i<nsort ; i++) { for (i=0 ; i<nsort ; i++) {
free(sortlist[i]->dirname); free(sortlist[i]->dirname);
free(sortlist[i]); free(sortlist[i]);
} }
free(sortlist); free(sortlist);
} }
} }
static void file_index_to_date_index(const char *entry) static void file_index_to_date_index(const char *entry)
{ {
int y1, y2, m1, m2, d1, d2; int y1, y2, m1, m2, d1, d2;
int i, j; int i, j;
int ndirlen; int ndirlen;
int monthlen; int monthlen;
char sm1[8], sm2[8]; char sm1[8], sm2[8];
char olddir[MAXLEN], newdir[MAXLEN]; char olddir[MAXLEN], newdir[MAXLEN];
if(strlen(entry) < 19) return; if (strlen(entry) < 19) return;
y1=0; y1=0;
y2=0; y2=0;
memset(sm1,0,sizeof(sm1)); memset(sm1,0,sizeof(sm1));
memset(sm2,0,sizeof(sm2)); memset(sm2,0,sizeof(sm2));
d1=0; d1=0;
d2=0; d2=0;
i=0; i=0;
if(strcmp(df,"u") == 0) { if (df=='u') {
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
y1=y1*10+(entry[i++]-'0'); y1=y1*10+(entry[i++]-'0');
if (j!=4) return; if (j!=4) return;
for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++ ) for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++ )
sm1[j]=entry[i++]; sm1[j]=entry[i++];
if (j!=3) return; if (j!=3) return;
sm1[j]='\0'; sm1[j]='\0';
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
d1=d1*10+(entry[i++]-'0'); d1=d1*10+(entry[i++]-'0');
if (j!=2) return; if (j!=2) return;
skipping to change at line 511 skipping to change at line 862
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
y2=y2*10+(entry[i++]-'0'); y2=y2*10+(entry[i++]-'0');
if (j!=4) return; if (j!=4) return;
for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++ ) for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++ )
sm2[j]=entry[i++]; sm2[j]=entry[i++];
if (j!=3) return; if (j!=3) return;
sm2[j]='\0'; sm2[j]='\0';
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
d2=d2*10+(entry[i++]-'0'); d2=d2*10+(entry[i++]-'0');
if (j!=2) return; if (j!=2) return;
} else if(strcmp(df,"e") == 0) { } else if (df=='e') {
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
d1=d1*10+(entry[i++]-'0'); d1=d1*10+(entry[i++]-'0');
if (j!=2) return; if (j!=2) return;
for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++ ) for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++ )
sm1[j]=entry[i++]; sm1[j]=entry[i++];
if (j!=3) return; if (j!=3) return;
sm1[j]='\0'; sm1[j]='\0';
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
y1=y1*10+(entry[i++]-'0'); y1=y1*10+(entry[i++]-'0');
if (j!=4) return; if (j!=4) return;
skipping to change at line 540 skipping to change at line 891
if (j!=3) return; if (j!=3) return;
sm2[j]='\0'; sm2[j]='\0';
for (j=0 ; entry[i] && isdigit(entry[i]) ; j++) for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
y2=y2*10+(entry[i++]-'0'); y2=y2*10+(entry[i++]-'0');
if (j!=4) return; if (j!=4) return;
} else } else
return; return;
m1=conv_month(sm1); m1=conv_month(sm1);
m2=conv_month(sm2); m2=conv_month(sm2);
ndirlen=sprintf(newdir,"%s%04d",outdir,y1); ndirlen=snprintf(newdir,sizeof(newdir),"%s%04d",outdir,y1);
if (ndirlen>=sizeof(newdir)) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%04d",outdir,y1);
exit(EXIT_FAILURE);
}
if (access(newdir, R_OK) != 0) { if (access(newdir, R_OK) != 0) {
if (mkdir(newdir,0755)) { if (PortableMkDir(newdir,0755)) {
debuga(_("Cannot create directory \"%s\": %s\n"),newdir,s debuga(__FILE__,__LINE__,_("Cannot create directory \"%s\
trerror(errno)); ": %s\n"),newdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
if(m1 != m2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",m1,m2); if (m1 != m2) ndirlen+=snprintf(newdir+ndirlen,sizeof(newdir)-ndirlen,"/%
else ndirlen+=sprintf(newdir+ndirlen,"/%02d",m1); 02d-%02d",m1,m2);
else ndirlen+=snprintf(newdir+ndirlen,sizeof(newdir)-ndirlen,"/%02d",m1);
if (ndirlen>=sizeof(newdir)) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s",newdir);
exit(EXIT_FAILURE);
}
if (access(newdir, R_OK) != 0) { if (access(newdir, R_OK) != 0) {
if (mkdir(newdir,0755)) { if (PortableMkDir(newdir,0755)) {
debuga(_("Cannot create directory \"%s\": %s\n"),newdir,s debuga(__FILE__,__LINE__,_("Cannot create directory \"%s\
trerror(errno)); ": %s\n"),newdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
monthlen=ndirlen; monthlen=ndirlen;
if(d1!=d2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",d1,d2); if (d1!=d2) ndirlen+=snprintf(newdir+ndirlen,sizeof(newdir)-ndirlen,"/%02
else ndirlen+=sprintf(newdir+ndirlen,"/%02d",d1); d-%02d",d1,d2);
else ndirlen+=snprintf(newdir+ndirlen,sizeof(newdir)-ndirlen,"/%02d",d1);
if (ndirlen>=sizeof(newdir)) {
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s",newdir);
exit(EXIT_FAILURE);
}
sprintf(olddir,"%s%s",outdir,entry); if (snprintf(olddir,sizeof(olddir),"%s%s",outdir,entry)>=sizeof(olddir))
{
debuga(__FILE__,__LINE__,_("Path too long: "));
debuga_more("%s%s",outdir,entry);
exit(EXIT_FAILURE);
}
if (rename(olddir,newdir)) { if (rename(olddir,newdir)) {
debugapos("index",_("Failed to rename \"%s\" into \"%s\": %s\n"), olddir,newdir,strerror(errno)); debuga(__FILE__,__LINE__,_("Error renaming \"%s\" to \"%s\": %s\n "),olddir,newdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
strcpy(newdir+monthlen,"/images"); strcpy(newdir+monthlen,"/images");
if(access(newdir, R_OK) != 0) { if (access(newdir, R_OK) != 0) {
#ifdef HAVE_SYMLINK #ifdef HAVE_SYMLINK
char linkdir[MAXLEN]; char linkdir[MAXLEN];
sprintf(linkdir,"%simages",outdir); format_path(__FILE__, __LINE__, linkdir, sizeof(linkdir), "%simag es", outdir);
if (symlink(linkdir,newdir)) { if (symlink(linkdir,newdir)) {
debuga(_("Failed to create link \"%s\" to \"%s\": %s\n"), linkdir,newdir,strerror(errno)); debuga(__FILE__,__LINE__,_("Failed to create link \"%s\" to \"%s\": %s\n"),linkdir,newdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#else #else
char cmd[MAXLEN]; char cmd[MAXLEN];
int cstatus; int cstatus;
sprintf(cmd,"ln -s \"%simages\" \"%s/images\"",outdir,newdir); sprintf(cmd,"ln -s \"%simages\" \"%s/images\"",outdir,newdir);
cstatus=system(cmd); cstatus=system(cmd);
if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
debuga(_("command return status %d\n"),WEXITSTATUS(cstatu debuga(__FILE__,__LINE__,_("command return status %d\n"),
s)); WEXITSTATUS(cstatus));
debuga(_("command: %s\n"),cmd); debuga(__FILE__,__LINE__,_("command: %s\n"),cmd);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#endif #endif
} }
} }
static void date_index_to_file_index(const char *entry) static void date_index_to_file_index(const char *entry)
{ {
int y1, next; int y1, next;
int m1, m2; int m1, m2;
skipping to change at line 605 skipping to change at line 975
int val1len; int val1len;
int i, j; int i, j;
char val1[MAXLEN]; char val1[MAXLEN];
const char *sm1, *sm2; const char *sm1, *sm2;
char *str; char *str;
char newdir[MAXLEN], olddir[MAXLEN]; char newdir[MAXLEN], olddir[MAXLEN];
DIR *dirp2, *dirp3; DIR *dirp2, *dirp3;
struct dirent *direntp2; struct dirent *direntp2;
struct dirent *direntp3; struct dirent *direntp3;
if(strlen(entry) != 4) return; if (strlen(entry) != 4) return;
next=-1; next=-1;
if (sscanf(entry,"%d%n",&y1,&next)!=1 || next<0 || entry[next]) return; if (sscanf(entry,"%d%n",&y1,&next)!=1 || next<0 || entry[next]) return;
val1len=snprintf(val1,sizeof(val1),"%s%s",outdir,entry); val1len=snprintf(val1,sizeof(val1),"%s%s",outdir,entry);
dirp2 = opendir(val1); dirp2 = opendir(val1);
if (!dirp2) return; if (!dirp2) return;
while ((direntp2 = readdir( dirp2 )) != NULL) { while ((direntp2 = readdir( dirp2 )) != NULL) {
if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1]) ) continue; if (!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1] )) continue;
i=0; i=0;
str=direntp2->d_name; str=direntp2->d_name;
m1=0; m1=0;
for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++) for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
m1=(m1*10)+(str[i++]-'0'); m1=(m1*10)+(str[i++]-'0');
if (j>=2) continue; if (j>=2) continue;
sm1=conv_month_name(m1); sm1=conv_month_name(m1);
if (str[i]=='-') { if (str[i]=='-') {
i++; i++;
m2=0; m2=0;
skipping to change at line 639 skipping to change at line 1009
} else if (!str[i]) { } else if (!str[i]) {
sm2=sm1; sm2=sm1;
} else { } else {
continue; continue;
} }
sprintf(val1+val1len,"/%s",direntp2->d_name); sprintf(val1+val1len,"/%s",direntp2->d_name);
dirp3 = opendir(val1); dirp3 = opendir(val1);
if (!dirp3) continue; if (!dirp3) continue;
while ((direntp3 = readdir( dirp3 )) != NULL) { while ((direntp3 = readdir( dirp3 )) != NULL) {
if(!isdigit(direntp3->d_name[0]) || !isdigit(direntp3->d_ name[1])) continue; if (!isdigit(direntp3->d_name[0]) || !isdigit(direntp3->d _name[1])) continue;
i=0; i=0;
str=direntp3->d_name; str=direntp3->d_name;
d1=0; d1=0;
for (j=0 ; str[i] && isdigit(str[i]) ; j++) for (j=0 ; str[i] && isdigit(str[i]) ; j++)
d1=d1*10+(str[i++]-'0'); d1=d1*10+(str[i++]-'0');
if (j!=2) continue; if (j!=2) continue;
if (str[i]=='-') { if (str[i]=='-') {
i++; i++;
d2=0; d2=0;
for (j=0 ; str[i] && isdigit(str[i]) ; j++) for (j=0 ; str[i] && isdigit(str[i]) ; j++)
d2=d2*10+(str[i++]-'0'); d2=d2*10+(str[i++]-'0');
if (j!=2) continue; if (j!=2) continue;
} else if (!str[i]) { } else if (!str[i]) {
d2=d1; d2=d1;
} else { } else {
continue; continue;
} }
if(strcmp(df,"u") == 0) sprintf(newdir,"%s%04d%s%02d-%04d if (df=='u') {
%s%02d",outdir,y1,sm1,d1,y1,sm2,d2); format_path(__FILE__, __LINE__, newdir, sizeof(ne
else if(strcmp(df,"e") == 0) sprintf(newdir,"%s%02d%s%04d wdir), "%s%04d%s%02d-%04d%s%02d", outdir, y1, sm1, d1, y1, sm2, d2);
-%02d%s%04d",outdir,d1,sm1,y1,d2,sm2,y1); } else if (df=='e') {
else continue; format_path(__FILE__, __LINE__, newdir, sizeof(ne
sprintf(olddir,"%s%04d/%s/%s",outdir,y1,direntp2->d_name, wdir), "%s%02d%s%04d-%02d%s%04d", outdir, d1, sm1, y1, d2, sm2, y1);
direntp3->d_name); } else {
if(rename(olddir,newdir)) { continue;
debugapos("index",_("Failed to rename \"%s\" into }
\"%s\": %s\n"),olddir,newdir,strerror(errno)); format_path(__FILE__, __LINE__, olddir, sizeof(olddir), "
%s%04d/%s/%s", outdir, y1, direntp2->d_name, direntp3->d_name);
if (rename(olddir,newdir)) {
debuga(__FILE__,__LINE__,_("Error renaming \"%s\"
to \"%s\": %s\n"),olddir,newdir,strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
closedir( dirp3 ); closedir(dirp3);
} }
closedir( dirp2 ); closedir(dirp2);
/*! /*!
\bug The links to the images in the reports are broken after moving the d irectories \bug The links to the images in the reports are broken after moving the d irectories
as the the HTML files are not at the right level for the images any more. as the the HTML files are not at the right level for the images any more.
*/ */
} }
 End of changes. 62 change blocks. 
258 lines changed or deleted 668 lines changed or added

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