From: Frédéric Marchal Date: Sun, 3 Jan 2010 18:27:14 +0000 (+0000) Subject: Index created using an internal sort algorithm instead of a system call X-Git-Tag: v2_2_7~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b25b96fe17a2c79bb7a4072de1eb4a5eceabbd95;p=thirdparty%2Fsarg.git Index created using an internal sort algorithm instead of a system call --- diff --git a/CMakeLists.txt b/CMakeLists.txt index ada1bbd..afac3fc 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ PROJECT(sarg C) SET(sarg_VERSION 2) SET(sarg_REVISION 2) SET(sarg_BUILD "7rc1") -SET(sarg_BUILDDATE "Dec-27-2009") +SET(sarg_BUILDDATE "Jan-03-2010") INCLUDE(AddFileDependencies) INCLUDE(CheckIncludeFile) diff --git a/ChangeLog b/ChangeLog index 1cc87aa..0ad3ad4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ SARG ChangeLog -Dec-31-2009 Version 2.2.7 +Jan-01-2010 Version 2.2.7 - Extra compile and run time protection (FORTIFY_SOURCE) fixed in configure. - Use tabulations as columns separator in intermediary files to avoid problems when a field of the log contains a space. - Input log file type detection partly rewritten to clearly distinguish which type is processed where. @@ -16,6 +16,7 @@ Dec-31-2009 Version 2.2.7 - Protect the creation of the index against invalid directories. - Only copy the files when creating the directory with the images to link the reports to. - Directories deleted without using the rm system command. + - Index created using an internal sort algorithm instead of a system call. Dec-31-2009 Version 2.2.6.1 - Remove unnecessary dependency on off_t. diff --git a/documentation/index.txt b/documentation/index.txt index 783b0c7..176b3a3 100644 --- a/documentation/index.txt +++ b/documentation/index.txt @@ -13,6 +13,25 @@ Create the main HTML index of the available reports. +/*! \fn static void make_date_index(void) +Create an index with the reports sorted hierarchicaly by date. A first level lists +the year. The second level lists the months (possibly a range) and the third level +lists the days or day ranges. +*/ + + + + + +/*! \fn static void make_file_index(void) +Create an index with the reports sorted by directory name. There is only one level +which is the name of the directory containing the report. +*/ + + + + + /*! \fn static void file_index_to_date_index(const char *entry) Convert a report from the file tree into a report for a date tree. diff --git a/include/conf.h b/include/conf.h index 9ec03fc..416a77e 100755 --- a/include/conf.h +++ b/include/conf.h @@ -162,7 +162,6 @@ char href2[MAXLEN]; char href3[MAXLEN]; char df[20]; char day[3], month[4], year[5]; -char nmonth[30]; char ltext110[50]; char cdfrom[30]; char cduntil[30]; diff --git a/include/info.h b/include/info.h index fe1969c..e894c49 100755 --- a/include/info.h +++ b/include/info.h @@ -1,3 +1,3 @@ -#define VERSION PACKAGE_VERSION" Dec-27-2009" +#define VERSION PACKAGE_VERSION" Jan-03-2010" #define PGM PACKAGE_NAME #define URL "http://sarg.sourceforge.net" diff --git a/index.c b/index.c index 6b5d34f..ffd57c5 100644 --- a/index.c +++ b/index.c @@ -1,6 +1,6 @@ /* * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com - * 1998, 2008 + * 1998, 2010 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net * * SARG donations: @@ -26,44 +26,21 @@ #include "include/conf.h" #include "include/defs.h" +static void make_date_index(void); +static void make_file_index(void); static void file_index_to_date_index(const char *entry); static void date_index_to_file_index(const char *entry); void make_index(void) { - FILE *fp_ou, *fp_ou2, *fp_ou3, *fp_tmp, *fp_tmp2, *fp_tmp3; - DIR *dirp, *dirp2, *dirp3; + DIR *dirp; struct dirent *direntp; - struct dirent *direntp2; - struct dirent *direntp3; - char html[MAXLEN]; char wdir[MAXLEN]; - char wdir_tmp[MAXLEN]; - char wdir_tmp2[MAXLEN]; - char wdir_tmp3[MAXLEN]; - char newname[512]; - char month[4]; - char period[80]; - char data[80]; - char tuser[20]; - char tbytes[20]; - char media[20]; - char ftime[128]; - char day[16], mon[16], year[40], hour[10]; - char *str; - char tmp2[MAXLEN]; - int cstatus; - int iyear, imonth, iday, ihour, iminute, isecond, idst; - struct getwordstruct gwarea; if(LastLog[0] != '\0') mklastlog(outdir); - sprintf(wdir,"%sindex.html",outdir); - sprintf(wdir_tmp,"%sindex.unsort",outdir); - sprintf(wdir_tmp2,"%sindex.sort",outdir); - strcpy(hbc1,"class=\"header\""); - if(strcmp(Index,"no") == 0) { + sprintf(wdir,"%sindex.html",outdir); if(access(wdir, R_OK) == 0) unlink(wdir); return; } @@ -81,266 +58,349 @@ void make_index(void) } } - if((fp_tmp=fopen(wdir_tmp,"w"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp); - exit(1); + if(strcmp(IndexTree,"date") == 0) { + make_date_index(); + } else { + make_file_index(); } +} - rewinddir(dirp); +static void make_date_index(void) +{ + FILE *fp_ou, *fp_ou2, *fp_ou3; + DIR *dirp, *dirp2, *dirp3; + struct dirent *direntp; + struct dirent *direntp2; + struct dirent *direntp3; + char hbc1[30]; + char yearindex[MAXLEN]; + char yeardir[MAXLEN]; + 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]; + int yearsort[150]; + int nyears; + int year; + int monthsort[144]; + int nmonths; + int m1, m2, month; + int daysort[31*31]; + int ndays; + int d1, d2, day; + int i, y, m, d; + int order; + + sprintf(yearindex,"%sindex.html",outdir); + strcpy(hbc1,"class=\"header\""); + + nyears=0; + dirp = opendir(outdir); while ((direntp = readdir( dirp )) != NULL) { - if(strcmp(IndexTree,"date") == 0) { - if(strlen(direntp->d_name) > 4 || !isdigit(direntp->d_name[0]) || !isdigit(direntp->d_name[1]) || - !isdigit(direntp->d_name[2]) || !isdigit(direntp->d_name[3])) continue; - fprintf(fp_tmp,"%s\t%s\n",direntp->d_name,get_size(outdir,direntp->d_name)); - } else { - if(strchr(direntp->d_name,'-') == 0) continue; - bzero(newname, sizeof(newname)); - if(strcmp(df,"u") == 0) { - strncat(newname,direntp->d_name,4); - strncpy(month,direntp->d_name+4,3); - } else { - strncat(newname,direntp->d_name+5,4); - strncpy(month,direntp->d_name+2,3); + if(strlen(direntp->d_name) > 4 || !isdigit(direntp->d_name[0]) || !isdigit(direntp->d_name[1]) || + !isdigit(direntp->d_name[2]) || !isdigit(direntp->d_name[3])) continue; + year=atoi(direntp->d_name); + if (nyears>=sizeof(yearsort)/sizeof(yearsort[0])) { + /* + 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 sarg but this safety is added to prevent + a crash should the directory be polluted by other entries. + */ + if (year>yearsort[0]) { + for (i=1 ; iyearsort[i] ; i++) + yearsort[i-1]=yearsort[i]; + yearsort[i-1]=year; } - month[3]='\0'; - conv_month(month); - strcat(newname,month); - if(strcmp(df,"u") == 0) strncat(newname,direntp->d_name+7,2); - else strncat(newname,direntp->d_name,2); - obtdate(outdir,direntp->d_name,data); - obtuser(outdir,direntp->d_name,tuser); - obttotal(outdir,direntp->d_name,tbytes,tuser,media); - if (sscanf(data,"%d-%d-%d %d:%d:%d %d",&iyear,&imonth,&iday,&ihour,&iminute,&isecond,&idst)==7) { - formatdate(data,sizeof(data),iyear,imonth,iday,ihour,iminute,isecond,idst); - fprintf(fp_tmp,"%04d%02d%02d%02d%02d%02d;%s;%s;%s;%s;%s;%s\n",iyear,imonth,iday,ihour,iminute,isecond, direntp->d_name, data, tuser, tbytes, media,newname); - } else { - /* - 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); - if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) { - printf("SARG: Maybe you have a broken week day in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) { - printf("SARG: Maybe you have a broken month in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) { - printf("SARG: Maybe you have a broken day in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) { - printf("SARG: Maybe you have a broken time in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - do { - if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) { - printf("SARG: Maybe you have a broken year in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - } while (year[0] && !isdigit(year[0])); //skip time zone information with spaces until the year is found - strcpy(html,hour); - if (sscanf(hour,"%d:%d:%d",&ihour,&iminute,&isecond)!=3) { - printf("SARG: Maybe you have a broken time in your %s%s/sarg-date file.\n",outdir,direntp->d_name); - exit(1); - } - buildymd(day,mon,year,ftime); - fprintf(fp_tmp,"%s%02d%02d%02d;%s;%s;%s;%s;%s;%s\n",ftime, ihour, iminute, isecond, direntp->d_name, data, tuser, tbytes, media,newname); + } else { + for (i=nyears ; i>0 && year%s%s\n",hbc1,text[130],hbc1,text[132]); - while(fgets(wwork1,sizeof(wwork1),fp_tmp)!=NULL) { - getword_start(&gwarea,wwork1); - if (getword(tmp4,sizeof(tmp4),&gwarea,'\t')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); - exit(1); - } - fprintf(fp_ou,"%s%s\n",tmp4,tmp4,gwarea.current); - sprintf(tmp2,"%s%s",outdir,tmp4); - sprintf(tmp3,"%s%s/index.unsort",outdir,tmp4); - // Year dir - if((fp_ou2=fopen(tmp3,"w"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp3); - exit(1); - } - dirp2 = opendir(tmp2); - while ((direntp2 = readdir( dirp2 )) != NULL) { - if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1])) continue; - fprintf(fp_ou2,"%s\n",direntp2->d_name); + order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1; + + if((fp_ou=fopen(yearindex,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s - %s\n",text[45],yearindex,strerror(errno)); + exit(1); + } + write_html_header(fp_ou, "."); + fprintf(fp_ou,"%s%s\n",hbc1,text[130],hbc1,text[132]); + for (y=0 ; y0) + year=yearsort[y]; + else + year=yearsort[nyears-1-y]; + sprintf(yearnum,"%04d",year); + fprintf(fp_ou,"%s%s\n",yearnum,yearnum,get_size(outdir,yearnum)); + sprintf(yeardir,"%s%s",outdir,yearnum); + // Year dir + nmonths=0; + dirp2 = opendir(yeardir); + 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 || m212) continue; + } else if (direntp2->d_name[i]!='\0') { + continue; + } else { + m2=0; } - if(fp_ou2) fclose(fp_ou2); - (void)closedir(dirp2); - sprintf(wdir_tmp3,"%s%s/index.sort",outdir,tmp4); - if(strcmp(IndexSortOrder,"A") == 0) sprintf(csort,"sort -n \"%s\" -o \"%s\"", tmp3, wdir_tmp3); - else sprintf(csort,"sort -n -r \"%s\" -o \"%s\"", tmp3, wdir_tmp3); - cstatus=system(csort); - if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus)); - fprintf(stderr, "SARG: sort command: %s\n",csort); - exit(1); + if (nmonths>=sizeof(monthsort)/sizeof(monthsort[0])) { + fprintf(stderr,"SARG: Too many month directories in %s\nSupernumerary entries are ignored\n",yeardir); + break; } - unlink(tmp3); - if((fp_tmp2=fopen(wdir_tmp3,"r"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp3); - exit(1); + month=m1*16+m2; + for (i=nmonths ; i>0 && month%s/%s\n",hbc1,text[130],text[131]); + for (m=0 ; m0) + 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)); } - write_html_header(fp_ou2,".."); - fprintf(fp_ou2,"%s/%s\n",hbc1,text[130],text[131]); - while(fgets(wwork1,sizeof(wwork1),fp_tmp2)!=NULL) { - fixendofline(wwork1); - strcpy(tmp5,wwork1); - if((str = strchr(tmp5,'-')) != 0) { - *str++ = '\0'; - strcpy(tmp6,str); - name_month(tmp5,sizeof(tmp5)); - name_month(tmp6,sizeof(tmp6)); - sprintf(nmonth,"%s-%s",tmp5,tmp6); + fprintf(fp_ou2,"%s %s\n",monthnum,yearnum,nmonth); + + sprintf(monthdir,"%s/%s",yeardir,monthnum); + // month dir + ndays=0; + dirp3 = opendir(monthdir); + while ((direntp3 = readdir( dirp3 )) != NULL) { + if(!isdigit(direntp3->d_name[0]) && !isdigit(direntp3->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 || d231) continue; + } else if (direntp3->d_name[i]!='\0') { + continue; } else { - strcpy(nmonth,tmp5); - name_month(nmonth,sizeof(nmonth)); - } - fprintf(fp_ou2,"%s %s\n",wwork1,tmp4,nmonth); - - sprintf(val1,"%s%s/%s",outdir,tmp4,wwork1); - sprintf(tmp5,"%s%s/%s/index.unsort",outdir,tmp4,wwork1); - if((fp_ou3=fopen(tmp5,"w"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp5); - exit(1); - } - // month dir - dirp3 = opendir(val1); - while ((direntp3 = readdir( dirp3 )) != NULL) { - if(!isdigit(direntp3->d_name[0]) && !isdigit(direntp3->d_name[1])) continue; - fprintf(fp_ou3,"%s\n",direntp3->d_name); - } - if(fp_ou3) fclose(fp_ou3); - (void)rewinddir(dirp3); - (void)closedir(dirp3); - unlink(wdir_tmp3); - sprintf(tmp6,"%s%s/%s/index.sort",outdir,tmp4,wwork1); - if(strcmp(IndexSortOrder,"A") == 0) sprintf(csort,"sort -n \"%s\" -o \"%s\"", tmp5, tmp6); - else sprintf(csort,"sort -n -r \"%s\" -o \"%s\"", tmp5, tmp6); - cstatus=system(csort); - if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus)); - fprintf(stderr, "SARG: sort command: %s\n",csort); - exit(1); + d2=0; } - unlink(tmp5); - sprintf(val2,"%s%s/%s/index.html",outdir,tmp4,wwork1); - sprintf(val3,"%s/%s",tmp4,wwork1); - unlink(val2); - if((fp_ou3=fopen(val2,"w"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],val2); - exit(1); + if (ndays>=sizeof(daysort)/sizeof(daysort[0])) { + fprintf(stderr,"SARG: Too many day directories in %s\nSupernumerary entries are ignored\n",monthdir); + break; } - if((fp_tmp3=fopen(tmp6,"r"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],tmp6); - exit(1); + day=d1*32+d2; + for (i=ndays ; i>0 && day%s/%s/%s\n",hbc1,text[130],text[131],text[127]); - while(fgets(warea,sizeof(warea),fp_tmp3)!=NULL) { - warea[strlen(warea)-1]='\0'; - fprintf(fp_ou3,"%s %s %s\n",warea,tmp4,nmonth,warea); + daysort[i]=day; + ndays++; + } + (void)closedir(dirp3); + sprintf(dayindex,"%s/index.html",monthdir); + if((fp_ou3=fopen(dayindex,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s - %s\n",text[45],dayindex,strerror(errno)); + exit(1); + } + write_html_header(fp_ou3,"../.."); + fprintf(fp_ou3,"%s/%s/%s\n",hbc1,text[130],text[131],text[127]); + for (d=0 ; d0) + 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); } - if(fp_tmp3) fclose(fp_tmp3); - write_html_trailer(fp_ou3); - if(fp_ou3) fclose(fp_ou3); - unlink(tmp6); + fprintf(fp_ou3,"%s %s %s\n",daynum,yearnum,nmonth,daynum); } - write_html_trailer(fp_ou2); - if(fp_ou2) fclose(fp_ou2); - } - if(fp_tmp) fclose(fp_tmp); - unlink(tmp6); - unlink(wdir_tmp2); - } else { - if(strcmp(IndexSortOrder,"A") == 0) sprintf(warea,"sort -t\";\" -k 7,7 -k 1,1 \"%s\" -o \"%s\"", wdir_tmp, wdir_tmp2); - else sprintf(warea,"sort -r -t\";\" -k 7,7 -k 1,1 \"%s\" -o \"%s\"", wdir_tmp, wdir_tmp2); - cstatus=system(warea); - if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus)); - fprintf(stderr, "SARG: sort command: %s\n",warea); - exit(1); + write_html_trailer(fp_ou3); + fclose(fp_ou3); } - if((fp_tmp2=fopen(wdir_tmp2,"r"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp2); - fprintf(stderr, "SARG: sort command: %s\n",warea); + write_html_trailer(fp_ou2); + fclose(fp_ou2); + } + + write_html_trailer(fp_ou); + fclose(fp_ou); +} + +static void make_file_index(void) +{ + #define MAX_CREATION_DATE 15 + #define MAX_DIR_NAME 30 + FILE *fp_ou; + DIR *dirp; + struct dirent *direntp; + char wdir[MAXLEN]; + char month[4]; + char data[80]; + char tuser[20]; + char tbytes[20]; + char media[20]; + char ftime[128]; + char day[6], mon[8], year[40], hour[10]; + int iyear, imonth, iday, ihour, iminute, isecond, idst; + int nsort; + int nallocated; + int order; + int i; + int cmp; + struct getwordstruct gwarea; + struct sortstruct + { + char sortname[9]; + char creationdate[MAX_CREATION_DATE]; + char dirname[MAX_DIR_NAME]; + char date[60]; + } **sortlist, *item, **tempsort; + + sprintf(wdir,"%sindex.html",outdir); + strcpy(hbc1,"class=\"header\""); + + order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1; + + dirp = opendir(outdir); + + nsort=0; + nallocated=0; + sortlist=NULL; + while ((direntp = readdir( dirp )) != NULL) { + if (strchr(direntp->d_name,'-') == 0) continue; + if (strlen(direntp->d_name)>MAX_DIR_NAME) continue; + item=malloc(sizeof(*item)); + if (!item) { + fprintf(stderr,"SARG: not enough memory to sort the index\n"); exit(1); } - unlink(wdir_tmp); - if((fp_ou=fopen(wdir,"w"))==NULL) { - fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); - exit(1); + if(strcmp(df,"u") == 0) { + strncpy(item->sortname,direntp->d_name,4); + strncpy(month,direntp->d_name+4,3); + } else { + strncpy(item->sortname,direntp->d_name+5,4); + strncpy(month,direntp->d_name+2,3); } - write_html_header(fp_ou,"."); - fprintf(fp_ou,"%s%s%s%s%s\n",hbc1,text[101],hbc1,text[102],hbc1,text[103],hbc1,text[93],hbc1,text[96]); - while(fgets(buf,sizeof(buf),fp_tmp2)!=NULL) { - getword_start(&gwarea,buf); - if (getword_multisep(period,sizeof(period),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + item->sortname[4]='\0'; + month[3]='\0'; + conv_month(month); + strcat(item->sortname,month); + if(strcmp(df,"u") == 0) strncat(item->sortname,direntp->d_name+7,2); + else strncat(item->sortname,direntp->d_name,2); + obtdate(outdir,direntp->d_name,data); + if (sscanf(data,"%d-%d-%d %d:%d:%d %d",&iyear,&imonth,&iday,&ihour,&iminute,&isecond,&idst)==7) { + formatdate(data,sizeof(data),iyear,imonth,iday,ihour,iminute,isecond,idst); + snprintf(item->creationdate,sizeof(item->creationdate),"%04d%02d%02d%02d%02d%02d",iyear,imonth,iday,ihour,iminute,isecond); + } else { + /* + 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); + if (getword_skip(16,&gwarea,' ')<0) { + printf("SARG: Maybe you have a broken week day in your %s%s/sarg-date file.\n",outdir,direntp->d_name); exit(1); } - if (getword_multisep(period,sizeof(period),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) { + printf("SARG: Maybe you have a broken month in your %s%s/sarg-date file.\n",outdir,direntp->d_name); exit(1); } - if (getword_multisep(data,sizeof(data),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) { + printf("SARG: Maybe you have a broken day in your %s%s/sarg-date file.\n",outdir,direntp->d_name); exit(1); } - if (getword_multisep(tuser,sizeof(tuser),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) { + printf("SARG: Maybe you have a broken time in your %s%s/sarg-date file.\n",outdir,direntp->d_name); exit(1); } - if (getword_multisep(tbytes,sizeof(tbytes),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + do { + if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) { + printf("SARG: Maybe you have a broken year in your %s%s/sarg-date file.\n",outdir,direntp->d_name); + exit(1); + } + } 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) { + printf("SARG: Maybe you have a broken time in your %s%s/sarg-date file.\n",outdir,direntp->d_name); exit(1); } - if (getword_multisep(media,sizeof(media),&gwarea,';')<0) { - printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wdir_tmp2); + buildymd(day,mon,year,ftime); + snprintf(item->creationdate,sizeof(item->creationdate),"%s%02d%02d%02d",ftime, ihour, iminute, isecond); + } + strcpy(item->dirname,direntp->d_name); + strncpy(item->date,data,sizeof(item->date)); + if (nsort+1>nallocated) { + nallocated+=10; + tempsort=realloc(sortlist,nallocated*sizeof(*item)); + if (!tempsort) { + fprintf(stderr,"SARG: not enough memory to sort the index\n"); exit(1); } - fprintf(fp_ou,"%s%s%s%s%s\n",period,ReplaceIndex,period,data,tuser,tbytes,media); + sortlist=tempsort; + } + for (i=nsort ; i>0 ; i--) { + cmp=strcmp(item->sortname,sortlist[i-1]->sortname); + if (cmp==0) cmp=strcmp(item->creationdate,sortlist[i-1]->creationdate); + if (cmp>=0) { + break; + } + sortlist[i]=sortlist[i-1]; } - if(fp_tmp2) fclose(fp_tmp2); - unlink(wdir_tmp2); + sortlist[i]=item; + nsort++; } + (void)closedir( dirp ); + + if((fp_ou=fopen(wdir,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); + exit(1); + } + write_html_header(fp_ou,"."); + fprintf(fp_ou,"%s%s%s%s%s\n",hbc1,text[101],hbc1,text[102],hbc1,text[103],hbc1,text[93],hbc1,text[96]); + for (i=0 ; i0) + item=sortlist[i]; + else + item=sortlist[nsort-i-1]; + obtuser(outdir,item->dirname,tuser); + obttotal(outdir,item->dirname,tbytes,tuser,media); + fprintf(fp_ou,"%s%s%s%s%s\n",item->dirname,ReplaceIndex,item->dirname,item->date,tuser,tbytes,media); + } write_html_trailer(fp_ou); - if(fp_ou) fclose(fp_ou); + fclose(fp_ou); + + if (sortlist) { + for (i=0 ; i