]> git.ipfire.org Git - thirdparty/sarg.git/commitdiff
Reindent code with tabs instead of space
authorFrédéric Marchal <fmarchal@users.sourceforge.net>
Tue, 21 Dec 2010 20:22:24 +0000 (20:22 +0000)
committerFrédéric Marchal <fmarchal@users.sourceforge.net>
Tue, 21 Dec 2010 20:22:24 +0000 (20:22 +0000)
This is useless except for me as I use tabs with other projects and
have to reconfigure my editor each time I switch to sarg.

41 files changed:
auth.c
authfail.c
btree_cache.c
charset.c
convlog.c
css.c
dansguardian_log.c
dansguardian_report.c
datafile.c
decomp.c
denied.c
download.c
email.c
exclude.c
getconf.c
grepday.c
html.c
index.c
indexonly.c
ip2name.c
lastlog.c
log.c
longline.c
realtime.c
repday.c
report.c
siteuser.c
smartfilter.c
sort.c
splitlog.c
squidguard_log.c
squidguard_report.c
topsites.c
topuser.c
totday.c
totger.c
usage.c
useragent.c
userinfo.c
usertab.c
util.c

diff --git a/auth.c b/auth.c
index 5a5481415ff159caf1efafb24961e385a63e16c4..42cbe454757f5088306e1366ea5dcc605e3cd73e 100644 (file)
--- a/auth.c
+++ b/auth.c
 
 void htaccess(const struct userinfostruct *uinfo)
 {
-   char htname[MAXLEN];
-   char line[MAXLEN];
-   FILE *fp_in;
-   FILE *fp_auth;
-   size_t i,nread;
+       char htname[MAXLEN];
+       char line[MAXLEN];
+       FILE *fp_in;
+       FILE *fp_auth;
+       size_t i,nread;
 
-   if(!UserAuthentication)
-      return;
+       if(!UserAuthentication)
+               return;
 
-   if (snprintf(htname,sizeof(htname),"%s/%s/.htaccess",outdirname,uinfo->filename)>=sizeof(htname)) {
-      debuga(_("File name too long: %s/%s/.htaccess\n"),outdirname,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_auth=fopen(htname,"w"))==NULL) {
-      debuga(_("(auth) Cannot open file: %s - %s\n"),htname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if (snprintf(htname,sizeof(htname),"%s/%s/.htaccess",outdirname,uinfo->filename)>=sizeof(htname)) {
+               debuga(_("File name too long: %s/%s/.htaccess\n"),outdirname,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_auth=fopen(htname,"w"))==NULL) {
+               debuga(_("(auth) Cannot open file: %s - %s\n"),htname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((fp_in=fopen(AuthUserTemplateFile,"r"))==NULL) {
-      debuga(_("(auth) Cannot open template file: %s - %s\n"),AuthUserTemplateFile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if ((fp_in=fopen(AuthUserTemplateFile,"r"))==NULL) {
+               debuga(_("(auth) Cannot open template file: %s - %s\n"),AuthUserTemplateFile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   while((nread=fread(line,1,sizeof(line),fp_in))!=0) {
-      for (i=0 ; i<nread ; i++)
-         if (line[i]=='%' && i+2<nread && line[i+1]=='u' && !isalpha(line[i+2])) {
-            fputs(uinfo->id,fp_auth);
-            i++;
-         } else {
-            fputc(line[i],fp_auth);
-      }
-   }
-   fclose(fp_auth);
-   fclose(fp_in);
+       while((nread=fread(line,1,sizeof(line),fp_in))!=0) {
+               for (i=0 ; i<nread ; i++)
+                       if (line[i]=='%' && i+2<nread && line[i+1]=='u' && !isalpha(line[i+2])) {
+                               fputs(uinfo->id,fp_auth);
+                               i++;
+                       } else {
+                               fputc(line[i],fp_auth);
+               }
+       }
+       fclose(fp_auth);
+       fclose(fp_in);
 
-   return;
+       return;
 }
index be634698003061b12dde3e584c2a914748feeddd..875053c7bf2f45057b35ae8fce7c5faf28007f3e 100644 (file)
 
 void authfail_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL;
-
-   char *buf;
-   char *url;
-   char authfail_in[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char ouser2[MAXLEN];
-   char data[15];
-   char hora[15];
-   char tmp4[MAXLEN];
-   char csort[MAXLEN];
-   int  z=0;
-   int  count=0;
-   int  cstatus;
-   int day,month,year;
-   bool new_user;
-   struct getwordstruct gwarea;
-   longline line;
-   struct userinfostruct *uinfo;
-   struct tm t;
-
-   if(DataFile[0] != '\0') return;
-
-   ouser[0]='\0';
-   ouser2[0]='\0';
-   oip[0]='\0';
-
-   snprintf(tmp4,sizeof(tmp4),"%s/authfail.log.unsort",tmp);
-
-   if(authfail_count == 0) {
-      unlink(tmp4);
-      return;
-   }
-
-   snprintf(authfail_in,sizeof(authfail_in),"%s/authfail.log",tmp);
-   snprintf(report,sizeof(report),"%s/authfail.html",outdirname);
-
-   snprintf(csort,sizeof(csort),"sort -b -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"", tmp, authfail_in, tmp4);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=MY_FOPEN(authfail_in,"r"))==NULL) {
-      debuga(_("(authfail) Cannot open file %s\n"),authfail_in);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   unlink(tmp4);
-
-   if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
-     debuga(_("(authfail) Cannot open file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Authentication Failures"),HTML_JS_NONE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Authentication Failures"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),authfail_in);
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,'\t')<0) {
-         debuga(_("There is a broken date in file %s\n"),authfail_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
-         debuga(_("There is a broken time in file %s\n"),authfail_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("There is a broken user ID in file %s\n"),authfail_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("There is a broken IP address in file %s\n"),authfail_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("There is a broken url in file %s\n"),authfail_in);
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
-      computedate(year,month,day,&t);
-      strftime(data,sizeof(data),"%x",&t);
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,authfail_in);
-         exit(EXIT_FAILURE);
-      }
-
-      new_user=false;
-      if(z == 0) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         z++;
-         new_user=true;
-      } else {
-         if(strcmp(ouser,user) != 0) {
-            strcpy(ouser,user);
-            new_user=true;
-         }
-         if(strcmp(oip,ip) != 0) {
-            strcpy(oip,ip);
-            new_user=true;
-         }
-      }
-
-     if(AuthfailReportLimit>0) {
-        if(strcmp(ouser2,uinfo->label) == 0) {
-            count++;
-         } else {
-            count=1;
-            strcpy(ouser2,uinfo->label);
-         }
-         if(count >= AuthfailReportLimit)
-            continue;
-      }
-
-      fputs("<tr>",fp_ou);
-      if (new_user)
-         fprintf(fp_ou,"<td class=\"data2\">%s</td><td class=\"data2\">%s</td>",uinfo->label,ip);
-      else
-         fputs("<td class=\"data2\"></td><td class=\"data2\"></td>",fp_ou);
-      fprintf(fp_ou,"<td class=\"data2\">%s-%s</td><td class=\"data2\">",data,hora);
-      if(BlockIt[0]!='\0') {
-         fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
-         output_html_url(fp_ou,url);
-         fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
-      }
-      fputs("<a href=\"",fp_ou);
-      output_html_url(fp_ou,url);
-      fputs("\">",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fputs("</a></td></th>\n",fp_ou);
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   unlink(authfail_in);
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char *buf;
+       char *url;
+       char authfail_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char ouser2[MAXLEN];
+       char data[15];
+       char hora[15];
+       char tmp4[MAXLEN];
+       char csort[MAXLEN];
+       int  z=0;
+       int  count=0;
+       int  cstatus;
+       int day,month,year;
+       bool new_user;
+       struct getwordstruct gwarea;
+       longline line;
+       struct userinfostruct *uinfo;
+       struct tm t;
+
+       if(DataFile[0] != '\0') return;
+
+       ouser[0]='\0';
+       ouser2[0]='\0';
+       oip[0]='\0';
+
+       snprintf(tmp4,sizeof(tmp4),"%s/authfail.log.unsort",tmp);
+
+       if(authfail_count == 0) {
+               unlink(tmp4);
+               return;
+       }
+
+       snprintf(authfail_in,sizeof(authfail_in),"%s/authfail.log",tmp);
+       snprintf(report,sizeof(report),"%s/authfail.html",outdirname);
+
+       snprintf(csort,sizeof(csort),"sort -b -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"", tmp, authfail_in, tmp4);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=MY_FOPEN(authfail_in,"r"))==NULL) {
+               debuga(_("(authfail) Cannot open file %s\n"),authfail_in);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       unlink(tmp4);
+
+       if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
+       debuga(_("(authfail) Cannot open file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Authentication Failures"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Authentication Failures"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),authfail_in);
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken date in file %s\n"),authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken time in file %s\n"),authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken user ID in file %s\n"),authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken IP address in file %s\n"),authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken url in file %s\n"),authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
+               computedate(year,month,day,&t);
+               strftime(data,sizeof(data),"%x",&t);
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,authfail_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               new_user=false;
+               if(z == 0) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       z++;
+                       new_user=true;
+               } else {
+                       if(strcmp(ouser,user) != 0) {
+                               strcpy(ouser,user);
+                               new_user=true;
+                       }
+                       if(strcmp(oip,ip) != 0) {
+                               strcpy(oip,ip);
+                               new_user=true;
+                       }
+               }
+
+       if(AuthfailReportLimit>0) {
+               if(strcmp(ouser2,uinfo->label) == 0) {
+                               count++;
+                       } else {
+                               count=1;
+                               strcpy(ouser2,uinfo->label);
+                       }
+                       if(count >= AuthfailReportLimit)
+                               continue;
+               }
+
+               fputs("<tr>",fp_ou);
+               if (new_user)
+                       fprintf(fp_ou,"<td class=\"data2\">%s</td><td class=\"data2\">%s</td>",uinfo->label,ip);
+               else
+                       fputs("<td class=\"data2\"></td><td class=\"data2\"></td>",fp_ou);
+               fprintf(fp_ou,"<td class=\"data2\">%s-%s</td><td class=\"data2\">",data,hora);
+               if(BlockIt[0]!='\0') {
+                       fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
+                       output_html_url(fp_ou,url);
+                       fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
+               }
+               fputs("<a href=\"",fp_ou);
+               output_html_url(fp_ou,url);
+               fputs("\">",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fputs("</a></td></th>\n",fp_ou);
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       unlink(authfail_in);
+
+       return;
 }
index 6eb11f794e720f25400867dbb469d45d76df1be8..5cd15c692e6b8865f094353e874e9cb8bc31b258 100644 (file)
@@ -33,9 +33,9 @@
 #define AVL_DOUBLE_LEFT_ROTATION  4
 
 struct bt {
-           char value[64], targetattr[256];
-           struct bt *left, *right;
-           int balanceinfo;
+       char value[64], targetattr[256];
+       struct bt *left, *right;
+       int balanceinfo;
 };
 
 struct bt *root_bt = NULL;
@@ -223,7 +223,6 @@ void rotate_left(struct bt *node)
                        if (parent->right == tmp)
                                parent->right = node;
        }
-
 }
 
 int get_disbalance_type(struct bt *node)
@@ -295,9 +294,7 @@ void init_cache(void)
 
 int insert_to_cache(const char *key, const char *value)
 {
-
        struct bt *root = NULL;
-
        char  strict_chars[] = " ~!@^&(){}|<>?:;\"\'\\[]`,\r\n\0", *strict_chars_ptr;
 
        strict_chars_ptr = strict_chars;
@@ -317,7 +314,6 @@ int insert_to_cache(const char *key, const char *value)
        }
        else
                return 1;
-
 }
 
 char *search_in_cache(const char *key)
index 7c0f44ba7554bbd2eb4af370942708fc8629fcee..ddd92cdfdf2f96123ab89d22a99745642418cf58 100644 (file)
--- a/charset.c
+++ b/charset.c
 
 void ccharset(char *CharSet)
 {
-   if(strcmp(CharSet,"Latin2") == 0) strcpy(CharSet,"ISO-8859-2");
-   else if(strcmp(CharSet,"Latin3") == 0) strcpy(CharSet,"ISO-8859-3");
-   else if(strcmp(CharSet,"Latin4") == 0) strcpy(CharSet,"ISO-8859-4");
-   else if(strcmp(CharSet,"Cyrillic") == 0) strcpy(CharSet,"ISO-8859-5");
-   else if(strcmp(CharSet,"Arabic") == 0) strcpy(CharSet,"ISO-8859-6");
-   else if(strcmp(CharSet,"Greek") == 0) strcpy(CharSet,"ISO-8859-7");
-   else if(strcmp(CharSet,"Hebrew") == 0) strcpy(CharSet,"ISO-8859-8");
-   else if(strcmp(CharSet,"Latin5") == 0) strcpy(CharSet,"ISO-8859-9");
-   else if(strcmp(CharSet,"Latin6") == 0) strcpy(CharSet,"ISO-8859-10");
-   else if(strcmp(CharSet,"Windows-1251") == 0) strcpy(CharSet,"Windows-1251");
-   else if(strcmp(CharSet,"Japan") == 0) strcpy(CharSet,"EUC-JP");
-   else if(strcmp(CharSet,"Koi8-r") == 0) strcpy(CharSet,"KOI8-R");
-   else if(strcmp(CharSet,"UTF-8") == 0) strcpy(CharSet,"UTF-8");
-   return;
+       if(strcmp(CharSet,"Latin2") == 0) strcpy(CharSet,"ISO-8859-2");
+       else if(strcmp(CharSet,"Latin3") == 0) strcpy(CharSet,"ISO-8859-3");
+       else if(strcmp(CharSet,"Latin4") == 0) strcpy(CharSet,"ISO-8859-4");
+       else if(strcmp(CharSet,"Cyrillic") == 0) strcpy(CharSet,"ISO-8859-5");
+       else if(strcmp(CharSet,"Arabic") == 0) strcpy(CharSet,"ISO-8859-6");
+       else if(strcmp(CharSet,"Greek") == 0) strcpy(CharSet,"ISO-8859-7");
+       else if(strcmp(CharSet,"Hebrew") == 0) strcpy(CharSet,"ISO-8859-8");
+       else if(strcmp(CharSet,"Latin5") == 0) strcpy(CharSet,"ISO-8859-9");
+       else if(strcmp(CharSet,"Latin6") == 0) strcpy(CharSet,"ISO-8859-10");
+       else if(strcmp(CharSet,"Windows-1251") == 0) strcpy(CharSet,"Windows-1251");
+       else if(strcmp(CharSet,"Japan") == 0) strcpy(CharSet,"EUC-JP");
+       else if(strcmp(CharSet,"Koi8-r") == 0) strcpy(CharSet,"KOI8-R");
+       else if(strcmp(CharSet,"UTF-8") == 0) strcpy(CharSet,"UTF-8");
+       return;
 }
index 28e1189c297a80c53c200cab05f34a71726cfbc3..512414c9841be33983479d2526805372cb5a6349 100644 (file)
--- a/convlog.c
+++ b/convlog.c
 
 void convlog(const char *arq, char *df, int dfrom, int duntil)
 {
-   FILE *fp_in;
-   char *buf;
-   char data[30];
-   char dia[11];
-   time_t tt;
-   int idata=0;
-   struct tm *t;
-   struct getwordstruct gwarea;
-   longline line;
+       FILE *fp_in;
+       char *buf;
+       char data[30];
+       char dia[11];
+       time_t tt;
+       int idata=0;
+       struct tm *t;
+       struct getwordstruct gwarea;
+       longline line;
 
-   if(arq[0] == '\0')
-      arq="/var/log/squid/access.log";
+       if(arq[0] == '\0')
+               arq="/var/log/squid/access.log";
 
-   if((fp_in=MY_FOPEN(arq,"r"))==NULL) {
-      debuga(_("(convlog) Cannot open log file %s - %s\n"),arq,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if((fp_in=MY_FOPEN(arq,"r"))==NULL) {
+               debuga(_("(convlog) Cannot open log file %s - %s\n"),arq,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the log file %s\n"),arq);
-      exit(EXIT_FAILURE);
-   }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the log file %s\n"),arq);
+               exit(EXIT_FAILURE);
+       }
 
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,' ')<0) {
-         debuga(_("Maybe you have a broken record or garbage in file %s\n"),arq);
-         exit(EXIT_FAILURE);
-      }
-      tt=atoi(data);
-      t=localtime(&tt);
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,' ')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in file %s\n"),arq);
+                       exit(EXIT_FAILURE);
+               }
+               tt=atoi(data);
+               t=localtime(&tt);
 
-      if(dfrom) {
-         idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
-         if(idata < dfrom || idata > duntil)
-            continue;
-      }
+               if(dfrom) {
+                       idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
+                       if(idata < dfrom || idata > duntil)
+                               continue;
+               }
 
-      if(df[0]=='e')
-         strftime(dia, sizeof(dia), "%d/%m/%Y", t);
-       else
-         strftime(dia, sizeof(dia), "%m/%d/%Y", t);
+               if(df[0]=='e')
+                       strftime(dia, sizeof(dia), "%d/%m/%Y", t);
+               else
+                       strftime(dia, sizeof(dia), "%m/%d/%Y", t);
 
-      printf("%s %02d:%02d:%02d %s\n",dia,t->tm_hour,t->tm_min,t->tm_sec,gwarea.current);
-   }
+               printf("%s %02d:%02d:%02d %s\n",dia,t->tm_hour,t->tm_min,t->tm_sec,gwarea.current);
+       }
 
-   longline_destroy(&line);
-   if (fclose(fp_in)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),arq,strerror(errno));
-   }
+       longline_destroy(&line);
+       if (fclose(fp_in)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),arq,strerror(errno));
+       }
 }
diff --git a/css.c b/css.c
index c6e368a2457dc0110c3c24980a96ef2022ad3565..90b94cd39dac1fdb4ce281c65d381359d971a86a 100644 (file)
--- a/css.c
+++ b/css.c
 
 void css_content(FILE *fp_css)
 {
-   fprintf(fp_css,".logo {font-family:Verdana,Tahoma,Arial;font-size:11px;color:%s;text-align:center;vertical-align:middle;border:none;padding:0px;margin-bottom:5px;}\n",LogoTextColor);
-   fprintf(fp_css,".logo th {padding:0px;}\n");
-   fprintf(fp_css,".logo img {vertical-align:middle;padding:0px;border:0px none;}\n");
-   fprintf(fp_css,".body {font-family:%s;font-size:%s;color:%s;background-color:%s;background-image:url(%s);}\n",FontFace,TitleFontSize,TxColor,BgColor,BgImage);
-   fprintf(fp_css,".info {font-family:%s;font-size:10px;text-align:center;margin-top:1em;margin-bottom:1em;}\n", FontFace);
-   fprintf(fp_css,".info a:link,a:visited {font-family:%s;color:#0000FF;font-size:10px;text-decoration:none;}\n", FontFace);
+       fprintf(fp_css,".logo {font-family:Verdana,Tahoma,Arial;font-size:11px;color:%s;text-align:center;vertical-align:middle;border:none;padding:0px;margin-bottom:5px;}\n",LogoTextColor);
+       fprintf(fp_css,".logo th {padding:0px;}\n");
+       fprintf(fp_css,".logo img {vertical-align:middle;padding:0px;border:0px none;}\n");
+       fprintf(fp_css,".body {font-family:%s;font-size:%s;color:%s;background-color:%s;background-image:url(%s);}\n",FontFace,TitleFontSize,TxColor,BgColor,BgImage);
+       fprintf(fp_css,".info {font-family:%s;font-size:10px;text-align:center;margin-top:1em;margin-bottom:1em;}\n", FontFace);
+       fprintf(fp_css,".info a:link,a:visited {font-family:%s;color:#0000FF;font-size:10px;text-decoration:none;}\n", FontFace);
 
-   fprintf(fp_css,".title {width:100%%;text-align:center;margin-bottom:1em;}\n");
-   fprintf(fp_css,"div.title > table {margin:auto;}\n");
-   fprintf(fp_css,".title_c {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:center;}\n",FontFace,TitleFontSize,TiColor,BgColor);
-   fprintf(fp_css,".title_l {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:left;}\n",FontFace,TitleFontSize,TiColor,BgColor);
-   fprintf(fp_css,".title_r {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:right;}\n",FontFace,TitleFontSize,TiColor,BgColor);
+       fprintf(fp_css,".title {width:100%%;text-align:center;margin-bottom:1em;}\n");
+       fprintf(fp_css,"div.title > table {margin:auto;}\n");
+       fprintf(fp_css,".title_c {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:center;}\n",FontFace,TitleFontSize,TiColor,BgColor);
+       fprintf(fp_css,".title_l {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:left;}\n",FontFace,TitleFontSize,TiColor,BgColor);
+       fprintf(fp_css,".title_r {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:right;}\n",FontFace,TitleFontSize,TiColor,BgColor);
 
-   fprintf(fp_css,".index {width:100%%;text-align:center;}\n");
-   fprintf(fp_css,"div.index > table {margin:auto;}\n");
-   fprintf(fp_css,".report {width:100%%;text-align:center;}\n");
-   fprintf(fp_css,"div.report > table {margin:auto;}\n");
+       fprintf(fp_css,".index {width:100%%;text-align:center;}\n");
+       fprintf(fp_css,"div.index > table {margin:auto;}\n");
+       fprintf(fp_css,".report {width:100%%;text-align:center;}\n");
+       fprintf(fp_css,"div.report > table {margin:auto;}\n");
 
-   fprintf(fp_css,".header_l {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:left;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
-   fprintf(fp_css,".header_r {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:right;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
-   fprintf(fp_css,".header_c {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:center;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
+       fprintf(fp_css,".header_l {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:left;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
+       fprintf(fp_css,".header_r {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:right;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
+       fprintf(fp_css,".header_c {font-family:%s;font-size:%s;color:%s;background-color:%s;text-align:center;border-right:1px solid #666666;border-bottom:1px solid #666666;}\n",FontFace,HeaderFontSize,HeaderColor,HeaderBgColor);
 
-   fprintf(fp_css,".data {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
-   fprintf(fp_css,".data a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;background-color:%s;text-align:right;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
+       fprintf(fp_css,".data {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
+       fprintf(fp_css,".data a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;background-color:%s;text-align:right;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
 
-   fprintf(fp_css,".data2 {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:left;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
-   fprintf(fp_css,".data2 a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;text-align:left;background-color:%s;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
+       fprintf(fp_css,".data2 {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:left;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
+       fprintf(fp_css,".data2 a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;text-align:left;background-color:%s;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
 
-   fprintf(fp_css,".data3 {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:center;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
-   fprintf(fp_css,".data3 a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;text-align:center;background-color:%s;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
+       fprintf(fp_css,".data3 {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:center;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;}\n", FontFace, TxColor, FontSize, TxBgColor);
+       fprintf(fp_css,".data3 a:link,a:visited {font-family:%s;color:#0000FF;font-size:%s;text-align:center;background-color:%s;text-decoration:none;}\n", FontFace, FontSize, TxBgColor);
 
-   fprintf(fp_css,".text {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:right;}\n", FontFace, TxColor, FontSize, TxBgColor);
+       fprintf(fp_css,".text {font-family:%s;color:%s;font-size:%s;background-color:%s;text-align:right;}\n", FontFace, TxColor, FontSize, TxBgColor);
 
-   fprintf(fp_css,".link {font-family:%s;font-size:%s;color:#0000FF;}\n", FontFace, FontSize);
-   fprintf(fp_css,".link a:link,a:visited {font-family:%s;font-size:%s;color:#0000FF;text-decoration:none;}\n", FontFace, FontSize);
+       fprintf(fp_css,".link {font-family:%s;font-size:%s;color:#0000FF;}\n", FontFace, FontSize);
+       fprintf(fp_css,".link a:link,a:visited {font-family:%s;font-size:%s;color:#0000FF;text-decoration:none;}\n", FontFace, FontSize);
 
-   fprintf(fp_css,"a > img {border:none;}\n");
+       fprintf(fp_css,"a > img {border:none;}\n");
 
-   if (SortTableJs[0]) {
-      fprintf(fp_css,".sorttable_nosort {cursor:default !important;}\n");
-      fprintf(fp_css,".sortable thead th {cursor:pointer;}\n");
-   }
+       if (SortTableJs[0]) {
+               fprintf(fp_css,".sorttable_nosort {cursor:default !important;}\n");
+               fprintf(fp_css,".sortable thead th {cursor:pointer;}\n");
+       }
 }
 
 void css(FILE *fp_css)
 {
-   if(ExternalCSSFile[0] != '\0') {
-      fprintf(fp_css,"<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n",ExternalCSSFile);
-      return;
-   }
+       if(ExternalCSSFile[0] != '\0') {
+               fprintf(fp_css,"<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n",ExternalCSSFile);
+               return;
+       }
 
-   fprintf(fp_css,"<style type=\"text/css\">\n");
-   css_content(fp_css);
-   fputs("</style>\n",fp_css);
+       fprintf(fp_css,"<style type=\"text/css\">\n");
+       css_content(fp_css);
+       fputs("</style>\n",fp_css);
 }
index c6d081b1c7d0d8563fe59bf83ded782832c373d6..5fa1cca5d62d74ce252e7ad0685f7f456776e87a 100644 (file)
 
 void dansguardian_log(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL, *fp_guard = NULL;
-   char buf[MAXLEN];
-   char guard_in[MAXLEN];
-   char guard_ou[MAXLEN];
-   char loglocation[MAXLEN] = "/var/log/dansguardian/access.log";
-   char year[10], mon[10], day[10];
-   char hour[15];
-   char user[MAXLEN], code1[255], code2[255];
-   char ip[30];
-   char wdata[127];
-   char *url;
-   char tmp6[MAXLEN];
-   int  idata=0;
-   int cstatus;
-   int dfrom, duntil;
-   struct getwordstruct gwarea;
-
-   dfrom=(period.start.tm_year+1900)*10000+(period.start.tm_mon+1)*100+period.start.tm_mday;
-   duntil=(period.end.tm_year+1900)*10000+(period.end.tm_mon+1)*100+period.end.tm_mday;
-
-   snprintf(guard_in,sizeof(guard_in),"%s/dansguardian.unsort",tmp);
-   snprintf(guard_ou,sizeof(guard_ou),"%s/dansguardian.log",tmp);
-
-   if(access(DansGuardianConf, R_OK) != 0) {
-      debuga(_("Cannot open DansGuardian config file: %s\n"),DansGuardianConf);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_guard=fopen(DansGuardianConf,"r"))==NULL) {
-      debuga(_("(dansguardian) Cannot open log file: %s\n"),DansGuardianConf);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(guard_in,"a"))==NULL) {
-      debuga(_("(dansguardian) Cannot open log file: %s\n"),guard_in);
-      exit(EXIT_FAILURE);
-   }
-
-   while(fgets(buf,sizeof(buf),fp_guard)!=NULL) {
-      fixendofline(buf);
-      if(buf[0]=='#')
-         continue;
-      if(strstr(buf,"loglocation ") != 0) {
-         getword_start(&gwarea,buf);
-         if (getword_skip(MAXLEN,&gwarea,'\'')<0 || getword(loglocation,sizeof(loglocation),&gwarea,'\'')<0) {
-            debuga(_("Maybe you have a broken record or garbage in your %s file\n"),DansGuardianConf);
-            exit(EXIT_FAILURE);
-         }
-         break;
-      }
-   }
-
-   if(debug)
-      debuga(_("Reading DansGuardian log file: %s\n"),loglocation);
-
-   if((fp_in=MY_FOPEN(loglocation,"r"))==NULL) {
-      debuga(_("(dansguardian) Cannot open log file: %s\n"),loglocation);
-      exit(EXIT_FAILURE);
-   }
-
-   while(fgets(buf,sizeof(buf),fp_in) != NULL) {
-      if(strstr(buf," *DENIED* ") == 0)
-         continue;
-      getword_start(&gwarea,buf);
-      if (getword(year,sizeof(year),&gwarea,'.')<0 || getword(mon,sizeof(mon),&gwarea,'.')<0 ||
-          getword(day,sizeof(day),&gwarea,' ')<0 || getword(hour,sizeof(hour),&gwarea,' ')<0 ||
-          getword(user,sizeof(user),&gwarea,' ')<0 || getword(ip,sizeof(ip),&gwarea,' ')<0 ||
-          getword_skip(MAXLEN,&gwarea,'/')<0 || getword_skip(MAXLEN,&gwarea,'/')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),loglocation);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,' ')<0) {
-         debuga(_("Maybe you have a broken url in your %s file\n"),loglocation);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_skip(255,&gwarea,' ')<0 ||
-          getword(code1,sizeof(code1),&gwarea,' ')<0 || getword(code2,sizeof(code2),&gwarea,' ')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),loglocation);
-         exit(EXIT_FAILURE);
-      }
-      sprintf(wdata,"%s%02d%s",year,atoi(mon),day);
-      idata = atoi(wdata);
-
-      if(DansguardianFilterOutDate) {
-         if(idata < dfrom && idata > duntil)
-            continue;
-      }
-
-      if (strcmp(user,"-") == 0) {
-         strcpy(user,ip);
-         bzero(ip, 30);
-      }
-      fprintf(fp_ou,"%s\t%d\t%s\t%s\t%s\t%s\t%s\n",user,idata,hour,ip,url,code1,code2);
-      dansguardian_count++;
-   }
-
-   if(fp_in) fclose(fp_in);
-   if(fp_guard) fclose(fp_guard);
-   if(fp_ou) fclose(fp_ou);
-
-   if(debug)
-      debuga(_("Sorting file: %s\n"),guard_ou);
-
-   snprintf(tmp6,sizeof(tmp6),"sort -k 1,1 -k 2,2 -k 4,4 \"%s\" -o \"%s\"",guard_in, guard_ou);
-   cstatus=system(tmp6);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),tmp6);
-      exit(EXIT_FAILURE);
-   }
-   unlink(guard_in);
+       FILE *fp_in = NULL, *fp_ou = NULL, *fp_guard = NULL;
+       char buf[MAXLEN];
+       char guard_in[MAXLEN];
+       char guard_ou[MAXLEN];
+       char loglocation[MAXLEN] = "/var/log/dansguardian/access.log";
+       char year[10], mon[10], day[10];
+       char hour[15];
+       char user[MAXLEN], code1[255], code2[255];
+       char ip[30];
+       char wdata[127];
+       char *url;
+       char tmp6[MAXLEN];
+       int  idata=0;
+       int cstatus;
+       int dfrom, duntil;
+       struct getwordstruct gwarea;
+
+       dfrom=(period.start.tm_year+1900)*10000+(period.start.tm_mon+1)*100+period.start.tm_mday;
+       duntil=(period.end.tm_year+1900)*10000+(period.end.tm_mon+1)*100+period.end.tm_mday;
+
+       snprintf(guard_in,sizeof(guard_in),"%s/dansguardian.unsort",tmp);
+       snprintf(guard_ou,sizeof(guard_ou),"%s/dansguardian.log",tmp);
+
+       if(access(DansGuardianConf, R_OK) != 0) {
+               debuga(_("Cannot open DansGuardian config file: %s\n"),DansGuardianConf);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_guard=fopen(DansGuardianConf,"r"))==NULL) {
+               debuga(_("(dansguardian) Cannot open log file: %s\n"),DansGuardianConf);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(guard_in,"a"))==NULL) {
+               debuga(_("(dansguardian) Cannot open log file: %s\n"),guard_in);
+               exit(EXIT_FAILURE);
+       }
+
+       while(fgets(buf,sizeof(buf),fp_guard)!=NULL) {
+               fixendofline(buf);
+               if(buf[0]=='#')
+                       continue;
+               if(strstr(buf,"loglocation ") != 0) {
+                       getword_start(&gwarea,buf);
+                       if (getword_skip(MAXLEN,&gwarea,'\'')<0 || getword(loglocation,sizeof(loglocation),&gwarea,'\'')<0) {
+                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),DansGuardianConf);
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               }
+       }
+
+       if(debug)
+               debuga(_("Reading DansGuardian log file: %s\n"),loglocation);
+
+       if((fp_in=MY_FOPEN(loglocation,"r"))==NULL) {
+               debuga(_("(dansguardian) Cannot open log file: %s\n"),loglocation);
+               exit(EXIT_FAILURE);
+       }
+
+       while(fgets(buf,sizeof(buf),fp_in) != NULL) {
+               if(strstr(buf," *DENIED* ") == 0)
+                       continue;
+               getword_start(&gwarea,buf);
+               if (getword(year,sizeof(year),&gwarea,'.')<0 || getword(mon,sizeof(mon),&gwarea,'.')<0 ||
+                       getword(day,sizeof(day),&gwarea,' ')<0 || getword(hour,sizeof(hour),&gwarea,' ')<0 ||
+                       getword(user,sizeof(user),&gwarea,' ')<0 || getword(ip,sizeof(ip),&gwarea,' ')<0 ||
+                       getword_skip(MAXLEN,&gwarea,'/')<0 || getword_skip(MAXLEN,&gwarea,'/')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),loglocation);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,' ')<0) {
+                       debuga(_("Maybe you have a broken url in your %s file\n"),loglocation);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_skip(255,&gwarea,' ')<0 ||
+                       getword(code1,sizeof(code1),&gwarea,' ')<0 || getword(code2,sizeof(code2),&gwarea,' ')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),loglocation);
+                       exit(EXIT_FAILURE);
+               }
+               sprintf(wdata,"%s%02d%s",year,atoi(mon),day);
+               idata = atoi(wdata);
+
+               if(DansguardianFilterOutDate) {
+                       if(idata < dfrom && idata > duntil)
+                               continue;
+               }
+
+               if (strcmp(user,"-") == 0) {
+                       strcpy(user,ip);
+                       bzero(ip, 30);
+               }
+               fprintf(fp_ou,"%s\t%d\t%s\t%s\t%s\t%s\t%s\n",user,idata,hour,ip,url,code1,code2);
+               dansguardian_count++;
+       }
+
+       if(fp_in) fclose(fp_in);
+       if(fp_guard) fclose(fp_guard);
+       if(fp_ou) fclose(fp_ou);
+
+       if(debug)
+               debuga(_("Sorting file: %s\n"),guard_ou);
+
+       snprintf(tmp6,sizeof(tmp6),"sort -k 1,1 -k 2,2 -k 4,4 \"%s\" -o \"%s\"",guard_in, guard_ou);
+       cstatus=system(tmp6);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),tmp6);
+               exit(EXIT_FAILURE);
+       }
+       unlink(guard_in);
 }
index e1e3b3f196eb6335e561a3c04cf67e3be77f9862..122769edaa589ed56014e6d6a4c357046102505b 100644 (file)
 
 void dansguardian_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL;
-
-   char buf[MAXLEN];
-   char *url;
-   char dansguardian_in[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char rule[255];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char date[15];
-   char date2[15];
-   char hour[15];
-   char ouser2[255];
-   int  z=0;
-   int  count=0;
-   struct getwordstruct gwarea;
-
-   ouser[0]='\0';
-
-   snprintf(dansguardian_in,sizeof(dansguardian_in),"%s/dansguardian.log",tmp);
-   if(!dansguardian_count) {
-      unlink(dansguardian_in);
-      return;
-   }
-
-   sprintf(report,"%s/dansguardian.html",outdirname);
-
-   if((fp_in=MY_FOPEN(dansguardian_in,"r"))==NULL) {
-     debuga(_("(dansguardian_report) Cannot open log file %s\n"),dansguardian_in);
-     exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
-     debuga(_("(dansguardian_report) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("DansGuardian"),HTML_JS_NONE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("DansGuardian"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"),_("CAUSE"));
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(date2,sizeof(date2),&gwarea,'\t')<0 ||
-          getword(hour,sizeof(hour),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),dansguardian_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken url in your %s file\n"),dansguardian_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(rule,sizeof(rule),&gwarea,'\n')<0) {
-         debuga(_("Maybe you have a broken rule in your %s file\n"),dansguardian_in);
-         exit(EXIT_FAILURE);
-      }
-
-      if(UserIp)
-           strcpy(user,ip);
-
-      bzero(date, 15);
-      if(strncmp(df,"u",1) != 0) {
-         strncpy(date,date2+6,2);
-         strcat(date,"/");
-         strncat(date,date2+4,2);
-         strcat(date,"/");
-         strncat(date,date2,4);
-      } else {
-         strncpy(date,date2+4,2);
-         strcat(date,"/");
-         strncat(date,date2+6,2);
-         strcat(date,"/");
-         strncat(date,date2,4);
-      }
-
-      if(Ip2Name)
-         ip2name(ip,sizeof(ip));
-
-      if(!z) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         z++;
-      } else {
-         if(strcmp(ouser,user) == 0)
-            user[0]='\0';
-         if(user[0] != '\0')
-            strcpy(ouser,user);
-         if(strcmp(oip,ip) == 0)
-            ip[0]='\0';
-         if(ip[0] != '\0')
-            strcpy(oip,ip);
-      }
-
-      user_find(name, sizeof(name), user);
-
-     if(DansGuardianReportLimit) {
-         if(strcmp(ouser2,name) == 0) {
-            count++;
-         } else {
-            count=1;
-            strcpy(ouser2,name);
-         }
-         if(count >= DansGuardianReportLimit)
-            continue;
-      }
-
-      fprintf(fp_ou,"<tr><td class=\"data2\">%s</td><td class=\"data2\">%s</td><td class=\"data2\">%s-%s</td><td class=\"data2\"><a href=\"http://",name,ip,date,hour);
-      output_html_url(fp_ou,url);
-      fputs("\">",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fprintf(fp_ou,"</a></td><td class=\"data2\">%s</td></tr>\n",rule);
-   }
-   fclose(fp_in);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   unlink(dansguardian_in);
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char buf[MAXLEN];
+       char *url;
+       char dansguardian_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char rule[255];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char date[15];
+       char date2[15];
+       char hour[15];
+       char ouser2[255];
+       int  z=0;
+       int  count=0;
+       struct getwordstruct gwarea;
+
+       ouser[0]='\0';
+
+       snprintf(dansguardian_in,sizeof(dansguardian_in),"%s/dansguardian.log",tmp);
+       if(!dansguardian_count) {
+               unlink(dansguardian_in);
+               return;
+       }
+
+       sprintf(report,"%s/dansguardian.html",outdirname);
+
+       if((fp_in=MY_FOPEN(dansguardian_in,"r"))==NULL) {
+       debuga(_("(dansguardian_report) Cannot open log file %s\n"),dansguardian_in);
+       exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
+       debuga(_("(dansguardian_report) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("DansGuardian"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("DansGuardian"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"),_("CAUSE"));
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(date2,sizeof(date2),&gwarea,'\t')<0 ||
+                       getword(hour,sizeof(hour),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken url in your %s file\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(rule,sizeof(rule),&gwarea,'\n')<0) {
+                       debuga(_("Maybe you have a broken rule in your %s file\n"),dansguardian_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(UserIp)
+                       strcpy(user,ip);
+
+               bzero(date, 15);
+               if(strncmp(df,"u",1) != 0) {
+                       strncpy(date,date2+6,2);
+                       strcat(date,"/");
+                       strncat(date,date2+4,2);
+                       strcat(date,"/");
+                       strncat(date,date2,4);
+               } else {
+                       strncpy(date,date2+4,2);
+                       strcat(date,"/");
+                       strncat(date,date2+6,2);
+                       strcat(date,"/");
+                       strncat(date,date2,4);
+               }
+
+               if(Ip2Name)
+                       ip2name(ip,sizeof(ip));
+
+               if(!z) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       z++;
+               } else {
+                       if(strcmp(ouser,user) == 0)
+                               user[0]='\0';
+                       if(user[0] != '\0')
+                               strcpy(ouser,user);
+                       if(strcmp(oip,ip) == 0)
+                               ip[0]='\0';
+                       if(ip[0] != '\0')
+                               strcpy(oip,ip);
+               }
+
+               user_find(name, sizeof(name), user);
+
+       if(DansGuardianReportLimit) {
+                       if(strcmp(ouser2,name) == 0) {
+                               count++;
+                       } else {
+                               count=1;
+                               strcpy(ouser2,name);
+                       }
+                       if(count >= DansGuardianReportLimit)
+                               continue;
+               }
+
+               fprintf(fp_ou,"<tr><td class=\"data2\">%s</td><td class=\"data2\">%s</td><td class=\"data2\">%s-%s</td><td class=\"data2\"><a href=\"http://",name,ip,date,hour);
+               output_html_url(fp_ou,url);
+               fputs("\">",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fprintf(fp_ou,"</a></td><td class=\"data2\">%s</td></tr>\n",rule);
+       }
+       fclose(fp_in);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       unlink(dansguardian_in);
+
+       return;
 }
index 8bab494a2a0d62f63e4139a95783329cca036062..485f2030d9865643797a082ea4ed6d6b7b8be427 100644 (file)
@@ -31,242 +31,241 @@ void saverecs(FILE *fp_ou, const struct userinfostruct *uinfo, long long int nac
 
 void data_file(char *tmp)
 {
+       FILE *fp_in, *fp_ou=NULL;
 
-   FILE *fp_in, *fp_ou=NULL;
+       char *buf;
+       char accdia[11], acchora[9], accip[MAXLEN], *accurl;
+       char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
+       char *oldurl;
+       char olduser[MAXLEN], acccode[50], oldacccode[50];
+       char ipantes[MAXLEN], nameantes[MAXLEN];
+       char accsmart[MAXLEN];
+       char crc2[50];
+       char *str;
+       char tmp3[MAXLEN];
+       char user[MAX_USER_LEN];
+       char u2[MAX_USER_LEN];
+       DIR *dirp;
+       struct dirent *direntp;
+       long long int nbytes=0;
+       long long int nelap=0;
+       long long int nacc=0;
+       int rtotal=0;
+       long long int incache=0;
+       long long int oucache=0;
+       long long int accbytes;
+       long long int accelap;
+       int dlen;
+       int new_user;
+       int same_url;
+       int url_len;
+       int ourl_size;
+       struct getwordstruct gwarea;
+       struct userinfostruct *uinfo;
+       longline line;
+       const char logext[]=".log";
 
-   char *buf;
-   char accdia[11], acchora[9], accip[MAXLEN], *accurl;
-   char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
-   char *oldurl;
-   char olduser[MAXLEN], acccode[50], oldacccode[50];
-   char ipantes[MAXLEN], nameantes[MAXLEN];
-   char accsmart[MAXLEN];
-   char crc2[50];
-   char *str;
-   char tmp3[MAXLEN];
-   char user[MAX_USER_LEN];
-   char u2[MAX_USER_LEN];
-   DIR *dirp;
-   struct dirent *direntp;
-   long long int nbytes=0;
-   long long int nelap=0;
-   long long int nacc=0;
-   int rtotal=0;
-   long long int incache=0;
-   long long int oucache=0;
-   long long int accbytes;
-   long long int accelap;
-   int dlen;
-   int new_user;
-   int same_url;
-   int url_len;
-   int ourl_size;
-   struct getwordstruct gwarea;
-   struct userinfostruct *uinfo;
-   longline line;
-   const char logext[]=".log";
+       ipantes[0]='\0';
+       nameantes[0]='\0';
 
-   ipantes[0]='\0';
-   nameantes[0]='\0';
+       olduser[0]='\0';
+       oldurl=NULL;
+       ourl_size=0;
 
-   olduser[0]='\0';
-   oldurl=NULL;
-   ourl_size=0;
+       if ((dirp = opendir(tmp)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ( (direntp = readdir( dirp )) != NULL ) {
+               dlen=strlen(direntp->d_name)-(sizeof(logext)-1);
+               if (dlen<=0) continue;
+               if(strcmp(direntp->d_name+dlen,logext) != 0)
+                       continue;
 
-   if ((dirp = opendir(tmp)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ( (direntp = readdir( dirp )) != NULL ) {
-      dlen=strlen(direntp->d_name)-(sizeof(logext)-1);
-      if (dlen<=0) continue;
-      if(strcmp(direntp->d_name+dlen,logext) != 0)
-         continue;
+               if (dlen>0) {
+                       if (dlen>=sizeof(user)) continue;
+                       strncpy(user,direntp->d_name,dlen);
+                       user[dlen]=0;
+               } else {
+                       user[0]='\0';
+               }
 
-      if (dlen>0) {
-         if (dlen>=sizeof(user)) continue;
-         strncpy(user,direntp->d_name,dlen);
-         user[dlen]=0;
-      } else {
-         user[0]='\0';
-      }
+               uinfo=userinfo_find_from_file(user);
+               if (!uinfo) {
+                       debuga(_("Ignoring unknown user file %s\n"),user);
+                       continue;
+               }
+               strcpy(u2,uinfo->id);
+               if(Ip2Name && uinfo->id_is_ip) {
+                       strcpy(ipantes,u2);
+                       ip2name(u2,sizeof(u2));
+                       strcpy(nameantes,u2);
+               }
+               user_find(uinfo->label,MAX_USER_LEN, u2);
 
-      uinfo=userinfo_find_from_file(user);
-      if (!uinfo) {
-         debuga(_("Ignoring unknown user file %s\n"),user);
-         continue;
-      }
-      strcpy(u2,uinfo->id);
-      if(Ip2Name && uinfo->id_is_ip) {
-         strcpy(ipantes,u2);
-         ip2name(u2,sizeof(u2));
-         strcpy(nameantes,u2);
-      }
-      user_find(uinfo->label,MAX_USER_LEN, u2);
+               if (snprintf(tmp3,sizeof(tmp3),"%s/%s",tmp,direntp->d_name)>=sizeof(tmp3)) {
+                       debuga(_("(datafile) directory path too long: %s/%s\n"),tmp,direntp->d_name);
+                       exit(EXIT_FAILURE);
+               }
 
-      if (snprintf(tmp3,sizeof(tmp3),"%s/%s",tmp,direntp->d_name)>=sizeof(tmp3)) {
-         debuga(_("(datafile) directory path too long: %s/%s\n"),tmp,direntp->d_name);
-         exit(EXIT_FAILURE);
-      }
+               if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
+                       debuga(_("(datafile) Cannot open file %s\n"),tmp3);
+                       exit(EXIT_FAILURE);
+               }
 
-      if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
-         debuga(_("(datafile) Cannot open file %s\n"),tmp3);
-         exit(EXIT_FAILURE);
-      }
+               if ((line=longline_create())==NULL) {
+                       debuga(_("Not enough memory to read the downloaded files.\n"));
+                       exit(EXIT_FAILURE);
+               }
 
-      if ((line=longline_create())==NULL) {
-         debuga(_("Not enough memory to read the downloaded files.\n"));
-         exit(EXIT_FAILURE);
-      }
+               ttopen=0;
+               new_user=1;
+               while((buf=longline_read(fp_in,line))!=NULL) {
+                       getword_start(&gwarea,buf);
+                       if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
+                               getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
+                               getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
+                               getword(acccode,sizeof(acccode),&gwarea,'\t')<0 || getword_atoll(&accelap,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken record or garbage in file %s\n"),tmp3);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
+                               debuga(_("There is an invalid smart info in file %s\n"),tmp3);
+                               exit(EXIT_FAILURE);
+                       }
 
-      ttopen=0;
-      new_user=1;
-      while((buf=longline_read(fp_in,line))!=NULL) {
-         getword_start(&gwarea,buf);
-         if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
-             getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
-             getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
-             getword(acccode,sizeof(acccode),&gwarea,'\t')<0 || getword_atoll(&accelap,&gwarea,'\t')<0) {
-            debuga(_("There is a broken record or garbage in file %s\n"),tmp3);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
-            debuga(_("There is an invalid smart info in file %s\n"),tmp3);
-            exit(EXIT_FAILURE);
-         }
+                       if(Ip2Name) {
+                               if(strcmp(accip,ipantes) != 0) {
+                                       strcpy(ipantes,accip);
+                                       ip2name(accip,sizeof(accip));
+                                       strcpy(nameantes,accip);
+                               }
+                               else strcpy(accip,nameantes);
+                       }
 
-         if(Ip2Name) {
-            if(strcmp(accip,ipantes) != 0) {
-               strcpy(ipantes,accip);
-               ip2name(accip,sizeof(accip));
-               strcpy(nameantes,accip);
-            }
-            else strcpy(accip,nameantes);
-         }
+                       if(!rtotal){
+                               url_len=strlen(accurl);
+                               if (!oldurl || url_len>=ourl_size) {
+                                       ourl_size=url_len+1;
+                                       oldurl=realloc(oldurl,ourl_size);
+                                       if (!oldurl) {
+                                               debuga(_("Not enough memory to store the url\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                               }
+                               strcpy(oldurl,accurl);
+                               strcpy(oldacccode,acccode);
+                               strcpy(oldaccip,accip);
+                               strcpy(oldaccdia,accdia);
+                               strcpy(oldacchora,acchora);
+                               new_user=0;
+                               rtotal++;
+                       }
+                       same_url=(strcmp(oldurl,accurl) == 0);
 
-         if(!rtotal){
-            url_len=strlen(accurl);
-            if (!oldurl || url_len>=ourl_size) {
-               ourl_size=url_len+1;
-               oldurl=realloc(oldurl,ourl_size);
-               if (!oldurl) {
-                  debuga(_("Not enough memory to store the url\n"));
-                  exit(EXIT_FAILURE);
-               }
-            }
-            strcpy(oldurl,accurl);
-            strcpy(oldacccode,acccode);
-            strcpy(oldaccip,accip);
-            strcpy(oldaccdia,accdia);
-            strcpy(oldacchora,acchora);
-            new_user=0;
-            rtotal++;
-         }
-         same_url=(strcmp(oldurl,accurl) == 0);
+                       if(!same_url || new_user){
+                               if(!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
+                                       debuga(_("(datafile) Cannot open file %s\n"),DataFile);
+                                       exit(EXIT_FAILURE);
+                               }
+                               saverecs(fp_ou,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
+                               nacc=0;
+                               nbytes=0;
+                               nelap=0;
+                               incache=0;
+                               oucache=0;
+                               new_user=0;
+                       }
 
-         if(!same_url || new_user){
-            if(!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
-               debuga(_("(datafile) Cannot open file %s\n"),DataFile);
-               exit(EXIT_FAILURE);
-            }
-            saverecs(fp_ou,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
-            nacc=0;
-            nbytes=0;
-            nelap=0;
-            incache=0;
-            oucache=0;
-            new_user=0;
-         }
+                       nacc++;
+                       nbytes+=accbytes;
+                       nelap+=accelap;
 
-         nacc++;
-         nbytes+=accbytes;
-         nelap+=accelap;
+                       strcpy(crc2,acccode);
+                       str=strchr(crc2,'/');
+                       if (str) *str='\0';
 
-         strcpy(crc2,acccode);
-         str=strchr(crc2,'/');
-         if (str) *str='\0';
+                       if(strstr(crc2,"MISS") != 0) oucache+=accbytes;
+                       else incache+=accbytes;
 
-         if(strstr(crc2,"MISS") != 0) oucache+=accbytes;
-         else incache+=accbytes;
+                       if (!same_url) {
+                               url_len=strlen(accurl);
+                               if (url_len>=ourl_size) {
+                                       ourl_size=url_len+1;
+                                       oldurl=realloc(oldurl,ourl_size);
+                                       if (!oldurl) {
+                                               debuga(_("Not enough memory to store the url\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                               }
+                               strcpy(oldurl,accurl);
+                       }
+                       new_user=0;
+                       strcpy(oldacccode,acccode);
+                       strcpy(oldaccip,accip);
+                       strcpy(oldaccdia,accdia);
+                       strcpy(oldacchora,acchora);
+               }
 
-         if (!same_url) {
-            url_len=strlen(accurl);
-            if (url_len>=ourl_size) {
-               ourl_size=url_len+1;
-               oldurl=realloc(oldurl,ourl_size);
-               if (!oldurl) {
-                  debuga(_("Not enough memory to store the url\n"));
-                  exit(EXIT_FAILURE);
-               }
-            }
-            strcpy(oldurl,accurl);
-         }
-         new_user=0;
-         strcpy(oldacccode,acccode);
-         strcpy(oldaccip,accip);
-         strcpy(oldaccdia,accdia);
-         strcpy(oldacchora,acchora);
-      }
+               fclose(fp_in);
+               longline_destroy(&line);
+       }
+       (void)closedir( dirp );
+       if (oldurl) free(oldurl);
+       if (fp_ou) fclose(fp_ou);
 
-      fclose(fp_in);
-      longline_destroy(&line);
-   }
-   (void)closedir( dirp );
-   if (oldurl) free(oldurl);
-   if (fp_ou) fclose(fp_ou);
-
-   if(debug)
-      debuga(_("Datafile %s written successfully\n"),DataFile);
+       if(debug)
+               debuga(_("Datafile %s written successfully\n"),DataFile);
 }
 
 void saverecs(FILE *fp_ou, const struct userinfostruct *uinfo, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache)
 {
-   char val[20];
-   char name[512];
+       char val[20];
+       char name[512];
 
-   if((DataFileFields & DATA_FIELD_USER) != 0) {
-      fputs(uinfo->label,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_DATE) != 0) {
-      fputs(dia,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_TIME) != 0) {
-      fputs(hora,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_URL) != 0) {
-      url_hostname(url,name,sizeof(name));
-      if (DataFileUrl == DATAFILEURL_IP) name2ip(name);
-      fputs(name,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_CONNECT) != 0) {
-      my_lltoa(nacc,val,sizeof(val),0);
-      fputs(val,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_BYTES) != 0) {
-      my_lltoa(nbytes,val,sizeof(val),0);
-      fputs(val,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_IN_CACHE) != 0) {
-      my_lltoa(incache,val,sizeof(val),0);
-      fputs(val,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_OUT_CACHE) != 0) {
-      my_lltoa(oucache,val,sizeof(val),0);
-      fputs(val,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
-   if((DataFileFields & DATA_FIELD_ELAPSED) != 0) {
-      my_lltoa(nelap,val,sizeof(val),0);
-      fputs(val,fp_ou);
-      fputc(DataFileDelimiter[0],fp_ou);
-   }
+       if((DataFileFields & DATA_FIELD_USER) != 0) {
+               fputs(uinfo->label,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_DATE) != 0) {
+               fputs(dia,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_TIME) != 0) {
+               fputs(hora,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_URL) != 0) {
+               url_hostname(url,name,sizeof(name));
+               if (DataFileUrl == DATAFILEURL_IP) name2ip(name);
+               fputs(name,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_CONNECT) != 0) {
+               my_lltoa(nacc,val,sizeof(val),0);
+               fputs(val,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_BYTES) != 0) {
+               my_lltoa(nbytes,val,sizeof(val),0);
+               fputs(val,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_IN_CACHE) != 0) {
+               my_lltoa(incache,val,sizeof(val),0);
+               fputs(val,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_OUT_CACHE) != 0) {
+               my_lltoa(oucache,val,sizeof(val),0);
+               fputs(val,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
+       if((DataFileFields & DATA_FIELD_ELAPSED) != 0) {
+               my_lltoa(nelap,val,sizeof(val),0);
+               fputs(val,fp_ou);
+               fputc(DataFileDelimiter[0],fp_ou);
+       }
 
-   fputc('\n',fp_ou);
+       fputc('\n',fp_ou);
 }
index d7dd5aff2928ff6d2575ffcc5d38a54771305f4f..2bbb1385dbd294b0f6df07089269976896afb25c 100644 (file)
--- a/decomp.c
+++ b/decomp.c
 
 FILE *decomp(const char *arq, bool *pipe)
 {
-   char cmd[1024];
-   int arqlen;
+       char cmd[1024];
+       int arqlen;
 
-   if(access(arq, R_OK) != 0) {
-      debuga(_("File not found: %s\n"),arq);
-      exit(EXIT_FAILURE);
-   }
+       if(access(arq, R_OK) != 0) {
+               debuga(_("File not found: %s\n"),arq);
+               exit(EXIT_FAILURE);
+       }
 
-   arqlen=strlen(arq);
-   if(arqlen>3 && strcmp(arq+arqlen-3,".gz") == 0) {
-      debuga(_("Decompressing log file \"%s\" with zcat\n"),arq);
-      if (snprintf(cmd,sizeof(cmd),"zcat \"%s\"",arq)>=sizeof(cmd)) {
-         debuga(_("decompression command too long for log file %s\n"),arq);
-         exit(EXIT_FAILURE);
-      }
-      *pipe=true;
-      return(popen(cmd,"r"));
-   }
+       arqlen=strlen(arq);
+       if(arqlen>3 && strcmp(arq+arqlen-3,".gz") == 0) {
+               debuga(_("Decompressing log file \"%s\" with zcat\n"),arq);
+               if (snprintf(cmd,sizeof(cmd),"zcat \"%s\"",arq)>=sizeof(cmd)) {
+                       debuga(_("decompression command too long for log file %s\n"),arq);
+                       exit(EXIT_FAILURE);
+               }
+               *pipe=true;
+               return(popen(cmd,"r"));
+       }
 
-   if(arqlen>4 && strcmp(arq+arqlen-4,".bz2") == 0) {
-      debuga(_("Decompressing log file \"%s\" with bzcat\n"),arq);
-      if (snprintf(cmd,sizeof(cmd),"bzcat \"%s\"",arq)>=sizeof(cmd)) {
-         debuga(_("decompression command too long for log file %s\n"),arq);
-         exit(EXIT_FAILURE);
-      }
-      *pipe=true;
-      return(popen(cmd,"r"));
-   }
+       if(arqlen>4 && strcmp(arq+arqlen-4,".bz2") == 0) {
+               debuga(_("Decompressing log file \"%s\" with bzcat\n"),arq);
+               if (snprintf(cmd,sizeof(cmd),"bzcat \"%s\"",arq)>=sizeof(cmd)) {
+                       debuga(_("decompression command too long for log file %s\n"),arq);
+                       exit(EXIT_FAILURE);
+               }
+               *pipe=true;
+               return(popen(cmd,"r"));
+       }
 
-   if(arqlen>2 && strcmp(arq+arqlen-2,".Z") == 0) {
-      debuga(_("Decompressing log file \"%s\" with zcat\n"),arq);
-      if (snprintf(cmd,sizeof(cmd),"zcat \"%s\"",arq)>=sizeof(cmd)) {
-         debuga(_("decompression command too long for log file %s\n"),arq);
-         exit(EXIT_FAILURE);
-      }
-      *pipe=true;
-      return(popen(cmd,"r"));
-   }
+       if(arqlen>2 && strcmp(arq+arqlen-2,".Z") == 0) {
+               debuga(_("Decompressing log file \"%s\" with zcat\n"),arq);
+               if (snprintf(cmd,sizeof(cmd),"zcat \"%s\"",arq)>=sizeof(cmd)) {
+                       debuga(_("decompression command too long for log file %s\n"),arq);
+                       exit(EXIT_FAILURE);
+               }
+               *pipe=true;
+               return(popen(cmd,"r"));
+       }
 
-   *pipe=false;
-   return(MY_FOPEN(arq,"r"));
+       *pipe=false;
+       return(MY_FOPEN(arq,"r"));
 }
index 553a62200bf9df5a17f5dcb1a5c5012f779258ab..5d2288e983c7e8d23490b74e60c94e2478a81e03 100644 (file)
--- a/denied.c
+++ b/denied.c
 
 static void show_ignored_denied(FILE *fp_ou,int count)
 {
-   char ignored[80];
+       char ignored[80];
 
-   snprintf(ignored,sizeof(ignored),ngettext("%d more denied access not shown here&hellip;","%d more denied accesses not shown here&hellip;",count),count);
-   fprintf(fp_ou,"<tr><td class=\"data\"></td><td class=\"data\"></td><td class=\"data\"></td><td class=\"data2\"><i>%s</i></td></tr>\n",ignored);
+       snprintf(ignored,sizeof(ignored),ngettext("%d more denied access not shown here&hellip;","%d more denied accesses not shown here&hellip;",count),count);
+       fprintf(fp_ou,"<tr><td class=\"data\"></td><td class=\"data\"></td><td class=\"data\"></td><td class=\"data2\"><i>%s</i></td></tr>\n",ignored);
 }
 
 void gen_denied_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL;
-
-   char *buf;
-   char *url;
-   char denied_in[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char ouser2[MAXLEN];
-   char data[15];
-   char hora[15];
-   bool  z=false;
-   int  count=0;
-   int day,month,year;
-   bool new_user;
-   struct getwordstruct gwarea;
-   longline line;
-   struct userinfostruct *uinfo;
-   struct tm t;
-
-   ouser[0]='\0';
-   ouser2[0]='\0';
-
-   sprintf(denied_in,"%s/denied.log",tmp);
-   if(!denied_count) {
-      unlink(denied_in);
-      return;
-   }
-
-   sprintf(report,"%s/denied.html",outdirname);
-
-   if((fp_in=MY_FOPEN(denied_in,"r"))==NULL) {
-     debuga(_("(denied) Cannot open log file %s\n"),denied_in);
-     exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
-     debuga(_("(denied) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Denied"),HTML_JS_NONE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Denied"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the denied accesses\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,'\t')<0 || getword(hora,sizeof(hora),&gwarea,'\t')<0 ||
-          getword(user,sizeof(user),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("There is a broken record or garbage in file %s\n"),denied_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("There is a broken url in file %s\n"),denied_in);
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
-      computedate(year,month,day,&t);
-      strftime(data,sizeof(data),"%x",&t);
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,denied_in);
-         exit(EXIT_FAILURE);
-      }
-
-      new_user=false;
-      if(!z) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         z=true;
-         new_user=true;
-      } else {
-         if(strcmp(ouser,user) != 0) {
-            strcpy(ouser,user);
-            new_user=true;
-         }
-         if(strcmp(oip,ip) != 0) {
-            strcpy(oip,ip);
-            new_user=true;
-         }
-      }
-
-      if(DeniedReportLimit) {
-         if(strcmp(ouser2,uinfo->label) == 0) {
-            count++;
-         } else {
-            if(count>DeniedReportLimit && DeniedReportLimit>0)
-               show_ignored_denied(fp_ou,count-DeniedReportLimit);
-            count=1;
-            strcpy(ouser2,uinfo->label);
-         }
-         if(count > DeniedReportLimit)
-            continue;
-      }
-
-      fputs("<tr>",fp_ou);
-      if (new_user)
-         fprintf(fp_ou,"<td class=\"data\"><a href=\"%s/%s.html\">%s</a></td><td class=\"data\">%s</td>",uinfo->filename,uinfo->filename,uinfo->label,ip);
-      else
-         fputs("<td class=\"data\"></td><td class=\"data\"></td>",fp_ou);
-      fprintf(fp_ou,"<td class=\"data\">%s-%s</td><td class=\"data2\">",data,hora);
-      if(BlockIt[0] != '\0') {
-         fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
-         output_html_url(fp_ou,url);
-         fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",ImageFile);
-      }
-      fputs("<a href=\"http://",fp_ou);
-      output_html_url(fp_ou,url);
-      fputs("\">http://",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fputs("</a></td></tr>\n",fp_ou);
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   if(count>DeniedReportLimit && DeniedReportLimit>0)
-      show_ignored_denied(fp_ou,count-DeniedReportLimit);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)<0)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   if (unlink(denied_in)==-1)
-      debuga(_("Failed to delete the file \"%s\" after processing it - %s\n"),denied_in,strerror(errno));
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char *buf;
+       char *url;
+       char denied_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char ouser2[MAXLEN];
+       char data[15];
+       char hora[15];
+       bool  z=false;
+       int  count=0;
+       int day,month,year;
+       bool new_user;
+       struct getwordstruct gwarea;
+       longline line;
+       struct userinfostruct *uinfo;
+       struct tm t;
+
+       ouser[0]='\0';
+       ouser2[0]='\0';
+
+       sprintf(denied_in,"%s/denied.log",tmp);
+       if(!denied_count) {
+               unlink(denied_in);
+               return;
+       }
+
+       sprintf(report,"%s/denied.html",outdirname);
+
+       if((fp_in=MY_FOPEN(denied_in,"r"))==NULL) {
+       debuga(_("(denied) Cannot open log file %s\n"),denied_in);
+       exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
+       debuga(_("(denied) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Denied"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Denied"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the denied accesses\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,'\t')<0 || getword(hora,sizeof(hora),&gwarea,'\t')<0 ||
+                       getword(user,sizeof(user),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken record or garbage in file %s\n"),denied_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken url in file %s\n"),denied_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
+               computedate(year,month,day,&t);
+               strftime(data,sizeof(data),"%x",&t);
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,denied_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               new_user=false;
+               if(!z) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       z=true;
+                       new_user=true;
+               } else {
+                       if(strcmp(ouser,user) != 0) {
+                               strcpy(ouser,user);
+                               new_user=true;
+                       }
+                       if(strcmp(oip,ip) != 0) {
+                               strcpy(oip,ip);
+                               new_user=true;
+                       }
+               }
+
+               if(DeniedReportLimit) {
+                       if(strcmp(ouser2,uinfo->label) == 0) {
+                               count++;
+                       } else {
+                               if(count>DeniedReportLimit && DeniedReportLimit>0)
+                                       show_ignored_denied(fp_ou,count-DeniedReportLimit);
+                               count=1;
+                               strcpy(ouser2,uinfo->label);
+                       }
+                       if(count > DeniedReportLimit)
+                               continue;
+               }
+
+               fputs("<tr>",fp_ou);
+               if (new_user)
+                       fprintf(fp_ou,"<td class=\"data\"><a href=\"%s/%s.html\">%s</a></td><td class=\"data\">%s</td>",uinfo->filename,uinfo->filename,uinfo->label,ip);
+               else
+                       fputs("<td class=\"data\"></td><td class=\"data\"></td>",fp_ou);
+               fprintf(fp_ou,"<td class=\"data\">%s-%s</td><td class=\"data2\">",data,hora);
+               if(BlockIt[0] != '\0') {
+                       fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
+                       output_html_url(fp_ou,url);
+                       fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",ImageFile);
+               }
+               fputs("<a href=\"http://",fp_ou);
+               output_html_url(fp_ou,url);
+               fputs("\">http://",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fputs("</a></td></tr>\n",fp_ou);
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       if(count>DeniedReportLimit && DeniedReportLimit>0)
+               show_ignored_denied(fp_ou,count-DeniedReportLimit);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)<0)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       if (unlink(denied_in)==-1)
+               debuga(_("Failed to delete the file \"%s\" after processing it - %s\n"),denied_in,strerror(errno));
+
+       return;
 }
index 10739e9781a19aa5ef52b17ede0b167f1cf6af2c..373465ddd80200351342535e5125c15372f70e02 100644 (file)
@@ -33,243 +33,242 @@ static int NDownloadSuffix=0;
 
 void download_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL;
-
-   char *buf;
-   char *url;
-   char report_in[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char ouser2[MAXLEN];
-   char data[15];
-   char hora[15];
-   int  z=0;
-   int  count=0;
-   int i;
-   int day,month,year;
-   bool new_user;
-   struct getwordstruct gwarea;
-   longline line;
-   struct userinfostruct *uinfo;
-   struct tm t;
-
-   ouser[0]='\0';
-   ouser2[0]='\0';
-
-   snprintf(report_in,sizeof(report_in),"%s/download.log",tmp);
-   if(access(report_in, R_OK) != 0)
-      return;
-
-   snprintf(report,sizeof(report),"%s/download.html",outdirname);
-
-   if((fp_in=MY_FOPEN(report_in,"r"))==NULL) {
-      debuga(_("(download) Cannot open log file %s\n"),report_in);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
-      debuga(_("(download) Cannot open log file %s\n"),report);
-      exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Downloads"),HTML_JS_NONE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Downloads"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the downloaded files\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,'\t')<0 || getword(hora,sizeof(hora),&gwarea,'\t')<0 ||
-          getword(user,sizeof(user),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("There is a broken record or garbage in file %s\n"),report_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("There is a broken url in file %s\n"),report_in);
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
-      computedate(year,month,day,&t);
-      strftime(data,sizeof(data),"%x",&t);
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,report_in);
-         exit(EXIT_FAILURE);
-      }
-      new_user=false;
-      if(!z) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         z++;
-         new_user=true;
-      } else {
-         if(strcmp(ouser,user) != 0) {
-            strcpy(ouser,user);
-            new_user=true;
-         }
-         if(strcmp(oip,ip) != 0) {
-            strcpy(oip,ip);
-            new_user=true;
-         }
-      }
-
-      if(DownloadReportLimit) {
-         if(strcmp(ouser2,uinfo->label) == 0) {
-            count++;
-         } else {
-            count=1;
-            strcpy(ouser2,uinfo->label);
-         }
-         if(count >= DownloadReportLimit)
-            continue;
-      }
-
-      for (i=strlen(url)-1 ; i>=0 && (unsigned char)url[i]<' ' ; i--) url[i]=0;
-
-      fputs("<tr>",fp_ou);
-      if (new_user)
-         fprintf(fp_ou,"<td class=\"data\">%s</td><td class=\"data\">%s</td>",uinfo->label,ip);
-      else
-         fputs("<td class=\"data\"></td><td class=\"data\"></td>",fp_ou);
-      fprintf(fp_ou,"<td class=\"data\">%s-%s</td><td class=\"data2\">",data,hora);
-      if(BlockIt[0]!='\0') {
-         fprintf(fp_ou,"<a href=\"%s%s?url=\"",wwwDocumentRoot,BlockIt);
-         output_html_url(fp_ou,url);
-         fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",ImageFile);
-      }
-      fputs("<a href=\"http://",fp_ou);
-      output_html_url(fp_ou,url);
-      fputs("\">http://",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fputs("</a></td></tr>\n",fp_ou);
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   unlink(report_in);
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char *buf;
+       char *url;
+       char report_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char ouser2[MAXLEN];
+       char data[15];
+       char hora[15];
+       int  z=0;
+       int  count=0;
+       int i;
+       int day,month,year;
+       bool new_user;
+       struct getwordstruct gwarea;
+       longline line;
+       struct userinfostruct *uinfo;
+       struct tm t;
+
+       ouser[0]='\0';
+       ouser2[0]='\0';
+
+       snprintf(report_in,sizeof(report_in),"%s/download.log",tmp);
+       if(access(report_in, R_OK) != 0)
+               return;
+
+       snprintf(report,sizeof(report),"%s/download.html",outdirname);
+
+       if((fp_in=MY_FOPEN(report_in,"r"))==NULL) {
+               debuga(_("(download) Cannot open log file %s\n"),report_in);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(report,"w"))==NULL) {
+               debuga(_("(download) Cannot open log file %s\n"),report);
+               exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Downloads"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Downloads"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the downloaded files\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,'\t')<0 || getword(hora,sizeof(hora),&gwarea,'\t')<0 ||
+                       getword(user,sizeof(user),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken record or garbage in file %s\n"),report_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken url in file %s\n"),report_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
+               computedate(year,month,day,&t);
+               strftime(data,sizeof(data),"%x",&t);
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,report_in);
+                       exit(EXIT_FAILURE);
+               }
+               new_user=false;
+               if(!z) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       z++;
+                       new_user=true;
+               } else {
+                       if(strcmp(ouser,user) != 0) {
+                               strcpy(ouser,user);
+                               new_user=true;
+                       }
+                       if(strcmp(oip,ip) != 0) {
+                               strcpy(oip,ip);
+                               new_user=true;
+                       }
+               }
+
+               if(DownloadReportLimit) {
+                       if(strcmp(ouser2,uinfo->label) == 0) {
+                               count++;
+                       } else {
+                               count=1;
+                               strcpy(ouser2,uinfo->label);
+                       }
+                       if(count >= DownloadReportLimit)
+                               continue;
+               }
+
+               for (i=strlen(url)-1 ; i>=0 && (unsigned char)url[i]<' ' ; i--) url[i]=0;
+
+               fputs("<tr>",fp_ou);
+               if (new_user)
+                       fprintf(fp_ou,"<td class=\"data\">%s</td><td class=\"data\">%s</td>",uinfo->label,ip);
+               else
+                       fputs("<td class=\"data\"></td><td class=\"data\"></td>",fp_ou);
+               fprintf(fp_ou,"<td class=\"data\">%s-%s</td><td class=\"data2\">",data,hora);
+               if(BlockIt[0]!='\0') {
+                       fprintf(fp_ou,"<a href=\"%s%s?url=\"",wwwDocumentRoot,BlockIt);
+                       output_html_url(fp_ou,url);
+                       fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",ImageFile);
+               }
+               fputs("<a href=\"http://",fp_ou);
+               output_html_url(fp_ou,url);
+               fputs("\">http://",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fputs("</a></td></tr>\n",fp_ou);
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       unlink(report_in);
+
+       return;
 }
 
 void free_download(void)
 {
-   if (DownloadSuffix) {
-      free(DownloadSuffix);
-      DownloadSuffix=NULL;
-   }
-   if (DownloadSuffixIndex) {
-      free(DownloadSuffixIndex);
-      DownloadSuffixIndex=NULL;
-   }
-   NDownloadSuffix=0;
+       if (DownloadSuffix) {
+               free(DownloadSuffix);
+               DownloadSuffix=NULL;
+       }
+       if (DownloadSuffixIndex) {
+               free(DownloadSuffixIndex);
+               DownloadSuffixIndex=NULL;
+       }
+       NDownloadSuffix=0;
 }
 
 void set_download_suffix(const char *list)
 {
-   char *str;
-   int i, j, k;
-   int cmp;
-
-   free_download();
-
-   DownloadSuffix=strdup(list);
-   if (!DownloadSuffix) {
-      debuga(_("Download suffix list too long\n"));
-      exit(EXIT_FAILURE);
-   }
-   j = 1;
-   for (i=0 ; list[i] ; i++)
-      if (list[i] == ',') j++;
-   DownloadSuffixIndex=malloc(j*sizeof(char *));
-   if (!DownloadSuffixIndex) {
-      debuga(_("Too many download suffixes\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   str = DownloadSuffix;
-   for (i=0 ; DownloadSuffix[i] ; i++) {
-      if (DownloadSuffix[i] == ',') {
-         DownloadSuffix[i] = '\0';
-         if (*str) {
-            cmp = -1;
-            for (j=0 ; j<NDownloadSuffix && (cmp=strcasecmp(str,DownloadSuffixIndex[j]))>0 ; j++);
-            if (cmp != 0) {
-               for (k=NDownloadSuffix ; k>j ; k--)
-                  DownloadSuffixIndex[k]=DownloadSuffixIndex[k-1];
-               NDownloadSuffix++;
-               DownloadSuffixIndex[j]=str;
-            }
-         }
-         str=DownloadSuffix+i+1;
-      }
-   }
-
-   if (*str) {
-      cmp = -1;
-      for (j=0 ; j<NDownloadSuffix && (cmp=strcasecmp(str,DownloadSuffixIndex[j]))>0 ; j++);
-      if (cmp != 0) {
-         for (k=NDownloadSuffix ; k>j ; k--)
-            DownloadSuffixIndex[k]=DownloadSuffixIndex[k-1];
-         NDownloadSuffix++;
-         DownloadSuffixIndex[j]=str;
-      }
-   }
+       char *str;
+       int i, j, k;
+       int cmp;
+
+       free_download();
+
+       DownloadSuffix=strdup(list);
+       if (!DownloadSuffix) {
+               debuga(_("Download suffix list too long\n"));
+               exit(EXIT_FAILURE);
+       }
+       j = 1;
+       for (i=0 ; list[i] ; i++)
+               if (list[i] == ',') j++;
+       DownloadSuffixIndex=malloc(j*sizeof(char *));
+       if (!DownloadSuffixIndex) {
+               debuga(_("Too many download suffixes\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       str = DownloadSuffix;
+       for (i=0 ; DownloadSuffix[i] ; i++) {
+               if (DownloadSuffix[i] == ',') {
+                       DownloadSuffix[i] = '\0';
+                       if (*str) {
+                               cmp = -1;
+                               for (j=0 ; j<NDownloadSuffix && (cmp=strcasecmp(str,DownloadSuffixIndex[j]))>0 ; j++);
+                               if (cmp != 0) {
+                                       for (k=NDownloadSuffix ; k>j ; k--)
+                                               DownloadSuffixIndex[k]=DownloadSuffixIndex[k-1];
+                                       NDownloadSuffix++;
+                                       DownloadSuffixIndex[j]=str;
+                               }
+                       }
+                       str=DownloadSuffix+i+1;
+               }
+       }
+
+       if (*str) {
+               cmp = -1;
+               for (j=0 ; j<NDownloadSuffix && (cmp=strcasecmp(str,DownloadSuffixIndex[j]))>0 ; j++);
+               if (cmp != 0) {
+                       for (k=NDownloadSuffix ; k>j ; k--)
+                               DownloadSuffixIndex[k]=DownloadSuffixIndex[k-1];
+                       NDownloadSuffix++;
+                       DownloadSuffixIndex[j]=str;
+               }
+       }
 }
 
 bool is_download_suffix(const char *url)
 {
-   int urllen;
-   int i;
-   int down, up, center;
-   const char *suffix;
-   int cmp;
-   const int max_suffix=10;
-
-   if (DownloadSuffix == NULL || NDownloadSuffix == 0) return(false);
-
-   urllen=strlen(url)-1;
-   if (urllen<=0) return(false);
-   if (url[urllen] == '.') return(false); //reject a single trailing dot
-   for (i=0 ; i<urllen && (url[i]!='/' || url[i+1]=='/') && url[i]!='?' ; i++);
-   if (i>=urllen) return(false); // url is a hostname without any path or file to download
-
-   for (i=0 ; i<=max_suffix && i<urllen && url[urllen-i]!='.' ; i++)
-      if (url[urllen-i] == '/' || url[urllen-i] == '?') return(false);
-   if (i>max_suffix || i>=urllen) return(false);
-
-   suffix=url+urllen-i+1;
-   down=0;
-   up=NDownloadSuffix-1;
-   while (down<=up) {
-      center=(down+up)/2;
-      cmp=strcasecmp(suffix,DownloadSuffixIndex[center]);
-      if (cmp == 0) return(true);
-      if (cmp < 0)
-         up = center-1;
-      else
-         down = center+1;
-   }
-   return(false);
+       int urllen;
+       int i;
+       int down, up, center;
+       const char *suffix;
+       int cmp;
+       const int max_suffix=10;
+
+       if (DownloadSuffix == NULL || NDownloadSuffix == 0) return(false);
+
+       urllen=strlen(url)-1;
+       if (urllen<=0) return(false);
+       if (url[urllen] == '.') return(false); //reject a single trailing dot
+       for (i=0 ; i<urllen && (url[i]!='/' || url[i+1]=='/') && url[i]!='?' ; i++);
+       if (i>=urllen) return(false); // url is a hostname without any path or file to download
+
+       for (i=0 ; i<=max_suffix && i<urllen && url[urllen-i]!='.' ; i++)
+               if (url[urllen-i] == '/' || url[urllen-i] == '?') return(false);
+       if (i>max_suffix || i>=urllen) return(false);
+
+       suffix=url+urllen-i+1;
+       down=0;
+       up=NDownloadSuffix-1;
+       while (down<=up) {
+               center=(down+up)/2;
+               cmp=strcasecmp(suffix,DownloadSuffixIndex[center]);
+               if (cmp == 0) return(true);
+               if (cmp < 0)
+                       up = center-1;
+               else
+                       down = center+1;
+       }
+       return(false);
 }
 
diff --git a/email.c b/email.c
index 4a0ca946105715cfb6b4ddd5238c69adebe87480..3188b7927217b7df79ed1098212cb7bd0968b1d4 100644 (file)
--- a/email.c
+++ b/email.c
 
 int geramail(const char *dirname, int debug, const char *outdir, const char *email, const char *TempDir)
 {
-   FILE *fp_in, *fp_top1, *fp_top2, *fp_top3;
-   long long int ttnbytes=0, ttnacc=0, tnacc=0;
-   long long int tnbytes=0, ttnelap=0, tnelap=0;
-   long long int nacc, nbytes, elap;
-   long long int avgacc, avgelap;
-   double perc=0.00;
-   double perc2=0.00;
-   int posicao=0;
-   char olduser[MAX_USER_LEN], csort[MAXLEN];
-   char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN], user[MAX_USER_LEN];
-   char strip1[MAXLEN], strip2[MAXLEN], strip3[MAXLEN], strip4[MAXLEN], strip5[MAXLEN], strip6[MAXLEN], strip7[MAXLEN];
-   char *buf;
-   char warea[MAXLEN];
-   int totuser=0;
-   time_t t;
-   struct tm *local;
-   int cstatus;
-   struct getwordstruct gwarea;
-   struct generalitemstruct item;
-   longline line;
-   const struct userinfostruct *uinfo;
-
-   snprintf(wger,sizeof(wger),"%s/sarg-general",dirname);
-   if((fp_in=fopen(wger,"r"))==NULL) {
-      debuga(_("(email) Cannot open file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(top1,sizeof(top1),"%s/top",dirname);
-   if((fp_top1=fopen(top1,"w"))==NULL) {
-      debuga(_("(email) Cannot open file %s\n"),top1);
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(top2,sizeof(top2),"%s/top.tmp",dirname);
-   if((fp_top2=fopen(top2,"w"))==NULL) {
-      debuga(_("(email) Cannot open file %s\n"),top2);
-      exit(EXIT_FAILURE);
-   }
-
-   olduser[0]='\0';
-   totuser=0;
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      ger_read(buf,&item,wger);
-      if(item.total) continue;
-      if(strcmp(olduser,item.user) != 0)
-      {
-         totuser++;
-
-         if (olduser[0] != '\0') {
+       FILE *fp_in, *fp_top1, *fp_top2, *fp_top3;
+       long long int ttnbytes=0, ttnacc=0, tnacc=0;
+       long long int tnbytes=0, ttnelap=0, tnelap=0;
+       long long int nacc, nbytes, elap;
+       long long int avgacc, avgelap;
+       double perc=0.00;
+       double perc2=0.00;
+       int posicao=0;
+       char olduser[MAX_USER_LEN], csort[MAXLEN];
+       char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN], user[MAX_USER_LEN];
+       char strip1[MAXLEN], strip2[MAXLEN], strip3[MAXLEN], strip4[MAXLEN], strip5[MAXLEN], strip6[MAXLEN], strip7[MAXLEN];
+       char *buf;
+       char warea[MAXLEN];
+       int totuser=0;
+       time_t t;
+       struct tm *local;
+       int cstatus;
+       struct getwordstruct gwarea;
+       struct generalitemstruct item;
+       longline line;
+       const struct userinfostruct *uinfo;
+
+       snprintf(wger,sizeof(wger),"%s/sarg-general",dirname);
+       if((fp_in=fopen(wger,"r"))==NULL) {
+               debuga(_("(email) Cannot open file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(top1,sizeof(top1),"%s/top",dirname);
+       if((fp_top1=fopen(top1,"w"))==NULL) {
+               debuga(_("(email) Cannot open file %s\n"),top1);
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(top2,sizeof(top2),"%s/top.tmp",dirname);
+       if((fp_top2=fopen(top2,"w"))==NULL) {
+               debuga(_("(email) Cannot open file %s\n"),top2);
+               exit(EXIT_FAILURE);
+       }
+
+       olduser[0]='\0';
+       totuser=0;
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               ger_read(buf,&item,wger);
+               if(item.total) continue;
+               if(strcmp(olduser,item.user) != 0)
+               {
+                       totuser++;
+
+                       if (olduser[0] != '\0') {
 #if defined(__FreeBSD__)
-            fprintf(fp_top2,"%s\t%qu\t%qu\t%qu\n",olduser,tnbytes,tnacc,tnelap);
+                               fprintf(fp_top2,"%s\t%qu\t%qu\t%qu\n",olduser,tnbytes,tnacc,tnelap);
 #else
-            fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap);
+                               fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap);
 #endif
-            ttnbytes+=tnbytes;
-            ttnacc+=tnacc;
-            ttnelap+=tnelap;
-         }
-         strcpy(olduser,item.user);
-         tnbytes=0;
-         tnacc=0;
-         tnelap=0;
-      }
-
-      tnbytes+=item.nbytes;
-      tnacc+=item.nacc;
-      tnelap+=item.nelap;
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   if (olduser[0] != '\0') {
+                               ttnbytes+=tnbytes;
+                               ttnacc+=tnacc;
+                               ttnelap+=tnelap;
+                       }
+                       strcpy(olduser,item.user);
+                       tnbytes=0;
+                       tnacc=0;
+                       tnelap=0;
+               }
+
+               tnbytes+=item.nbytes;
+               tnacc+=item.nacc;
+               tnelap+=item.nelap;
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       if (olduser[0] != '\0') {
 #if defined(__FreeBSD__)
-      fprintf(fp_top2,"%s\t%qu\t%qu\t%qu\n",olduser,tnbytes,tnacc,tnelap);
+               fprintf(fp_top2,"%s\t%qu\t%qu\t%qu\n",olduser,tnbytes,tnacc,tnelap);
 #else
-      fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap);
+               fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap);
 #endif
-      ttnbytes+=tnbytes;
-      ttnacc+=tnacc;
-      ttnelap+=tnelap;
-   }
-
-   fclose(fp_top2);
-
-   sprintf(csort,"sort -n -T \"%s\" -r -k 2,2 -o \"%s\" \"%s\"", TempDir, top1, top2);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(top2);
-
-   if((fp_top1=fopen(top1,"r"))==NULL) {
-      debuga(_("(email) Cannot open file %s\n"),top1);
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(top3,sizeof(top3),"%s/report",dirname);
-   if((fp_top3=fopen(top3,"w"))==NULL) {
-      debuga(_("(email) Cannot open file %s\n"),top3);
-      exit(EXIT_FAILURE);
-   }
-
-   strcpy(strip1,_("Squid User Access Report"));
-   strip_latin(strip1);
-   fprintf(fp_top3,"%s\n",strip1);
-
-   strcpy(strip1,_("Decreasing Access (bytes)"));
-   strip_latin(strip1);
-   fprintf(fp_top3,"%s\n",strip1);
-
-   strcpy(strip1,_("Period"));
-   strip_latin(strip1);
-   fprintf(fp_top3,"%s %s\n\n",strip1,period.text);
-
-   strcpy(strip1,_("NUM"));
-   strip_latin(strip1);
-   strcpy(strip2,_("USERID"));
-   strip_latin(strip2);
-   strcpy(strip3,_("CONNECT"));
-   strip_latin(strip3);
-   strcpy(strip4,_("BYTES"));
-   strip_latin(strip4);
-   strcpy(strip5,_("ELAPSED TIME"));
-   strip_latin(strip5);
-   strcpy(strip6,_("MILLISEC"));
-   strip_latin(strip6);
-   strcpy(strip7,_("TIME"));
-   strip_latin(strip7);
-
-   fprintf(fp_top3,"%-7s %-20s %-8s %-15s %%%-6s %-10s %-10s %%%-7s\n------- -------------------- -------- --------------- ------- ---------- ---------- -------\n",strip1,strip2,strip3,strip4,strip4,strip5,strip6,strip7);
-
-   while(fgets(warea,sizeof(warea),fp_top1))
-   {
-      fixendofline(warea);
-      getword_start(&gwarea,warea);
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid user ID in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&nbytes,&gwarea,'\t')<0) {
-         debuga(_("There is an invalid number of bytes in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&nacc,&gwarea,'\t')<0) {
-         debuga(_("There is an invalid number of access in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&elap,&gwarea,'\0')<0) {
-         debuga(_("There is an invalid elapsed time in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,top1);
-         exit(EXIT_FAILURE);
-      }
-
-      perc=(ttnbytes) ? nbytes * 100. / ttnbytes : 0;
-      perc2=(ttnelap) ? elap * 100. / ttnelap : 0;
-
-      posicao++;
+               ttnbytes+=tnbytes;
+               ttnacc+=tnacc;
+               ttnelap+=tnelap;
+       }
+
+       fclose(fp_top2);
+
+       sprintf(csort,"sort -n -T \"%s\" -r -k 2,2 -o \"%s\" \"%s\"", TempDir, top1, top2);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(top2);
+
+       if((fp_top1=fopen(top1,"r"))==NULL) {
+               debuga(_("(email) Cannot open file %s\n"),top1);
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(top3,sizeof(top3),"%s/report",dirname);
+       if((fp_top3=fopen(top3,"w"))==NULL) {
+               debuga(_("(email) Cannot open file %s\n"),top3);
+               exit(EXIT_FAILURE);
+       }
+
+       strcpy(strip1,_("Squid User Access Report"));
+       strip_latin(strip1);
+       fprintf(fp_top3,"%s\n",strip1);
+
+       strcpy(strip1,_("Decreasing Access (bytes)"));
+       strip_latin(strip1);
+       fprintf(fp_top3,"%s\n",strip1);
+
+       strcpy(strip1,_("Period"));
+       strip_latin(strip1);
+       fprintf(fp_top3,"%s %s\n\n",strip1,period.text);
+
+       strcpy(strip1,_("NUM"));
+       strip_latin(strip1);
+       strcpy(strip2,_("USERID"));
+       strip_latin(strip2);
+       strcpy(strip3,_("CONNECT"));
+       strip_latin(strip3);
+       strcpy(strip4,_("BYTES"));
+       strip_latin(strip4);
+       strcpy(strip5,_("ELAPSED TIME"));
+       strip_latin(strip5);
+       strcpy(strip6,_("MILLISEC"));
+       strip_latin(strip6);
+       strcpy(strip7,_("TIME"));
+       strip_latin(strip7);
+
+       fprintf(fp_top3,"%-7s %-20s %-8s %-15s %%%-6s %-10s %-10s %%%-7s\n------- -------------------- -------- --------------- ------- ---------- ---------- -------\n",strip1,strip2,strip3,strip4,strip4,strip5,strip6,strip7);
+
+       while(fgets(warea,sizeof(warea),fp_top1))
+       {
+               fixendofline(warea);
+               getword_start(&gwarea,warea);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid user ID in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&nbytes,&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid number of bytes in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&nacc,&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid number of access in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&elap,&gwarea,'\0')<0) {
+                       debuga(_("There is an invalid elapsed time in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,top1);
+                       exit(EXIT_FAILURE);
+               }
+
+               perc=(ttnbytes) ? nbytes * 100. / ttnbytes : 0;
+               perc2=(ttnelap) ? elap * 100. / ttnelap : 0;
+
+               posicao++;
 
 #if defined(__FreeBSD__)
-      fprintf(fp_top3,"%7d %20s %8lld %15s %3.2lf%% %10s %10qu %3.2lf%%\n",posicao,uinfo->label,nacc,fixnum(nbytes,1),perc,buildtime(elap),elap,perc2);
+               fprintf(fp_top3,"%7d %20s %8lld %15s %3.2lf%% %10s %10qu %3.2lf%%\n",posicao,uinfo->label,nacc,fixnum(nbytes,1),perc,buildtime(elap),elap,perc2);
 #else
-      fprintf(fp_top3,"%7d %20s %8"PRIu64" %15s %3.2lf%% %10s %10"PRIu64" %3.2lf%%\n",posicao,uinfo->label,(uint64_t)nacc,fixnum(nbytes,1),perc,buildtime(elap),(uint64_t)elap,perc2);
+               fprintf(fp_top3,"%7d %20s %8"PRIu64" %15s %3.2lf%% %10s %10"PRIu64" %3.2lf%%\n",posicao,uinfo->label,(uint64_t)nacc,fixnum(nbytes,1),perc,buildtime(elap),(uint64_t)elap,perc2);
 #endif
-   }
+       }
 
-   // output total
-   fputs("------- -------------------- -------- --------------- ------- ---------- ---------- -------\n",fp_top3);
+       // output total
+       fputs("------- -------------------- -------- --------------- ------- ---------- ---------- -------\n",fp_top3);
 #if defined(__FreeBSD__)
-   fprintf(fp_top3,"%-7s %20s %8qu %15s %8s %9s %10qu\n",_("TOTAL")," ",ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),ttnelap);
+       fprintf(fp_top3,"%-7s %20s %8qu %15s %8s %9s %10qu\n",_("TOTAL")," ",ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),ttnelap);
 #else
-   fprintf(fp_top3,"%-7s %20s %8"PRIu64" %15s %8s %9s %10"PRIu64"\n",_("TOTAL")," ",(uint64_t)ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),(uint64_t)ttnelap);
+       fprintf(fp_top3,"%-7s %20s %8"PRIu64" %15s %8s %9s %10"PRIu64"\n",_("TOTAL")," ",(uint64_t)ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),(uint64_t)ttnelap);
 #endif
 
-   // compute and write average
-   if (totuser>0) {
-      tnbytes=(totuser) ? ttnbytes / totuser : 0;
-      avgacc=ttnacc/totuser;
-      avgelap=ttnelap/totuser;
-   } else {
-      tnbytes=0;
-      avgacc=0;
-      avgelap=0;
-   }
-
-   strcpy(strip1,_("AVERAGE"));
-   strip_latin(strip1);
+       // compute and write average
+       if (totuser>0) {
+               tnbytes=(totuser) ? ttnbytes / totuser : 0;
+               avgacc=ttnacc/totuser;
+               avgelap=ttnelap/totuser;
+       } else {
+               tnbytes=0;
+               avgacc=0;
+               avgelap=0;
+       }
+
+       strcpy(strip1,_("AVERAGE"));
+       strip_latin(strip1);
 #if defined(__FreeBSD__)
-   fprintf(fp_top3,"%-7s %20s %8qu %15s %8s %9s %10qu\n",strip1," ",avgacc,fixnum(tnbytes,1)," ",buildtime(avgelap),avgelap);
+       fprintf(fp_top3,"%-7s %20s %8qu %15s %8s %9s %10qu\n",strip1," ",avgacc,fixnum(tnbytes,1)," ",buildtime(avgelap),avgelap);
 #else
-   fprintf(fp_top3,"%-7s %20s %8"PRIu64" %15s %8s %9s %10"PRIu64"\n",strip1," ",(uint64_t)avgacc,fixnum(tnbytes,1)," ",buildtime(avgelap),(uint64_t)avgelap);
+       fprintf(fp_top3,"%-7s %20s %8"PRIu64" %15s %8s %9s %10"PRIu64"\n",strip1," ",(uint64_t)avgacc,fixnum(tnbytes,1)," ",buildtime(avgelap),(uint64_t)avgelap);
 #endif
 
-   fclose(fp_top1);
-   unlink(top1);
+       fclose(fp_top1);
+       unlink(top1);
 
-   t = time(NULL);
-   local = localtime(&t);
-   fprintf(fp_top3, "\n%s\n", asctime(local));
+       t = time(NULL);
+       local = localtime(&t);
+       fprintf(fp_top3, "\n%s\n", asctime(local));
 
-   fclose(fp_top3);
+       fclose(fp_top3);
 
-   if(strcmp(email,"stdout") == 0) {
-      if((fp_top3=fopen(top3,"r"))==NULL) {
-         debuga(_("(email) Cannot open file %s\n"),top3);
-         exit(EXIT_FAILURE);
-      }
+       if(strcmp(email,"stdout") == 0) {
+               if((fp_top3=fopen(top3,"r"))==NULL) {
+                       debuga(_("(email) Cannot open file %s\n"),top3);
+                       exit(EXIT_FAILURE);
+               }
 
-      while(fgets(warea,sizeof(warea),fp_top3)!=NULL)
-         fputs(warea,stdout);
-    } else {
-      snprintf(warea,sizeof(warea),"%s -s \"SARG %s, %s\" \"%s\" <\"%s\"",MailUtility,_("Report"),asctime(local),email,top3);
-      cstatus=system(warea);
-      if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-         debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
-         debuga(_("command: %s\n"),warea);
-         exit(EXIT_FAILURE);
-      }
-    }
+               while(fgets(warea,sizeof(warea),fp_top3)!=NULL)
+                       fputs(warea,stdout);
+       } else {
+               snprintf(warea,sizeof(warea),"%s -s \"SARG %s, %s\" \"%s\" <\"%s\"",MailUtility,_("Report"),asctime(local),email,top3);
+               cstatus=system(warea);
+               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                       debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
+                       debuga(_("command: %s\n"),warea);
+                       exit(EXIT_FAILURE);
+               }
+       }
 
-   //unlinkdir(TempDir,0);
+       //unlinkdir(TempDir,0);
 
-   return (0);
+       return (0);
 }
index 915dc1541b1285a828db34876f33646c8322617c..0ccfb0702e1966a5bb70157f638fcdce400b9d24 100644 (file)
--- a/exclude.c
+++ b/exclude.c
 
 struct hostip4struct
 {
-   //! The IP address.
-   unsigned long int address;
-   //! The mask to match the address of the URL.
-   unsigned long int mask;
+       //! The IP address.
+       unsigned long int address;
+       //! The mask to match the address of the URL.
+       unsigned long int mask;
 };
 
 struct hostnamestruct
 {
-   //! The URL to match without any leading wildcard.
-   char *url;
-   //! The number of dots in the url if a wildcard is present or -1 if the address is complete (no wildcard)
-   int ndots;
+       //! The URL to match without any leading wildcard.
+       char *url;
+       //! The number of dots in the url if a wildcard is present or -1 if the address is complete (no wildcard)
+       int ndots;
 };
 
 static struct hostip4struct *exclude_ip4=NULL;
@@ -54,355 +54,354 @@ static char *excludeuser=NULL;
 
 static void store_exclude_ip4(unsigned short int *addr,int mask)
 {
-   int i;
-
-   if (num_exclude_ip4>=ip4allocated) {
-      struct hostip4struct *temp;
-
-      ip4allocated+=5;
-      temp=realloc(exclude_ip4,ip4allocated*sizeof(*temp));
-      if (temp==NULL) {
-         debuga(_("Not enough memory to store the exlcluded IP addresses\n"));
-         exit(EXIT_FAILURE);
-      }
-      exclude_ip4=temp;
-   }
-   exclude_ip4[num_exclude_ip4].address=0UL;
-   for (i=0 ; i<4 ; i++)
-      exclude_ip4[num_exclude_ip4].address=(exclude_ip4[num_exclude_ip4].address<<8) | (unsigned char)(addr[i] & 0xFFU);
-   exclude_ip4[num_exclude_ip4].mask=(0xFFFFFFFFUL << (32-mask));
-   num_exclude_ip4++;
+       int i;
+
+       if (num_exclude_ip4>=ip4allocated) {
+               struct hostip4struct *temp;
+
+               ip4allocated+=5;
+               temp=realloc(exclude_ip4,ip4allocated*sizeof(*temp));
+               if (temp==NULL) {
+                       debuga(_("Not enough memory to store the exlcluded IP addresses\n"));
+                       exit(EXIT_FAILURE);
+               }
+               exclude_ip4=temp;
+       }
+       exclude_ip4[num_exclude_ip4].address=0UL;
+       for (i=0 ; i<4 ; i++)
+               exclude_ip4[num_exclude_ip4].address=(exclude_ip4[num_exclude_ip4].address<<8) | (unsigned char)(addr[i] & 0xFFU);
+       exclude_ip4[num_exclude_ip4].mask=(0xFFFFFFFFUL << (32-mask));
+       num_exclude_ip4++;
 }
 
 static void store_exclude_url(char *url,int length)
 {
-   int start;
-   int i;
-   int ndots, firstdot;
-   struct hostnamestruct *item;
-
-   start=0;
-   ndots=-1;
-   firstdot=0;
-   for (i=0 ; i<length ; i++)
-      if (url[i]=='*') {
-         firstdot=1;
-      } else if (url[i]=='.') {
-         if (firstdot) {
-            firstdot=0;
-            ndots=1;
-            start=i+1;
-         } else if (ndots>=0)
-            ndots++;
-      }
-   if (start>=length || firstdot) return;
-   if (start>0) {
-      url+=start;
-      length-=start;
-   }
-
-   if (num_exclude_name>=nameallocated) {
-      struct hostnamestruct *temp;
-
-      nameallocated+=5;
-      temp=realloc(exclude_name,nameallocated*sizeof(*temp));
-      if (temp==NULL) {
-         debuga(_("Not enough memory to store the excluded URLs\n"));
-         exit(EXIT_FAILURE);
-      }
-      exclude_name=temp;
-   }
-
-   item=exclude_name+num_exclude_name;
-   num_exclude_name++;
-   item->url=malloc(length+1);
-   if (!item->url) {
-      debuga(_("Not enough memory to store the excluded URLs\n"));
-      exit(EXIT_FAILURE);
-   }
-   strncpy(item->url,url,length);
-   item->url[length]='\0';
-   item->ndots=(ndots>0) ? ndots : -1;
+       int start;
+       int i;
+       int ndots, firstdot;
+       struct hostnamestruct *item;
+
+       start=0;
+       ndots=-1;
+       firstdot=0;
+       for (i=0 ; i<length ; i++)
+               if (url[i]=='*') {
+                       firstdot=1;
+               } else if (url[i]=='.') {
+                       if (firstdot) {
+                               firstdot=0;
+                               ndots=1;
+                               start=i+1;
+                       } else if (ndots>=0)
+                               ndots++;
+               }
+       if (start>=length || firstdot) return;
+       if (start>0) {
+               url+=start;
+               length-=start;
+       }
+
+       if (num_exclude_name>=nameallocated) {
+               struct hostnamestruct *temp;
+
+               nameallocated+=5;
+               temp=realloc(exclude_name,nameallocated*sizeof(*temp));
+               if (temp==NULL) {
+                       debuga(_("Not enough memory to store the excluded URLs\n"));
+                       exit(EXIT_FAILURE);
+               }
+               exclude_name=temp;
+       }
+
+       item=exclude_name+num_exclude_name;
+       num_exclude_name++;
+       item->url=malloc(length+1);
+       if (!item->url) {
+               debuga(_("Not enough memory to store the excluded URLs\n"));
+               exit(EXIT_FAILURE);
+       }
+       strncpy(item->url,url,length);
+       item->url[length]='\0';
+       item->ndots=(ndots>0) ? ndots : -1;
 }
 
 
 void gethexclude(const char *hexfile, int debug)
 {
-   FILE *fp_ex;
-   char buf[255];
-   int i;
-   int ip_size;
-   unsigned int value4, value6;
-   unsigned short int addr[8];
-   int addr_len;
-   int mask, max_mask;
-
-   if(access(hexfile, R_OK) != 0) {
-      debuga(_("Cannot open exclude_hosts file: %s - %s\n"),hexfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   if(debug)
-      debuga(_("Loading exclude host file from: %s\n"),hexfile);
-
-   if ((fp_ex = fopen(hexfile, "r")) == NULL) {
-      debuga(_("(gethexclude) Cannot open file %s - %s\n"),hexfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   while(fgets(buf,sizeof(buf),fp_ex)!=NULL){
-      if(buf[0]=='#')
-         continue;
-      fixendofline(buf);
-      ip_size=0x60  | 0x04;
-      value4=0U;
-      value6=0U;
-      addr_len=0;
-      for (i=0 ; (unsigned char)buf[i]>' ' && buf[i]!='/' ; i++) {
-         if (ip_size & 0x04) {
-            if (isdigit(buf[i])) {
-               value4=value4*10+(buf[i]-'0');
-               if (value4>0xFFU) ip_size&=~0x04;
-            } else if (buf[i]=='.' && addr_len<4) {
-               addr[addr_len++]=(unsigned short)(value4 & 0xFFU);
-               value4=0U;
-            } else {
-               ip_size&=~0x04;
-            }
-         }
-         if (ip_size & 0x60) {
-            if (isdigit(buf[i])) {
-               value6=(value6<<4)+(buf[i]-'0');
-               if (value6>0xFFFFU) ip_size&=~0x60;
-            } else if (toupper(buf[i])>='A' && toupper(buf[i])<='F') {
-               value6=(value6<<4)+(toupper(buf[i])-'A'+10);
-               if (value6>0xFFFFU) ip_size&=~0x60;
-            } else if (buf[i]==':' && addr_len<8) {
-               addr[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
-               value6=0U;
-            } else {
-               ip_size&=~0x60;
-            }
-         }
-      }
-      if (i==0) continue;
-      if (ip_size & 0x04) {
-         if (addr_len!=3)
-            ip_size&=~0x04;
-         else
-            addr[addr_len++]=(unsigned short)(value4 & 0xFFU);
-      }
-      if (ip_size & 0x60) {
-         if (addr_len>=8)
-            ip_size&=~0x60;
-         else
-            addr[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
-      }
-      if (ip_size) {
-         max_mask=(ip_size & 0x04) ? 4*8 : 8*16;
-         if (buf[i]=='/') {
-            mask=atoi(buf+i+1);
-            if (mask<0 || mask>max_mask) mask=max_mask;
-         } else
-            mask=max_mask;
-         if (ip_size & 0x04)
-            store_exclude_ip4(addr,mask);
-         else {
-            debuga(_("IPv6 addresses are not supported (found in %s)\n"),hexfile);
-            exit(EXIT_FAILURE);
-         }
-      } else {
-         store_exclude_url(buf,i);
-      }
-   }
-
-   fclose(fp_ex);
-   return;
+       FILE *fp_ex;
+       char buf[255];
+       int i;
+       int ip_size;
+       unsigned int value4, value6;
+       unsigned short int addr[8];
+       int addr_len;
+       int mask, max_mask;
+
+       if(access(hexfile, R_OK) != 0) {
+               debuga(_("Cannot open exclude_hosts file: %s - %s\n"),hexfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if(debug)
+               debuga(_("Loading exclude host file from: %s\n"),hexfile);
+
+       if ((fp_ex = fopen(hexfile, "r")) == NULL) {
+               debuga(_("(gethexclude) Cannot open file %s - %s\n"),hexfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       while(fgets(buf,sizeof(buf),fp_ex)!=NULL){
+               if(buf[0]=='#')
+                       continue;
+               fixendofline(buf);
+               ip_size=0x60  | 0x04;
+               value4=0U;
+               value6=0U;
+               addr_len=0;
+               for (i=0 ; (unsigned char)buf[i]>' ' && buf[i]!='/' ; i++) {
+                       if (ip_size & 0x04) {
+                               if (isdigit(buf[i])) {
+                                       value4=value4*10+(buf[i]-'0');
+                                       if (value4>0xFFU) ip_size&=~0x04;
+                               } else if (buf[i]=='.' && addr_len<4) {
+                                       addr[addr_len++]=(unsigned short)(value4 & 0xFFU);
+                                       value4=0U;
+                               } else {
+                                       ip_size&=~0x04;
+                               }
+                       }
+                       if (ip_size & 0x60) {
+                               if (isdigit(buf[i])) {
+                                       value6=(value6<<4)+(buf[i]-'0');
+                                       if (value6>0xFFFFU) ip_size&=~0x60;
+                               } else if (toupper(buf[i])>='A' && toupper(buf[i])<='F') {
+                                       value6=(value6<<4)+(toupper(buf[i])-'A'+10);
+                                       if (value6>0xFFFFU) ip_size&=~0x60;
+                               } else if (buf[i]==':' && addr_len<8) {
+                                       addr[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
+                                       value6=0U;
+                               } else {
+                                       ip_size&=~0x60;
+                               }
+                       }
+               }
+               if (i==0) continue;
+               if (ip_size & 0x04) {
+                       if (addr_len!=3)
+                               ip_size&=~0x04;
+                       else
+                               addr[addr_len++]=(unsigned short)(value4 & 0xFFU);
+               }
+               if (ip_size & 0x60) {
+                       if (addr_len>=8)
+                               ip_size&=~0x60;
+                       else
+                               addr[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
+               }
+               if (ip_size) {
+                       max_mask=(ip_size & 0x04) ? 4*8 : 8*16;
+                       if (buf[i]=='/') {
+                               mask=atoi(buf+i+1);
+                               if (mask<0 || mask>max_mask) mask=max_mask;
+                       } else
+                               mask=max_mask;
+                       if (ip_size & 0x04)
+                               store_exclude_ip4(addr,mask);
+                       else {
+                               debuga(_("IPv6 addresses are not supported (found in %s)\n"),hexfile);
+                               exit(EXIT_FAILURE);
+                       }
+               } else {
+                       store_exclude_url(buf,i);
+               }
+       }
+
+       fclose(fp_ex);
+       return;
 }
 
 int vhexclude(const char *url)
 {
-   int i, j;
-   int length;
-   int ip_size;
-   unsigned int value4, value6;
-   unsigned long int addr4;
-   unsigned short int addr6[8];
-   int addr_len;
-   int dotpos[10];
-   int ndots;
-
-   ip_size=0x60  | 0x04;
-   addr4=0UL;
-   value4=0U;
-   value6=0U;
-   addr_len=0;
-   for (i=0 ; (unsigned char)url[i]>' ' && url[i]!='/' && url[i]!='?'&& ((ip_size & 0x60)!=0 || url[i]!=':') && ip_size ; i++) {
-      if (ip_size & 0x04) {
-         if (isdigit(url[i])) {
-            value4=value4*10+(url[i]-'0');
-            if (value4>0xFFU) ip_size&=~0x04;
-         } else if (url[i]=='.' && addr_len<4) {
-            addr_len++;
-            addr4=(addr4<<8) | (unsigned long int)(value4 & 0xFFU);
-            value4=0U;
-         } else {
-            ip_size&=~0x04;
-         }
-      }
-      if (ip_size & 0x60) {
-         if (isdigit(url[i])) {
-            value6=(value6<<4)+(url[i]-'0');
-            if (value6>0xFFFFU) ip_size&=~0x60;
-         } else if (toupper(url[i])>='A' && toupper(url[i])<='F') {
-            value6=(value6<<4)+(toupper(url[i])-'A'+10);
-            if (value6>0xFFFFU) ip_size&=~0x60;
-         } else if (url[i]==':' && addr_len<8) {
-            addr6[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
-            value6=0U;
-         } else {
-            ip_size&=~0x60;
-         }
-      }
-   }
-   if ((ip_size & 0x04) && addr_len==3) {
-      if (exclude_ip4 == NULL) return(1);
-      addr4=(addr4<<8) | (unsigned long int)(value4 & 0xFFU);
-      for (i=0 ; i<num_exclude_ip4 ; i++)
-         if (((exclude_ip4[i].address ^ addr4) & exclude_ip4[i].mask)==0) return(0);
-   } else if ((ip_size & 0x60) && addr_len<8) {
-      addr6[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
-   } else {
-      if (exclude_name == NULL) return(1);
-      ndots=0;
-      for (length=0 ; (unsigned char)url[length]>' ' && url[length]!=':' && url[length]!='/' && url[length]!='?' ; length++)
-         if (url[length]=='.') {
-            /*
-            We store the position of each dots of the URL to match it against any
-            wildcard in the excluded list. The size of dotpos is big enough for the most
-            ambitious URL but we have a safety mechanism that shift the positions should there be too
-            many dots in the URL.
-            */
-            if (ndots<sizeof(dotpos)/sizeof(dotpos[0]))
-               dotpos[ndots++]=length+1;
-            else {
-               for (j=1 ; j<ndots ; j++) dotpos[j-1]=dotpos[j];
-               dotpos[ndots-1]=length+1;
-            }
-         }
-      if (length>0) {
-         for (i=0 ; i<num_exclude_name ; i++) {
-            if (exclude_name[i].ndots>0) {
-               const char *wurl=url;
-               int len=length;
-               if (exclude_name[i].ndots<=ndots) {
-                  wurl+=dotpos[ndots-exclude_name[i].ndots];
-                  len-=dotpos[ndots-exclude_name[i].ndots];
-               }
-               if (strncmp(exclude_name[i].url,wurl,len)==0 && exclude_name[i].url[len]=='\0') return(0);
-            } else {
-               if (strncmp(exclude_name[i].url,url,length)==0 && exclude_name[i].url[length]=='\0') return(0);
-            }
-         }
-      }
-   }
-
-   return(1);
+       int i, j;
+       int length;
+       int ip_size;
+       unsigned int value4, value6;
+       unsigned long int addr4;
+       unsigned short int addr6[8];
+       int addr_len;
+       int dotpos[10];
+       int ndots;
+
+       ip_size=0x60  | 0x04;
+       addr4=0UL;
+       value4=0U;
+       value6=0U;
+       addr_len=0;
+       for (i=0 ; (unsigned char)url[i]>' ' && url[i]!='/' && url[i]!='?'&& ((ip_size & 0x60)!=0 || url[i]!=':') && ip_size ; i++) {
+               if (ip_size & 0x04) {
+                       if (isdigit(url[i])) {
+                               value4=value4*10+(url[i]-'0');
+                               if (value4>0xFFU) ip_size&=~0x04;
+                       } else if (url[i]=='.' && addr_len<4) {
+                               addr_len++;
+                               addr4=(addr4<<8) | (unsigned long int)(value4 & 0xFFU);
+                               value4=0U;
+                       } else {
+                               ip_size&=~0x04;
+                       }
+               }
+               if (ip_size & 0x60) {
+                       if (isdigit(url[i])) {
+                               value6=(value6<<4)+(url[i]-'0');
+                               if (value6>0xFFFFU) ip_size&=~0x60;
+                       } else if (toupper(url[i])>='A' && toupper(url[i])<='F') {
+                               value6=(value6<<4)+(toupper(url[i])-'A'+10);
+                               if (value6>0xFFFFU) ip_size&=~0x60;
+                       } else if (url[i]==':' && addr_len<8) {
+                               addr6[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
+                               value6=0U;
+                       } else {
+                               ip_size&=~0x60;
+                       }
+               }
+       }
+       if ((ip_size & 0x04) && addr_len==3) {
+               if (exclude_ip4 == NULL) return(1);
+               addr4=(addr4<<8) | (unsigned long int)(value4 & 0xFFU);
+               for (i=0 ; i<num_exclude_ip4 ; i++)
+                       if (((exclude_ip4[i].address ^ addr4) & exclude_ip4[i].mask)==0) return(0);
+       } else if ((ip_size & 0x60) && addr_len<8) {
+               addr6[addr_len++]=(unsigned short)(value6 & 0xFFFFU);
+       } else {
+               if (exclude_name == NULL) return(1);
+               ndots=0;
+               for (length=0 ; (unsigned char)url[length]>' ' && url[length]!=':' && url[length]!='/' && url[length]!='?' ; length++)
+                       if (url[length]=='.') {
+                               /*
+                               We store the position of each dots of the URL to match it against any
+                               wildcard in the excluded list. The size of dotpos is big enough for the most
+                               ambitious URL but we have a safety mechanism that shift the positions should there be too
+                               many dots in the URL.
+                               */
+                               if (ndots<sizeof(dotpos)/sizeof(dotpos[0]))
+                                       dotpos[ndots++]=length+1;
+                               else {
+                                       for (j=1 ; j<ndots ; j++) dotpos[j-1]=dotpos[j];
+                                       dotpos[ndots-1]=length+1;
+                               }
+                       }
+               if (length>0) {
+                       for (i=0 ; i<num_exclude_name ; i++) {
+                               if (exclude_name[i].ndots>0) {
+                                       const char *wurl=url;
+                                       int len=length;
+                                       if (exclude_name[i].ndots<=ndots) {
+                                               wurl+=dotpos[ndots-exclude_name[i].ndots];
+                                               len-=dotpos[ndots-exclude_name[i].ndots];
+                                       }
+                                       if (strncmp(exclude_name[i].url,wurl,len)==0 && exclude_name[i].url[len]=='\0') return(0);
+                               } else {
+                                       if (strncmp(exclude_name[i].url,url,length)==0 && exclude_name[i].url[length]=='\0') return(0);
+                               }
+                       }
+               }
+       }
+
+       return(1);
 }
 
 
 void getuexclude(const char *uexfile, int debug)
 {
-
-   FILE *fp_ex;
-   char buf[255];
-   long int nreg=0;
-
-   if(debug)
-      debuga(_("Loading exclude file from: %s\n"),uexfile);
-
-   if ((fp_ex = fopen(uexfile, "r")) == NULL) {
-      debuga(_("(gethexclude) Cannot open file %s - %s\n"),uexfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if (fseek(fp_ex, 0, SEEK_END)==-1) {
-      debuga(_("Failed to move till the end of the excluded users file %s: %s\n"),uexfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   nreg = ftell(fp_ex);
-   if (nreg<0) {
-      debuga(_("Cannot get the size of file %s\n"),uexfile);
-      exit(EXIT_FAILURE);
-   }
-   nreg += 11;
-   if (fseek(fp_ex, 0, SEEK_SET)==-1) {
-      debuga(_("Failed to rewind the excluded users file %s: %s\n"),uexfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if((excludeuser=(char *) malloc(nreg))==NULL){
-      debuga(_("malloc error (%ld bytes required)\n"),nreg);
-      exit(EXIT_FAILURE);
-   }
-
-   bzero(excludeuser,nreg);
-
-   while(fgets(buf,sizeof(buf),fp_ex)!=NULL){
-     if(strchr(buf,'#') != NULL)
-        continue;
-     fixendofline(buf);
-     strcat(excludeuser,buf);
-     strcat(excludeuser," ");
-   }
-
-   strcat(excludeuser,"*END* ");
-
-   fclose(fp_ex);
-
-   return;
+       FILE *fp_ex;
+       char buf[255];
+       long int nreg=0;
+
+       if(debug)
+               debuga(_("Loading exclude file from: %s\n"),uexfile);
+
+       if ((fp_ex = fopen(uexfile, "r")) == NULL) {
+               debuga(_("(gethexclude) Cannot open file %s - %s\n"),uexfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (fseek(fp_ex, 0, SEEK_END)==-1) {
+               debuga(_("Failed to move till the end of the excluded users file %s: %s\n"),uexfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       nreg = ftell(fp_ex);
+       if (nreg<0) {
+               debuga(_("Cannot get the size of file %s\n"),uexfile);
+               exit(EXIT_FAILURE);
+       }
+       nreg += 11;
+       if (fseek(fp_ex, 0, SEEK_SET)==-1) {
+               debuga(_("Failed to rewind the excluded users file %s: %s\n"),uexfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if((excludeuser=(char *) malloc(nreg))==NULL){
+               debuga(_("malloc error (%ld bytes required)\n"),nreg);
+               exit(EXIT_FAILURE);
+       }
+
+       bzero(excludeuser,nreg);
+
+       while(fgets(buf,sizeof(buf),fp_ex)!=NULL){
+       if(strchr(buf,'#') != NULL)
+               continue;
+       fixendofline(buf);
+       strcat(excludeuser,buf);
+       strcat(excludeuser," ");
+       }
+
+       strcat(excludeuser,"*END* ");
+
+       fclose(fp_ex);
+
+       return;
 }
 
 int vuexclude(const char *user)
 {
-   const char *wuser;
-   int len;
-
-   if (excludeuser) {
-      len=strlen(user);
-      wuser=excludeuser;
-      while ((wuser=strstr(wuser,user))!=NULL) {
-         if (wuser[len]==' ') return(0);
-         wuser+=len;
-      }
-   }
-
-   return(1);
+       const char *wuser;
+       int len;
+
+       if (excludeuser) {
+               len=strlen(user);
+               wuser=excludeuser;
+               while ((wuser=strstr(wuser,user))!=NULL) {
+                       if (wuser[len]==' ') return(0);
+                       wuser+=len;
+               }
+       }
+
+       return(1);
 }
 
 bool is_indexonly(void)
 {
-   if (excludeuser==NULL) return(false);
-   return(strstr(excludeuser,"indexonly") != NULL);
+       if (excludeuser==NULL) return(false);
+       return(strstr(excludeuser,"indexonly") != NULL);
 }
 
 void free_exclude(void)
 {
-   int i;
-
-   if (exclude_ip4) {
-      free(exclude_ip4);
-      exclude_ip4=NULL;
-   }
-
-   if (exclude_name) {
-      for (i=0 ; i<num_exclude_name ; i++)
-         if (exclude_name[i].url) free(exclude_name[i].url);
-      free(exclude_name);
-      exclude_name=NULL;
-   }
-
-   if(excludeuser) {
-      free(excludeuser);
-      excludeuser=NULL;
-   }
+       int i;
+
+       if (exclude_ip4) {
+               free(exclude_ip4);
+               exclude_ip4=NULL;
+       }
+
+       if (exclude_name) {
+               for (i=0 ; i<num_exclude_name ; i++)
+                       if (exclude_name[i].url) free(exclude_name[i].url);
+               free(exclude_name);
+               exclude_name=NULL;
+       }
+
+       if(excludeuser) {
+               free(excludeuser);
+               excludeuser=NULL;
+       }
 }
index 3d08446f23d4d594b231d5b9558f373891872003..8884f8bd4c9eab2914f51bee4e282ed23c85d13d 100644 (file)
--- a/getconf.c
+++ b/getconf.c
@@ -33,749 +33,748 @@ extern numlist hours, weekdays;
 
 struct param_list
 {
-   //! The name of the value of the parameter.
-   const char *name;
-   //! The bit to set if the value is found.
-   unsigned long int value;
-   //! The value is invalid if any bit of this mask is set in the parameter.
-   unsigned long int exclude;
+       //! The name of the value of the parameter.
+       const char *name;
+       //! The bit to set if the value is found.
+       unsigned long int value;
+       //! The value is invalid if any bit of this mask is set in the parameter.
+       unsigned long int exclude;
 };
 
 struct sort_list
 {
-   //! The name of the value of the parameter.
-   const char *name;
-   //! The bit to set if the value is found.
-   unsigned long int value;
+       //! The name of the value of the parameter.
+       const char *name;
+       //! The bit to set if the value is found.
+       unsigned long int value;
 };
 
 static struct param_list report_type_values[]=
 {
-   {"users_sites",REPORT_TYPE_USERS_SITES,0},
-   {"topusers",REPORT_TYPE_TOPUSERS,0},
-   {"topsites",REPORT_TYPE_TOPSITES,0},
-   {"sites_users",REPORT_TYPE_SITES_USERS,0},
-   {"date_time",REPORT_TYPE_DATE_TIME,0},
-   {"denied",REPORT_TYPE_DENIED,0},
-   {"auth_failures",REPORT_TYPE_AUTH_FAILURES,0},
-   {"site_user_time_date",REPORT_TYPE_SITE_USER_TIME_DATE,0},
-   {"downloads",REPORT_TYPE_DOWNLOADS,0},
+       {"users_sites",REPORT_TYPE_USERS_SITES,0},
+       {"topusers",REPORT_TYPE_TOPUSERS,0},
+       {"topsites",REPORT_TYPE_TOPSITES,0},
+       {"sites_users",REPORT_TYPE_SITES_USERS,0},
+       {"date_time",REPORT_TYPE_DATE_TIME,0},
+       {"denied",REPORT_TYPE_DENIED,0},
+       {"auth_failures",REPORT_TYPE_AUTH_FAILURES,0},
+       {"site_user_time_date",REPORT_TYPE_SITE_USER_TIME_DATE,0},
+       {"downloads",REPORT_TYPE_DOWNLOADS,0},
 };
 
 static struct param_list data_field_values[]=
 {
-   {"user",DATA_FIELD_USER,0},
-   {"date",DATA_FIELD_DATE,0},
-   {"time",DATA_FIELD_TIME,0},
-   {"url",DATA_FIELD_URL,0},
-   {"connect",DATA_FIELD_CONNECT,0},
-   {"bytes",DATA_FIELD_BYTES,0},
-   {"in_cache",DATA_FIELD_IN_CACHE,0},
-   {"out_cache",DATA_FIELD_OUT_CACHE,0},
-   {"elapsed",DATA_FIELD_ELAPSED,0},
+       {"user",DATA_FIELD_USER,0},
+       {"date",DATA_FIELD_DATE,0},
+       {"time",DATA_FIELD_TIME,0},
+       {"url",DATA_FIELD_URL,0},
+       {"connect",DATA_FIELD_CONNECT,0},
+       {"bytes",DATA_FIELD_BYTES,0},
+       {"in_cache",DATA_FIELD_IN_CACHE,0},
+       {"out_cache",DATA_FIELD_OUT_CACHE,0},
+       {"elapsed",DATA_FIELD_ELAPSED,0},
 };
 
 static struct param_list topuserfields_values[]=
 {
-   {"NUM",TOPUSERFIELDS_NUM,0},
-   {"DATE_TIME",TOPUSERFIELDS_DATE_TIME,0},
-   {"USERID",TOPUSERFIELDS_USERID,0},
-   {"CONNECT",TOPUSERFIELDS_CONNECT,0},
-   {"BYTES",TOPUSERFIELDS_BYTES,0},
-   {"%BYTES",TOPUSERFIELDS_SETYB,0},
-   {"SETYB",TOPUSERFIELDS_SETYB,0},
-   {"IN-CACHE-OUT",TOPUSERFIELDS_IN_CACHE_OUT,0},
-   {"USED_TIME",TOPUSERFIELDS_USED_TIME,0},
-   {"MILISEC",TOPUSERFIELDS_MILISEC,0},
-   {"%TIME",TOPUSERFIELDS_PTIME,0},
-   {"TOTAL",TOPUSERFIELDS_TOTAL,0},
-   {"AVERAGE",TOPUSERFIELDS_AVERAGE,0},
+       {"NUM",TOPUSERFIELDS_NUM,0},
+       {"DATE_TIME",TOPUSERFIELDS_DATE_TIME,0},
+       {"USERID",TOPUSERFIELDS_USERID,0},
+       {"CONNECT",TOPUSERFIELDS_CONNECT,0},
+       {"BYTES",TOPUSERFIELDS_BYTES,0},
+       {"%BYTES",TOPUSERFIELDS_SETYB,0},
+       {"SETYB",TOPUSERFIELDS_SETYB,0},
+       {"IN-CACHE-OUT",TOPUSERFIELDS_IN_CACHE_OUT,0},
+       {"USED_TIME",TOPUSERFIELDS_USED_TIME,0},
+       {"MILISEC",TOPUSERFIELDS_MILISEC,0},
+       {"%TIME",TOPUSERFIELDS_PTIME,0},
+       {"TOTAL",TOPUSERFIELDS_TOTAL,0},
+       {"AVERAGE",TOPUSERFIELDS_AVERAGE,0},
 };
 
 static struct param_list userreportfields_values[]=
 {
-   {"CONNECT",USERREPORTFIELDS_CONNECT,0},
-   {"BYTES",USERREPORTFIELDS_BYTES,0},
-   {"%BYTES",USERREPORTFIELDS_SETYB,0},
-   {"SETYB",USERREPORTFIELDS_SETYB,0},
-   {"IN-CACHE-OUT",USERREPORTFIELDS_IN_CACHE_OUT,0},
-   {"USED_TIME",USERREPORTFIELDS_USED_TIME,0},
-   {"MILISEC",USERREPORTFIELDS_MILISEC,0},
-   {"%TIME",USERREPORTFIELDS_PTIME,0},
-   {"TOTAL",USERREPORTFIELDS_TOTAL,0},
-   {"AVERAGE",USERREPORTFIELDS_AVERAGE,0},
+       {"CONNECT",USERREPORTFIELDS_CONNECT,0},
+       {"BYTES",USERREPORTFIELDS_BYTES,0},
+       {"%BYTES",USERREPORTFIELDS_SETYB,0},
+       {"SETYB",USERREPORTFIELDS_SETYB,0},
+       {"IN-CACHE-OUT",USERREPORTFIELDS_IN_CACHE_OUT,0},
+       {"USED_TIME",USERREPORTFIELDS_USED_TIME,0},
+       {"MILISEC",USERREPORTFIELDS_MILISEC,0},
+       {"%TIME",USERREPORTFIELDS_PTIME,0},
+       {"TOTAL",USERREPORTFIELDS_TOTAL,0},
+       {"AVERAGE",USERREPORTFIELDS_AVERAGE,0},
 };
 
 static struct param_list index_values[]=
 {
-   {"yes",INDEX_YES,~INDEX_YES},
-   {"no",INDEX_NO,~INDEX_NO},
-   {"only",INDEX_ONLY,~INDEX_ONLY},
+       {"yes",INDEX_YES,~INDEX_YES},
+       {"no",INDEX_NO,~INDEX_NO},
+       {"only",INDEX_ONLY,~INDEX_ONLY},
 };
 
 static struct param_list index_tree_values[]=
 {
-   {"date",INDEX_TREE_DATE,~INDEX_TREE_DATE},
-   {"file",INDEX_TREE_FILE,~INDEX_TREE_FILE},
+       {"date",INDEX_TREE_DATE,~INDEX_TREE_DATE},
+       {"file",INDEX_TREE_FILE,~INDEX_TREE_FILE},
 };
 
 static struct param_list ntml_userformat_values[]=
 {
-   {"user",NTLMUSERFORMAT_USER,~NTLMUSERFORMAT_USER},
-   {"domainname+username",NTLMUSERFORMAT_DOMAINUSER,~NTLMUSERFORMAT_DOMAINUSER},
+       {"user",NTLMUSERFORMAT_USER,~NTLMUSERFORMAT_USER},
+       {"domainname+username",NTLMUSERFORMAT_DOMAINUSER,~NTLMUSERFORMAT_DOMAINUSER},
 };
 
 static struct param_list recnouser_values[]=
 {
-   {"ip",RECORDWITHOUTUSER_IP,~RECORDWITHOUTUSER_IP},
-   {"ignore",RECORDWITHOUTUSER_IGNORE,~RECORDWITHOUTUSER_IGNORE},
-   {"everybody",RECORDWITHOUTUSER_EVERYBODY,~RECORDWITHOUTUSER_EVERYBODY},
+       {"ip",RECORDWITHOUTUSER_IP,~RECORDWITHOUTUSER_IP},
+       {"ignore",RECORDWITHOUTUSER_IGNORE,~RECORDWITHOUTUSER_IGNORE},
+       {"everybody",RECORDWITHOUTUSER_EVERYBODY,~RECORDWITHOUTUSER_EVERYBODY},
 };
 
 static struct param_list datafileurl_values[]=
 {
-   {"ip",DATAFILEURL_IP,~DATAFILEURL_IP},
-   {"name",DATAFILEURL_NAME,~DATAFILEURL_NAME},
+       {"ip",DATAFILEURL_IP,~DATAFILEURL_IP},
+       {"name",DATAFILEURL_NAME,~DATAFILEURL_NAME},
 };
 
 static struct param_list displayvalue_values[]=
 {
-   {"bytes",DISPLAY_BYTES,~DISPLAY_BYTES},
-   {"abbreviation",DISPLAY_ABBREV,~DISPLAY_ABBREV},
+       {"bytes",DISPLAY_BYTES,~DISPLAY_BYTES},
+       {"abbreviation",DISPLAY_ABBREV,~DISPLAY_ABBREV},
 };
 
 static struct param_list datetime_values[]=
 {
-   {"elap",DATETIME_ELAP,0},
-   {"bytes",DATETIME_BYTE,0},
+       {"elap",DATETIME_ELAP,0},
+       {"bytes",DATETIME_BYTE,0},
 };
 
 static struct param_list realtime_unauth_values[]=
 {
-   {"show",REALTIME_UNAUTH_REC_SHOW,~REALTIME_UNAUTH_REC_SHOW},
-   {"ignore",REALTIME_UNAUTH_REC_IGNORE,~REALTIME_UNAUTH_REC_IGNORE},
+       {"show",REALTIME_UNAUTH_REC_SHOW,~REALTIME_UNAUTH_REC_SHOW},
+       {"ignore",REALTIME_UNAUTH_REC_IGNORE,~REALTIME_UNAUTH_REC_IGNORE},
 };
 
 struct sort_list topuser_sort[]=
 {
-   {"BYTES",TOPUSER_SORT_BYTES},
-   {"USER",TOPUSER_SORT_USER},
-   {"CONNECT",TOPUSER_SORT_CONNECT},
-   {"TIME",TOPUSER_SORT_TIME},
+       {"BYTES",TOPUSER_SORT_BYTES},
+       {"USER",TOPUSER_SORT_USER},
+       {"CONNECT",TOPUSER_SORT_CONNECT},
+       {"TIME",TOPUSER_SORT_TIME},
 };
 
 struct sort_list topsite_sort[]=
 {
-   {"BYTES",TOPSITE_SORT_BYTES},
-   {"CONNECT",TOPSITE_SORT_CONNECT},
-   {"TIME",TOPSITE_SORT_TIME},
+       {"BYTES",TOPSITE_SORT_BYTES},
+       {"CONNECT",TOPSITE_SORT_CONNECT},
+       {"TIME",TOPSITE_SORT_TIME},
 };
 
 struct sort_list user_sort[]=
 {
-   {"BYTES",USER_SORT_BYTES},
-   {"SITE",USER_SORT_SITE},
-   {"CONNECT",USER_SORT_CONNECT},
-   {"TIME",USER_SORT_TIME},
+       {"BYTES",USER_SORT_BYTES},
+       {"SITE",USER_SORT_SITE},
+       {"CONNECT",USER_SORT_CONNECT},
+       {"TIME",USER_SORT_TIME},
 };
 
 static int is_param(const char *param,const char *buf)
 {
-   int plen;
+       int plen;
 
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   return(1);
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       return(1);
 }
 
 static int getparam_string(const char *param,char *buf,char *value,int value_size)
 {
-   int plen;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   if (strlen(buf)>=value_size) {
-      debuga(_("The string value of parameter \"%s\" is too long\n"),param);
-      exit(EXIT_FAILURE);
-   }
-   strcpy(value,buf);
-   fixnone(value);
-   return(1);
+       int plen;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       if (strlen(buf)>=value_size) {
+               debuga(_("The string value of parameter \"%s\" is too long\n"),param);
+               exit(EXIT_FAILURE);
+       }
+       strcpy(value,buf);
+       fixnone(value);
+       return(1);
 }
 
 static int getparam_quoted(const char *param,char *buf,char *value,int value_size)
 {
-   int plen;
-   int i;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   if (*buf != '\"') {
-      debuga(_("Missing double quote after parameter \"%s\"\n"),param);
-      exit(EXIT_FAILURE);
-   }
-   buf++;
-
-   value_size--;
-   for (i=0 ; i<value_size && *buf && *buf!='\"' ; i++) {
-      value[i]=*buf++;
-   }
-   value[i]='\0';
-
-   if (*buf != '\"') {
-      debuga(_("Missing double quote after parameter \"%s\" or value is more than %d bytes long\n"),param,value_size);
-      exit(EXIT_FAILURE);
-   }
-   fixnone(value);
-   return(1);
+       int plen;
+       int i;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       if (*buf != '\"') {
+               debuga(_("Missing double quote after parameter \"%s\"\n"),param);
+               exit(EXIT_FAILURE);
+       }
+       buf++;
+
+       value_size--;
+       for (i=0 ; i<value_size && *buf && *buf!='\"' ; i++) {
+               value[i]=*buf++;
+       }
+       value[i]='\0';
+
+       if (*buf != '\"') {
+               debuga(_("Missing double quote after parameter \"%s\" or value is more than %d bytes long\n"),param,value_size);
+               exit(EXIT_FAILURE);
+       }
+       fixnone(value);
+       return(1);
 }
 
 static int getparam_2words(const char *param,char *buf,char *word1,int word1_size,char *word2,int word2_size)
 {
-   int plen;
-   int i;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   for (i=0 ; i<word1_size && *buf && (unsigned char)*buf>' ' ; i++)
-      word1[i]=*buf++;
-   if (i>=word1_size) {
-      debuga(_("The first word of parameter \"%s\" is more than %d bytes long\n"),param,word1_size-1);
-      exit(EXIT_FAILURE);
-   }
-   if (*buf!=' ') {
-      debuga(_("Missing second word for parameter \"%s\"\n"),param);
-      exit(EXIT_FAILURE);
-   }
-   word1[i]=0;
-
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   for (i=0 ; i<word2_size && *buf && (unsigned char)*buf>' ' ; i++)
-      word2[i]=*buf++;
-   if (i>=word2_size) {
-      debuga(_("The second word of parameter \"%s\" is more than %d bytes long\n"),param,word2_size-1);
-      exit(EXIT_FAILURE);
-   }
-   word2[i]=0;
-
-   fixnone(word1);
-   fixnone(word2);
-   return(1);
+       int plen;
+       int i;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       for (i=0 ; i<word1_size && *buf && (unsigned char)*buf>' ' ; i++)
+               word1[i]=*buf++;
+       if (i>=word1_size) {
+               debuga(_("The first word of parameter \"%s\" is more than %d bytes long\n"),param,word1_size-1);
+               exit(EXIT_FAILURE);
+       }
+       if (*buf!=' ') {
+               debuga(_("Missing second word for parameter \"%s\"\n"),param);
+               exit(EXIT_FAILURE);
+       }
+       word1[i]=0;
+
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       for (i=0 ; i<word2_size && *buf && (unsigned char)*buf>' ' ; i++)
+               word2[i]=*buf++;
+       if (i>=word2_size) {
+               debuga(_("The second word of parameter \"%s\" is more than %d bytes long\n"),param,word2_size-1);
+               exit(EXIT_FAILURE);
+       }
+       word2[i]=0;
+
+       fixnone(word1);
+       fixnone(word2);
+       return(1);
 }
 
 static int getparam_int(const char *param,char *buf,int *value)
 {
-   int plen;
-   int next;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   next=0;
-   if (sscanf(buf,"%d%n",value,&next) != 1 || (unsigned char)buf[next] > ' ') {
-      debuga(_("The integer value of parameter \"%s\" is invalid\n"),param);
-      exit(EXIT_FAILURE);
-   }
-   return(1);
+       int plen;
+       int next;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       next=0;
+       if (sscanf(buf,"%d%n",value,&next) != 1 || (unsigned char)buf[next] > ' ') {
+               debuga(_("The integer value of parameter \"%s\" is invalid\n"),param);
+               exit(EXIT_FAILURE);
+       }
+       return(1);
 }
 
 static int getparam_bool(const char *param,char *buf,bool *value)
 {
-   int plen;
-   int i;
-   const char *bool_str="yes,true,on,1";
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   *value=false;
-   for ( ; *bool_str ; bool_str+=i) {
-      for (i=0 ; bool_str[i] && bool_str[i]!=',' ; i++);
-      if (strncasecmp(bool_str,buf,i)==0) {
-         *value=true;
-         break;
-      }
-      if (bool_str[i]==',') i++;
-   }
-   return(1);
+       int plen;
+       int i;
+       const char *bool_str="yes,true,on,1";
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       *value=false;
+       for ( ; *bool_str ; bool_str+=i) {
+               for (i=0 ; bool_str[i] && bool_str[i]!=',' ; i++);
+               if (strncasecmp(bool_str,buf,i)==0) {
+                       *value=true;
+                       break;
+               }
+               if (bool_str[i]==',') i++;
+       }
+       return(1);
 }
 
 static int getparam_list(const char *param,struct param_list *options,int noptions,char *buf,unsigned long int *value)
 {
-   int plen;
-   char *str;
-   int i;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   *value=0UL;
-   while (*buf) {
-      str=buf;
-      while (*str && (unsigned char)*str>' ' && *str!=';') str++;
-      if (*str) {
-         *str++='\0';
-         while (*str && ((unsigned char)*str<=' ' || *str==';')) str++;
-      }
-      for (i=0 ; i<noptions && strcasecmp(buf,options[i].name) ; i++);
-      if (i>=noptions) {
-         debuga(_("Unknown value \"%s\" for parameter \"%s\"\n"),buf,param);
-         exit(EXIT_FAILURE);
-      }
-      if ((*value & options[i].exclude)!=0) {
-         debuga(_("Value \"%s\" conflicts with other selected values for parameter \"%s\"\n"),buf,param);
-         exit(EXIT_FAILURE);
-      }
-      *value|=options[i].value;
-      buf=str;
-   }
-   return(1);
+       int plen;
+       char *str;
+       int i;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       *value=0UL;
+       while (*buf) {
+               str=buf;
+               while (*str && (unsigned char)*str>' ' && *str!=';') str++;
+               if (*str) {
+                       *str++='\0';
+                       while (*str && ((unsigned char)*str<=' ' || *str==';')) str++;
+               }
+               for (i=0 ; i<noptions && strcasecmp(buf,options[i].name) ; i++);
+               if (i>=noptions) {
+                       debuga(_("Unknown value \"%s\" for parameter \"%s\"\n"),buf,param);
+                       exit(EXIT_FAILURE);
+               }
+               if ((*value & options[i].exclude)!=0) {
+                       debuga(_("Value \"%s\" conflicts with other selected values for parameter \"%s\"\n"),buf,param);
+                       exit(EXIT_FAILURE);
+               }
+               *value|=options[i].value;
+               buf=str;
+       }
+       return(1);
 }
 
 static int getparam_sort(const char *param,struct sort_list *options,int noptions,char *buf,unsigned long int *value)
 {
-   int plen;
-   char *str, *order;
-   int i;
-
-   plen=strlen(param);
-   if (strncmp(buf,param,plen) != 0) return(0);
-   buf+=plen;
-   if ((unsigned char)*buf>' ') return(0);
-   while (*buf && (unsigned char)*buf<=' ') buf++;
-
-   str=buf;
-   order=NULL;
-   while (*str && (unsigned char)*str>' ') str++;
-   if (*str) {
-      *str++='\0';
-      while (*str && (unsigned char)*str<=' ') str++;
-      order=str;
-   }
-   for (i=0 ; i<noptions && strcasecmp(buf,options[i].name) ; i++);
-   if (i>=noptions) {
-      debuga(_("Unknown sort criterion \"%s\" for parameter \"%s\"\n"),buf,param);
-      exit(EXIT_FAILURE);
-   }
-   *value=options[i].value;
-
-   if (order) {
-      str=order;
-      while (*str && (unsigned char)*str>' ') str++;
-      if (*str) {
-         *str++='\0';
-         while (*str && (unsigned char)*str<=' ') str++;
-      }
-      if (strcasecmp(order,"reverse")==0 || strcasecmp(order,"D")==0) {
-         *value|=SORT_REVERSE;
-      } else if (strcasecmp(order,"normal")!=0 && strcasecmp(order,"A")!=0) {
-         debuga(_("Unknown sort order \"%s\" for parameter \"%s\"\n"),order,param);
-         exit(EXIT_FAILURE);
-      }
-   }
-
-   buf=str;
-   return(1);
+       int plen;
+       char *str, *order;
+       int i;
+
+       plen=strlen(param);
+       if (strncmp(buf,param,plen) != 0) return(0);
+       buf+=plen;
+       if ((unsigned char)*buf>' ') return(0);
+       while (*buf && (unsigned char)*buf<=' ') buf++;
+
+       str=buf;
+       order=NULL;
+       while (*str && (unsigned char)*str>' ') str++;
+       if (*str) {
+               *str++='\0';
+               while (*str && (unsigned char)*str<=' ') str++;
+               order=str;
+       }
+       for (i=0 ; i<noptions && strcasecmp(buf,options[i].name) ; i++);
+       if (i>=noptions) {
+               debuga(_("Unknown sort criterion \"%s\" for parameter \"%s\"\n"),buf,param);
+               exit(EXIT_FAILURE);
+       }
+       *value=options[i].value;
+
+       if (order) {
+               str=order;
+               while (*str && (unsigned char)*str>' ') str++;
+               if (*str) {
+                       *str++='\0';
+                       while (*str && (unsigned char)*str<=' ') str++;
+               }
+               if (strcasecmp(order,"reverse")==0 || strcasecmp(order,"D")==0) {
+                       *value|=SORT_REVERSE;
+               } else if (strcasecmp(order,"normal")!=0 && strcasecmp(order,"A")!=0) {
+                       debuga(_("Unknown sort order \"%s\" for parameter \"%s\"\n"),order,param);
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       buf=str;
+       return(1);
 }
 
 static void parmtest(char *buf)
 {
-   char wbuf[2048];
-   struct getwordstruct gwarea;
+       char wbuf[2048];
+       struct getwordstruct gwarea;
 
-   while (*buf && (unsigned char)*buf<=' ') buf++;
+       while (*buf && (unsigned char)*buf<=' ') buf++;
 
-   if(*buf == '#' || *buf == '\0')
-      return;
+       if(*buf == '#' || *buf == '\0')
+               return;
 
-   if(debugz)
-      printf(_("SARG: TAG: %s\n"),buf);
+       if(debugz)
+               printf(_("SARG: TAG: %s\n"),buf);
 
-   if (getparam_string("background_color",buf,BgColor,sizeof(BgColor))>0) return;
+       if (getparam_string("background_color",buf,BgColor,sizeof(BgColor))>0) return;
 
-   if (getparam_string("text_color",buf,TxColor,sizeof(TxColor))>0) return;
+       if (getparam_string("text_color",buf,TxColor,sizeof(TxColor))>0) return;
 
-   if (getparam_string("text_bgcolor",buf,TxBgColor,sizeof(TxBgColor))>0) return;
+       if (getparam_string("text_bgcolor",buf,TxBgColor,sizeof(TxBgColor))>0) return;
 
-   if (getparam_string("title_color",buf,TiColor,sizeof(TiColor))>0) return;
+       if (getparam_string("title_color",buf,TiColor,sizeof(TiColor))>0) return;
 
-   if (getparam_string("logo_image",buf,LogoImage,sizeof(LogoImage))>0) return;
+       if (getparam_string("logo_image",buf,LogoImage,sizeof(LogoImage))>0) return;
 
-   if (getparam_quoted("logo_text",buf,LogoText,sizeof(LogoText))>0) return;
+       if (getparam_quoted("logo_text",buf,LogoText,sizeof(LogoText))>0) return;
 
-   if (getparam_string("logo_text_color",buf,LogoTextColor,sizeof(LogoTextColor))>0) return;
+       if (getparam_string("logo_text_color",buf,LogoTextColor,sizeof(LogoTextColor))>0) return;
 
-   if (getparam_string("background_image",buf,BgImage,sizeof(BgImage))>0) return;
+       if (getparam_string("background_image",buf,BgImage,sizeof(BgImage))>0) return;
 
-   if (getparam_bool("show_sarg_info",buf,&ShowSargInfo)>0) return;
+       if (getparam_bool("show_sarg_info",buf,&ShowSargInfo)>0) return;
 
-   if (getparam_bool("show_sarg_logo",buf,&ShowSargLogo)>0) return;
+       if (getparam_bool("show_sarg_logo",buf,&ShowSargLogo)>0) return;
 
-   if (getparam_string("font_face",buf,FontFace,sizeof(FontFace))>0) return;
+       if (getparam_string("font_face",buf,FontFace,sizeof(FontFace))>0) return;
 
-   if (getparam_string("header_color",buf,HeaderColor,sizeof(HeaderColor))>0) return;
+       if (getparam_string("header_color",buf,HeaderColor,sizeof(HeaderColor))>0) return;
 
-   if (getparam_string("header_bgcolor",buf,HeaderBgColor,sizeof(HeaderBgColor))>0) return;
+       if (getparam_string("header_bgcolor",buf,HeaderBgColor,sizeof(HeaderBgColor))>0) return;
 
-   if (getparam_string("font_size",buf,FontSize,sizeof(FontSize))>0) return;
+       if (getparam_string("font_size",buf,FontSize,sizeof(FontSize))>0) return;
 
-   if (getparam_string("header_font_size",buf,HeaderFontSize,sizeof(HeaderFontSize))>0) return;
+       if (getparam_string("header_font_size",buf,HeaderFontSize,sizeof(HeaderFontSize))>0) return;
 
-   if (getparam_string("title_font_size",buf,TitleFontSize,sizeof(TitleFontSize))>0) return;
+       if (getparam_string("title_font_size",buf,TitleFontSize,sizeof(TitleFontSize))>0) return;
 
-   if (getparam_2words("image_size",buf,Width,sizeof(Width),Height,sizeof(Height))>0) return;
+       if (getparam_2words("image_size",buf,Width,sizeof(Width),Height,sizeof(Height))>0) return;
 
-   if (getparam_quoted("title",buf,Title,sizeof(Title))>0) return;
+       if (getparam_quoted("title",buf,Title,sizeof(Title))>0) return;
 
-   if (getparam_bool("resolve_ip",buf,&Ip2Name)>0) return;
+       if (getparam_bool("resolve_ip",buf,&Ip2Name)>0) return;
 
-   if (getparam_bool("user_ip",buf,&UserIp)>0) return;
+       if (getparam_bool("user_ip",buf,&UserIp)>0) return;
 
-   if (getparam_string("max_elapsed",buf,MaxElapsed,sizeof(MaxElapsed))>0) return;
+       if (getparam_string("max_elapsed",buf,MaxElapsed,sizeof(MaxElapsed))>0) return;
 
-   if (is_param("date_format",buf)) {
-      getword_start(&gwarea,buf);
-      if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
-         debuga(_("Maybe you have a broken record or garbage in \"date_format\" parameter\n"));
-         exit(EXIT_FAILURE);
-      }
-      strncpy(DateFormat,gwarea.current,1);
-      fixnone(DateFormat);
-      return;
-   }
+       if (is_param("date_format",buf)) {
+               getword_start(&gwarea,buf);
+               if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in \"date_format\" parameter\n"));
+                       exit(EXIT_FAILURE);
+               }
+               strncpy(DateFormat,gwarea.current,1);
+               fixnone(DateFormat);
+               return;
+       }
 
-   if (is_param("hours",buf)) {
-      if( getnumlist( buf, &hours, 24, 24 ) ) {
-         debuga(_("Error: Invalid syntax in hours tag!\n"));
-         exit( 1 );
-      }
-      return;
-   }
+       if (is_param("hours",buf)) {
+               if( getnumlist( buf, &hours, 24, 24 ) ) {
+                       debuga(_("Error: Invalid syntax in hours tag!\n"));
+                       exit( 1 );
+               }
+               return;
+       }
 
-   if (is_param("weekdays",buf)) {
-      if( getnumlist( buf, &weekdays, 7, 7 ) ) {
-         debuga(_("Error: Invalid syntax in weekdays tag!\n"));
-         exit( 1 );
-      }
-      return;
-   }
+       if (is_param("weekdays",buf)) {
+               if( getnumlist( buf, &weekdays, 7, 7 ) ) {
+                       debuga(_("Error: Invalid syntax in weekdays tag!\n"));
+                       exit( 1 );
+               }
+               return;
+       }
 
-   if (getparam_sort("topuser_sort_field",SET_LIST(topuser_sort),buf,&TopuserSort)>0) return;
+       if (getparam_sort("topuser_sort_field",SET_LIST(topuser_sort),buf,&TopuserSort)>0) return;
 
-   if (getparam_sort("user_sort_field",SET_LIST(user_sort),buf,&UserSort)>0) return;
+       if (getparam_sort("user_sort_field",SET_LIST(user_sort),buf,&UserSort)>0) return;
 
-   if (is_param("access_log",buf)>0) {
-      if (AccessLogFromCmdLine==0) {
-         if (NAccessLog>=MAXLOGS) {
-            debuga(_("Too many log files in configuration file\n"));
-            exit(EXIT_FAILURE);
-         }
-         getparam_string("access_log",buf,AccessLog[NAccessLog],MAX_LOG_FILELEN);
-         NAccessLog++;
-      }
-      return;
-   }
+       if (is_param("access_log",buf)>0) {
+               if (AccessLogFromCmdLine==0) {
+                       if (NAccessLog>=MAXLOGS) {
+                               debuga(_("Too many log files in configuration file\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       getparam_string("access_log",buf,AccessLog[NAccessLog],MAX_LOG_FILELEN);
+                       NAccessLog++;
+               }
+               return;
+       }
 
-   if (is_param("redirector_log",buf)>0) {
-      if (RedirectorLogFromCmdLine==0) {
-         if (NRedirectorLogs>=MAX_REDIRECTOR_LOGS) {
-            debuga(_("Too many redirector log files in configuration file\n"));
-            exit(EXIT_FAILURE);
-         }
-         getparam_string("redirector_log",buf,RedirectorLogs[NRedirectorLogs],MAX_REDIRECTOR_FILELEN);
-         NRedirectorLogs++;
-      }
-      return;
-   }
+       if (is_param("redirector_log",buf)>0) {
+               if (RedirectorLogFromCmdLine==0) {
+                       if (NRedirectorLogs>=MAX_REDIRECTOR_LOGS) {
+                               debuga(_("Too many redirector log files in configuration file\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       getparam_string("redirector_log",buf,RedirectorLogs[NRedirectorLogs],MAX_REDIRECTOR_FILELEN);
+                       NRedirectorLogs++;
+               }
+               return;
+       }
 
-   if (getparam_string("useragent_log",buf,UserAgentLog,sizeof(UserAgentLog))>0) return;
+       if (getparam_string("useragent_log",buf,UserAgentLog,sizeof(UserAgentLog))>0) return;
 
-   if (getparam_string("exclude_hosts",buf,ExcludeHosts,sizeof(ExcludeHosts))>0) return;
+       if (getparam_string("exclude_hosts",buf,ExcludeHosts,sizeof(ExcludeHosts))>0) return;
 
-   if (getparam_string("exclude_codes",buf,ExcludeCodes,sizeof(ExcludeCodes))>0) return;
+       if (getparam_string("exclude_codes",buf,ExcludeCodes,sizeof(ExcludeCodes))>0) return;
 
-   if (getparam_string("exclude_users",buf,ExcludeUsers,sizeof(ExcludeUsers))>0) return;
+       if (getparam_string("exclude_users",buf,ExcludeUsers,sizeof(ExcludeUsers))>0) return;
 
-   if (getparam_string("password",buf,PasswdFile,sizeof(PasswdFile))>0) return;
+       if (getparam_string("password",buf,PasswdFile,sizeof(PasswdFile))>0) return;
 
-   if (getparam_string("temporary_dir",buf,TempDir,sizeof(TempDir))>0) return;
+       if (getparam_string("temporary_dir",buf,TempDir,sizeof(TempDir))>0) return;
 
-   if (getparam_list("report_type",SET_LIST(report_type_values),buf,&ReportType)>0) return;
+       if (getparam_list("report_type",SET_LIST(report_type_values),buf,&ReportType)>0) return;
 
-   if (getparam_string("output_dir",buf,OutputDir,sizeof(OutputDir))>0) return;
+       if (getparam_string("output_dir",buf,OutputDir,sizeof(OutputDir))>0) return;
 
-   if (getparam_string("output_email",buf,OutputEmail,sizeof(OutputEmail))>0) return;
+       if (getparam_string("output_email",buf,OutputEmail,sizeof(OutputEmail))>0) return;
 
-   if (getparam_2words("per_user_limit",buf,PerUserLimitFile,sizeof(PerUserLimitFile),wbuf,sizeof(wbuf))>0) {
-      PerUserLimit=atoi(wbuf);
-      return;
-   }
+       if (getparam_2words("per_user_limit",buf,PerUserLimitFile,sizeof(PerUserLimitFile),wbuf,sizeof(wbuf))>0) {
+               PerUserLimit=atoi(wbuf);
+               return;
+       }
 
-   if (getparam_int("lastlog",buf,&LastLog)>0) return;
+       if (getparam_int("lastlog",buf,&LastLog)>0) return;
 
-   if (getparam_bool("remove_temp_files",buf,&RemoveTempFiles)>0) return;
+       if (getparam_bool("remove_temp_files",buf,&RemoveTempFiles)>0) return;
 
-   if (getparam_string("replace_index",buf,ReplaceIndex,sizeof(ReplaceIndex))>0) return;
+       if (getparam_string("replace_index",buf,ReplaceIndex,sizeof(ReplaceIndex))>0) return;
 
-   if (getparam_list("index_tree",SET_LIST(index_tree_values),buf,&IndexTree)>0) return;
+       if (getparam_list("index_tree",SET_LIST(index_tree_values),buf,&IndexTree)>0) return;
 
-   if (getparam_list("index",SET_LIST(index_values),buf,&Index)>0) return;
+       if (getparam_list("index",SET_LIST(index_values),buf,&Index)>0) return;
 
-   if (getparam_bool("overwrite_report",buf,&OverwriteReport)>0) return;
+       if (getparam_bool("overwrite_report",buf,&OverwriteReport)>0) return;
 
-   if (getparam_list("records_without_userid",SET_LIST(recnouser_values),buf,&RecordsWithoutUser)>0) return;
+       if (getparam_list("records_without_userid",SET_LIST(recnouser_values),buf,&RecordsWithoutUser)>0) return;
 
-   if (getparam_bool("use_comma",buf,&UseComma)>0) return;
+       if (getparam_bool("use_comma",buf,&UseComma)>0) return;
 
-   if (getparam_string("mail_utility",buf,MailUtility,sizeof(MailUtility))>0) return;
+       if (getparam_string("mail_utility",buf,MailUtility,sizeof(MailUtility))>0) return;
 
-   if (getparam_int("topsites_num",buf,&TopSitesNum)>0) return;
+       if (getparam_int("topsites_num",buf,&TopSitesNum)>0) return;
 
-   if (getparam_int("topuser_num",buf,&TopUsersNum)>0) return;
+       if (getparam_int("topuser_num",buf,&TopUsersNum)>0) return;
 
-   if (getparam_string("usertab",buf,UserTabFile,sizeof(UserTabFile))>0) return;
+       if (getparam_string("usertab",buf,UserTabFile,sizeof(UserTabFile))>0) return;
 
-   if (getparam_string("index_sort_order",buf,IndexSortOrder,sizeof(IndexSortOrder))>0) return;
+       if (getparam_string("index_sort_order",buf,IndexSortOrder,sizeof(IndexSortOrder))>0) return;
 
-   if (getparam_sort("topsites_sort_order",SET_LIST(topsite_sort),buf,&TopsitesSort)>0) return;
+       if (getparam_sort("topsites_sort_order",SET_LIST(topsite_sort),buf,&TopsitesSort)>0) return;
 
-   if (getparam_bool("long_url",buf,&LongUrl)>0) return;
+       if (getparam_bool("long_url",buf,&LongUrl)>0) return;
 
-   if (getparam_string("dansguardian_conf",buf,DansGuardianConf,sizeof(DansGuardianConf))>0) return;
+       if (getparam_string("dansguardian_conf",buf,DansGuardianConf,sizeof(DansGuardianConf))>0) return;
 
-   if (getparam_string("squidguard_conf",buf,SquidGuardConf,sizeof(SquidGuardConf))>0) return;
+       if (getparam_string("squidguard_conf",buf,SquidGuardConf,sizeof(SquidGuardConf))>0) return;
 
-   if (getparam_list("date_time_by",SET_LIST(datetime_values),buf,&datetimeby)>0) return;
+       if (getparam_list("date_time_by",SET_LIST(datetime_values),buf,&datetimeby)>0) return;
 
-   if (getparam_string("charset",buf,CharSet,sizeof(CharSet))>0) {
-      ccharset(CharSet);
-      return;
-   }
+       if (getparam_string("charset",buf,CharSet,sizeof(CharSet))>0) {
+               ccharset(CharSet);
+               return;
+       }
 
-   if (getparam_quoted("user_invalid_char",buf,UserInvalidChar,sizeof(UserInvalidChar))>0) return;
+       if (getparam_quoted("user_invalid_char",buf,UserInvalidChar,sizeof(UserInvalidChar))>0) return;
 
-   if (getparam_quoted("include_users",buf,IncludeUsers+1,sizeof(IncludeUsers)-2)>0) {
-      IncludeUsers[0]=':';
-      strcat(IncludeUsers,":");
-      return;
-   }
+       if (getparam_quoted("include_users",buf,IncludeUsers+1,sizeof(IncludeUsers)-2)>0) {
+               IncludeUsers[0]=':';
+               strcat(IncludeUsers,":");
+               return;
+       }
 
-   if (getparam_quoted("exclude_string",buf,ExcludeString,sizeof(ExcludeString))>0) return;
+       if (getparam_quoted("exclude_string",buf,ExcludeString,sizeof(ExcludeString))>0) return;
 
-   if (getparam_bool("privacy",buf,&Privacy)>0) return;
+       if (getparam_bool("privacy",buf,&Privacy)>0) return;
 
-   if (getparam_quoted("privacy_string",buf,PrivacyString,sizeof(PrivacyString))>0) return;
+       if (getparam_quoted("privacy_string",buf,PrivacyString,sizeof(PrivacyString))>0) return;
 
-   if (getparam_string("privacy_string_color",buf,PrivacyStringColor,sizeof(PrivacyStringColor))>0) return;
+       if (getparam_string("privacy_string_color",buf,PrivacyStringColor,sizeof(PrivacyStringColor))>0) return;
 
-   if (getparam_bool("show_successful_message",buf,&SuccessfulMsg)>0) return;
+       if (getparam_bool("show_successful_message",buf,&SuccessfulMsg)>0) return;
 
-   if (getparam_bool("show_read_statistics",buf,&ShowReadStatistics)>0) return;
+       if (getparam_bool("show_read_statistics",buf,&ShowReadStatistics)>0) return;
 
-   if (getparam_list("topuser_fields",SET_LIST(topuserfields_values),buf,&TopUserFields)>0) return;
+       if (getparam_list("topuser_fields",SET_LIST(topuserfields_values),buf,&TopUserFields)>0) return;
 
-   if (getparam_bool("bytes_in_sites_users_report",buf,&BytesInSitesUsersReport)>0) return;
+       if (getparam_bool("bytes_in_sites_users_report",buf,&BytesInSitesUsersReport)>0) return;
 
-   if (getparam_list("user_report_fields",SET_LIST(userreportfields_values),buf,&UserReportFields)>0) return;
+       if (getparam_list("user_report_fields",SET_LIST(userreportfields_values),buf,&UserReportFields)>0) return;
 
-   if (getparam_string("datafile",buf,DataFile,sizeof(DataFile))>0) return;
+       if (getparam_string("datafile",buf,DataFile,sizeof(DataFile))>0) return;
 
-   if (getparam_quoted("datafile_delimiter",buf,DataFileDelimiter,sizeof(DataFileDelimiter))>0) return;
+       if (getparam_quoted("datafile_delimiter",buf,DataFileDelimiter,sizeof(DataFileDelimiter))>0) return;
 
-   if (getparam_list("datafile_fields",SET_LIST(data_field_values),buf,&DataFileFields)>0) return;
+       if (getparam_list("datafile_fields",SET_LIST(data_field_values),buf,&DataFileFields)>0) return;
 
-   if (getparam_list("datafile_url",SET_LIST(datafileurl_values),buf,&DataFileUrl)>0) return;
+       if (getparam_list("datafile_url",SET_LIST(datafileurl_values),buf,&DataFileUrl)>0) return;
 
-   if (getparam_string("parsed_output_log",buf,ParsedOutputLog,sizeof(ParsedOutputLog))>0) return;
+       if (getparam_string("parsed_output_log",buf,ParsedOutputLog,sizeof(ParsedOutputLog))>0) return;
 
-   if (getparam_string("parsed_output_log_compress",buf,ParsedOutputLogCompress,sizeof(ParsedOutputLogCompress))>0) return;
+       if (getparam_string("parsed_output_log_compress",buf,ParsedOutputLogCompress,sizeof(ParsedOutputLogCompress))>0) return;
 
-   if (getparam_list("displayed_values",SET_LIST(displayvalue_values),buf,&DisplayedValues)>0) return;
+       if (getparam_list("displayed_values",SET_LIST(displayvalue_values),buf,&DisplayedValues)>0) return;
 
-   if (getparam_int("authfail_report_limit",buf,&AuthfailReportLimit)>0) return;
+       if (getparam_int("authfail_report_limit",buf,&AuthfailReportLimit)>0) return;
 
-   if (getparam_int("denied_report_limit",buf,&DeniedReportLimit)>0) return;
+       if (getparam_int("denied_report_limit",buf,&DeniedReportLimit)>0) return;
 
-   if (getparam_int("siteusers_report_limit",buf,&SiteUsersReportLimit)>0) return;
+       if (getparam_int("siteusers_report_limit",buf,&SiteUsersReportLimit)>0) return;
 
-   if (getparam_int("dansguardian_report_limit",buf,&DansGuardianReportLimit)>0) return;
+       if (getparam_int("dansguardian_report_limit",buf,&DansGuardianReportLimit)>0) return;
 
-   if (getparam_int("squidguard_report_limit",buf,&SquidGuardReportLimit)>0) return;
+       if (getparam_int("squidguard_report_limit",buf,&SquidGuardReportLimit)>0) return;
 
-   if (getparam_int("user_report_limit",buf,&UserReportLimit)>0) return;
+       if (getparam_int("user_report_limit",buf,&UserReportLimit)>0) return;
 
-   if (getparam_int("download_report_limit",buf,&DownloadReportLimit)>0) return;
+       if (getparam_int("download_report_limit",buf,&DownloadReportLimit)>0) return;
 
-   if (getparam_string("www_document_root",buf,wwwDocumentRoot,sizeof(wwwDocumentRoot))>0) return;
+       if (getparam_string("www_document_root",buf,wwwDocumentRoot,sizeof(wwwDocumentRoot))>0) return;
 
-   if (getparam_string("block_it",buf,BlockIt,sizeof(BlockIt))>0) return;
+       if (getparam_string("block_it",buf,BlockIt,sizeof(BlockIt))>0) return;
 
-   if (getparam_string("external_css_file",buf,ExternalCSSFile,sizeof(ExternalCSSFile))>0) return;
+       if (getparam_string("external_css_file",buf,ExternalCSSFile,sizeof(ExternalCSSFile))>0) return;
 
-   if (getparam_bool("user_authentication",buf,&UserAuthentication)>0) return;
+       if (getparam_bool("user_authentication",buf,&UserAuthentication)>0) return;
 
-   if (getparam_string("AuthUserTemplateFile",buf,wbuf,sizeof(wbuf))>0) {
-      char dir[MAXLEN];
+       if (getparam_string("AuthUserTemplateFile",buf,wbuf,sizeof(wbuf))>0) {
+               char dir[MAXLEN];
 
-      if (is_absolute(wbuf)) {
-         if (strlen(wbuf)>=sizeof(AuthUserTemplateFile)) {
-            debuga(_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
-            exit(EXIT_FAILURE);
-         }
-         strcpy(AuthUserTemplateFile,wbuf);
-      } else {
-         strcpy(dir,ConfigFile);
-         if (snprintf(AuthUserTemplateFile,sizeof(AuthUserTemplateFile),"%s/%s",dirname(dir),wbuf)>=sizeof(AuthUserTemplateFile)) {
-            debuga(_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
-            exit(EXIT_FAILURE);
-         }
-      }
-      return;
-   }
+               if (is_absolute(wbuf)) {
+                       if (strlen(wbuf)>=sizeof(AuthUserTemplateFile)) {
+                               debuga(_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       strcpy(AuthUserTemplateFile,wbuf);
+               } else {
+                       strcpy(dir,ConfigFile);
+                       if (snprintf(AuthUserTemplateFile,sizeof(AuthUserTemplateFile),"%s/%s",dirname(dir),wbuf)>=sizeof(AuthUserTemplateFile)) {
+                               debuga(_("Template file name is too long in parameter \"AuthUserTemplateFile\"\n"));
+                               exit(EXIT_FAILURE);
+                       }
+               }
+               return;
+       }
 
-   if (is_param("download_suffix",buf)) {
-      char warea[MAXLEN];
+       if (is_param("download_suffix",buf)) {
+               char warea[MAXLEN];
 
-      getparam_quoted("download_suffix",buf,warea,sizeof(warea));
-      set_download_suffix(warea);
-      return;
-   }
+               getparam_quoted("download_suffix",buf,warea,sizeof(warea));
+               set_download_suffix(warea);
+               return;
+       }
 
-   if (getparam_bool("graphs",buf,&Graphs)>0) return;
+       if (getparam_bool("graphs",buf,&Graphs)>0) return;
 
-   if (getparam_string("graph_days_bytes_bar_color",buf,GraphDaysBytesBarColor,sizeof(GraphDaysBytesBarColor))>0) return;
+       if (getparam_string("graph_days_bytes_bar_color",buf,GraphDaysBytesBarColor,sizeof(GraphDaysBytesBarColor))>0) return;
 
-   if (getparam_string("redirector_log_format",buf,RedirectorLogFormat,sizeof(RedirectorLogFormat))>0) return;
-   if (getparam_string("squidguard_log_format",buf,RedirectorLogFormat,sizeof(RedirectorLogFormat))>0) {
-      debuga(_("squidguard_log_format is deprecated and has been replaced by redirector_log_format. Please update your configuration file.\n"));
-      return;
-   }
+       if (getparam_string("redirector_log_format",buf,RedirectorLogFormat,sizeof(RedirectorLogFormat))>0) return;
+       if (getparam_string("squidguard_log_format",buf,RedirectorLogFormat,sizeof(RedirectorLogFormat))>0) {
+               debuga(_("squidguard_log_format is deprecated and has been replaced by redirector_log_format. Please update your configuration file.\n"));
+               return;
+       }
 
-   if (getparam_bool("redirector_filter_out_date",buf,&RedirectorFilterOutDate)>0) return;
-   if (getparam_bool("redirector_ignore_date",buf,&RedirectorFilterOutDate)>0) {
-      /*
-      Due to an old bug in sarg before version 2.3, the option was having the opposite action than implied by the name.
-      */
-      debuga(_("redirector_ignore_date is deprecated and has been replaced by redirector_filter_out_date that does the action implied by its name as opposed to redirector_ignore_date. Please update your configuration file.\n"));
-      RedirectorFilterOutDate=!RedirectorFilterOutDate;
-      return;
-   }
-   if (getparam_bool("squidguard_ignore_date",buf,&RedirectorFilterOutDate)>0) {
-      debuga(_("squidguard_ignore_date is deprecated and has been replaced by redirector_filter_out_date that does the action implied by its name as opposed to squidguard_ignore_date. Please update your configuration file.\n"));
-      RedirectorFilterOutDate=!RedirectorFilterOutDate;
-      return;
-   }
+       if (getparam_bool("redirector_filter_out_date",buf,&RedirectorFilterOutDate)>0) return;
+       if (getparam_bool("redirector_ignore_date",buf,&RedirectorFilterOutDate)>0) {
+               /*
+               Due to an old bug in sarg before version 2.3, the option was having the opposite action than implied by the name.
+               */
+               debuga(_("redirector_ignore_date is deprecated and has been replaced by redirector_filter_out_date that does the action implied by its name as opposed to redirector_ignore_date. Please update your configuration file.\n"));
+               RedirectorFilterOutDate=!RedirectorFilterOutDate;
+               return;
+       }
+       if (getparam_bool("squidguard_ignore_date",buf,&RedirectorFilterOutDate)>0) {
+               debuga(_("squidguard_ignore_date is deprecated and has been replaced by redirector_filter_out_date that does the action implied by its name as opposed to squidguard_ignore_date. Please update your configuration file.\n"));
+               RedirectorFilterOutDate=!RedirectorFilterOutDate;
+               return;
+       }
 
-   if (getparam_bool("dansguardian_filter_out_date",buf,&DansguardianFilterOutDate)>0) return;
-   if (getparam_bool("dansguardian_ignore_date",buf,&DansguardianFilterOutDate)>0) {
-      debuga(_("dansguardian_ignore_date is deprecated and has been replaced by dansguardian_filter_out_date that does the action implied by its name as opposed to dansguardian_ignore_date. Please update your configuration file.\n"));
-      DansguardianFilterOutDate=!DansguardianFilterOutDate;
-      return;
-   }
+       if (getparam_bool("dansguardian_filter_out_date",buf,&DansguardianFilterOutDate)>0) return;
+       if (getparam_bool("dansguardian_ignore_date",buf,&DansguardianFilterOutDate)>0) {
+               debuga(_("dansguardian_ignore_date is deprecated and has been replaced by dansguardian_filter_out_date that does the action implied by its name as opposed to dansguardian_ignore_date. Please update your configuration file.\n"));
+               DansguardianFilterOutDate=!DansguardianFilterOutDate;
+               return;
+       }
 
-   if (getparam_string("ulimit",buf,Ulimit,sizeof(Ulimit))>0) return;
+       if (getparam_string("ulimit",buf,Ulimit,sizeof(Ulimit))>0) return;
 
-   if (getparam_list("ntlm_user_format",SET_LIST(ntml_userformat_values),buf,&NtlmUserFormat)>0) return;
+       if (getparam_list("ntlm_user_format",SET_LIST(ntml_userformat_values),buf,&NtlmUserFormat)>0) return;
 
-   if (getparam_string("realtime_types",buf,RealtimeTypes,sizeof(RealtimeTypes))>0) return;
+       if (getparam_string("realtime_types",buf,RealtimeTypes,sizeof(RealtimeTypes))>0) return;
 
-   if (getparam_list("realtime_unauthenticated_records",SET_LIST(realtime_unauth_values),buf,&RealtimeUnauthRec)>0) return;
+       if (getparam_list("realtime_unauthenticated_records",SET_LIST(realtime_unauth_values),buf,&RealtimeUnauthRec)>0) return;
 
-   if (getparam_int("realtime_refresh_time",buf,&realtime_refresh)>0) return;
+       if (getparam_int("realtime_refresh_time",buf,&realtime_refresh)>0) return;
 
-   if (getparam_int("realtime_access_log_lines",buf,&realtime_access_log_lines)>0) return;
+       if (getparam_int("realtime_access_log_lines",buf,&realtime_access_log_lines)>0) return;
 
-   if (getparam_string("LDAPHost",buf,LDAPHost,sizeof(LDAPHost))>0) return;
+       if (getparam_string("LDAPHost",buf,LDAPHost,sizeof(LDAPHost))>0) return;
 
-   if (getparam_int("LDAPPort",buf,&LDAPPort)>0) return;
+       if (getparam_int("LDAPPort",buf,&LDAPPort)>0) return;
 
-   if (getparam_int("LDAPProtocolVersion",buf,&LDAPProtocolVersion)>0) return;
+       if (getparam_int("LDAPProtocolVersion",buf,&LDAPProtocolVersion)>0) return;
 
-   if (getparam_string("LDAPBindDN",buf,LDAPBindDN,sizeof(LDAPBindDN))>0) return;
+       if (getparam_string("LDAPBindDN",buf,LDAPBindDN,sizeof(LDAPBindDN))>0) return;
 
-   if (getparam_string("LDAPBindPW",buf,LDAPBindPW,sizeof(LDAPBindPW))>0) return;
+       if (getparam_string("LDAPBindPW",buf,LDAPBindPW,sizeof(LDAPBindPW))>0) return;
 
-   if (getparam_string("LDAPBaseSearch",buf,LDAPBaseSearch,sizeof(LDAPBaseSearch))>0) return;
+       if (getparam_string("LDAPBaseSearch",buf,LDAPBaseSearch,sizeof(LDAPBaseSearch))>0) return;
 
-   if (getparam_string("LDAPFilterSearch",buf,LDAPFilterSearch,sizeof(LDAPFilterSearch))>0) return;
+       if (getparam_string("LDAPFilterSearch",buf,LDAPFilterSearch,sizeof(LDAPFilterSearch))>0) return;
 
-   if (getparam_string("LDAPTargetAttr",buf,LDAPTargetAttr,sizeof(LDAPTargetAttr))>0) return;
+       if (getparam_string("LDAPTargetAttr",buf,LDAPTargetAttr,sizeof(LDAPTargetAttr))>0) return;
 
-   if (getparam_string("graph_font",buf,GraphFont,sizeof(GraphFont))>0) return;
+       if (getparam_string("graph_font",buf,GraphFont,sizeof(GraphFont))>0) return;
 
-   if (getparam_string("sorttable",buf,SortTableJs,sizeof(SortTableJs))>0) return;
+       if (getparam_string("sorttable",buf,SortTableJs,sizeof(SortTableJs))>0) return;
 
-   if(strstr(buf,"squid24") != 0) {
-      squid24=true;
-      return;
-   }
+       if(strstr(buf,"squid24") != 0) {
+               squid24=true;
+               return;
+       }
 
-   if(strstr(buf,"byte_cost") != 0) {
-      getword_start(&gwarea,buf);
-      if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
-         debuga(_("The \"byte_cost\" parameter of the configuration file is invalid\n"));
-         exit(EXIT_FAILURE);
-      }
-      cost=atol(gwarea.current);
-      if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
-         debuga(_("The \"byte_cost\" parameter of the configuration file is invalid\n"));
-         exit(EXIT_FAILURE);
-      }
-      nocost=my_atoll(gwarea.current);
-      return;
-   }
+       if(strstr(buf,"byte_cost") != 0) {
+               getword_start(&gwarea,buf);
+               if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
+                       debuga(_("The \"byte_cost\" parameter of the configuration file is invalid\n"));
+                       exit(EXIT_FAILURE);
+               }
+               cost=atol(gwarea.current);
+               if (getword_multisep(wbuf,sizeof(wbuf),&gwarea,' ')<0) {
+                       debuga(_("The \"byte_cost\" parameter of the configuration file is invalid\n"));
+                       exit(EXIT_FAILURE);
+               }
+               nocost=my_atoll(gwarea.current);
+               return;
+       }
 
-   printf(_("SARG: Unknown option %s\n"),buf);
+       printf(_("SARG: Unknown option %s\n"),buf);
 }
 
 void getconf(void)
 {
+       FILE *fp_in;
+       char buf[MAXLEN];
 
-   FILE *fp_in;
-   char buf[MAXLEN];
+       if(debug)
+               debuga(_("Loading configuration from %s\n"),ConfigFile);
 
-   if(debug)
-      debuga(_("Loading configuration from %s\n"),ConfigFile);
+       if ((fp_in = fopen(ConfigFile, "r")) == NULL) {
+               debuga(_("(getconf) Cannot open file %s\n"),ConfigFile);
+               exit(EXIT_FAILURE);
+       }
 
-   if ((fp_in = fopen(ConfigFile, "r")) == NULL) {
-      debuga(_("(getconf) Cannot open file %s\n"),ConfigFile);
-      exit(EXIT_FAILURE);
-   }
+       while (fgets(buf, sizeof(buf), fp_in) != NULL) {
+               fixendofline(buf);
 
-   while (fgets(buf, sizeof(buf), fp_in) != NULL) {
-      fixendofline(buf);
+               if(debugm)
+                       printf("SYSCONFDIR %s\n",buf);
 
-      if(debugm)
-         printf("SYSCONFDIR %s\n",buf);
+               parmtest(buf);
 
-      parmtest(buf);
+       }
 
-   }
-
-   fclose(fp_in);
-   return;
+       fclose(fp_in);
+       return;
 }
index 5d09f79bbafb86f11b7c50d6b8201ef6fbc553a6..87829a08c470de8efda93571b4f420e1c8e9e7ca 100644 (file)
--- a/grepday.c
+++ b/grepday.c
 
 struct GraphDataStruct
 {
-   int lavender;
-   int darkblue;
-   int dimgray;
-   int goldenrod;
-   int goldenrod2;
-   int gray;
-   int silver;
-   int black;
-   //! The color of the top side of a graph bar.
-   int color1;
-   //! The color of the right side of a graph bar.
-   int color2;
-   //! The color of the front side of a graph bar.
-   int color3;
-   //! The libgd image we are drawing on.
-   gdImage *im;
-   //! An allocated buffer to convert the string into UTF-8.
-   char *string;
-   //! The number of bytes allocated for the string buffer.
-   size_t string_size;
-   //! The bottom border of the graph.
-   int BottomGraph;
-   //! The top border of the graph.
-   int TopGraph;
-   //! The left border of the graph.
-   int LeftGraph;
-   //! The right border of the graph.
-   int RightGraph;
-   //! The height at which the bottom depth border of the graph extends.
-   int BottomDepth;
-   //! The distance between two ticks on the horizontal axis.
-   double XScale;
-   //! The distance between two ticks on the vertical axis.
-   double YScale;
-   //! The exterior length of a tick on the scales.
-   int TickLength;
-   //! The distance, in pixels, between two ticks along the Y axis.
-   int YTickSpace;
+       int lavender;
+       int darkblue;
+       int dimgray;
+       int goldenrod;
+       int goldenrod2;
+       int gray;
+       int silver;
+       int black;
+       //! The color of the top side of a graph bar.
+       int color1;
+       //! The color of the right side of a graph bar.
+       int color2;
+       //! The color of the front side of a graph bar.
+       int color3;
+       //! The libgd image we are drawing on.
+       gdImage *im;
+       //! An allocated buffer to convert the string into UTF-8.
+       char *string;
+       //! The number of bytes allocated for the string buffer.
+       size_t string_size;
+       //! The bottom border of the graph.
+       int BottomGraph;
+       //! The top border of the graph.
+       int TopGraph;
+       //! The left border of the graph.
+       int LeftGraph;
+       //! The right border of the graph.
+       int RightGraph;
+       //! The height at which the bottom depth border of the graph extends.
+       int BottomDepth;
+       //! The distance between two ticks on the horizontal axis.
+       double XScale;
+       //! The distance between two ticks on the vertical axis.
+       double YScale;
+       //! The exterior length of a tick on the scales.
+       int TickLength;
+       //! The distance, in pixels, between two ticks along the Y axis.
+       int YTickSpace;
 };
 
 enum PlotType
 {
-   PTG_LinBin,
-   PTG_LogBin,
-   PTG_Time,
+       PTG_LinBin,
+       PTG_LogBin,
+       PTG_Time,
 };
 
 struct PlotStruct
 {
-   //! The data points to plot.
-   long long int *datapoints;
-   //! The number of points to plot.
-   int npoints;
-   //! The minimum data to plot along the Y axis.
-   long long int ymin;
-   //! The maximum data to plot along the Y axis.
-   long long int ymax;
-   //! The type of Y axis to draw.
-   enum PlotType ytype;
-   //! The label to write on the X axis.
-   const char *XLabel;
-   //! The label to write on the Y axis.
-   const char *YLabel;
-   //! The name of the output PNG file.
-   const char *pngfile;
+       //! The data points to plot.
+       long long int *datapoints;
+       //! The number of points to plot.
+       int npoints;
+       //! The minimum data to plot along the Y axis.
+       long long int ymin;
+       //! The maximum data to plot along the Y axis.
+       long long int ymax;
+       //! The type of Y axis to draw.
+       enum PlotType ytype;
+       //! The label to write on the X axis.
+       const char *XLabel;
+       //! The label to write on the Y axis.
+       const char *YLabel;
+       //! The name of the output PNG file.
+       const char *pngfile;
 };
 
 enum TextRefPos
 {
-   TRP_TopLeft,
-   TRP_TopCenter,
-   TRP_TopRight,
-   TRP_BottomLeft,
-   TRP_BottomCenter,
-   TRP_BottomRight,
-   TRP_CenterLeft,
-   TRP_Center,
-   TRP_CenterRight,
+       TRP_TopLeft,
+       TRP_TopCenter,
+       TRP_TopRight,
+       TRP_BottomLeft,
+       TRP_BottomCenter,
+       TRP_BottomRight,
+       TRP_CenterLeft,
+       TRP_Center,
+       TRP_CenterRight,
 };
 
 #ifdef USE_ICONV
@@ -122,510 +122,510 @@ iconv_t localtoutf=(iconv_t)-1;
 #endif
 
 static void Sarg_gdImageStringFT (struct GraphDataStruct *gdata, int fg, char *fontlist,
-                         double ptsize, double angle, int x, int y, const char *string,enum TextRefPos RefPos)
+                                                               double ptsize, double angle, int x, int y, const char *string,enum TextRefPos RefPos)
 {
-   char *sstring;
-   char *retval;
-   int brect[8];
-   int minx,miny,maxx,maxy;
-   int i;
+       char *sstring;
+       char *retval;
+       int brect[8];
+       int minx,miny,maxx,maxy;
+       int i;
 
 #ifdef USE_ICONV
-   if (localtoutf!=(iconv_t)-1) {
-      const char *str;
-      char *sstr;
-      size_t slen, sslen;
-
-      slen = strlen(string) + 1; // We must include string termination character
-      sslen = slen * 3;          // We assume that the UTF8 string will not be bigger than 3 times the original size.
-      if (sslen>gdata->string_size) {
-         sstring = (char *)realloc(gdata->string,sslen);
-         if (!sstring) {
-            debuga(_("realloc error (%"PRIu64" bytes required)\n"),(uint64_t)sslen);
-            exit(EXIT_FAILURE);
-         }
-         gdata->string=(char *)sstring;
-         gdata->string_size=sslen;
-      } else {
-         sstring=gdata->string;
-         sslen=gdata->string_size;
-      }
-
-      str = string;
-      sstr = sstring;
-      if (iconv (localtoutf, (ICONV_CONST char **)&str, &slen, &sstr, &sslen)==-1) {
-         debuga(_("(grepday) iconv failed to convert string \"%s\" from %s to UTF-8 - %s\n"),string,CharSet,strerror(errno));
-         sstring=(char *)string; //show something sensible on the graph
-      }
-   } else {
-      sstring=(char *)string; //show something sensible on the graph
-   }
+       if (localtoutf!=(iconv_t)-1) {
+               const char *str;
+               char *sstr;
+               size_t slen, sslen;
+
+               slen = strlen(string) + 1; // We must include string termination character
+               sslen = slen * 3;          // We assume that the UTF8 string will not be bigger than 3 times the original size.
+               if (sslen>gdata->string_size) {
+                       sstring = (char *)realloc(gdata->string,sslen);
+                       if (!sstring) {
+                               debuga(_("realloc error (%"PRIu64" bytes required)\n"),(uint64_t)sslen);
+                               exit(EXIT_FAILURE);
+                       }
+                       gdata->string=(char *)sstring;
+                       gdata->string_size=sslen;
+               } else {
+                       sstring=gdata->string;
+                       sslen=gdata->string_size;
+               }
+
+               str = string;
+               sstr = sstring;
+               if (iconv (localtoutf, (ICONV_CONST char **)&str, &slen, &sstr, &sslen)==-1) {
+                       debuga(_("(grepday) iconv failed to convert string \"%s\" from %s to UTF-8 - %s\n"),string,CharSet,strerror(errno));
+                       sstring=(char *)string; //show something sensible on the graph
+               }
+       } else {
+               sstring=(char *)string; //show something sensible on the graph
+       }
 #else
-   sstring=(char *)string;
+       sstring=(char *)string;
 #endif
 
-   if (RefPos!=TRP_BottomLeft) {
-      retval = gdImageStringFTEx (NULL, brect, fg, fontlist, ptsize, angle, 0, 0, sstring, gdFTEX_Unicode);
-      if (retval) {
-         debuga(_("libgd failed to calculate the bounding box of the text \"%s\": %s\n"),sstring,retval);
-         exit(EXIT_FAILURE);
-      }
-      /*
-      From libgd documentation, brect contains this without taking into account the angle:
-      0  lower left corner, X position
-      1  lower left corner, Y position
-      2  lower right corner, X position
-      3  lower right corner, Y position
-      4  upper right corner, X position
-      5  upper right corner, Y position
-      6  upper left corner, X position
-      7  upper left corner, Y position
-      */
-      minx=maxx=brect[0];
-      miny=maxy=brect[1];
-      for (i=2 ; i<7 ; i+=2) {
-         if (minx>brect[i]) minx=brect[i];
-         if (maxx<brect[i]) maxx=brect[i];
-         if (miny>brect[i+1]) miny=brect[i+1];
-         if (maxy<brect[i+1]) maxy=brect[i+1];
-      }
-   }
-
-   switch (RefPos)
-   {
-      case TRP_TopLeft:
-         y-=miny;
-         break;
-
-      case TRP_TopCenter:
-         x-=(maxx-minx)/2;
-         y-=miny;
-         break;
-
-      case TRP_TopRight:
-         x-=maxx;
-         y-=miny;
-         break;
-
-      case TRP_BottomLeft:
-         break;
-
-      case TRP_BottomCenter:
-         x-=(maxx-minx)/2;
-         break;
-
-      case TRP_BottomRight:
-         x-=maxx;
-         break;
-
-      case TRP_Center:
-         x-=(maxx-minx)/2;
-         y+=(maxy-miny)/2;
-         break;
-
-      case TRP_CenterLeft:
-         y+=(maxy-miny)/2;
-         break;
-
-      case TRP_CenterRight:
-         x-=maxx;
-         y+=(maxy-miny)/2;
-         break;
-   }
-   retval = gdImageStringFTEx (gdata->im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode);
-   if (retval) {
-      debuga(_("libgd failed to render the text \"%s\": %s\n"),sstring,retval);
-      exit(EXIT_FAILURE);
-   }
+       if (RefPos!=TRP_BottomLeft) {
+               retval = gdImageStringFTEx (NULL, brect, fg, fontlist, ptsize, angle, 0, 0, sstring, gdFTEX_Unicode);
+               if (retval) {
+                       debuga(_("libgd failed to calculate the bounding box of the text \"%s\": %s\n"),sstring,retval);
+                       exit(EXIT_FAILURE);
+               }
+               /*
+               From libgd documentation, brect contains this without taking into account the angle:
+               0  lower left corner, X position
+               1  lower left corner, Y position
+               2  lower right corner, X position
+               3  lower right corner, Y position
+               4  upper right corner, X position
+               5  upper right corner, Y position
+               6  upper left corner, X position
+               7  upper left corner, Y position
+               */
+               minx=maxx=brect[0];
+               miny=maxy=brect[1];
+               for (i=2 ; i<7 ; i+=2) {
+                       if (minx>brect[i]) minx=brect[i];
+                       if (maxx<brect[i]) maxx=brect[i];
+                       if (miny>brect[i+1]) miny=brect[i+1];
+                       if (maxy<brect[i+1]) maxy=brect[i+1];
+               }
+       }
+
+       switch (RefPos)
+       {
+               case TRP_TopLeft:
+                       y-=miny;
+                       break;
+
+               case TRP_TopCenter:
+                       x-=(maxx-minx)/2;
+                       y-=miny;
+                       break;
+
+               case TRP_TopRight:
+                       x-=maxx;
+                       y-=miny;
+                       break;
+
+               case TRP_BottomLeft:
+                       break;
+
+               case TRP_BottomCenter:
+                       x-=(maxx-minx)/2;
+                       break;
+
+               case TRP_BottomRight:
+                       x-=maxx;
+                       break;
+
+               case TRP_Center:
+                       x-=(maxx-minx)/2;
+                       y+=(maxy-miny)/2;
+                       break;
+
+               case TRP_CenterLeft:
+                       y+=(maxy-miny)/2;
+                       break;
+
+               case TRP_CenterRight:
+                       x-=maxx;
+                       y+=(maxy-miny)/2;
+                       break;
+       }
+       retval = gdImageStringFTEx (gdata->im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode);
+       if (retval) {
+               debuga(_("libgd failed to render the text \"%s\": %s\n"),sstring,retval);
+               exit(EXIT_FAILURE);
+       }
 }
 
 static void bar(struct GraphDataStruct *gdata,int x1,double y,const char *label)
 {
-   gdPoint points[4];
-   int val=0;
-   int width2;
-
-   val=gdata->BottomGraph+5-(int)(y*gdata->YScale+0.5);
-   width2=(int)(gdata->XScale/4.);
-
-   // front side of the bar
-   if (val<gdata->BottomDepth)
-      gdImageFilledRectangle(gdata->im, x1-width2, val, x1+width2, gdata->BottomDepth, gdata->color3);
-
-   // top side of the bar
-   points[0].x = x1-width2+5;
-   points[0].y = val-5;
-   points[1].x = x1-width2;
-   points[1].y = val;
-   points[2].x = x1+width2;
-   points[2].y = val;
-   points[3].x = x1+width2+5;
-   points[3].y = val-5;
-   gdImageFilledPolygon(gdata->im, points, 4, gdata->color1);
-
-   gdImageLine(gdata->im, x1+2, val-2, x1+2, val-10, gdata->dimgray);
-   gdImageFilledRectangle(gdata->im, x1-8, val-20, x1+12, val-10, gdata->goldenrod);
-   gdImageRectangle(gdata->im, x1-8, val-20, x1+12, val-10, gdata->goldenrod2);
-
-   Sarg_gdImageStringFT(gdata,gdata->black,GraphFont,6,0.0,x1+2,val-12,label,TRP_BottomCenter);
-
-   // lateral side of the bar
-   if (val<gdata->BottomDepth) {
-      points[0].x = x1+width2+5;
-      points[0].y = val-5;
-      points[1].x = x1+width2;
-      points[1].y = val;
-      points[2].x = x1+width2;
-      points[2].y = gdata->BottomDepth;
-      points[3].x = x1+width2+5;
-      points[3].y = gdata->BottomGraph;
-      gdImageFilledPolygon(gdata->im, points, 4, gdata->color2);
-   }
-
-   return;
+       gdPoint points[4];
+       int val=0;
+       int width2;
+
+       val=gdata->BottomGraph+5-(int)(y*gdata->YScale+0.5);
+       width2=(int)(gdata->XScale/4.);
+
+       // front side of the bar
+       if (val<gdata->BottomDepth)
+               gdImageFilledRectangle(gdata->im, x1-width2, val, x1+width2, gdata->BottomDepth, gdata->color3);
+
+       // top side of the bar
+       points[0].x = x1-width2+5;
+       points[0].y = val-5;
+       points[1].x = x1-width2;
+       points[1].y = val;
+       points[2].x = x1+width2;
+       points[2].y = val;
+       points[3].x = x1+width2+5;
+       points[3].y = val-5;
+       gdImageFilledPolygon(gdata->im, points, 4, gdata->color1);
+
+       gdImageLine(gdata->im, x1+2, val-2, x1+2, val-10, gdata->dimgray);
+       gdImageFilledRectangle(gdata->im, x1-8, val-20, x1+12, val-10, gdata->goldenrod);
+       gdImageRectangle(gdata->im, x1-8, val-20, x1+12, val-10, gdata->goldenrod2);
+
+       Sarg_gdImageStringFT(gdata,gdata->black,GraphFont,6,0.0,x1+2,val-12,label,TRP_BottomCenter);
+
+       // lateral side of the bar
+       if (val<gdata->BottomDepth) {
+               points[0].x = x1+width2+5;
+               points[0].y = val-5;
+               points[1].x = x1+width2;
+               points[1].y = val;
+               points[2].x = x1+width2;
+               points[2].y = gdata->BottomDepth;
+               points[3].x = x1+width2+5;
+               points[3].y = gdata->BottomGraph;
+               gdImageFilledPolygon(gdata->im, points, 4, gdata->color2);
+       }
+
+       return;
 }
 
 static int greport_compute_yaxis(struct PlotStruct *pdata,struct GraphDataStruct *gdata)
 {
-   double symin,symax;
-   double range;
-   double yscale;
-   double ymag;
-
-   if (pdata->ymin<0.) {
-      debuga(_("Minimum for Y scale of the graph is out of range: %"PRId64"\n"),(int64_t)pdata->ymin);
-      return(-1);
-   }
-   if (pdata->ymax<=0.) {
-      debuga(_("Maximum for Y scale of the graph is out of range: %"PRId64"\n"),(int64_t)pdata->ymax);
-      return(-1);
-   }
-
-   switch(pdata->ytype)
-   {
-      case PTG_LinBin:
-         symin=(double)pdata->ymin;
-         symax=(double)pdata->ymax;
-         ymag=1000.;
-         break;
-
-      case PTG_LogBin:
-         if (pdata->ymin>0.)
-            symin=log(pdata->ymin);
-         else
-            symin=0.;
-         symax=log(pdata->ymax);
-         ymag=1000.;
-         break;
-
-      case PTG_Time:
-         symin=(double)pdata->ymin;
-         symax=(double)pdata->ymax;
-         ymag=1.;
-         break;
-
-      default:
-         debuga(_("Unknown type %d for Y axis scale\n"),pdata->ytype);
-         return(-1);
-   }
-   gdata->YTickSpace=10;
-
-   range=symax-symin;
-   yscale=(double)(gdata->BottomGraph-gdata->TopGraph)/range;
-   gdata->YScale=yscale;
-   return(0);
+       double symin,symax;
+       double range;
+       double yscale;
+       double ymag;
+
+       if (pdata->ymin<0.) {
+               debuga(_("Minimum for Y scale of the graph is out of range: %"PRId64"\n"),(int64_t)pdata->ymin);
+               return(-1);
+       }
+       if (pdata->ymax<=0.) {
+               debuga(_("Maximum for Y scale of the graph is out of range: %"PRId64"\n"),(int64_t)pdata->ymax);
+               return(-1);
+       }
+
+       switch(pdata->ytype)
+       {
+               case PTG_LinBin:
+                       symin=(double)pdata->ymin;
+                       symax=(double)pdata->ymax;
+                       ymag=1000.;
+                       break;
+
+               case PTG_LogBin:
+                       if (pdata->ymin>0.)
+                               symin=log(pdata->ymin);
+                       else
+                               symin=0.;
+                       symax=log(pdata->ymax);
+                       ymag=1000.;
+                       break;
+
+               case PTG_Time:
+                       symin=(double)pdata->ymin;
+                       symax=(double)pdata->ymax;
+                       ymag=1.;
+                       break;
+
+               default:
+                       debuga(_("Unknown type %d for Y axis scale\n"),pdata->ytype);
+                       return(-1);
+       }
+       gdata->YTickSpace=10;
+
+       range=symax-symin;
+       yscale=(double)(gdata->BottomGraph-gdata->TopGraph)/range;
+       gdata->YScale=yscale;
+       return(0);
 }
 
 static void greport_formatbin(double yval,int maxdigits,char *string,int slen)
 {
-   int len;
-   char schar[]={'\0','k','M','G','T','P'};
-   int scount;
-   int i;
-   int ndigits;
-
-   for (scount=0 ; scount<sizeof(schar)/sizeof(*schar) && yval>=1000. ; scount++)
-      yval/=1000.;
-   if (yval<2.)
-      ndigits=2;
-   else if (yval<3.)
-      ndigits=1;
-   else
-      ndigits=0;
-   if (ndigits>maxdigits) ndigits=maxdigits;
-   len=snprintf(string,slen,"%.*f",ndigits,(float)yval);
-   if (UseComma)
-      for (i=0 ; i<len ; i++)
-         if (string[i]=='.') string[i]=',';
-   if (schar[scount] && len<slen) {
-      string[len++]=schar[scount];
-      string[len]='\0';
-   }
+       int len;
+       char schar[]={'\0','k','M','G','T','P'};
+       int scount;
+       int i;
+       int ndigits;
+
+       for (scount=0 ; scount<sizeof(schar)/sizeof(*schar) && yval>=1000. ; scount++)
+               yval/=1000.;
+       if (yval<2.)
+               ndigits=2;
+       else if (yval<3.)
+               ndigits=1;
+       else
+               ndigits=0;
+       if (ndigits>maxdigits) ndigits=maxdigits;
+       len=snprintf(string,slen,"%.*f",ndigits,(float)yval);
+       if (UseComma)
+               for (i=0 ; i<len ; i++)
+                       if (string[i]=='.') string[i]=',';
+       if (schar[scount] && len<slen) {
+               string[len++]=schar[scount];
+               string[len]='\0';
+       }
 }
 
 static void greport_draw_yaxis(struct PlotStruct *pdata,struct GraphDataStruct *gdata)
 {
-   double yval;
-   int y0;
-   int y;
-   int yt;
-   char YLabel[50];
-   int xexterior;
-   int xinterior;
-   int xtick;
-
-   y0=gdata->BottomGraph;
-   yt=gdata->BottomDepth-gdata->BottomGraph;
-   xexterior=gdata->LeftGraph-10;
-   xinterior=gdata->LeftGraph;
-   xtick=gdata->LeftGraph-10-gdata->TickLength;
-   for(y=y0-gdata->YTickSpace ; y>=gdata->TopGraph ; y-=gdata->YTickSpace) {
-      gdImageLine(gdata->im, xtick, y+yt, xexterior, y+yt, gdata->dimgray);
-      gdImageLine(gdata->im, xexterior, y+yt, xinterior, y, gdata->dimgray);
-      gdImageLine(gdata->im, xinterior, y, gdata->RightGraph, y, gdata->dimgray);
-      switch (pdata->ytype)
-      {
-         case PTG_LinBin:
-            yval=(double)(y0-y)/gdata->YScale+(double)pdata->ymin;
-            greport_formatbin(yval,2,YLabel,sizeof(YLabel));
-            break;
-
-         case PTG_LogBin:
-            yval=exp((double)(y0-y)/gdata->YScale+log(pdata->ymin));
-            greport_formatbin(yval,2,YLabel,sizeof(YLabel));
-            break;
-
-         case PTG_Time:
-         {
-            int t;
-
-            yval=(double)(y0-y)/gdata->YScale+(double)pdata->ymin;
-            t=(int)(yval/60000.+0.5);
-            snprintf(YLabel,sizeof(YLabel),"%02d:%02d",t/60,t%60);
-            break;
-         }
-      }
-      Sarg_gdImageStringFT(gdata,gdata->dimgray,GraphFont,7,0.0,xtick,y+yt,YLabel,TRP_CenterRight);
-   }
+       double yval;
+       int y0;
+       int y;
+       int yt;
+       char YLabel[50];
+       int xexterior;
+       int xinterior;
+       int xtick;
+
+       y0=gdata->BottomGraph;
+       yt=gdata->BottomDepth-gdata->BottomGraph;
+       xexterior=gdata->LeftGraph-10;
+       xinterior=gdata->LeftGraph;
+       xtick=gdata->LeftGraph-10-gdata->TickLength;
+       for(y=y0-gdata->YTickSpace ; y>=gdata->TopGraph ; y-=gdata->YTickSpace) {
+               gdImageLine(gdata->im, xtick, y+yt, xexterior, y+yt, gdata->dimgray);
+               gdImageLine(gdata->im, xexterior, y+yt, xinterior, y, gdata->dimgray);
+               gdImageLine(gdata->im, xinterior, y, gdata->RightGraph, y, gdata->dimgray);
+               switch (pdata->ytype)
+               {
+                       case PTG_LinBin:
+                               yval=(double)(y0-y)/gdata->YScale+(double)pdata->ymin;
+                               greport_formatbin(yval,2,YLabel,sizeof(YLabel));
+                               break;
+
+                       case PTG_LogBin:
+                               yval=exp((double)(y0-y)/gdata->YScale+log(pdata->ymin));
+                               greport_formatbin(yval,2,YLabel,sizeof(YLabel));
+                               break;
+
+                       case PTG_Time:
+                       {
+                               int t;
+
+                               yval=(double)(y0-y)/gdata->YScale+(double)pdata->ymin;
+                               t=(int)(yval/60000.+0.5);
+                               snprintf(YLabel,sizeof(YLabel),"%02d:%02d",t/60,t%60);
+                               break;
+                       }
+               }
+               Sarg_gdImageStringFT(gdata,gdata->dimgray,GraphFont,7,0.0,xtick,y+yt,YLabel,TRP_CenterRight);
+       }
 }
 
 static void greport_plot(const struct userinfostruct *uinfo,struct PlotStruct *pdata)
 {
-   FILE *pngout;
-   int x, y;
-   int day;
-   int x1;
-   char graph[MAXLEN];
-   char s[15];
-   char ftime[128];
-   time_t t;
-   struct tm *local;
-   gdPoint points[4];
-   struct GraphDataStruct gdata;
-   const int ImgXSize=720;
-   const int ImgYSize=480;
-   const int LeftMargin=60;
-   const int RightMargin=20;
-   const int TopMargin=60;
-   const int BottomMargin=60;
-   const int TickLength=3;
-   const int ZTickLength=5;
-   double yval;
-   char blabel[50];
-   double logpmin;
-
-   memset(&gdata,0,sizeof(gdata));
-
-   gdata.im = gdImageCreate(ImgXSize, ImgYSize);
-   gdata.BottomGraph=ImgYSize-BottomMargin;
-   gdata.LeftGraph=LeftMargin;
-   gdata.RightGraph=ImgXSize-RightMargin;
-   gdata.TopGraph=TopMargin;
-   gdata.BottomDepth=gdata.BottomGraph+5;
-   gdata.XScale=(double)(gdata.RightGraph-gdata.LeftGraph)/(pdata->npoints+1);
-   if (greport_compute_yaxis(pdata,&gdata)<0) return;
-   gdata.TickLength=TickLength;
-
-   // first allocated color is the background
-   gdata.lavender = gdImageColorAllocate(gdata.im, 230, 230, 250);
-   gdata.gray = gdImageColorAllocate(gdata.im, 192, 192, 192);
-   gdata.silver = gdImageColorAllocate(gdata.im, 211, 211, 211);
-   gdata.black = gdImageColorAllocate(gdata.im, 0, 0, 0);
-   gdata.dimgray = gdImageColorAllocate(gdata.im, 105, 105, 105);
-   gdata.darkblue = gdImageColorAllocate(gdata.im, 0, 0, 139);
-   gdata.goldenrod = gdImageColorAllocate(gdata.im, 234, 234, 174);
-   gdata.goldenrod2 = gdImageColorAllocate(gdata.im, 207, 181, 59);
-
-   if(strcmp(GraphDaysBytesBarColor,"orange") == 0) {
-      gdata.color1 = gdImageColorAllocate(gdata.im, 255, 233, 142);
-      gdata.color2 = gdImageColorAllocate(gdata.im, 220, 163, 72);
-      gdata.color3 = gdImageColorAllocate(gdata.im, 255, 198, 107);
-   }
-   else if(strcmp(GraphDaysBytesBarColor,"blue") == 0) {
-      gdata.color1 = gdImageColorAllocate(gdata.im, 62, 80, 167);
-      gdata.color2 = gdImageColorAllocate(gdata.im, 40, 51, 101);
-      gdata.color3 = gdImageColorAllocate(gdata.im, 57, 73, 150);
-   }
-   else if(strcmp(GraphDaysBytesBarColor,"green") == 0) {
-      gdata.color1 = gdImageColorAllocate(gdata.im,120,166,129);
-      gdata.color2 = gdImageColorAllocate(gdata.im,84,113,82);
-      gdata.color3 = gdImageColorAllocate(gdata.im,158,223,167);
-   }
-   else if(strcmp(GraphDaysBytesBarColor,"yellow") == 0) {
-      gdata.color1 = gdImageColorAllocate(gdata.im,185,185,10);
-      gdata.color2 = gdImageColorAllocate(gdata.im,111,111,10);
-      gdata.color3 = gdImageColorAllocate(gdata.im,166,166,10);
-   }
-   else if(strcmp(GraphDaysBytesBarColor,"brown") == 0) {
-      gdata.color1 = gdImageColorAllocate(gdata.im,97,45,27);
-      gdata.color2 = gdImageColorAllocate(gdata.im,60,30,20);
-      gdata.color3 = gdImageColorAllocate(gdata.im,88,41,26);
-   }
-   else if(strcmp(GraphDaysBytesBarColor,"red")  == 0){
-      gdata.color1 = gdImageColorAllocate(gdata.im,185,10,10);
-      gdata.color2 = gdImageColorAllocate(gdata.im,111,10,10);
-      gdata.color3 = gdImageColorAllocate(gdata.im,166,10,10);
-   } else {
-      debuga(_("Unknown color \"%s\" requested for the graph. Using orange instead\n"),GraphDaysBytesBarColor);
-      gdata.color1 = gdImageColorAllocate(gdata.im, 255, 233, 142);
-      gdata.color2 = gdImageColorAllocate(gdata.im, 220, 163, 72);
-      gdata.color3 = gdImageColorAllocate(gdata.im, 255, 198, 107);
-   }
-
-   // rectangle around the image
-   gdImageRectangle(gdata.im, 0, 0, ImgXSize-1, ImgYSize-1, gdata.dimgray);
-   // backtround of the graph
-   gdImageFilledRectangle(gdata.im, LeftMargin, gdata.TopGraph, gdata.RightGraph, gdata.BottomGraph, gdata.silver);
-
-   // depth of the left Y axis
-   points[0].x = gdata.LeftGraph-10;
-   points[0].y = gdata.TopGraph+5;
-   points[1].x = gdata.LeftGraph-10;
-   points[1].y = gdata.BottomDepth;
-   points[2].x = gdata.LeftGraph;
-   points[2].y = gdata.BottomGraph;
-   points[3].x = gdata.LeftGraph;
-   points[3].y = gdata.TopGraph;
-   gdImageFilledPolygon(gdata.im, points, 4, gdata.gray);
-
-   // depth of the bottom X axis
-   points[0].x = gdata.LeftGraph;
-   points[0].y = gdata.BottomGraph;
-   points[1].x = gdata.LeftGraph-10;
-   points[1].y = gdata.BottomDepth;
-   points[2].x = gdata.RightGraph-10;
-   points[2].y = gdata.BottomDepth;
-   points[3].x = gdata.RightGraph;
-   points[3].y = gdata.BottomGraph;
-   gdImageFilledPolygon(gdata.im, points, 4, gdata.gray);
-
-   // vertical exterior line of the depth
-   gdImageLine(gdata.im, LeftMargin-10, TopMargin+5, LeftMargin-10, gdata.BottomDepth+ZTickLength, gdata.black);
-   // horizontal exterior line of the depth
-   gdImageLine(gdata.im, LeftMargin-10-ZTickLength, gdata.BottomDepth, gdata.RightGraph-10, gdata.BottomDepth, gdata.black);
-   // diagonal line between the two depths
-   gdImageLine(gdata.im, LeftMargin-10, gdata.BottomDepth, LeftMargin, gdata.BottomGraph, gdata.black);
-   // vertical left line of the graph
-   gdImageLine(gdata.im, LeftMargin, gdata.BottomGraph, LeftMargin, gdata.TopGraph, gdata.black);
-   // horizontal bottom line of the graph
-   gdImageLine(gdata.im, LeftMargin, gdata.BottomGraph, gdata.RightGraph, gdata.BottomGraph, gdata.black);
-   // vertical right line of the graph
-   gdImageLine(gdata.im, gdata.RightGraph, gdata.TopGraph, gdata.RightGraph, gdata.BottomGraph, gdata.black);
-   // diagonal line to close the right of the bottom depth
-   gdImageLine(gdata.im, gdata.RightGraph-10, gdata.BottomDepth, gdata.RightGraph, gdata.BottomGraph, gdata.black);
-
-   // Y axis ticks
-   greport_draw_yaxis(pdata,&gdata);
-
-   // X axis ticks and labels
-   for(y=1; y<=pdata->npoints; y++) {
-      x=gdata.LeftGraph-10+(int)((double)y*gdata.XScale+0.5);
-      gdImageLine(gdata.im, x, gdata.BottomDepth, x, gdata.BottomDepth+TickLength, gdata.dimgray);
-      sprintf(s,"%02d",y);
-      Sarg_gdImageStringFT(&gdata,gdata.dimgray,GraphFont,7,0.0,x,gdata.BottomDepth+TickLength+1,s,TRP_TopCenter);
-   }
-
-   t = time(NULL);
-   local = localtime(&t);
-   if(DateFormat[0]=='u')
-      strftime(ftime, sizeof(ftime), "%b/%d/%Y %H:%M", local);
-   if(DateFormat[0]=='e')
-      strftime(ftime, sizeof(ftime), "%d/%b/%Y-%H:%M", local);
-
-   x=ImgXSize*5/12;
-   Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,7,0.0,ImgXSize-10,ImgYSize-10,ftime,TRP_BottomRight);
-   if(ShowSargInfo) Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,10,0.0,x,15,_("SARG, "),TRP_BottomRight);
-   Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,10,0.0,x,15,Title,TRP_BottomLeft);
-   sprintf(warea,_("Period: %s"),period.text);
-   Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,9,0.0,x,27,warea,TRP_BottomLeft);
-   sprintf(warea,_("User: %s"),uinfo->label);
-   Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,9,0.0,x,38,warea,TRP_BottomLeft);
-
-   Sarg_gdImageStringFT(&gdata,gdata.black,GraphFont,10,3.141592/2,15,ImgYSize/2,pdata->YLabel,TRP_CenterLeft);
-   Sarg_gdImageStringFT(&gdata,gdata.black,GraphFont,10,0.0,ImgXSize/2,ImgYSize-20,pdata->XLabel,TRP_BottomCenter);
-
-   logpmin=(pdata->ytype==PTG_LogBin && pdata->ymin>0.) ? log(pdata->ymin) : 0.;
-   for (day=0 ; day<pdata->npoints ; day++) {
-      if (pdata->datapoints[day]>0) {
-         x1=gdata.LeftGraph-10+(int)((double)(day+1)*gdata.XScale+0.5);
-         switch (pdata->ytype)
-         {
-            case PTG_LinBin:
-               yval=(double)pdata->datapoints[day];
-               if (yval<pdata->ymin)
-                  yval=0.;
-               else if (yval>pdata->ymax)
-                  yval=pdata->ymax;
-               else
-                  yval-=pdata->ymin;
-               greport_formatbin(pdata->datapoints[day],1,blabel,sizeof(blabel));
-               break;
-            case PTG_LogBin:
-               yval=(double)pdata->datapoints[day];
-               if (yval<=pdata->ymin)
-                  yval=0.;
-               else if (yval>pdata->ymax)
-                  yval=log(pdata->ymax)-logpmin;
-               else
-                  yval=log(yval)-logpmin;
-               greport_formatbin(pdata->datapoints[day],1,blabel,sizeof(blabel));
-               break;
-            case PTG_Time:
-            {
-               int t;
-
-               yval=(double)pdata->datapoints[day];
-               if (yval<pdata->ymin)
-                  yval=0.;
-               else if (yval>pdata->ymax)
-                  yval=pdata->ymax;
-               else
-                  yval-=pdata->ymin;
-               t=(int)(pdata->datapoints[day]/60000.);
-               snprintf(blabel,sizeof(blabel),"%d:%02d",t/60,t%60);
-               break;
-            }
-            default:
-               yval=-1.;
-               break;
-         }
-         if (yval>=0.) bar(&gdata,x1,yval,blabel);
-      }
-   }
-
-   if (snprintf(graph,sizeof(graph),"%s/%s/%s",outdirname,uinfo->filename,pdata->pngfile)>=sizeof(graph)) {
-      debuga(_("user name too long for %s/%s/%s\n"),outdirname,uinfo->filename,pdata->pngfile);
-      exit(EXIT_FAILURE);
-   }
-   if((pngout=fopen(graph,"wb"))==NULL) {
-      debuga(_("(grepday) Cannot open log file %s\n"),graph);
-      exit(EXIT_FAILURE);
-   }
-   gdImagePng(gdata.im, pngout);
-   fclose(pngout);
-   gdImageDestroy(gdata.im);
-
-   if (gdata.string) free(gdata.string);
+       FILE *pngout;
+       int x, y;
+       int day;
+       int x1;
+       char graph[MAXLEN];
+       char s[15];
+       char ftime[128];
+       time_t t;
+       struct tm *local;
+       gdPoint points[4];
+       struct GraphDataStruct gdata;
+       const int ImgXSize=720;
+       const int ImgYSize=480;
+       const int LeftMargin=60;
+       const int RightMargin=20;
+       const int TopMargin=60;
+       const int BottomMargin=60;
+       const int TickLength=3;
+       const int ZTickLength=5;
+       double yval;
+       char blabel[50];
+       double logpmin;
+
+       memset(&gdata,0,sizeof(gdata));
+
+       gdata.im = gdImageCreate(ImgXSize, ImgYSize);
+       gdata.BottomGraph=ImgYSize-BottomMargin;
+       gdata.LeftGraph=LeftMargin;
+       gdata.RightGraph=ImgXSize-RightMargin;
+       gdata.TopGraph=TopMargin;
+       gdata.BottomDepth=gdata.BottomGraph+5;
+       gdata.XScale=(double)(gdata.RightGraph-gdata.LeftGraph)/(pdata->npoints+1);
+       if (greport_compute_yaxis(pdata,&gdata)<0) return;
+       gdata.TickLength=TickLength;
+
+       // first allocated color is the background
+       gdata.lavender = gdImageColorAllocate(gdata.im, 230, 230, 250);
+       gdata.gray = gdImageColorAllocate(gdata.im, 192, 192, 192);
+       gdata.silver = gdImageColorAllocate(gdata.im, 211, 211, 211);
+       gdata.black = gdImageColorAllocate(gdata.im, 0, 0, 0);
+       gdata.dimgray = gdImageColorAllocate(gdata.im, 105, 105, 105);
+       gdata.darkblue = gdImageColorAllocate(gdata.im, 0, 0, 139);
+       gdata.goldenrod = gdImageColorAllocate(gdata.im, 234, 234, 174);
+       gdata.goldenrod2 = gdImageColorAllocate(gdata.im, 207, 181, 59);
+
+       if(strcmp(GraphDaysBytesBarColor,"orange") == 0) {
+               gdata.color1 = gdImageColorAllocate(gdata.im, 255, 233, 142);
+               gdata.color2 = gdImageColorAllocate(gdata.im, 220, 163, 72);
+               gdata.color3 = gdImageColorAllocate(gdata.im, 255, 198, 107);
+       }
+       else if(strcmp(GraphDaysBytesBarColor,"blue") == 0) {
+               gdata.color1 = gdImageColorAllocate(gdata.im, 62, 80, 167);
+               gdata.color2 = gdImageColorAllocate(gdata.im, 40, 51, 101);
+               gdata.color3 = gdImageColorAllocate(gdata.im, 57, 73, 150);
+       }
+       else if(strcmp(GraphDaysBytesBarColor,"green") == 0) {
+               gdata.color1 = gdImageColorAllocate(gdata.im,120,166,129);
+               gdata.color2 = gdImageColorAllocate(gdata.im,84,113,82);
+               gdata.color3 = gdImageColorAllocate(gdata.im,158,223,167);
+       }
+       else if(strcmp(GraphDaysBytesBarColor,"yellow") == 0) {
+               gdata.color1 = gdImageColorAllocate(gdata.im,185,185,10);
+               gdata.color2 = gdImageColorAllocate(gdata.im,111,111,10);
+               gdata.color3 = gdImageColorAllocate(gdata.im,166,166,10);
+       }
+       else if(strcmp(GraphDaysBytesBarColor,"brown") == 0) {
+               gdata.color1 = gdImageColorAllocate(gdata.im,97,45,27);
+               gdata.color2 = gdImageColorAllocate(gdata.im,60,30,20);
+               gdata.color3 = gdImageColorAllocate(gdata.im,88,41,26);
+       }
+       else if(strcmp(GraphDaysBytesBarColor,"red")  == 0){
+               gdata.color1 = gdImageColorAllocate(gdata.im,185,10,10);
+               gdata.color2 = gdImageColorAllocate(gdata.im,111,10,10);
+               gdata.color3 = gdImageColorAllocate(gdata.im,166,10,10);
+       } else {
+               debuga(_("Unknown color \"%s\" requested for the graph. Using orange instead\n"),GraphDaysBytesBarColor);
+               gdata.color1 = gdImageColorAllocate(gdata.im, 255, 233, 142);
+               gdata.color2 = gdImageColorAllocate(gdata.im, 220, 163, 72);
+               gdata.color3 = gdImageColorAllocate(gdata.im, 255, 198, 107);
+       }
+
+       // rectangle around the image
+       gdImageRectangle(gdata.im, 0, 0, ImgXSize-1, ImgYSize-1, gdata.dimgray);
+       // backtround of the graph
+       gdImageFilledRectangle(gdata.im, LeftMargin, gdata.TopGraph, gdata.RightGraph, gdata.BottomGraph, gdata.silver);
+
+       // depth of the left Y axis
+       points[0].x = gdata.LeftGraph-10;
+       points[0].y = gdata.TopGraph+5;
+       points[1].x = gdata.LeftGraph-10;
+       points[1].y = gdata.BottomDepth;
+       points[2].x = gdata.LeftGraph;
+       points[2].y = gdata.BottomGraph;
+       points[3].x = gdata.LeftGraph;
+       points[3].y = gdata.TopGraph;
+       gdImageFilledPolygon(gdata.im, points, 4, gdata.gray);
+
+       // depth of the bottom X axis
+       points[0].x = gdata.LeftGraph;
+       points[0].y = gdata.BottomGraph;
+       points[1].x = gdata.LeftGraph-10;
+       points[1].y = gdata.BottomDepth;
+       points[2].x = gdata.RightGraph-10;
+       points[2].y = gdata.BottomDepth;
+       points[3].x = gdata.RightGraph;
+       points[3].y = gdata.BottomGraph;
+       gdImageFilledPolygon(gdata.im, points, 4, gdata.gray);
+
+       // vertical exterior line of the depth
+       gdImageLine(gdata.im, LeftMargin-10, TopMargin+5, LeftMargin-10, gdata.BottomDepth+ZTickLength, gdata.black);
+       // horizontal exterior line of the depth
+       gdImageLine(gdata.im, LeftMargin-10-ZTickLength, gdata.BottomDepth, gdata.RightGraph-10, gdata.BottomDepth, gdata.black);
+       // diagonal line between the two depths
+       gdImageLine(gdata.im, LeftMargin-10, gdata.BottomDepth, LeftMargin, gdata.BottomGraph, gdata.black);
+       // vertical left line of the graph
+       gdImageLine(gdata.im, LeftMargin, gdata.BottomGraph, LeftMargin, gdata.TopGraph, gdata.black);
+       // horizontal bottom line of the graph
+       gdImageLine(gdata.im, LeftMargin, gdata.BottomGraph, gdata.RightGraph, gdata.BottomGraph, gdata.black);
+       // vertical right line of the graph
+       gdImageLine(gdata.im, gdata.RightGraph, gdata.TopGraph, gdata.RightGraph, gdata.BottomGraph, gdata.black);
+       // diagonal line to close the right of the bottom depth
+       gdImageLine(gdata.im, gdata.RightGraph-10, gdata.BottomDepth, gdata.RightGraph, gdata.BottomGraph, gdata.black);
+
+       // Y axis ticks
+       greport_draw_yaxis(pdata,&gdata);
+
+       // X axis ticks and labels
+       for(y=1; y<=pdata->npoints; y++) {
+               x=gdata.LeftGraph-10+(int)((double)y*gdata.XScale+0.5);
+               gdImageLine(gdata.im, x, gdata.BottomDepth, x, gdata.BottomDepth+TickLength, gdata.dimgray);
+               sprintf(s,"%02d",y);
+               Sarg_gdImageStringFT(&gdata,gdata.dimgray,GraphFont,7,0.0,x,gdata.BottomDepth+TickLength+1,s,TRP_TopCenter);
+       }
+
+       t = time(NULL);
+       local = localtime(&t);
+       if(DateFormat[0]=='u')
+               strftime(ftime, sizeof(ftime), "%b/%d/%Y %H:%M", local);
+       if(DateFormat[0]=='e')
+               strftime(ftime, sizeof(ftime), "%d/%b/%Y-%H:%M", local);
+
+       x=ImgXSize*5/12;
+       Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,7,0.0,ImgXSize-10,ImgYSize-10,ftime,TRP_BottomRight);
+       if(ShowSargInfo) Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,10,0.0,x,15,_("SARG, "),TRP_BottomRight);
+       Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,10,0.0,x,15,Title,TRP_BottomLeft);
+       sprintf(warea,_("Period: %s"),period.text);
+       Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,9,0.0,x,27,warea,TRP_BottomLeft);
+       sprintf(warea,_("User: %s"),uinfo->label);
+       Sarg_gdImageStringFT(&gdata,gdata.darkblue,GraphFont,9,0.0,x,38,warea,TRP_BottomLeft);
+
+       Sarg_gdImageStringFT(&gdata,gdata.black,GraphFont,10,3.141592/2,15,ImgYSize/2,pdata->YLabel,TRP_CenterLeft);
+       Sarg_gdImageStringFT(&gdata,gdata.black,GraphFont,10,0.0,ImgXSize/2,ImgYSize-20,pdata->XLabel,TRP_BottomCenter);
+
+       logpmin=(pdata->ytype==PTG_LogBin && pdata->ymin>0.) ? log(pdata->ymin) : 0.;
+       for (day=0 ; day<pdata->npoints ; day++) {
+               if (pdata->datapoints[day]>0) {
+                       x1=gdata.LeftGraph-10+(int)((double)(day+1)*gdata.XScale+0.5);
+                       switch (pdata->ytype)
+                       {
+                               case PTG_LinBin:
+                                       yval=(double)pdata->datapoints[day];
+                                       if (yval<pdata->ymin)
+                                               yval=0.;
+                                       else if (yval>pdata->ymax)
+                                               yval=pdata->ymax;
+                                       else
+                                               yval-=pdata->ymin;
+                                       greport_formatbin(pdata->datapoints[day],1,blabel,sizeof(blabel));
+                                       break;
+                               case PTG_LogBin:
+                                       yval=(double)pdata->datapoints[day];
+                                       if (yval<=pdata->ymin)
+                                               yval=0.;
+                                       else if (yval>pdata->ymax)
+                                               yval=log(pdata->ymax)-logpmin;
+                                       else
+                                               yval=log(yval)-logpmin;
+                                       greport_formatbin(pdata->datapoints[day],1,blabel,sizeof(blabel));
+                                       break;
+                               case PTG_Time:
+                               {
+                                       int t;
+
+                                       yval=(double)pdata->datapoints[day];
+                                       if (yval<pdata->ymin)
+                                               yval=0.;
+                                       else if (yval>pdata->ymax)
+                                               yval=pdata->ymax;
+                                       else
+                                               yval-=pdata->ymin;
+                                       t=(int)(pdata->datapoints[day]/60000.);
+                                       snprintf(blabel,sizeof(blabel),"%d:%02d",t/60,t%60);
+                                       break;
+                               }
+                               default:
+                                       yval=-1.;
+                                       break;
+                       }
+                       if (yval>=0.) bar(&gdata,x1,yval,blabel);
+               }
+       }
+
+       if (snprintf(graph,sizeof(graph),"%s/%s/%s",outdirname,uinfo->filename,pdata->pngfile)>=sizeof(graph)) {
+               debuga(_("user name too long for %s/%s/%s\n"),outdirname,uinfo->filename,pdata->pngfile);
+               exit(EXIT_FAILURE);
+       }
+       if((pngout=fopen(graph,"wb"))==NULL) {
+               debuga(_("(grepday) Cannot open log file %s\n"),graph);
+               exit(EXIT_FAILURE);
+       }
+       gdImagePng(gdata.im, pngout);
+       fclose(pngout);
+       gdImageDestroy(gdata.im);
+
+       if (gdata.string) free(gdata.string);
 }
 
 #endif //HAVE_GD
@@ -633,16 +633,16 @@ static void greport_plot(const struct userinfostruct *uinfo,struct PlotStruct *p
 void greport_prepare(void)
 {
 #ifdef HAVE_GD
-   if(access(GraphFont, R_OK) != 0) {
-      debuga(_("(grepday) Fontname %s not found\n"),GraphFont);
-      exit(EXIT_FAILURE);
-   }
+       if(access(GraphFont, R_OK) != 0) {
+               debuga(_("(grepday) Fontname %s not found\n"),GraphFont);
+               exit(EXIT_FAILURE);
+       }
 
 #ifdef USE_ICONV
-   localtoutf = iconv_open ("UTF-8", CharSet);
-   if (localtoutf==(iconv_t)-1) {
-      debuga(_("(grepday) iconv cannot convert from %s to UTF-8 - %s\n"),CharSet,strerror(errno));
-   }
+       localtoutf = iconv_open ("UTF-8", CharSet);
+       if (localtoutf==(iconv_t)-1) {
+               debuga(_("(grepday) iconv cannot convert from %s to UTF-8 - %s\n"),CharSet,strerror(errno));
+       }
 #endif
 
 #endif //HAVE_GD
@@ -651,126 +651,126 @@ void greport_prepare(void)
 void greport_day(const struct userinfostruct *uinfo)
 {
 #ifdef HAVE_GD
-   FILE *fp_in, *fp_ou;
-   char wdirname[MAXLEN];
-   char buf[MAXLEN];
-   char colsep;
-   int day;
-   long long int llday;
-   long long int bytes;
-   long long int elap;
-   long long int bytespoints[31];
-   long long int elappoints[31];
-   struct getwordstruct gwarea;
-   struct PlotStruct pdata;
-
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("user name too long for %s/%s.day\n"),tmp,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
-   if(access(wdirname, R_OK) != 0) {
-      return;
-   }
-   if(!Graphs || GraphFont[0]=='\0') {
-      unlink(wdirname);
-      return;
-   }
-
-   if((fp_in=fopen(wdirname,"r"))==NULL) {
-      debuga(_("(grepday) Cannot open log file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
-
-   memset(bytespoints,0,sizeof(bytespoints));
-   memset(elappoints,0,sizeof(elappoints));
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword_atoll(&llday,&gwarea,'/')<0) {
-         debuga(_("Invalid date in file %s\n"),wdirname);
-         exit(EXIT_FAILURE);
-      }
-      day=(int)llday;
-      if (day<1 || day>31) continue;
-      if (getword_skip(20,&gwarea,'\t')<0 || getword_skip(20,&gwarea,'\t')<0) {
-         debuga(_("Invalid entry in file %s\n"),wdirname);
-         exit(EXIT_FAILURE);
-      }
-      if ((datetimeby & DATETIME_BYTE)!=0) {
-         colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
-         if (getword_atoll(&bytes,&gwarea,'\t')<0) {
-            debuga(_("Invalid number of bytes in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         bytespoints[day-1]+=bytes;
-      }
-      if ((datetimeby & DATETIME_ELAP)!=0) {
-         if (getword_atoll(&elap,&gwarea,'\0')<0) {
-            debuga(_("Invalid elapsed time in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         elappoints[day-1]+=elap;
-      }
-   }
-   fclose(fp_in);
-   unlink(wdirname);
-
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s/graph.html",outdirname,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("user name too long for %s/%s/%s\n"),outdirname,uinfo->filename,"graph.html");
-      exit(EXIT_FAILURE);
-   }
-   if ((fp_ou=fopen(wdirname,"wt"))==NULL) {
-     debuga(_("(grepday) Cannot open output file %s\n"),wdirname);
-     exit(EXIT_FAILURE);
-   }
-   write_html_head(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Graph report"),HTML_JS_NONE);
-
-   fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
-   if((datetimeby & DATETIME_BYTE)!=0) {
-      memset(&pdata,0,sizeof(pdata));
-      pdata.datapoints=bytespoints;
-      pdata.npoints=31;
-      pdata.XLabel=_("DAYS");
-      pdata.ymin=50LL*1000LL;
-      pdata.ymax=5LL*1000LL*1000LL*1000LL;
-      pdata.ytype=PTG_LogBin;
-      pdata.YLabel=_("BYTES");
-      pdata.pngfile="graph_day_byte.png";
-      greport_plot(uinfo,&pdata);
-      fprintf(fp_ou,"<tr><td><img src=\"%s\" alt=\"B\"></td></tr>\n",pdata.pngfile);
-   }
-   if((datetimeby & DATETIME_ELAP)!=0) {
-      memset(&pdata,0,sizeof(pdata));
-      pdata.datapoints=elappoints;
-      pdata.npoints=31;
-      pdata.XLabel=_("DAYS");
-      pdata.ymin=0;
-      pdata.ymax=86400000;
-      pdata.ytype=PTG_Time;
-      pdata.YLabel=_("ELAPSED TIME");
-      pdata.pngfile="graph_day_elap.png";
-      greport_plot(uinfo,&pdata);
-      fprintf(fp_ou,"<tr><td><img src=\"%s\" alt=\"E\"></td></tr>\n",pdata.pngfile);
-   }
-   fputs("</table>\n",fp_ou);
-
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),wdirname);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
+       FILE *fp_in, *fp_ou;
+       char wdirname[MAXLEN];
+       char buf[MAXLEN];
+       char colsep;
+       int day;
+       long long int llday;
+       long long int bytes;
+       long long int elap;
+       long long int bytespoints[31];
+       long long int elappoints[31];
+       struct getwordstruct gwarea;
+       struct PlotStruct pdata;
+
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("user name too long for %s/%s.day\n"),tmp,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
+       if(access(wdirname, R_OK) != 0) {
+               return;
+       }
+       if(!Graphs || GraphFont[0]=='\0') {
+               unlink(wdirname);
+               return;
+       }
+
+       if((fp_in=fopen(wdirname,"r"))==NULL) {
+               debuga(_("(grepday) Cannot open log file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
+
+       memset(bytespoints,0,sizeof(bytespoints));
+       memset(elappoints,0,sizeof(elappoints));
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword_atoll(&llday,&gwarea,'/')<0) {
+                       debuga(_("Invalid date in file %s\n"),wdirname);
+                       exit(EXIT_FAILURE);
+               }
+               day=(int)llday;
+               if (day<1 || day>31) continue;
+               if (getword_skip(20,&gwarea,'\t')<0 || getword_skip(20,&gwarea,'\t')<0) {
+                       debuga(_("Invalid entry in file %s\n"),wdirname);
+                       exit(EXIT_FAILURE);
+               }
+               if ((datetimeby & DATETIME_BYTE)!=0) {
+                       colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
+                       if (getword_atoll(&bytes,&gwarea,'\t')<0) {
+                               debuga(_("Invalid number of bytes in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       bytespoints[day-1]+=bytes;
+               }
+               if ((datetimeby & DATETIME_ELAP)!=0) {
+                       if (getword_atoll(&elap,&gwarea,'\0')<0) {
+                               debuga(_("Invalid elapsed time in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       elappoints[day-1]+=elap;
+               }
+       }
+       fclose(fp_in);
+       unlink(wdirname);
+
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s/graph.html",outdirname,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("user name too long for %s/%s/%s\n"),outdirname,uinfo->filename,"graph.html");
+               exit(EXIT_FAILURE);
+       }
+       if ((fp_ou=fopen(wdirname,"wt"))==NULL) {
+       debuga(_("(grepday) Cannot open output file %s\n"),wdirname);
+       exit(EXIT_FAILURE);
+       }
+       write_html_head(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Graph report"),HTML_JS_NONE);
+
+       fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
+       if((datetimeby & DATETIME_BYTE)!=0) {
+               memset(&pdata,0,sizeof(pdata));
+               pdata.datapoints=bytespoints;
+               pdata.npoints=31;
+               pdata.XLabel=_("DAYS");
+               pdata.ymin=50LL*1000LL;
+               pdata.ymax=5LL*1000LL*1000LL*1000LL;
+               pdata.ytype=PTG_LogBin;
+               pdata.YLabel=_("BYTES");
+               pdata.pngfile="graph_day_byte.png";
+               greport_plot(uinfo,&pdata);
+               fprintf(fp_ou,"<tr><td><img src=\"%s\" alt=\"B\"></td></tr>\n",pdata.pngfile);
+       }
+       if((datetimeby & DATETIME_ELAP)!=0) {
+               memset(&pdata,0,sizeof(pdata));
+               pdata.datapoints=elappoints;
+               pdata.npoints=31;
+               pdata.XLabel=_("DAYS");
+               pdata.ymin=0;
+               pdata.ymax=86400000;
+               pdata.ytype=PTG_Time;
+               pdata.YLabel=_("ELAPSED TIME");
+               pdata.pngfile="graph_day_elap.png";
+               greport_plot(uinfo,&pdata);
+               fprintf(fp_ou,"<tr><td><img src=\"%s\" alt=\"E\"></td></tr>\n",pdata.pngfile);
+       }
+       fputs("</table>\n",fp_ou);
+
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),wdirname);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
 #endif //HAVE_GD
 
-   return;
+       return;
 }
 
 void greport_cleanup(void)
 {
 #ifdef HAVE_GD
-   gdFontCacheShutdown();
+       gdFontCacheShutdown();
 
 #ifdef USE_ICONV
-   if (localtoutf!=(iconv_t)-1)
-      iconv_close (localtoutf);
+       if (localtoutf!=(iconv_t)-1)
+               iconv_close (localtoutf);
 #endif
 #endif //HAVE_GD
 }
diff --git a/html.c b/html.c
index bc4175189b57ce8054fd8c0da590c14d707e520d..a6beae5611f80414b0d60d61537575e797ec6d0d 100644 (file)
--- a/html.c
+++ b/html.c
 
 void htmlrel(void)
 {
-   DIR *dirp;
-   FILE *fp_in, *fp_ou, *fp_ip, *fp_ip2, *fp_usr;
-
-   struct dirent *direntp;
-   long long int nnbytes=0, unbytes=0, tnbytes=0, totbytes=0, totbytes2=0;
-   long long int totelap=0, totelap2=0, nnelap=0, unelap=0, tnelap=0;
-   long long int incache=0, oucache=0, tnincache=0, tnoucache=0, twork=0;
-   long long int ltemp;
-   long long int ntotuser;
-   long long int userbytes, userelap;
-   char *buf;
-   char arqin[MAXLEN], arqou[MAXLEN], arqper[MAXLEN], arqip[MAXLEN];
-   char *url, tmsg[50], csort[MAXLEN];
-   char user[MAXLEN], duser[MAXLEN];
-   char user_ip[MAXLEN], olduserip[MAXLEN], tmp2[MAXLEN], tmp3[MAXLEN];
-   char denied_report[255];
-   char *str;
-   char warea[MAXLEN];
-   char totuser[8];
-   char tmp6[MAXLEN];
-   char *user_url;
-   long long int tnacc=0, ttnacc=0, unacc=0;
-   double perc=0, perc2=0, ouperc=0, inperc=0;
-   int count;
-   int cstatus;
-   const char txtext[]=".txt";
-   const char *sort_field;
-   const char *sort_order;
-   int dlen;
-   char siteind[MAX_TRUNCATED_URL];
-   struct getwordstruct gwarea;
-   longline line,line1;
-   struct generalitemstruct item;
-   const struct userinfostruct *uinfo;
-
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
-
-   strcpy(tmp2,tmp);
-   strcat(tmp2,"/sargtmp.unsort");
-
-   strcpy(tmp3,tmp);
-   strcat(tmp3,"/sargtmp.log");
-
-   snprintf(arqper,sizeof(arqper),"%s/sarg-general",outdirname);
-   if ((fp_in = fopen(arqper, "r")) == 0){
-      debuga(_("(html2) Cannot open file %s\n"),arqper);
-      exit(EXIT_FAILURE);
-   }
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),arqper);
-      exit(EXIT_FAILURE);
-   }
-   ttnacc=0;
-   totbytes=0;
-   totelap=0;
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      ger_read(buf,&item,arqper);
-      if(item.total) {
-         ttnacc+=item.nacc;
-         totbytes+=item.nbytes;
-         totelap+=item.nelap;
-      }
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   snprintf(arqper,sizeof(arqper),"%s/sarg-users",outdirname);
-   if ((fp_in = fopen(arqper, "r")) == 0){
-      debuga(_("(html11) Cannot open file %s\n"),arqper);
-      exit(EXIT_FAILURE);
-   }
-   if (!fgets(totuser,sizeof(totuser),fp_in)) {
-      debuga(_("(html11) read error in %s\n"),arqper);
-      exit(EXIT_FAILURE);
-   }
-   fclose(fp_in);
-   ntotuser=my_atoll(totuser);
-   if (ntotuser<=0) ntotuser=1;
-
-   greport_prepare();
-
-   sort_labels(&sort_field,&sort_order);
-
-   if ((dirp = opendir(tmp)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ( (direntp = readdir( dirp )) != NULL ) {
-      dlen=strlen(direntp->d_name)-(sizeof(txtext)-1);
-      if (dlen<0) continue;
-      if(strcmp(direntp->d_name+dlen,txtext) != 0)
-         continue;
-
-      count=1;
-      if (dlen>0) {
-         if (dlen>=sizeof(user)) continue;
-         strncpy(user,direntp->d_name,dlen);
-         user[dlen]=0;
-      } else {
-         user[0]=0;
-      }
-
-      uinfo=userinfo_find_from_file(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in directory %s\n"),user,tmp);
-         exit(EXIT_FAILURE);
-      }
-      str=strrchr(user,'.');
-      if (str)
-         strcpy(denied_report,str+1);
-      else
-         strcpy(denied_report,user);
-
-      if (snprintf(warea,sizeof(warea),"%s/%s",outdirname,user)>=sizeof(warea)) {
-         debuga(_("Destination directory too long: %s/%s\n"),outdirname,user);
-         exit(EXIT_FAILURE);
-      }
-      mkdir(warea,0755);
-
-      report_day(uinfo);
-      greport_day(uinfo);
-
-      if (snprintf(arqin,sizeof(arqin),"%s/%s",tmp,direntp->d_name)>=sizeof(arqin)) {
-         debuga(_("Input file name too long: %s/%s\n"),tmp,direntp->d_name);
-         exit(EXIT_FAILURE);
-      }
-      if (snprintf(arqou,sizeof(arqou),"%s/%s/%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqou)) {
-         debuga(_("Output file name too long: %s/%s/%s.html\n"),outdirname,uinfo->filename,uinfo->filename);
-         exit(EXIT_FAILURE);
-      }
-      if (snprintf(duser,sizeof(duser),"%s/%s/denied_%s.html",tmp,direntp->d_name,denied_report)>=sizeof(duser)) {
-         debuga(_("File name too long: %s/%s/denied_%s.html\n"),tmp,direntp->d_name,denied_report);
-         exit(EXIT_FAILURE);
-      }
-      if(access(duser, R_OK) != 0)
-         denied_report[0]='\0';
-
-      if ((fp_in = fopen(arqin, "r")) == 0){
-         debuga(_("(html3) Cannot open file %s\n"),arqin);
-         exit(EXIT_FAILURE);
-      }
-
-      if ((line=longline_create())==NULL) {
-         debuga(_("Not enough memory to read file %s\n"),arqin);
-         exit(EXIT_FAILURE);
-      }
-
-      tnacc=0;
-      tnbytes=0;
-      tnelap=0;
-      tnincache=0;
-      tnoucache=0;
-      while((buf=longline_read(fp_in,line))!=NULL) {
-         getword_start(&gwarea,buf);
-         if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
-            debuga(_("There is a broken number of access in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         tnacc+=ltemp;
-         if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
-            debuga(_("There is a broken downloaded size in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         tnbytes+=ltemp;
-         if (getword_ptr(NULL,NULL,&gwarea,'\t')<0) {
-            debuga(_("There is a broken url in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_skip(MAXLEN,&gwarea,'\t')<0) {
-            debuga(_("There is a broken access code in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
-            debuga(_("There is a broken elapsed time in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         tnelap+=ltemp;
-         if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
-            debuga(_("There is a broken in-cache volume in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         tnincache+=ltemp;
-         if (getword_atoll(&ltemp,&gwarea,'\n')<0) {
-            debuga(_("There is a broken out-cache volume in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         tnoucache+=ltemp;
-      }
-
-      rewind(fp_in);
-
-      if ((fp_ou = fopen(arqou, "w")) == 0){
-         debuga(_("(html5) Cannot open file %s\n"),arqou);
-         exit(EXIT_FAILURE);
-      }
-
-      write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("User report"),HTML_JS_SORTTABLE);
-      fprintf(fp_ou,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
-      fprintf(fp_ou,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("User"),uinfo->label);
-      fputs("<tr><td class=\"header_c\">",fp_ou);
-      fprintf(fp_ou,_("Sort:&nbsp;%s, %s"),sort_field,sort_order);
-      fputs("</td></tr>\n",fp_ou);
-      fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("User report"));
-      close_html_header(fp_ou);
-
-      fputs("<div class=\"report\"><table cellpadding=\"2\" cellspacing=\"1\"",fp_ou);
-      if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
-      fputs(">\n",fp_ou);
-
-      /*! \bug This line lays before the header of the table and is therefore invalid
-      HTML. It will also break the sorttable script. Beside, I suspect it serves no purpose.
-      */
-      if(denied_report[0]!='\0') {
-         fprintf(fp_ou,"<tr><td class=\"header_l\" colspan=\"11\"><a href=\"denied_%s.html\">%s</a> %s</td></tr>\n",denied_report,_("SmartFilter"),_("Report"));
-      }
-
-      fputs("<thead><tr><th class=\"sorttable_nosort\"></th><th class=\"header_l",fp_ou);
-      if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
-      fprintf(fp_ou,"\">%s</th>",_("ACCESSED SITE"));
-
-      if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("CONNECT"));
-      if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("BYTES"));
-      if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%%%s</th>",_("BYTES"));
-      if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
-         fprintf(fp_ou,"<th class=\"header_c\" colspan=\"2\">%s</th><th style=\"display:none;\"></th>",_("IN-CACHE-OUT"));
-      if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("ELAPSED TIME"));
-      if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("MILLISEC"));
-      if((UserReportFields & USERREPORTFIELDS_PTIME) != 0)
-         fprintf(fp_ou,"<th class=\"header_l\">%%%s</th>",_("TIME"));
-
-      fputs("</tr></thead>\n",fp_ou);
-
-      if(debug) {
-         debuga(_("Making report: %s\n"),uinfo->id);
-      }
-
-      while((buf=longline_read(fp_in,line))!=NULL) {
-         getword_start(&gwarea,buf);
-         if (getword_atoll(&twork,&gwarea,'\t')<0) {
-            debuga(_("There is a broken number of access in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_atoll(&nnbytes,&gwarea,'\t')<0) {
-            debuga(_("There is a broken number of bytes in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-            debuga(_("There is a broken url in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword(tmsg,sizeof(tmsg),&gwarea,'\t')<0) {
-            debuga(_("There is a broken access code in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_atoll(&nnelap,&gwarea,'\t')<0) {
-            debuga(_("There is a broken elapsed time in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_atoll(&incache,&gwarea,'\t')<0) {
-            debuga(_("There is a broken in cache column in file %s\n"),arqin);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_atoll(&oucache,&gwarea,'\n')<0) {
-            debuga(_("There is a broken out of cache column in file %s (%d)\n"),arqin,__LINE__);
-            exit(EXIT_FAILURE);
-         }
-
-         if(UserReportLimit<=0 || count<=UserReportLimit) {
-            fputs("<tr>",fp_ou);
-
-            if(IndexTree == INDEX_TREE_DATE)
-               sprintf(tmp6,"../%s",ImageFile);
-            else
-               strcpy(tmp6,"../../images");
-
-            if((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0) {
-               url_to_file(url,siteind,sizeof(siteind));
-               fprintf(fp_ou,"<td class=\"data\"><a href=\"tt%s-%s.html\"><img src=\"%s/datetime.png\" title=\"%s\" alt=\"T\"></a></td>",uinfo->filename,siteind,tmp6,_("date/time report"));
-            } else {
-               fprintf(fp_ou,"<td class=\"data\"></td>");
-            }
-
-            if(Privacy)
-               fprintf(fp_ou,"<td class=\"data2\"><span style=\"color:%s;\">%s</span></td>",PrivacyStringColor,PrivacyString);
-            else {
-               fputs("<td class=\"data2\">",fp_ou);
-               if(BlockIt[0]!='\0') {
-                  fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
-                  output_html_url(fp_ou,url);
-                  fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",tmp6);
-               }
-               fputs("<a href=\"http://",fp_ou);
-               output_html_url(fp_ou,url);
-               fputs("\">",fp_ou);
-               output_html_string(fp_ou,url,100);
-               fputs("</a></td>",fp_ou);
-            }
-
-            if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0) {
-               fputs("<td class=\"data\"",fp_ou);
-               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)twork);
-               fprintf(fp_ou,">%s</td>",fixnum(twork,1));
-            }
-            if((UserReportFields & USERREPORTFIELDS_BYTES) != 0) {
-               fputs("<td class=\"data\"",fp_ou);
-               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnbytes);
-               fprintf(fp_ou,">%s</td>",fixnum(nnbytes,1));
-            }
-            if((UserReportFields & USERREPORTFIELDS_SETYB) != 0) {
-               perc=(tnbytes) ? nnbytes * 100. / tnbytes : 0.;
-               fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td>",perc);
-            }
-            if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0) {
-               inperc=(nnbytes) ? incache * 100. / nnbytes : 0.;
-               ouperc=(nnbytes) ? oucache * 100. / nnbytes : 0.;
-               fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td><td class=\"data\">%3.2lf%%</td>",inperc,ouperc);
-            }
-            if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0) {
-               fputs("<td class=\"data\"",fp_ou);
-               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnelap);
-               fprintf(fp_ou,">%s</td>",buildtime(nnelap));
-            }
-            if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0) {
-               fputs("<td class=\"data\"",fp_ou);
-               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnelap);
-               fprintf(fp_ou,">%s</td>",fixnum2(nnelap,1));
-            }
-            if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
-               perc2=(tnelap) ? nnelap * 100. / tnelap : 0.;
-               fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td>",perc2);
-            }
-
-            if(strncmp(tmsg,"OK",2) != 0)
-               fprintf(fp_ou,"<td class=\"data\">%s</td>",_("DENIED"));
-
-            fputs("</tr>\n",fp_ou);
-            count++;
-         } else if ((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0) {
-            url_to_file(url,siteind,sizeof(siteind));
-            snprintf(tmp2,sizeof(tmp2),"%s/%s/tt%s-%s.html",outdirname,uinfo->filename,uinfo->filename,siteind);
-            if (unlink(tmp2)!=0) {
-               debuga(_("Cannot delete unused file \"%s\" - %s\n"),tmp2,strerror(errno));
-            }
-         }
-
-         if(iprel) {
-            if (snprintf(arqip,sizeof(arqip),"%s/%s.ip",tmp,uinfo->filename)>=sizeof(arqip)) {
-               debuga(_("File name too long: %s/%s.ip\n"),tmp,uinfo->filename);
-               exit(EXIT_FAILURE);
-            }
-
-            if ((fp_ip = fopen(arqip, "r")) == 0){
-               debuga(_("(html6) Cannot open file %s\n"),arqip);
-               exit(EXIT_FAILURE);
-            }
-
-            if ((fp_ip2 = MY_FOPEN(tmp2, "a")) == 0){
-               debuga(_("(html7) Cannot open file %s\n"),tmp2);
-               exit(EXIT_FAILURE);
-            }
-
-            if ((line1=longline_create())==NULL) {
-               debuga(_("Not enough memory to read file %s\n"),arqip);
-               exit(EXIT_FAILURE);
-            }
-            while((buf=longline_read(fp_ip,line1))!=NULL) {
-               getword_start(&gwarea,buf);
-               if (getword(user_ip,sizeof(user_ip),&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken user IP in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_ptr(buf,&user_url,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken url in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (strncmp(user_url,url,strlen(url))!=0) continue;
-               if (getword_skip(15,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken day in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_skip(15,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken time in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_atoll(&userbytes,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken size in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_atoll(&userelap,&gwarea,'\0')<0) {
-                  debuga(_("Maybe you have a broken elapsed time in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               fprintf(fp_ip2,"%s\t%"PRIu64"\t%"PRIu64"\n",user_ip,(uint64_t)userbytes,(uint64_t)userelap);
-            }
-            longline_destroy(&line1);
-
-            fclose(fp_ip);
-            fclose(fp_ip2);
-
-            sprintf(csort,"sort -n -T \"%s\" -k 1,1 -k 2,2 -o \"%s\" \"%s\"",tmp,tmp3,tmp2);
-            cstatus=system(csort);
-            if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-               debuga(_("sort command: %s\n"),csort);
-               exit(EXIT_FAILURE);
-            }
-
-            if ((fp_ip = MY_FOPEN(tmp3, "r")) == 0) {
-               debuga(_("(html8) Cannot open file %s\n"),tmp3);
-               exit(EXIT_FAILURE);
-            }
-
-            olduserip[0]='\0';
-
-            if ((line1=longline_create())==NULL) {
-               debuga(_("Not enough memory to read file %s\n"),arqip);
-               exit(EXIT_FAILURE);
-            }
-            while((buf=longline_read(fp_ip,line1))!=NULL) {
-               getword_start(&gwarea,buf);
-               if (getword(user_ip,sizeof(user_ip),&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken user IP in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_atoll(&userbytes,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken size in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_atoll(&userelap,&gwarea,'\0')<0) {
-                  debuga(_("Maybe you have a broken elapsed time in your %s file\n"),tmp3);
-                  exit(EXIT_FAILURE);
-               }
-               if(strcmp(user_ip,olduserip) != 0) {
-                  if (olduserip[0]!='\0') {
-                     fprintf(fp_ou,"<tr><td></td><td class=\"data\">%s</td>",olduserip);
-                     if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
-                        fputs("<td></td>",fp_ou);
-                     if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
-                        fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum(unbytes,1));
-                     if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
-                        fputs("<td></td>",fp_ou);
-                     if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
-                        fputs("</td><td></td><td></td>",fp_ou);
-                     if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
-                        fprintf(fp_ou,"<td class=\"data\">%s</td>",buildtime(unelap));
-                     if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
-                        fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum2(unelap,1));
-                     fputs("</tr>\n",fp_ou);
-                  }
-
-                  strcpy(olduserip,user_ip);
-                  unacc=0;
-                  unbytes=0;
-                  unelap=0;
-               }
-
-               unbytes+=userbytes;
-               unelap+=userelap;
-            }
-
-            fclose(fp_ip);
-            longline_destroy(&line1);
-
-            unlink(tmp2);
-            unlink(tmp3);
-
-            if (olduserip[0]!='\0') {
-               fprintf(fp_ou,"<tr><td></td><td class=\"data\">%s</td>",olduserip);
-               if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
-                  fputs("<td></td>",fp_ou);
-               if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
-                  fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum(unbytes,1));
-               if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
-                  fputs("<td></td>",fp_ou);
-               if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
-                  fputs("</td><td></td><td></td>",fp_ou);
-               if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
-                  fprintf(fp_ou,"<td class=\"data\">%s</td>",buildtime(unelap));
-               if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
-                  fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum2(unelap,1));
-               fputs("</tr>\n",fp_ou);
-            }
-         }
-
-         unacc=0;
-         unbytes=0;
-         unelap=0;
-      }
-
-      fclose(fp_in);
-      longline_destroy(&line);
-
-      if(iprel)
-         unlink(arqip);
-      unlink(arqin);
-
-      if ((UserReportFields & (USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE)) != 0)
-         fputs("<tfoot>",fp_ou);
-
-      if((UserReportFields & USERREPORTFIELDS_TOTAL) != 0) {
-         fprintf(fp_ou,"<tr><th></th><th class=\"header_l\">%s</th>",_("TOTAL"));
-         if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(tnacc,1));
-         if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(tnbytes,1));
-         if((UserReportFields & USERREPORTFIELDS_SETYB) != 0) {
-            perc=(totbytes) ? tnbytes *100. / totbytes :0.;
-            fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc);
-         }
-         if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0) {
-            inperc=(tnbytes) ? tnincache * 100. / tnbytes : 0.;
-            ouperc=(tnbytes) ? tnoucache * 100. / tnbytes : 0.;
-            fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th><th class=\"header_r\">%3.2lf%%</th>",inperc,ouperc);
-         }
-         if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",buildtime(tnelap));
-         if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum2(tnelap,1));
-         if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
-            perc2=(totelap) ? tnelap * 100. / totelap : 0.;
-            fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc2);
-         }
-         fputs("</tr>\n",fp_ou);
-      }
-
-      if(PerUserLimit > 0) {
-         if(tnbytes > (PerUserLimit*1000000)) {
-            limit_flag=0;
-            if(access(PerUserLimitFile, R_OK) == 0) {
-               if((fp_usr = fopen(PerUserLimitFile, "r")) == 0) {
-                  debuga(_("(html9) Cannot open file %s\n"),PerUserLimitFile);
-                  exit(EXIT_FAILURE);
-               }
-               while(fgets(tmp6,sizeof(tmp6),fp_usr)!=NULL) {
-                  fixendofline(tmp6);
-                  if(strcmp(tmp6,uinfo->label) == 0) {
-                     limit_flag=1;
-                     break;
-                  }
-               }
-               fclose(fp_usr);
-            }
-
-            if(!limit_flag) {
-               if((fp_usr = fopen(PerUserLimitFile, "a")) == 0) {
-                  debuga(_("(html10) Cannot open file %s\n"),PerUserLimitFile);
-                  exit(EXIT_FAILURE);
-               }
-               fprintf(fp_usr,"%s\n",uinfo->label);
-               fclose(fp_usr);
-
-               if(debug)
-                  debuga(_("User %s limit exceeded (%d MB). Added to file %s\n"),uinfo->label,PerUserLimit,PerUserLimitFile);
-            }
-         }
-      }
+       DIR *dirp;
+       FILE *fp_in, *fp_ou, *fp_ip, *fp_ip2, *fp_usr;
+
+       struct dirent *direntp;
+       long long int nnbytes=0, unbytes=0, tnbytes=0, totbytes=0, totbytes2=0;
+       long long int totelap=0, totelap2=0, nnelap=0, unelap=0, tnelap=0;
+       long long int incache=0, oucache=0, tnincache=0, tnoucache=0, twork=0;
+       long long int ltemp;
+       long long int ntotuser;
+       long long int userbytes, userelap;
+       char *buf;
+       char arqin[MAXLEN], arqou[MAXLEN], arqper[MAXLEN], arqip[MAXLEN];
+       char *url, tmsg[50], csort[MAXLEN];
+       char user[MAXLEN], duser[MAXLEN];
+       char user_ip[MAXLEN], olduserip[MAXLEN], tmp2[MAXLEN], tmp3[MAXLEN];
+       char denied_report[255];
+       char *str;
+       char warea[MAXLEN];
+       char totuser[8];
+       char tmp6[MAXLEN];
+       char *user_url;
+       long long int tnacc=0, ttnacc=0, unacc=0;
+       double perc=0, perc2=0, ouperc=0, inperc=0;
+       int count;
+       int cstatus;
+       const char txtext[]=".txt";
+       const char *sort_field;
+       const char *sort_order;
+       int dlen;
+       char siteind[MAX_TRUNCATED_URL];
+       struct getwordstruct gwarea;
+       longline line,line1;
+       struct generalitemstruct item;
+       const struct userinfostruct *uinfo;
+
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+
+       strcpy(tmp2,tmp);
+       strcat(tmp2,"/sargtmp.unsort");
+
+       strcpy(tmp3,tmp);
+       strcat(tmp3,"/sargtmp.log");
+
+       snprintf(arqper,sizeof(arqper),"%s/sarg-general",outdirname);
+       if ((fp_in = fopen(arqper, "r")) == 0){
+               debuga(_("(html2) Cannot open file %s\n"),arqper);
+               exit(EXIT_FAILURE);
+       }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),arqper);
+               exit(EXIT_FAILURE);
+       }
+       ttnacc=0;
+       totbytes=0;
+       totelap=0;
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               ger_read(buf,&item,arqper);
+               if(item.total) {
+                       ttnacc+=item.nacc;
+                       totbytes+=item.nbytes;
+                       totelap+=item.nelap;
+               }
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       snprintf(arqper,sizeof(arqper),"%s/sarg-users",outdirname);
+       if ((fp_in = fopen(arqper, "r")) == 0){
+               debuga(_("(html11) Cannot open file %s\n"),arqper);
+               exit(EXIT_FAILURE);
+       }
+       if (!fgets(totuser,sizeof(totuser),fp_in)) {
+               debuga(_("(html11) read error in %s\n"),arqper);
+               exit(EXIT_FAILURE);
+       }
+       fclose(fp_in);
+       ntotuser=my_atoll(totuser);
+       if (ntotuser<=0) ntotuser=1;
+
+       greport_prepare();
+
+       sort_labels(&sort_field,&sort_order);
+
+       if ((dirp = opendir(tmp)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ( (direntp = readdir( dirp )) != NULL ) {
+               dlen=strlen(direntp->d_name)-(sizeof(txtext)-1);
+               if (dlen<0) continue;
+               if(strcmp(direntp->d_name+dlen,txtext) != 0)
+                       continue;
+
+               count=1;
+               if (dlen>0) {
+                       if (dlen>=sizeof(user)) continue;
+                       strncpy(user,direntp->d_name,dlen);
+                       user[dlen]=0;
+               } else {
+                       user[0]=0;
+               }
+
+               uinfo=userinfo_find_from_file(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in directory %s\n"),user,tmp);
+                       exit(EXIT_FAILURE);
+               }
+               str=strrchr(user,'.');
+               if (str)
+                       strcpy(denied_report,str+1);
+               else
+                       strcpy(denied_report,user);
+
+               if (snprintf(warea,sizeof(warea),"%s/%s",outdirname,user)>=sizeof(warea)) {
+                       debuga(_("Destination directory too long: %s/%s\n"),outdirname,user);
+                       exit(EXIT_FAILURE);
+               }
+               mkdir(warea,0755);
+
+               report_day(uinfo);
+               greport_day(uinfo);
+
+               if (snprintf(arqin,sizeof(arqin),"%s/%s",tmp,direntp->d_name)>=sizeof(arqin)) {
+                       debuga(_("Input file name too long: %s/%s\n"),tmp,direntp->d_name);
+                       exit(EXIT_FAILURE);
+               }
+               if (snprintf(arqou,sizeof(arqou),"%s/%s/%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqou)) {
+                       debuga(_("Output file name too long: %s/%s/%s.html\n"),outdirname,uinfo->filename,uinfo->filename);
+                       exit(EXIT_FAILURE);
+               }
+               if (snprintf(duser,sizeof(duser),"%s/%s/denied_%s.html",tmp,direntp->d_name,denied_report)>=sizeof(duser)) {
+                       debuga(_("File name too long: %s/%s/denied_%s.html\n"),tmp,direntp->d_name,denied_report);
+                       exit(EXIT_FAILURE);
+               }
+               if(access(duser, R_OK) != 0)
+                       denied_report[0]='\0';
+
+               if ((fp_in = fopen(arqin, "r")) == 0){
+                       debuga(_("(html3) Cannot open file %s\n"),arqin);
+                       exit(EXIT_FAILURE);
+               }
+
+               if ((line=longline_create())==NULL) {
+                       debuga(_("Not enough memory to read file %s\n"),arqin);
+                       exit(EXIT_FAILURE);
+               }
+
+               tnacc=0;
+               tnbytes=0;
+               tnelap=0;
+               tnincache=0;
+               tnoucache=0;
+               while((buf=longline_read(fp_in,line))!=NULL) {
+                       getword_start(&gwarea,buf);
+                       if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken number of access in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       tnacc+=ltemp;
+                       if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken downloaded size in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       tnbytes+=ltemp;
+                       if (getword_ptr(NULL,NULL,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken url in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(MAXLEN,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken access code in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken elapsed time in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       tnelap+=ltemp;
+                       if (getword_atoll(&ltemp,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken in-cache volume in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       tnincache+=ltemp;
+                       if (getword_atoll(&ltemp,&gwarea,'\n')<0) {
+                               debuga(_("There is a broken out-cache volume in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       tnoucache+=ltemp;
+               }
+
+               rewind(fp_in);
+
+               if ((fp_ou = fopen(arqou, "w")) == 0){
+                       debuga(_("(html5) Cannot open file %s\n"),arqou);
+                       exit(EXIT_FAILURE);
+               }
+
+               write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("User report"),HTML_JS_SORTTABLE);
+               fprintf(fp_ou,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
+               fprintf(fp_ou,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("User"),uinfo->label);
+               fputs("<tr><td class=\"header_c\">",fp_ou);
+               fprintf(fp_ou,_("Sort:&nbsp;%s, %s"),sort_field,sort_order);
+               fputs("</td></tr>\n",fp_ou);
+               fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("User report"));
+               close_html_header(fp_ou);
+
+               fputs("<div class=\"report\"><table cellpadding=\"2\" cellspacing=\"1\"",fp_ou);
+               if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
+               fputs(">\n",fp_ou);
+
+               /*! \bug This line lays before the header of the table and is therefore invalid
+               HTML. It will also break the sorttable script. Beside, I suspect it serves no purpose.
+               */
+               if(denied_report[0]!='\0') {
+                       fprintf(fp_ou,"<tr><td class=\"header_l\" colspan=\"11\"><a href=\"denied_%s.html\">%s</a> %s</td></tr>\n",denied_report,_("SmartFilter"),_("Report"));
+               }
+
+               fputs("<thead><tr><th class=\"sorttable_nosort\"></th><th class=\"header_l",fp_ou);
+               if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
+               fprintf(fp_ou,"\">%s</th>",_("ACCESSED SITE"));
+
+               if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("CONNECT"));
+               if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("BYTES"));
+               if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%%%s</th>",_("BYTES"));
+               if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
+                       fprintf(fp_ou,"<th class=\"header_c\" colspan=\"2\">%s</th><th style=\"display:none;\"></th>",_("IN-CACHE-OUT"));
+               if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("ELAPSED TIME"));
+               if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("MILLISEC"));
+               if((UserReportFields & USERREPORTFIELDS_PTIME) != 0)
+                       fprintf(fp_ou,"<th class=\"header_l\">%%%s</th>",_("TIME"));
+
+               fputs("</tr></thead>\n",fp_ou);
+
+               if(debug) {
+                       debuga(_("Making report: %s\n"),uinfo->id);
+               }
+
+               while((buf=longline_read(fp_in,line))!=NULL) {
+                       getword_start(&gwarea,buf);
+                       if (getword_atoll(&twork,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken number of access in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_atoll(&nnbytes,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken number of bytes in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken url in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword(tmsg,sizeof(tmsg),&gwarea,'\t')<0) {
+                               debuga(_("There is a broken access code in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_atoll(&nnelap,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken elapsed time in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_atoll(&incache,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken in cache column in file %s\n"),arqin);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_atoll(&oucache,&gwarea,'\n')<0) {
+                               debuga(_("There is a broken out of cache column in file %s (%d)\n"),arqin,__LINE__);
+                               exit(EXIT_FAILURE);
+                       }
+
+                       if(UserReportLimit<=0 || count<=UserReportLimit) {
+                               fputs("<tr>",fp_ou);
+
+                               if(IndexTree == INDEX_TREE_DATE)
+                                       sprintf(tmp6,"../%s",ImageFile);
+                               else
+                                       strcpy(tmp6,"../../images");
+
+                               if((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0) {
+                                       url_to_file(url,siteind,sizeof(siteind));
+                                       fprintf(fp_ou,"<td class=\"data\"><a href=\"tt%s-%s.html\"><img src=\"%s/datetime.png\" title=\"%s\" alt=\"T\"></a></td>",uinfo->filename,siteind,tmp6,_("date/time report"));
+                               } else {
+                                       fprintf(fp_ou,"<td class=\"data\"></td>");
+                               }
+
+                               if(Privacy)
+                                       fprintf(fp_ou,"<td class=\"data2\"><span style=\"color:%s;\">%s</span></td>",PrivacyStringColor,PrivacyString);
+                               else {
+                                       fputs("<td class=\"data2\">",fp_ou);
+                                       if(BlockIt[0]!='\0') {
+                                               fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
+                                               output_html_url(fp_ou,url);
+                                               fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a>&nbsp;",tmp6);
+                                       }
+                                       fputs("<a href=\"http://",fp_ou);
+                                       output_html_url(fp_ou,url);
+                                       fputs("\">",fp_ou);
+                                       output_html_string(fp_ou,url,100);
+                                       fputs("</a></td>",fp_ou);
+                               }
+
+                               if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0) {
+                                       fputs("<td class=\"data\"",fp_ou);
+                                       if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)twork);
+                                       fprintf(fp_ou,">%s</td>",fixnum(twork,1));
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_BYTES) != 0) {
+                                       fputs("<td class=\"data\"",fp_ou);
+                                       if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnbytes);
+                                       fprintf(fp_ou,">%s</td>",fixnum(nnbytes,1));
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_SETYB) != 0) {
+                                       perc=(tnbytes) ? nnbytes * 100. / tnbytes : 0.;
+                                       fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td>",perc);
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0) {
+                                       inperc=(nnbytes) ? incache * 100. / nnbytes : 0.;
+                                       ouperc=(nnbytes) ? oucache * 100. / nnbytes : 0.;
+                                       fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td><td class=\"data\">%3.2lf%%</td>",inperc,ouperc);
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0) {
+                                       fputs("<td class=\"data\"",fp_ou);
+                                       if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnelap);
+                                       fprintf(fp_ou,">%s</td>",buildtime(nnelap));
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0) {
+                                       fputs("<td class=\"data\"",fp_ou);
+                                       if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)nnelap);
+                                       fprintf(fp_ou,">%s</td>",fixnum2(nnelap,1));
+                               }
+                               if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
+                                       perc2=(tnelap) ? nnelap * 100. / tnelap : 0.;
+                                       fprintf(fp_ou,"<td class=\"data\">%3.2lf%%</td>",perc2);
+                               }
+
+                               if(strncmp(tmsg,"OK",2) != 0)
+                                       fprintf(fp_ou,"<td class=\"data\">%s</td>",_("DENIED"));
+
+                               fputs("</tr>\n",fp_ou);
+                               count++;
+                       } else if ((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0) {
+                               url_to_file(url,siteind,sizeof(siteind));
+                               snprintf(tmp2,sizeof(tmp2),"%s/%s/tt%s-%s.html",outdirname,uinfo->filename,uinfo->filename,siteind);
+                               if (unlink(tmp2)!=0) {
+                                       debuga(_("Cannot delete unused file \"%s\" - %s\n"),tmp2,strerror(errno));
+                               }
+                       }
+
+                       if(iprel) {
+                               if (snprintf(arqip,sizeof(arqip),"%s/%s.ip",tmp,uinfo->filename)>=sizeof(arqip)) {
+                                       debuga(_("File name too long: %s/%s.ip\n"),tmp,uinfo->filename);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               if ((fp_ip = fopen(arqip, "r")) == 0){
+                                       debuga(_("(html6) Cannot open file %s\n"),arqip);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               if ((fp_ip2 = MY_FOPEN(tmp2, "a")) == 0){
+                                       debuga(_("(html7) Cannot open file %s\n"),tmp2);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               if ((line1=longline_create())==NULL) {
+                                       debuga(_("Not enough memory to read file %s\n"),arqip);
+                                       exit(EXIT_FAILURE);
+                               }
+                               while((buf=longline_read(fp_ip,line1))!=NULL) {
+                                       getword_start(&gwarea,buf);
+                                       if (getword(user_ip,sizeof(user_ip),&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken user IP in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_ptr(buf,&user_url,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken url in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (strncmp(user_url,url,strlen(url))!=0) continue;
+                                       if (getword_skip(15,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken day in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_skip(15,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken time in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_atoll(&userbytes,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken size in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_atoll(&userelap,&gwarea,'\0')<0) {
+                                               debuga(_("Maybe you have a broken elapsed time in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       fprintf(fp_ip2,"%s\t%"PRIu64"\t%"PRIu64"\n",user_ip,(uint64_t)userbytes,(uint64_t)userelap);
+                               }
+                               longline_destroy(&line1);
+
+                               fclose(fp_ip);
+                               fclose(fp_ip2);
+
+                               sprintf(csort,"sort -n -T \"%s\" -k 1,1 -k 2,2 -o \"%s\" \"%s\"",tmp,tmp3,tmp2);
+                               cstatus=system(csort);
+                               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                                       debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+                                       debuga(_("sort command: %s\n"),csort);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               if ((fp_ip = MY_FOPEN(tmp3, "r")) == 0) {
+                                       debuga(_("(html8) Cannot open file %s\n"),tmp3);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               olduserip[0]='\0';
+
+                               if ((line1=longline_create())==NULL) {
+                                       debuga(_("Not enough memory to read file %s\n"),arqip);
+                                       exit(EXIT_FAILURE);
+                               }
+                               while((buf=longline_read(fp_ip,line1))!=NULL) {
+                                       getword_start(&gwarea,buf);
+                                       if (getword(user_ip,sizeof(user_ip),&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken user IP in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_atoll(&userbytes,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken size in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_atoll(&userelap,&gwarea,'\0')<0) {
+                                               debuga(_("Maybe you have a broken elapsed time in your %s file\n"),tmp3);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if(strcmp(user_ip,olduserip) != 0) {
+                                               if (olduserip[0]!='\0') {
+                                                       fprintf(fp_ou,"<tr><td></td><td class=\"data\">%s</td>",olduserip);
+                                                       if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
+                                                               fputs("<td></td>",fp_ou);
+                                                       if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
+                                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum(unbytes,1));
+                                                       if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
+                                                               fputs("<td></td>",fp_ou);
+                                                       if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
+                                                               fputs("</td><td></td><td></td>",fp_ou);
+                                                       if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
+                                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",buildtime(unelap));
+                                                       if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
+                                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum2(unelap,1));
+                                                       fputs("</tr>\n",fp_ou);
+                                               }
+
+                                               strcpy(olduserip,user_ip);
+                                               unacc=0;
+                                               unbytes=0;
+                                               unelap=0;
+                                       }
+
+                                       unbytes+=userbytes;
+                                       unelap+=userelap;
+                               }
+
+                               fclose(fp_ip);
+                               longline_destroy(&line1);
+
+                               unlink(tmp2);
+                               unlink(tmp3);
+
+                               if (olduserip[0]!='\0') {
+                                       fprintf(fp_ou,"<tr><td></td><td class=\"data\">%s</td>",olduserip);
+                                       if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
+                                               fputs("<td></td>",fp_ou);
+                                       if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
+                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum(unbytes,1));
+                                       if((UserReportFields & USERREPORTFIELDS_SETYB) != 0)
+                                               fputs("<td></td>",fp_ou);
+                                       if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0)
+                                               fputs("</td><td></td><td></td>",fp_ou);
+                                       if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
+                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",buildtime(unelap));
+                                       if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
+                                               fprintf(fp_ou,"<td class=\"data\">%s</td>",fixnum2(unelap,1));
+                                       fputs("</tr>\n",fp_ou);
+                               }
+                       }
+
+                       unacc=0;
+                       unbytes=0;
+                       unelap=0;
+               }
+
+               fclose(fp_in);
+               longline_destroy(&line);
+
+               if(iprel)
+                       unlink(arqip);
+               unlink(arqin);
+
+               if ((UserReportFields & (USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE)) != 0)
+                       fputs("<tfoot>",fp_ou);
+
+               if((UserReportFields & USERREPORTFIELDS_TOTAL) != 0) {
+                       fprintf(fp_ou,"<tr><th></th><th class=\"header_l\">%s</th>",_("TOTAL"));
+                       if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(tnacc,1));
+                       if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(tnbytes,1));
+                       if((UserReportFields & USERREPORTFIELDS_SETYB) != 0) {
+                               perc=(totbytes) ? tnbytes *100. / totbytes :0.;
+                               fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc);
+                       }
+                       if((UserReportFields & USERREPORTFIELDS_IN_CACHE_OUT) != 0) {
+                               inperc=(tnbytes) ? tnincache * 100. / tnbytes : 0.;
+                               ouperc=(tnbytes) ? tnoucache * 100. / tnbytes : 0.;
+                               fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th><th class=\"header_r\">%3.2lf%%</th>",inperc,ouperc);
+                       }
+                       if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",buildtime(tnelap));
+                       if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum2(tnelap,1));
+                       if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
+                               perc2=(totelap) ? tnelap * 100. / totelap : 0.;
+                               fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc2);
+                       }
+                       fputs("</tr>\n",fp_ou);
+               }
+
+               if(PerUserLimit > 0) {
+                       if(tnbytes > (PerUserLimit*1000000)) {
+                               limit_flag=0;
+                               if(access(PerUserLimitFile, R_OK) == 0) {
+                                       if((fp_usr = fopen(PerUserLimitFile, "r")) == 0) {
+                                               debuga(_("(html9) Cannot open file %s\n"),PerUserLimitFile);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       while(fgets(tmp6,sizeof(tmp6),fp_usr)!=NULL) {
+                                               fixendofline(tmp6);
+                                               if(strcmp(tmp6,uinfo->label) == 0) {
+                                                       limit_flag=1;
+                                                       break;
+                                               }
+                                       }
+                                       fclose(fp_usr);
+                               }
+
+                               if(!limit_flag) {
+                                       if((fp_usr = fopen(PerUserLimitFile, "a")) == 0) {
+                                               debuga(_("(html10) Cannot open file %s\n"),PerUserLimitFile);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       fprintf(fp_usr,"%s\n",uinfo->label);
+                                       fclose(fp_usr);
+
+                                       if(debug)
+                                               debuga(_("User %s limit exceeded (%d MB). Added to file %s\n"),uinfo->label,PerUserLimit,PerUserLimitFile);
+                               }
+                       }
+               }
 
 //      if(indexonly) {
 //     unlink(arqou);
 //     continue;
 //      }
 
-      if ((ReportType & REPORT_TYPE_TOPUSERS) != 0 && (UserReportFields & USERREPORTFIELDS_AVERAGE) != 0) {
-         totbytes2=totbytes/ntotuser;
-         totelap2=totelap/ntotuser;
-
-         fprintf(fp_ou,"<tr><th></th><th class=\"header_l\">%s</th>",_("AVERAGE"));
-         if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(ttnacc/ntotuser,1));
-         if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(totbytes2,1));
-         fprintf(fp_ou,"<th></th><th></th><th></th>");
-         if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",buildtime(totelap2));
-         if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
-            fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum2(totelap2,1));
-         if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
-            perc2 = (totelap) ? totelap2 * 100. / totelap : 0.;
-            fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc2);
-         }
-         fputs("</tr>\n",fp_ou);
-      }
-
-      if ((UserReportFields & (USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE)) != 0)
-         fputs("</tfoot>",fp_ou);
-
-      fputs("</table></div>\n",fp_ou);
-      if (write_html_trailer(fp_ou)<0)
-         debuga(_("Write error in file %s\n"),arqou);
-      if (fclose(fp_ou)==EOF)
-         debuga(_("Failed to close file %s - %s\n"),arqou,strerror(errno));
-
-      htaccess(uinfo);
-   }
-
-   (void)closedir(dirp);
-   greport_cleanup();
-
-   return;
+               if ((ReportType & REPORT_TYPE_TOPUSERS) != 0 && (UserReportFields & USERREPORTFIELDS_AVERAGE) != 0) {
+                       totbytes2=totbytes/ntotuser;
+                       totelap2=totelap/ntotuser;
+
+                       fprintf(fp_ou,"<tr><th></th><th class=\"header_l\">%s</th>",_("AVERAGE"));
+                       if((UserReportFields & USERREPORTFIELDS_CONNECT) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(ttnacc/ntotuser,1));
+                       if((UserReportFields & USERREPORTFIELDS_BYTES) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum(totbytes2,1));
+                       fprintf(fp_ou,"<th></th><th></th><th></th>");
+                       if((UserReportFields & USERREPORTFIELDS_USED_TIME) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",buildtime(totelap2));
+                       if((UserReportFields & USERREPORTFIELDS_MILISEC) != 0)
+                               fprintf(fp_ou,"<th class=\"header_r\">%s</th>",fixnum2(totelap2,1));
+                       if((UserReportFields & USERREPORTFIELDS_PTIME) != 0) {
+                               perc2 = (totelap) ? totelap2 * 100. / totelap : 0.;
+                               fprintf(fp_ou,"<th class=\"header_r\">%3.2lf%%</th>",perc2);
+                       }
+                       fputs("</tr>\n",fp_ou);
+               }
+
+               if ((UserReportFields & (USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE)) != 0)
+                       fputs("</tfoot>",fp_ou);
+
+               fputs("</table></div>\n",fp_ou);
+               if (write_html_trailer(fp_ou)<0)
+                       debuga(_("Write error in file %s\n"),arqou);
+               if (fclose(fp_ou)==EOF)
+                       debuga(_("Failed to close file %s - %s\n"),arqou,strerror(errno));
+
+               htaccess(uinfo);
+       }
+
+       (void)closedir(dirp);
+       greport_cleanup();
+
+       return;
 }
diff --git a/index.c b/index.c
index 2fc7235dd581049a72968c6a02e4f02839f989c4..c439b7c265ac52f405b979c80d120deb5b2e9b6d 100644 (file)
--- a/index.c
+++ b/index.c
@@ -34,619 +34,619 @@ static void date_index_to_file_index(const char *entry);
 
 void make_index(void)
 {
-   DIR *dirp;
-   struct dirent *direntp;
-   char wdir[MAXLEN];
-
-   if(LastLog > 0) mklastlog(outdir);
-
-   if(Index == INDEX_NO) {
-      sprintf(wdir,"%sindex.html",outdir);
-      if(access(wdir, R_OK) == 0) unlink(wdir);
-      return;
-   }
-
-   if(debug) debuga(_("Making index.html\n"));
-
-   // convert any old report hierarchy
-   if ((dirp = opendir(outdir)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ((direntp = readdir( dirp )) != NULL) {
-      if(isdigit(direntp->d_name[0]) && isdigit(direntp->d_name[1])) {
-         if(IndexTree == INDEX_TREE_DATE)
-            file_index_to_date_index(direntp->d_name);
-         else
-            date_index_to_file_index(direntp->d_name);
-      }
-   }
-   closedir(dirp);
-
-   if(IndexTree == INDEX_TREE_DATE) {
-      make_date_index();
-   } else {
-      make_file_index();
-   }
+       DIR *dirp;
+       struct dirent *direntp;
+       char wdir[MAXLEN];
+
+       if(LastLog > 0) mklastlog(outdir);
+
+       if(Index == INDEX_NO) {
+               sprintf(wdir,"%sindex.html",outdir);
+               if(access(wdir, R_OK) == 0) unlink(wdir);
+               return;
+       }
+
+       if(debug) debuga(_("Making index.html\n"));
+
+       // convert any old report hierarchy
+       if ((dirp = opendir(outdir)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ((direntp = readdir( dirp )) != NULL) {
+               if(isdigit(direntp->d_name[0]) && isdigit(direntp->d_name[1])) {
+                       if(IndexTree == INDEX_TREE_DATE)
+                               file_index_to_date_index(direntp->d_name);
+                       else
+                               date_index_to_file_index(direntp->d_name);
+               }
+       }
+       closedir(dirp);
+
+       if(IndexTree == INDEX_TREE_DATE) {
+               make_date_index();
+       } else {
+               make_file_index();
+       }
 }
 
 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 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];
-   char title[80];
-   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);
-
-   nyears=0;
-   if ((dirp = opendir(outdir)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ((direntp = readdir( dirp )) != NULL) {
-      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 ; i<nyears && year>yearsort[i] ; i++)
-               yearsort[i-1]=yearsort[i];
-            yearsort[i-1]=year;
-         }
-      } else {
-         for (i=nyears ; i>0 &&  year<yearsort[i-1] ; i--) {
-            yearsort[i]=yearsort[i-1];
-         }
-         yearsort[i]=year;
-         nyears++;
-      }
-   }
-   closedir( dirp );
-
-   order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
-
-   if((fp_ou=fopen(yearindex,"w"))==NULL) {
-      debuga(_("(index) Cannot open file %s - %s\n"),yearindex,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nyears),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</th><th class=\"header_l\">%s</th></tr>\n",_("YEAR"),_("SIZE"));
-   for (y=0 ; y<nyears ; y++) {
-      if (order>0)
-         year=yearsort[y];
-      else
-         year=yearsort[nyears-1-y];
-      sprintf(yearnum,"%04d",year);
-      fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s</a></td><td class=\"data2\">%s</td></tr>\n",yearnum,yearnum,get_size(outdir,yearnum));
-      sprintf(yeardir,"%s%s",outdir,yearnum);
-      // Year dir
-      nmonths=0;
-      if ((dirp2 = opendir(yeardir)) == NULL) {
-         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 || m2<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\nSupernumerary 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) {
-         debuga(_("(index) Cannot open file %s - %s\n"),monthindex,strerror(errno));
-         exit(EXIT_FAILURE);
-      }
-      snprintf(title,sizeof(title),ngettext("SARG: report for %04d","SARG: 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/index.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(_("Failed to open directory %s - %s\n"),monthdir,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         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 || 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) {
-            debuga(_("(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\" cellspacing=\"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"),dayindex);
-         if (fclose(fp_ou3)==EOF)
-            debuga(_("Failed to close the index file %s - %s\n"),dayindex,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 the index file %s - %s\n"),monthindex,strerror(errno));
-   }
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in the index %s\n"),yearindex);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close the index file %s - %s\n"),yearindex,strerror(errno));
+       FILE *fp_ou, *fp_ou2, *fp_ou3;
+       DIR *dirp, *dirp2, *dirp3;
+       struct dirent *direntp;
+       struct dirent *direntp2;
+       struct dirent *direntp3;
+       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];
+       char title[80];
+       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);
+
+       nyears=0;
+       if ((dirp = opendir(outdir)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ((direntp = readdir( dirp )) != NULL) {
+               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 ; i<nyears && year>yearsort[i] ; i++)
+                                       yearsort[i-1]=yearsort[i];
+                               yearsort[i-1]=year;
+                       }
+               } else {
+                       for (i=nyears ; i>0 &&  year<yearsort[i-1] ; i--) {
+                               yearsort[i]=yearsort[i-1];
+                       }
+                       yearsort[i]=year;
+                       nyears++;
+               }
+       }
+       closedir( dirp );
+
+       order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
+
+       if((fp_ou=fopen(yearindex,"w"))==NULL) {
+               debuga(_("(index) Cannot open file %s - %s\n"),yearindex,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nyears),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</th><th class=\"header_l\">%s</th></tr>\n",_("YEAR"),_("SIZE"));
+       for (y=0 ; y<nyears ; y++) {
+               if (order>0)
+                       year=yearsort[y];
+               else
+                       year=yearsort[nyears-1-y];
+               sprintf(yearnum,"%04d",year);
+               fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s</a></td><td class=\"data2\">%s</td></tr>\n",yearnum,yearnum,get_size(outdir,yearnum));
+               sprintf(yeardir,"%s%s",outdir,yearnum);
+               // Year dir
+               nmonths=0;
+               if ((dirp2 = opendir(yeardir)) == NULL) {
+                       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 || m2<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\nSupernumerary 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) {
+                       debuga(_("(index) Cannot open file %s - %s\n"),monthindex,strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+               snprintf(title,sizeof(title),ngettext("SARG: report for %04d","SARG: 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/index.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(_("Failed to open directory %s - %s\n"),monthdir,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       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 || 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) {
+                               debuga(_("(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\" cellspacing=\"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"),dayindex);
+                       if (fclose(fp_ou3)==EOF)
+                               debuga(_("Failed to close the index file %s - %s\n"),dayindex,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 the index file %s - %s\n"),monthindex,strerror(errno));
+       }
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in the index %s\n"),yearindex);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close the index file %s - %s\n"),yearindex,strerror(errno));
 }
 
 static void make_file_index(void)
 {
-   #define MAX_CREATION_DATE 15
-   FILE *fp_ou;
-   DIR *dirp;
-   struct dirent *direntp;
-   char wdir[MAXLEN];
-   char data[80];
-   char ftime[128];
-   char day[6], mon[8], year[40], hour[10];
-   long long int tbytes;
-   long long int media;
-   int iyear, imonth, iday, ihour, iminute, isecond, idst;
-   int nsort;
-   int nallocated;
-   int order;
-   int i;
-   int tuser;
-   struct getwordstruct gwarea;
-   struct sortstruct
-   {
-      int year, month, day, sortnum;
-      char creationdate[MAX_CREATION_DATE];
-      char *dirname;
-      char date[60];
-   } **sortlist, *item, **tempsort;
-
-   sprintf(wdir,"%sindex.html",outdir);
-
-   order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
-
-   if ((dirp = opendir(outdir)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   nsort=0;
-   nallocated=0;
-   sortlist=NULL;
-   while ((direntp = readdir( dirp )) != NULL) {
-      if (strchr(direntp->d_name,'-') == 0) continue;
-      item=malloc(sizeof(*item));
-      if (!item) {
-         debuga(_("not enough memory to sort the index\n"));
-         exit(EXIT_FAILURE);
-      }
-      if(strcmp(df,"u") == 0) {
-         item->year=atoi(direntp->d_name);
-         item->month=conv_month(direntp->d_name+4);
-         item->day=atoi(direntp->d_name+7);
-      } else {
-         item->year=atoi(direntp->d_name+5);
-         item->month=conv_month(direntp->d_name+2);
-         item->day=atoi(direntp->d_name);
-      }
-      item->sortnum=(item->year*16+item->month)*32+item->day;
-      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) {
-            debuga(_("Maybe you have a broken week day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) {
-            debuga(_("Maybe you have a broken month in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) {
-            debuga(_("Maybe you have a broken day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) {
-            debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-            exit(EXIT_FAILURE);
-         }
-         do {
-            if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) {
-               debuga(_("Maybe you have a broken year in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-               exit(EXIT_FAILURE);
-            }
-         } 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) {
-            debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
-            exit(EXIT_FAILURE);
-         }
-         buildymd(day,mon,year,ftime);
-         snprintf(item->creationdate,sizeof(item->creationdate),"%s%02d%02d%02d",ftime, ihour, iminute, isecond);
-      }
-      item->dirname=strdup(direntp->d_name);
-      if (!item->dirname) {
-         debuga(_("Not enough memory to store the directory name \"%s\" in the index\n"),direntp->d_name);
-         exit(EXIT_FAILURE);
-      }
-      strncpy(item->date,data,sizeof(item->date));
-      if (nsort+1>nallocated) {
-         nallocated+=10;
-         tempsort=realloc(sortlist,nallocated*sizeof(*item));
-         if (!tempsort) {
-            debuga(_("not enough memory to sort the index\n"));
-            exit(EXIT_FAILURE);
-         }
-         sortlist=tempsort;
-      }
-      for (i=nsort ; i>0 ; i--) {
-         if (item->sortnum>sortlist[i-1]->sortnum) break;
-         if (item->sortnum==sortlist[i-1]->sortnum) {
-            if (strcmp(item->creationdate,sortlist[i-1]->creationdate)>=0) break;
-         }
-         sortlist[i]=sortlist[i-1];
-      }
-      sortlist[i]=item;
-      nsort++;
-   }
-
-   closedir( dirp );
-
-   if((fp_ou=fopen(wdir,"w"))==NULL) {
-      debuga(_("(index) Cannot open file %s\n"),wdir);
-      exit(EXIT_FAILURE);
-   }
-   write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nsort),HTML_JS_SORTTABLE);
-   close_html_header(fp_ou);
-   fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_ou);
-   if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
-   fputs(">\n",fp_ou);
-   fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr></thead>\n",_("FILE/PERIOD"),_("CREATION DATE"),_("USERS"),_("BYTES"),_("AVERAGE"));
-   for (i=0 ; i<nsort ; i++) {
-      if (order>0)
-         item=sortlist[i];
-      else
-         item=sortlist[nsort-i-1];
-      tuser=obtuser(outdir,item->dirname);
-      obttotal(outdir,item->dirname,tuser,&tbytes,&media);
-      fputs("<tr><td class=\"data2\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%d\"",item->sortnum);
-      fprintf(fp_ou,"><a href='%s/%s'>%s</a></td>",item->dirname,ReplaceIndex,item->dirname);
-      fputs("<td class=\"data2\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%s\"",item->creationdate);
-      fprintf(fp_ou,">%s</td>",item->date);
-      fprintf(fp_ou,"<td class=\"data\">%d</td>",tuser);
-      fputs("<td class=\"data\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)tbytes);
-      fprintf(fp_ou,">%s</td>",fixnum(tbytes,1));
-      fputs("<td class=\"data\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)media);
-      fprintf(fp_ou,">%s</td></tr>\n",fixnum(media,1));
-   }
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in the index %s\n"),wdir);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close the index file %s - %s\n"),wdir,strerror(errno));
-
-   if (sortlist) {
-      for (i=0 ; i<nsort ; i++) {
-         free(sortlist[i]->dirname);
-         free(sortlist[i]);
-      }
-      free(sortlist);
-   }
+       #define MAX_CREATION_DATE 15
+       FILE *fp_ou;
+       DIR *dirp;
+       struct dirent *direntp;
+       char wdir[MAXLEN];
+       char data[80];
+       char ftime[128];
+       char day[6], mon[8], year[40], hour[10];
+       long long int tbytes;
+       long long int media;
+       int iyear, imonth, iday, ihour, iminute, isecond, idst;
+       int nsort;
+       int nallocated;
+       int order;
+       int i;
+       int tuser;
+       struct getwordstruct gwarea;
+       struct sortstruct
+       {
+               int year, month, day, sortnum;
+               char creationdate[MAX_CREATION_DATE];
+               char *dirname;
+               char date[60];
+       } **sortlist, *item, **tempsort;
+
+       sprintf(wdir,"%sindex.html",outdir);
+
+       order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
+
+       if ((dirp = opendir(outdir)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       nsort=0;
+       nallocated=0;
+       sortlist=NULL;
+       while ((direntp = readdir( dirp )) != NULL) {
+               if (strchr(direntp->d_name,'-') == 0) continue;
+               item=malloc(sizeof(*item));
+               if (!item) {
+                       debuga(_("not enough memory to sort the index\n"));
+                       exit(EXIT_FAILURE);
+               }
+               if(strcmp(df,"u") == 0) {
+                       item->year=atoi(direntp->d_name);
+                       item->month=conv_month(direntp->d_name+4);
+                       item->day=atoi(direntp->d_name+7);
+               } else {
+                       item->year=atoi(direntp->d_name+5);
+                       item->month=conv_month(direntp->d_name+2);
+                       item->day=atoi(direntp->d_name);
+               }
+               item->sortnum=(item->year*16+item->month)*32+item->day;
+               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) {
+                               debuga(_("Maybe you have a broken week day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) {
+                               debuga(_("Maybe you have a broken month in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) {
+                               debuga(_("Maybe you have a broken day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) {
+                               debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                               exit(EXIT_FAILURE);
+                       }
+                       do {
+                               if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) {
+                                       debuga(_("Maybe you have a broken year in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                                       exit(EXIT_FAILURE);
+                               }
+                       } 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) {
+                               debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
+                               exit(EXIT_FAILURE);
+                       }
+                       buildymd(day,mon,year,ftime);
+                       snprintf(item->creationdate,sizeof(item->creationdate),"%s%02d%02d%02d",ftime, ihour, iminute, isecond);
+               }
+               item->dirname=strdup(direntp->d_name);
+               if (!item->dirname) {
+                       debuga(_("Not enough memory to store the directory name \"%s\" in the index\n"),direntp->d_name);
+                       exit(EXIT_FAILURE);
+               }
+               strncpy(item->date,data,sizeof(item->date));
+               if (nsort+1>nallocated) {
+                       nallocated+=10;
+                       tempsort=realloc(sortlist,nallocated*sizeof(*item));
+                       if (!tempsort) {
+                               debuga(_("not enough memory to sort the index\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       sortlist=tempsort;
+               }
+               for (i=nsort ; i>0 ; i--) {
+                       if (item->sortnum>sortlist[i-1]->sortnum) break;
+                       if (item->sortnum==sortlist[i-1]->sortnum) {
+                               if (strcmp(item->creationdate,sortlist[i-1]->creationdate)>=0) break;
+                       }
+                       sortlist[i]=sortlist[i-1];
+               }
+               sortlist[i]=item;
+               nsort++;
+       }
+
+       closedir( dirp );
+
+       if((fp_ou=fopen(wdir,"w"))==NULL) {
+               debuga(_("(index) Cannot open file %s\n"),wdir);
+               exit(EXIT_FAILURE);
+       }
+       write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nsort),HTML_JS_SORTTABLE);
+       close_html_header(fp_ou);
+       fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_ou);
+       if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
+       fputs(">\n",fp_ou);
+       fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr></thead>\n",_("FILE/PERIOD"),_("CREATION DATE"),_("USERS"),_("BYTES"),_("AVERAGE"));
+       for (i=0 ; i<nsort ; i++) {
+               if (order>0)
+                       item=sortlist[i];
+               else
+                       item=sortlist[nsort-i-1];
+               tuser=obtuser(outdir,item->dirname);
+               obttotal(outdir,item->dirname,tuser,&tbytes,&media);
+               fputs("<tr><td class=\"data2\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%d\"",item->sortnum);
+               fprintf(fp_ou,"><a href='%s/%s'>%s</a></td>",item->dirname,ReplaceIndex,item->dirname);
+               fputs("<td class=\"data2\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%s\"",item->creationdate);
+               fprintf(fp_ou,">%s</td>",item->date);
+               fprintf(fp_ou,"<td class=\"data\">%d</td>",tuser);
+               fputs("<td class=\"data\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)tbytes);
+               fprintf(fp_ou,">%s</td>",fixnum(tbytes,1));
+               fputs("<td class=\"data\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)media);
+               fprintf(fp_ou,">%s</td></tr>\n",fixnum(media,1));
+       }
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in the index %s\n"),wdir);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close the index file %s - %s\n"),wdir,strerror(errno));
+
+       if (sortlist) {
+               for (i=0 ; i<nsort ; i++) {
+                       free(sortlist[i]->dirname);
+                       free(sortlist[i]);
+               }
+               free(sortlist);
+       }
 }
 
 static void file_index_to_date_index(const char *entry)
 {
-   int y1, y2, m1, m2, d1, d2;
-   int i, j;
-   int ndirlen;
-   int monthlen;
-   char sm1[8], sm2[8];
-   char olddir[MAXLEN], newdir[MAXLEN];
-
-   if(strlen(entry) < 19) return;
-
-   y1=0;
-   y2=0;
-   memset(sm1,0,sizeof(sm1));
-   memset(sm2,0,sizeof(sm2));
-   d1=0;
-   d2=0;
-   i=0;
-   if(strcmp(df,"u") == 0) {
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         y1=y1*10+(entry[i++]-'0');
-      if (j!=4) return;
-      for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
-         sm1[j]=entry[i++];
-      if (j!=3) return;
-      sm1[j]='\0';
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         d1=d1*10+(entry[i++]-'0');
-      if (j!=2) return;
-
-      if (entry[i++]!='-') return;
-
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         y2=y2*10+(entry[i++]-'0');
-      if (j!=4) return;
-      for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
-         sm2[j]=entry[i++];
-      if (j!=3) return;
-      sm2[j]='\0';
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         d2=d2*10+(entry[i++]-'0');
-      if (j!=2) return;
-   } else if(strcmp(df,"e") == 0) {
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         d1=d1*10+(entry[i++]-'0');
-      if (j!=2) return;
-      for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
-         sm1[j]=entry[i++];
-      if (j!=3) return;
-      sm1[j]='\0';
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         y1=y1*10+(entry[i++]-'0');
-      if (j!=4) return;
-
-      if (entry[i++]!='-') return;
-
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         d2=d2*10+(entry[i++]-'0');
-      if (j!=2) return;
-      for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
-         sm2[j]=entry[i++];
-      if (j!=3) return;
-      sm2[j]='\0';
-      for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
-         y2=y2*10+(entry[i++]-'0');
-      if (j!=4) return;
-   } else
-      return;
-
-   m1=conv_month(sm1);
-   m2=conv_month(sm2);
-   ndirlen=sprintf(newdir,"%s%04d",outdir,y1);
-   if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
-   if(m1 != m2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",m1,m2);
-   else ndirlen+=sprintf(newdir+ndirlen,"/%02d",m1);
-   if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
-   monthlen=ndirlen;
-   if(d1!=d2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",d1,d2);
-   else ndirlen+=sprintf(newdir+ndirlen,"/%02d",d1);
-
-   sprintf(olddir,"%s%s",outdir,entry);
-   if (rename(olddir,newdir)) {
-      debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   strcpy(newdir+monthlen,"/images");
-   if(access(newdir, R_OK) != 0) {
+       int y1, y2, m1, m2, d1, d2;
+       int i, j;
+       int ndirlen;
+       int monthlen;
+       char sm1[8], sm2[8];
+       char olddir[MAXLEN], newdir[MAXLEN];
+
+       if(strlen(entry) < 19) return;
+
+       y1=0;
+       y2=0;
+       memset(sm1,0,sizeof(sm1));
+       memset(sm2,0,sizeof(sm2));
+       d1=0;
+       d2=0;
+       i=0;
+       if(strcmp(df,"u") == 0) {
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       y1=y1*10+(entry[i++]-'0');
+               if (j!=4) return;
+               for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
+                       sm1[j]=entry[i++];
+               if (j!=3) return;
+               sm1[j]='\0';
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       d1=d1*10+(entry[i++]-'0');
+               if (j!=2) return;
+
+               if (entry[i++]!='-') return;
+
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       y2=y2*10+(entry[i++]-'0');
+               if (j!=4) return;
+               for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
+                       sm2[j]=entry[i++];
+               if (j!=3) return;
+               sm2[j]='\0';
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       d2=d2*10+(entry[i++]-'0');
+               if (j!=2) return;
+       } else if(strcmp(df,"e") == 0) {
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       d1=d1*10+(entry[i++]-'0');
+               if (j!=2) return;
+               for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
+                       sm1[j]=entry[i++];
+               if (j!=3) return;
+               sm1[j]='\0';
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       y1=y1*10+(entry[i++]-'0');
+               if (j!=4) return;
+
+               if (entry[i++]!='-') return;
+
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       d2=d2*10+(entry[i++]-'0');
+               if (j!=2) return;
+               for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
+                       sm2[j]=entry[i++];
+               if (j!=3) return;
+               sm2[j]='\0';
+               for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
+                       y2=y2*10+(entry[i++]-'0');
+               if (j!=4) return;
+       } else
+               return;
+
+       m1=conv_month(sm1);
+       m2=conv_month(sm2);
+       ndirlen=sprintf(newdir,"%s%04d",outdir,y1);
+       if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
+       if(m1 != m2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",m1,m2);
+       else ndirlen+=sprintf(newdir+ndirlen,"/%02d",m1);
+       if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
+       monthlen=ndirlen;
+       if(d1!=d2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",d1,d2);
+       else ndirlen+=sprintf(newdir+ndirlen,"/%02d",d1);
+
+       sprintf(olddir,"%s%s",outdir,entry);
+       if (rename(olddir,newdir)) {
+               debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       strcpy(newdir+monthlen,"/images");
+       if(access(newdir, R_OK) != 0) {
 #ifdef HAVE_SYMLINK
-      char linkdir[MAXLEN];
+               char linkdir[MAXLEN];
 
-      sprintf(linkdir,"%simages",outdir);
-      if (symlink(linkdir,newdir)) {
-         debuga(_("failed to create link \"%s\" to \"%s\" - %s\n"),linkdir,newdir,strerror(errno));
-         exit(EXIT_FAILURE);
-      }
+               sprintf(linkdir,"%simages",outdir);
+               if (symlink(linkdir,newdir)) {
+                       debuga(_("failed to create link \"%s\" to \"%s\" - %s\n"),linkdir,newdir,strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
 #else
-      char cmd[MAXLEN];
-      int cstatus;
-
-      sprintf(cmd,"ln -s \"%simages\" \"%s/images\"",outdir,newdir);
-      cstatus=system(cmd);
-      if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-         debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
-         debuga(_("command: %s\n"),cmd);
-         exit(EXIT_FAILURE);
-      }
+               char cmd[MAXLEN];
+               int cstatus;
+
+               sprintf(cmd,"ln -s \"%simages\" \"%s/images\"",outdir,newdir);
+               cstatus=system(cmd);
+               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                       debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
+                       debuga(_("command: %s\n"),cmd);
+                       exit(EXIT_FAILURE);
+               }
 #endif
-   }
+       }
 }
 
 static void date_index_to_file_index(const char *entry)
 {
-   int y1, next;
-   int m1, m2;
-   int d1, d2;
-   int val1len;
-   int i, j;
-   char val1[MAXLEN];
-   const char *sm1, *sm2;
-   char *str;
-   char newdir[MAXLEN], olddir[MAXLEN];
-   DIR *dirp2, *dirp3;
-   struct dirent *direntp2;
-   struct dirent *direntp3;
-
-   if(strlen(entry) != 4) return;
-
-   next=-1;
-   if (sscanf(entry,"%d%n",&y1,&next)!=1 || next<0 || entry[next]) return;
-
-   val1len=snprintf(val1,sizeof(val1),"%s%s",outdir,entry);
-   dirp2 = opendir(val1);
-   if (!dirp2) return;
-   while ((direntp2 = readdir( dirp2 )) != NULL) {
-      if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1])) continue;
-      i=0;
-      str=direntp2->d_name;
-      m1=0;
-      for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
-         m1=(m1*10)+(str[i++]-'0');
-      if (j>=2) continue;
-      sm1=conv_month_name(m1);
-      if (str[i]=='-') {
-         i++;
-         m2=0;
-         for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
-            m2=(m2*10)+(str[i++]-'0');
-         if (j>=2) continue;
-         sm2=conv_month_name(m2);
-      } else if (!str[i]) {
-         sm2=sm1;
-      } else {
-         continue;
-      }
-
-      sprintf(val1+val1len,"/%s",direntp2->d_name);
-      dirp3 = opendir(val1);
-      if (!dirp3) continue;
-      while ((direntp3 = readdir( dirp3 )) != NULL) {
-         if(!isdigit(direntp3->d_name[0]) || !isdigit(direntp3->d_name[1])) continue;
-         i=0;
-         str=direntp3->d_name;
-         d1=0;
-         for (j=0 ; str[i] && isdigit(str[i]) ; j++)
-            d1=d1*10+(str[i++]-'0');
-         if (j!=2) continue;
-         if (str[i]=='-') {
-            i++;
-            d2=0;
-            for (j=0 ; str[i] && isdigit(str[i]) ; j++)
-               d2=d2*10+(str[i++]-'0');
-            if (j!=2) continue;
-         } else if (!str[i]) {
-            d2=d1;
-         } else {
-            continue;
-         }
-
-         if(strcmp(df,"u") == 0) sprintf(newdir,"%s%04d%s%02d-%04d%s%02d",outdir,y1,sm1,d1,y1,sm2,d2);
-         else if(strcmp(df,"e") == 0) sprintf(newdir,"%s%02d%s%04d-%02d%s%04d",outdir,d1,sm1,y1,d2,sm2,y1);
-         else continue;
-         sprintf(olddir,"%s%04d/%s/%s",outdir,y1,direntp2->d_name,direntp3->d_name);
-         if(rename(olddir,newdir)) {
-            debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-      }
-      closedir( dirp3 );
-   }
-   closedir( dirp2 );
-
-   /*!
-   \bug The links to the images in the reports are broken after moving the directories
-   as the the HTML files are not at the right level for the images any more.
-   */
+       int y1, next;
+       int m1, m2;
+       int d1, d2;
+       int val1len;
+       int i, j;
+       char val1[MAXLEN];
+       const char *sm1, *sm2;
+       char *str;
+       char newdir[MAXLEN], olddir[MAXLEN];
+       DIR *dirp2, *dirp3;
+       struct dirent *direntp2;
+       struct dirent *direntp3;
+
+       if(strlen(entry) != 4) return;
+
+       next=-1;
+       if (sscanf(entry,"%d%n",&y1,&next)!=1 || next<0 || entry[next]) return;
+
+       val1len=snprintf(val1,sizeof(val1),"%s%s",outdir,entry);
+       dirp2 = opendir(val1);
+       if (!dirp2) return;
+       while ((direntp2 = readdir( dirp2 )) != NULL) {
+               if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1])) continue;
+               i=0;
+               str=direntp2->d_name;
+               m1=0;
+               for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
+                       m1=(m1*10)+(str[i++]-'0');
+               if (j>=2) continue;
+               sm1=conv_month_name(m1);
+               if (str[i]=='-') {
+                       i++;
+                       m2=0;
+                       for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
+                               m2=(m2*10)+(str[i++]-'0');
+                       if (j>=2) continue;
+                       sm2=conv_month_name(m2);
+               } else if (!str[i]) {
+                       sm2=sm1;
+               } else {
+                       continue;
+               }
+
+               sprintf(val1+val1len,"/%s",direntp2->d_name);
+               dirp3 = opendir(val1);
+               if (!dirp3) continue;
+               while ((direntp3 = readdir( dirp3 )) != NULL) {
+                       if(!isdigit(direntp3->d_name[0]) || !isdigit(direntp3->d_name[1])) continue;
+                       i=0;
+                       str=direntp3->d_name;
+                       d1=0;
+                       for (j=0 ; str[i] && isdigit(str[i]) ; j++)
+                               d1=d1*10+(str[i++]-'0');
+                       if (j!=2) continue;
+                       if (str[i]=='-') {
+                               i++;
+                               d2=0;
+                               for (j=0 ; str[i] && isdigit(str[i]) ; j++)
+                                       d2=d2*10+(str[i++]-'0');
+                               if (j!=2) continue;
+                       } else if (!str[i]) {
+                               d2=d1;
+                       } else {
+                               continue;
+                       }
+
+                       if(strcmp(df,"u") == 0) sprintf(newdir,"%s%04d%s%02d-%04d%s%02d",outdir,y1,sm1,d1,y1,sm2,d2);
+                       else if(strcmp(df,"e") == 0) sprintf(newdir,"%s%02d%s%04d-%02d%s%04d",outdir,d1,sm1,y1,d2,sm2,y1);
+                       else continue;
+                       sprintf(olddir,"%s%04d/%s/%s",outdir,y1,direntp2->d_name,direntp3->d_name);
+                       if(rename(olddir,newdir)) {
+                               debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+               }
+               closedir( dirp3 );
+       }
+       closedir( dirp2 );
+
+       /*!
+       \bug The links to the images in the reports are broken after moving the directories
+       as the the HTML files are not at the right level for the images any more.
+       */
 }
 
index 0c538a1a72a221b9668747653a4ef2ae83d899f5..8cdf1188705aa9aeaacf9c47118a1f495001ef70 100644 (file)
 
 void index_only(const char *dirname,int debug)
 {
-   DIR *dirp;
-   struct dirent *direntp;
-   char remove[MAXLEN];
+       DIR *dirp;
+       struct dirent *direntp;
+       char remove[MAXLEN];
 
-   if ((dirp = opendir(dirname)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),dirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ( (direntp = readdir( dirp )) != NULL ){
-      if(strcmp(direntp->d_name,".") == 0 || strcmp(direntp->d_name,"..") == 0 || strcmp(direntp->d_name, "index.html") == 0)
-         continue;
+       if ((dirp = opendir(dirname)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),dirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ( (direntp = readdir( dirp )) != NULL ){
+               if(strcmp(direntp->d_name,".") == 0 || strcmp(direntp->d_name,"..") == 0 || strcmp(direntp->d_name, "index.html") == 0)
+                       continue;
 
-      if (snprintf(remove,sizeof(remove),"%s/%s",dirname,direntp->d_name)>=sizeof(remove)) {
-         debuga(_("Name of the file to remove is too long: %s/%s\n"),dirname,direntp->d_name);
-         continue;
-      }
-      if (unlink(remove) == -1) {
-         debuga(_("Failed to remove the file %s\n"),remove);
-      }
-   }
+               if (snprintf(remove,sizeof(remove),"%s/%s",dirname,direntp->d_name)>=sizeof(remove)) {
+                       debuga(_("Name of the file to remove is too long: %s/%s\n"),dirname,direntp->d_name);
+                       continue;
+               }
+               if (unlink(remove) == -1) {
+                       debuga(_("Failed to remove the file %s\n"),remove);
+               }
+       }
 
-   (void)closedir( dirp );
+       (void)closedir( dirp );
 
-   return;
+       return;
 }
index d2021989963c295ce92688a9b448d28e83f806d9..4ae79bb0e76293e59296f584d2e70bee15161a0f 100644 (file)
--- a/ip2name.c
+++ b/ip2name.c
 #include "include/conf.h"
 #include "include/defs.h"
 #ifdef HAVE_WS2TCPIP_H
-#include <ws2tcpip.h> //define getnameinfo on windows 
+#include <ws2tcpip.h> //define getnameinfo on windows
 #endif
 
 void ip2name(char *ip,int ip_len)
 {
 #ifdef HAVE_GETNAMEINFO
-   struct sockaddr_storage sa;
-   char host[NI_MAXHOST];
-   int n1,n2,n3,n4,next=0;
-   int error;
+       struct sockaddr_storage sa;
+       char host[NI_MAXHOST];
+       int n1,n2,n3,n4,next=0;
+       int error;
 
-   memset(&sa,0,sizeof(sa));
-   if (sscanf(ip,"%d.%d.%d.%d%n",&n1,&n2,&n3,&n4,&next)==4 && ip[next]=='\0') {
-      struct sockaddr_in *s4=(struct sockaddr_in *)&sa;
-      if (inet_pton(AF_INET,ip,&s4->sin_addr)!=1) return;
-      sa.ss_family=AF_INET;
-   } else {
-      struct sockaddr_in6 *s6=(struct sockaddr_in6 *)&sa;
-      if (inet_pton(AF_INET6,ip,&s6->sin6_addr)!=1) return;
-      sa.ss_family=AF_INET6;
-   }
-   error=getnameinfo((struct sockaddr *)&sa,sizeof(sa),host,sizeof(host),NULL,0,0);
-   if (error==0)
-   {
-      strncpy(ip,host,ip_len-1);
-      ip[ip_len-1]='\0';
-   } else {
-      debuga(_("IP to name resolution (getnameinfo) on IP address %s failed with error %d - %s\n"),ip,error,gai_strerror(error));
-   }
+       memset(&sa,0,sizeof(sa));
+       if (sscanf(ip,"%d.%d.%d.%d%n",&n1,&n2,&n3,&n4,&next)==4 && ip[next]=='\0') {
+               struct sockaddr_in *s4=(struct sockaddr_in *)&sa;
+               if (inet_pton(AF_INET,ip,&s4->sin_addr)!=1) return;
+               sa.ss_family=AF_INET;
+       } else {
+               struct sockaddr_in6 *s6=(struct sockaddr_in6 *)&sa;
+               if (inet_pton(AF_INET6,ip,&s6->sin6_addr)!=1) return;
+               sa.ss_family=AF_INET6;
+       }
+       error=getnameinfo((struct sockaddr *)&sa,sizeof(sa),host,sizeof(host),NULL,0,0);
+       if (error==0)
+       {
+               strncpy(ip,host,ip_len-1);
+               ip[ip_len-1]='\0';
+       } else {
+               debuga(_("IP to name resolution (getnameinfo) on IP address %s failed with error %d - %s\n"),ip,error,gai_strerror(error));
+       }
 #else
-   struct in_addr addr;
-   struct hostent *hp;
-   char **p;
+       struct in_addr addr;
+       struct hostent *hp;
+       char **p;
 
 #ifdef HAVE_INET_ATON
-   if (inet_aton(ip,&addr) == 0)
-      return;
+       if (inet_aton(ip,&addr) == 0)
+               return;
 #else
-   addr.s_addr=inet_addr(ip);
-   if (addr.s_addr==-1) return;
+       addr.s_addr=inet_addr(ip);
+       if (addr.s_addr==-1) return;
 #endif
 
-   hp = gethostbyaddr((void *)&addr, sizeof (addr), AF_INET);
-   if (hp == NULL)
-      return;
+       hp = gethostbyaddr((void *)&addr, sizeof (addr), AF_INET);
+       if (hp == NULL)
+               return;
 
-   for (p = hp->h_addr_list; *p != 0; p++) {
-      struct in_addr in;
+       for (p = hp->h_addr_list; *p != 0; p++) {
+               struct in_addr in;
 
-      (void) memcpy(&in.s_addr, *p, sizeof (in.s_addr));
-      strncpy(ip,hp->h_name,ip_len-1);
-      ip[ip_len-1]=0;
-   }
+               (void) memcpy(&in.s_addr, *p, sizeof (in.s_addr));
+               strncpy(ip,hp->h_name,ip_len-1);
+               ip[ip_len-1]=0;
+       }
 #endif
-   return;
+       return;
 }
 
 void name2ip(char *name)
 {
-   struct in_addr ia;
-   struct hostent *hp;
-   char *port;
-   char n1[4];
-   char n2[4];
-   char n3[4];
-   char n4[4];
-   struct getwordstruct gwarea;
+       struct in_addr ia;
+       struct hostent *hp;
+       char *port;
+       char n1[4];
+       char n2[4];
+       char n3[4];
+       char n4[4];
+       struct getwordstruct gwarea;
 
-   port=strchr(name,':');
-   if (port) *port=0;
+       port=strchr(name,':');
+       if (port) *port=0;
 
-   if((hp=gethostbyname(name))==NULL)
-      return;
+       if((hp=gethostbyname(name))==NULL)
+               return;
 
-   memcpy(&ia.s_addr,hp->h_addr_list[0],sizeof(ia.s_addr));
-   ia.s_addr=ntohl(ia.s_addr);
-   getword_start(&gwarea,inet_ntoa(ia));
-   if (getword(n4,sizeof(n4),&gwarea,'.')<0 || getword(n3,sizeof(n3),&gwarea,'.')<0 ||
-         getword(n2,sizeof(n2),&gwarea,'.')<0 || getword(n1,sizeof(n1),&gwarea,0)<0) {
-      printf("SARG: Maybe you have a broken record or garbage in your %s ip address.\n",gwarea.beginning);
-      exit(EXIT_FAILURE);
-   }
-   sprintf(name,"%s.%s.%s.%s",n1,n2,n3,n4);
+       memcpy(&ia.s_addr,hp->h_addr_list[0],sizeof(ia.s_addr));
+       ia.s_addr=ntohl(ia.s_addr);
+       getword_start(&gwarea,inet_ntoa(ia));
+       if (getword(n4,sizeof(n4),&gwarea,'.')<0 || getword(n3,sizeof(n3),&gwarea,'.')<0 ||
+                       getword(n2,sizeof(n2),&gwarea,'.')<0 || getword(n1,sizeof(n1),&gwarea,0)<0) {
+               printf("SARG: Maybe you have a broken record or garbage in your %s ip address.\n",gwarea.beginning);
+               exit(EXIT_FAILURE);
+       }
+       sprintf(name,"%s.%s.%s.%s",n1,n2,n3,n4);
 
-   return;
+       return;
 }
index 0a4469905a64f5e0e5d40b540824f94b38ccfb85..2252bafa6cef4a9078a0fb0742e385ad3ef65396 100644 (file)
--- a/lastlog.c
+++ b/lastlog.c
 
 void mklastlog(const char *outdir)
 {
-
-   FILE *fp_in, *fp_ou;
-   DIR *dirp;
-   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;
-   int cstatus;
-   struct getwordstruct gwarea;
-
-   if(LastLog <= 0)
-      return;
-
-   snprintf(temp,sizeof(temp),"%slastlog1",outdir);
-   if((fp_ou=fopen(temp,"w"))==NULL) {
-     debuga(_("(lastlog) Cannot open temporary file %s\n"),temp);
-     exit(EXIT_FAILURE);
-   }
-
-   if ((dirp = opendir(outdir)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ((direntp = readdir( dirp )) != NULL ){
-      if(strchr(direntp->d_name,'-') == 0)
-         continue;
-
-      snprintf(warea,sizeof(warea),"%s%s",outdir,direntp->d_name);
-      if (stat(warea,&statb) == -1) {
-         debuga(_("Failed to get the creation time of %s\n"),warea);
-         continue;
-      }
-      t=statb.st_ctime;
-      local = localtime(&t);
-      strftime(ftime, sizeof(ftime), "%Y%m%d%H%M%S", local);
-      fprintf(fp_ou,"%s\t%s\n",ftime,direntp->d_name);
-      ftot++;
-   }
-
-   closedir( dirp );
-   fclose(fp_ou);
-
-   snprintf(buf,sizeof(buf),"sort -n -k 1,1 -o \"%slastlog\" \"%s\"",outdir,temp);
-   cstatus=system(buf);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),buf);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(temp);
-
-   if(ftot<=LastLog) {
-      snprintf(temp,sizeof(temp),"%slastlog",outdir);
-      if(access(temp, R_OK) == 0)
-         unlink(temp);
-      return;
-   }
-
-   ftot-=LastLog;
-
-   snprintf(temp,sizeof(temp),"%slastlog",outdir);
-   if((fp_in=fopen(temp,"r"))==NULL) {
-     debuga(_("(lastlog) Cannot open temporary file %s\n"),temp);
-     exit(EXIT_FAILURE);
-   }
-
-   while(ftot>0 && fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword(warea,sizeof(warea),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),temp);
-         exit(EXIT_FAILURE);
-      }
-
-      if(debug)
-         debuga(_("Removing old report file %s\n"),gwarea.current);
-      if (snprintf(temp,sizeof(temp),"%s%s",outdir,gwarea.current)>=sizeof(temp)) {
-         debuga(_("Directory name too long: %s%s\n"),outdir,gwarea.current);
-         exit(EXIT_FAILURE);
-      }
-      unlinkdir(temp,0);
-      ftot--;
-   }
-
-   fclose(fp_in);
-   snprintf(temp,sizeof(temp),"%slastlog",outdir);
-   if (unlink(temp) == -1) {
-      debuga(_("Failed to delete the file %s\n"),temp);
-   }
-
-   return;
+       FILE *fp_in, *fp_ou;
+       DIR *dirp;
+       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;
+       int cstatus;
+       struct getwordstruct gwarea;
+
+       if(LastLog <= 0)
+               return;
+
+       snprintf(temp,sizeof(temp),"%slastlog1",outdir);
+       if((fp_ou=fopen(temp,"w"))==NULL) {
+       debuga(_("(lastlog) Cannot open temporary file %s\n"),temp);
+       exit(EXIT_FAILURE);
+       }
+
+       if ((dirp = opendir(outdir)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ((direntp = readdir( dirp )) != NULL ){
+               if(strchr(direntp->d_name,'-') == 0)
+                       continue;
+
+               snprintf(warea,sizeof(warea),"%s%s",outdir,direntp->d_name);
+               if (stat(warea,&statb) == -1) {
+                       debuga(_("Failed to get the creation time of %s\n"),warea);
+                       continue;
+               }
+               t=statb.st_ctime;
+               local = localtime(&t);
+               strftime(ftime, sizeof(ftime), "%Y%m%d%H%M%S", local);
+               fprintf(fp_ou,"%s\t%s\n",ftime,direntp->d_name);
+               ftot++;
+       }
+
+       closedir( dirp );
+       fclose(fp_ou);
+
+       snprintf(buf,sizeof(buf),"sort -n -k 1,1 -o \"%slastlog\" \"%s\"",outdir,temp);
+       cstatus=system(buf);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),buf);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(temp);
+
+       if(ftot<=LastLog) {
+               snprintf(temp,sizeof(temp),"%slastlog",outdir);
+               if(access(temp, R_OK) == 0)
+                       unlink(temp);
+               return;
+       }
+
+       ftot-=LastLog;
+
+       snprintf(temp,sizeof(temp),"%slastlog",outdir);
+       if((fp_in=fopen(temp,"r"))==NULL) {
+       debuga(_("(lastlog) Cannot open temporary file %s\n"),temp);
+       exit(EXIT_FAILURE);
+       }
+
+       while(ftot>0 && fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword(warea,sizeof(warea),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),temp);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(debug)
+                       debuga(_("Removing old report file %s\n"),gwarea.current);
+               if (snprintf(temp,sizeof(temp),"%s%s",outdir,gwarea.current)>=sizeof(temp)) {
+                       debuga(_("Directory name too long: %s%s\n"),outdir,gwarea.current);
+                       exit(EXIT_FAILURE);
+               }
+               unlinkdir(temp,0);
+               ftot--;
+       }
+
+       fclose(fp_in);
+       snprintf(temp,sizeof(temp),"%slastlog",outdir);
+       if (unlink(temp) == -1) {
+               debuga(_("Failed to delete the file %s\n"),temp);
+       }
+
+       return;
 }
diff --git a/log.c b/log.c
index 42eaec65c94ab993d2e1d98c2a841a5482fabb9e..869dd1fde738516f8e335af120e1cda6ab454dd8 100644 (file)
--- a/log.c
+++ b/log.c
 
 struct userfilestruct
 {
-   struct userfilestruct *next;
-   struct userinfostruct *user;
-   FILE *file;
+       struct userfilestruct *next;
+       struct userinfostruct *user;
+       FILE *file;
 };
 
 /*@null@*/static char *userfile=NULL;
 
 numlist weekdays = { { 0, 1, 2, 3, 4, 5, 6 }, 7 };
 numlist hours = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
-             13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, 24 };
+                               13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, 24 };
 
 static void getusers(const char *pwdfile, int debug);
 
 int main(int argc,char *argv[])
 {
-   enum isa_col_id {
-      ISACOL_Ip,
-      ISACOL_UserName,
-      ISACOL_Date,
-      ISACOL_Time,
-      ISACOL_TimeTaken,
-      ISACOL_Bytes,
-      ISACOL_Uri,
-      ISACOL_Status,
-      ISACOL_Last //last entry of the list !
-   };
-   enum InputLogFormat {
-      ILF_Unknown,
-      ILF_Squid,
-      ILF_Common,
-      ILF_Sarg,
-      ILF_Isa,
-      ILF_Last //last entry of the list !
-   };
-
-   FILE *fp_in = NULL, *fp_denied=NULL, *fp_authfail=NULL, *fp_log=NULL;
-
-   char sz_Download_Unsort[ 20000 ] ;
-   FILE * fp_Download_Unsort = NULL ;
-
-   extern int optind;
-   extern int optopt;
-   extern char *optarg;
-
-   char data[255];
-   char elap[255];
-   char ip[MAXLEN];
-   char tam[255];
-   char fun[MAXLEN];
-   char wuser[MAXLEN];
-   char smartfilter[MAXLEN];
-   char dia[128];
-   char mes[30];
-   char ano[30];
-   char hora[30];
-   char wtemp[MAXLEN];
-   char date[255];
-   char arq[255];
-   char arq_log[255];
-   int hm, hmf, hmr;
-   char hm_str[15];
-   char uagent[MAXLEN];
-   char hexclude[MAXLEN];
-   char csort[MAXLEN];
-   int cstatus;
-   char tbuf2[128];
-   char zip[20];
-   char *str;
-   char tmp3[MAXLEN];
-   char denied_unsort[MAXLEN];
-   char denied_sort[MAXLEN];
-   char authfail_unsort[MAXLEN];
-   char start_hour[128];
-   char end_hour[128];
-   char *linebuf;
-   char hostname[512];
-   char *url;
-   char *urly;
-   char user[MAX_USER_LEN];
-   enum InputLogFormat ilf;
-   int ilf_count[ILF_Last];
-   int  ch;
-   int  x;
-   int  errflg=0;
-   int  puser=0;
-   bool  fhost=false;
-   bool  dns=false;
-   bool  fuser=false;
-   int  idata=0;
-   int  mindate=0;
-   int  maxdate=0;
-   int  iarq=0;
-   int isa_ncols=0,isa_cols[ISACOL_Last];
-   int lastlog=-1;
-   bool from_stdin;
-   bool from_pipe;
-   int blen;
-   int maxopenfiles;
-   int nopen;
-   bool id_is_ip;
-   long totregsl=0;
-   long totregsg=0;
-   long totregsx=0;
-   bool totper=false;
-   long int max_elapsed=0;
-   long long int iyear, imonth, iday;
-   bool realt;
-   bool userip;
-   struct tm tt;
-   struct tm *t;
-   unsigned long recs1=0UL;
-   unsigned long recs2=0UL;
-   int OutputNonZero = REPORT_EVERY_X_LINES ;
-   bool download_flag=false;
-   char *download_url=NULL;
-   struct getwordstruct gwarea;
-   longline line;
-   time_t tnum;
-   struct stat logstat;
-   struct userinfostruct *uinfo;
-   struct userfilestruct *first_user_file, *ufile, *ufile1, *prev_ufile;
-   static int split=0;
-   static int convert=0;
-   static int output_css=0;
-   int option_index;
-   static struct option long_options[]=
-   {
-      {"convert",no_argument,&convert,1},
-      {"css",no_argument,&output_css,1},
-      {"lastlog",required_argument,NULL,2},
-      {"keeplogs",no_argument,NULL,3},
-      {"split",no_argument,&split,1},
-      {0,0,0,0}
-   };
+       enum isa_col_id {
+               ISACOL_Ip,
+               ISACOL_UserName,
+               ISACOL_Date,
+               ISACOL_Time,
+               ISACOL_TimeTaken,
+               ISACOL_Bytes,
+               ISACOL_Uri,
+               ISACOL_Status,
+               ISACOL_Last //last entry of the list !
+       };
+       enum InputLogFormat {
+               ILF_Unknown,
+               ILF_Squid,
+               ILF_Common,
+               ILF_Sarg,
+               ILF_Isa,
+               ILF_Last //last entry of the list !
+       };
+
+       FILE *fp_in = NULL, *fp_denied=NULL, *fp_authfail=NULL, *fp_log=NULL;
+
+       char sz_Download_Unsort[ 20000 ] ;
+       FILE * fp_Download_Unsort = NULL ;
+
+       extern int optind;
+       extern int optopt;
+       extern char *optarg;
+
+       char data[255];
+       char elap[255];
+       char ip[MAXLEN];
+       char tam[255];
+       char fun[MAXLEN];
+       char wuser[MAXLEN];
+       char smartfilter[MAXLEN];
+       char dia[128];
+       char mes[30];
+       char ano[30];
+       char hora[30];
+       char wtemp[MAXLEN];
+       char date[255];
+       char arq[255];
+       char arq_log[255];
+       int hm, hmf, hmr;
+       char hm_str[15];
+       char uagent[MAXLEN];
+       char hexclude[MAXLEN];
+       char csort[MAXLEN];
+       int cstatus;
+       char tbuf2[128];
+       char zip[20];
+       char *str;
+       char tmp3[MAXLEN];
+       char denied_unsort[MAXLEN];
+       char denied_sort[MAXLEN];
+       char authfail_unsort[MAXLEN];
+       char start_hour[128];
+       char end_hour[128];
+       char *linebuf;
+       char hostname[512];
+       char *url;
+       char *urly;
+       char user[MAX_USER_LEN];
+       enum InputLogFormat ilf;
+       int ilf_count[ILF_Last];
+       int  ch;
+       int  x;
+       int  errflg=0;
+       int  puser=0;
+       bool  fhost=false;
+       bool  dns=false;
+       bool  fuser=false;
+       int  idata=0;
+       int  mindate=0;
+       int  maxdate=0;
+       int  iarq=0;
+       int isa_ncols=0,isa_cols[ISACOL_Last];
+       int lastlog=-1;
+       bool from_stdin;
+       bool from_pipe;
+       int blen;
+       int maxopenfiles;
+       int nopen;
+       bool id_is_ip;
+       long totregsl=0;
+       long totregsg=0;
+       long totregsx=0;
+       bool totper=false;
+       long int max_elapsed=0;
+       long long int iyear, imonth, iday;
+       bool realt;
+       bool userip;
+       struct tm tt;
+       struct tm *t;
+       unsigned long recs1=0UL;
+       unsigned long recs2=0UL;
+       int OutputNonZero = REPORT_EVERY_X_LINES ;
+       bool download_flag=false;
+       char *download_url=NULL;
+       struct getwordstruct gwarea;
+       longline line;
+       time_t tnum;
+       struct stat logstat;
+       struct userinfostruct *uinfo;
+       struct userfilestruct *first_user_file, *ufile, *ufile1, *prev_ufile;
+       static int split=0;
+       static int convert=0;
+       static int output_css=0;
+       int option_index;
+       static struct option long_options[]=
+       {
+               {"convert",no_argument,&convert,1},
+               {"css",no_argument,&output_css,1},
+               {"lastlog",required_argument,NULL,2},
+               {"keeplogs",no_argument,NULL,3},
+               {"split",no_argument,&split,1},
+               {0,0,0,0}
+       };
 
 #ifdef HAVE_LOCALE_H
-   setlocale(LC_TIME,"");
+       setlocale(LC_TIME,"");
 #endif
 
 #if defined(ENABLE_NLS) && defined(HAVE_LOCALE_H)
-   if (!setlocale (LC_ALL, "")) {
-      fprintf(stderr,"SARG: Cannot set the locale LC_ALL to the environment variable\n");
-      exit(EXIT_FAILURE);
-   }
-   if (!bindtextdomain (PACKAGE_NAME, LOCALEDIR)) {
-      fprintf(stderr,"SARG: Cannot bind to text domain %s in directory %s (%s)\n",PACKAGE_NAME,LOCALEDIR,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   if (!textdomain (PACKAGE_NAME)) {
-      fprintf(stderr,"SARG: Cannot set gettext domain for %s PACKAGE_NAME (%s)\n",PACKAGE_NAME,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if (!setlocale (LC_ALL, "")) {
+               fprintf(stderr,"SARG: Cannot set the locale LC_ALL to the environment variable\n");
+               exit(EXIT_FAILURE);
+       }
+       if (!bindtextdomain (PACKAGE_NAME, LOCALEDIR)) {
+               fprintf(stderr,"SARG: Cannot bind to text domain %s in directory %s (%s)\n",PACKAGE_NAME,LOCALEDIR,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if (!textdomain (PACKAGE_NAME)) {
+               fprintf(stderr,"SARG: Cannot set gettext domain for %s PACKAGE_NAME (%s)\n",PACKAGE_NAME,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 #endif //ENABLE_NLS
 
-   BgImage[0]='\0';
-   LogoImage[0]='\0';
-   LogoText[0]='\0';
-   PasswdFile[0]='\0';
-   OutputEmail[0]='\0';
-   UserAgentLog[0]='\0';
-   ExcludeHosts[0]='\0';
-   ExcludeUsers[0]='\0';
-   ConfigFile[0]='\0';
-   code[0]='\0';
-   LastLog=0;
-   ReportType=0UL;
-   UserTabFile[0]='\0';
-   BlockIt[0]='\0';
-   ExternalCSSFile[0]='\0';
-   RedirectorLogFormat[0]='\0';
-   NRedirectorLogs=0;
-   for (ilf=0 ; ilf<ILF_Last ; ilf++) ilf_count[ilf]=0;
-
-   sprintf(ExcludeCodes,"%s/exclude_codes",SYSCONFDIR);
-   strcpy(GraphDaysBytesBarColor,"orange");
-   strcpy(BgColor,"#ffffff");
-   strcpy(TxColor,"#000000");
-   strcpy(TxBgColor,"lavender");
-   strcpy(TiColor,"darkblue");
-   strcpy(Width,"80");
-   strcpy(Height,"45");
-   strcpy(LogoTextColor,"#000000");
-   strcpy(HeaderColor,"darkblue");
-   strcpy(HeaderBgColor,"#dddddd");
-   strcpy(LogoTextColor,"#006699");
-   strcpy(FontSize,"9px");
-   strcpy(TempDir,"/tmp");
-   strcpy(OutputDir,"/var/www/html/squid-reports");
-   Ip2Name=false;
-   strcpy(DateFormat,"u");
-   OverwriteReport=false;
-   RemoveTempFiles=true;
-   strcpy(ReplaceIndex,"index.html");
-   Index=INDEX_YES;
-   RecordsWithoutUser=RECORDWITHOUTUSER_IP;
-   UseComma=0;
-   strcpy(MailUtility,"mailx");
-   TopSitesNum=100;
-   TopUsersNum=0;
-   UserIp=0;
-   TopuserSort=TOPUSER_SORT_BYTES | TOPUSER_SORT_REVERSE;
-   UserSort=USER_SORT_BYTES | USER_SORT_REVERSE;
-   TopsitesSort=TOPSITE_SORT_CONNECT | TOPSITE_SORT_REVERSE;
-   LongUrl=0;
-   strcpy(FontFace,"Verdana,Tahoma,Arial");
-   datetimeby=DATETIME_BYTE;
-   strcpy(CharSet,"ISO-8859-1");
-   Privacy=0;
-   strcpy(PrivacyString,"***.***.***.***");
-   strcpy(PrivacyStringColor,"blue");
-   SuccessfulMsg=true;
-   TopUserFields=TOPUSERFIELDS_NUM | TOPUSERFIELDS_DATE_TIME | TOPUSERFIELDS_USERID | TOPUSERFIELDS_CONNECT |
-                 TOPUSERFIELDS_BYTES | TOPUSERFIELDS_SETYB | TOPUSERFIELDS_IN_CACHE_OUT |
-                 TOPUSERFIELDS_USED_TIME | TOPUSERFIELDS_MILISEC | TOPUSERFIELDS_PTIME |
-                 TOPUSERFIELDS_TOTAL | TOPUSERFIELDS_AVERAGE;
-   UserReportFields=USERREPORTFIELDS_CONNECT | USERREPORTFIELDS_BYTES | USERREPORTFIELDS_SETYB |
-                    USERREPORTFIELDS_IN_CACHE_OUT | USERREPORTFIELDS_USED_TIME | USERREPORTFIELDS_MILISEC |
-                    USERREPORTFIELDS_PTIME | USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE;
-   strcpy(DataFileDelimiter,";");
-   DataFileFields=DATA_FIELD_USER | DATA_FIELD_DATE | DATA_FIELD_TIME | DATA_FIELD_URL | DATA_FIELD_CONNECT |
-                  DATA_FIELD_BYTES | DATA_FIELD_IN_CACHE | DATA_FIELD_OUT_CACHE | DATA_FIELD_ELAPSED;
-   ShowReadStatistics=true;
-   strcpy(IndexSortOrder,"D");
-   ShowSargInfo=true;
-   ShowSargLogo=true;
-   strcpy(ParsedOutputLog,"no");
-   strcpy(ParsedOutputLogCompress,"/bin/gzip -f");
-   DisplayedValues=DISPLAY_ABBREV;
-   strcpy(HeaderFontSize,"9px");
-   strcpy(TitleFontSize,"11px");
-   strcpy(AuthUserTemplateFile,"sarg_htaccess");
-   set_download_suffix("7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso,lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar,tgz,vcd,vob,wma,wmv,zip");
-   Graphs=true;
+       BgImage[0]='\0';
+       LogoImage[0]='\0';
+       LogoText[0]='\0';
+       PasswdFile[0]='\0';
+       OutputEmail[0]='\0';
+       UserAgentLog[0]='\0';
+       ExcludeHosts[0]='\0';
+       ExcludeUsers[0]='\0';
+       ConfigFile[0]='\0';
+       code[0]='\0';
+       LastLog=0;
+       ReportType=0UL;
+       UserTabFile[0]='\0';
+       BlockIt[0]='\0';
+       ExternalCSSFile[0]='\0';
+       RedirectorLogFormat[0]='\0';
+       NRedirectorLogs=0;
+       for (ilf=0 ; ilf<ILF_Last ; ilf++) ilf_count[ilf]=0;
+
+       sprintf(ExcludeCodes,"%s/exclude_codes",SYSCONFDIR);
+       strcpy(GraphDaysBytesBarColor,"orange");
+       strcpy(BgColor,"#ffffff");
+       strcpy(TxColor,"#000000");
+       strcpy(TxBgColor,"lavender");
+       strcpy(TiColor,"darkblue");
+       strcpy(Width,"80");
+       strcpy(Height,"45");
+       strcpy(LogoTextColor,"#000000");
+       strcpy(HeaderColor,"darkblue");
+       strcpy(HeaderBgColor,"#dddddd");
+       strcpy(LogoTextColor,"#006699");
+       strcpy(FontSize,"9px");
+       strcpy(TempDir,"/tmp");
+       strcpy(OutputDir,"/var/www/html/squid-reports");
+       Ip2Name=false;
+       strcpy(DateFormat,"u");
+       OverwriteReport=false;
+       RemoveTempFiles=true;
+       strcpy(ReplaceIndex,"index.html");
+       Index=INDEX_YES;
+       RecordsWithoutUser=RECORDWITHOUTUSER_IP;
+       UseComma=0;
+       strcpy(MailUtility,"mailx");
+       TopSitesNum=100;
+       TopUsersNum=0;
+       UserIp=0;
+       TopuserSort=TOPUSER_SORT_BYTES | TOPUSER_SORT_REVERSE;
+       UserSort=USER_SORT_BYTES | USER_SORT_REVERSE;
+       TopsitesSort=TOPSITE_SORT_CONNECT | TOPSITE_SORT_REVERSE;
+       LongUrl=0;
+       strcpy(FontFace,"Verdana,Tahoma,Arial");
+       datetimeby=DATETIME_BYTE;
+       strcpy(CharSet,"ISO-8859-1");
+       Privacy=0;
+       strcpy(PrivacyString,"***.***.***.***");
+       strcpy(PrivacyStringColor,"blue");
+       SuccessfulMsg=true;
+       TopUserFields=TOPUSERFIELDS_NUM | TOPUSERFIELDS_DATE_TIME | TOPUSERFIELDS_USERID | TOPUSERFIELDS_CONNECT |
+                                       TOPUSERFIELDS_BYTES | TOPUSERFIELDS_SETYB | TOPUSERFIELDS_IN_CACHE_OUT |
+                                       TOPUSERFIELDS_USED_TIME | TOPUSERFIELDS_MILISEC | TOPUSERFIELDS_PTIME |
+                                       TOPUSERFIELDS_TOTAL | TOPUSERFIELDS_AVERAGE;
+       UserReportFields=USERREPORTFIELDS_CONNECT | USERREPORTFIELDS_BYTES | USERREPORTFIELDS_SETYB |
+                                               USERREPORTFIELDS_IN_CACHE_OUT | USERREPORTFIELDS_USED_TIME | USERREPORTFIELDS_MILISEC |
+                                               USERREPORTFIELDS_PTIME | USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE;
+       strcpy(DataFileDelimiter,";");
+       DataFileFields=DATA_FIELD_USER | DATA_FIELD_DATE | DATA_FIELD_TIME | DATA_FIELD_URL | DATA_FIELD_CONNECT |
+                                               DATA_FIELD_BYTES | DATA_FIELD_IN_CACHE | DATA_FIELD_OUT_CACHE | DATA_FIELD_ELAPSED;
+       ShowReadStatistics=true;
+       strcpy(IndexSortOrder,"D");
+       ShowSargInfo=true;
+       ShowSargLogo=true;
+       strcpy(ParsedOutputLog,"no");
+       strcpy(ParsedOutputLogCompress,"/bin/gzip -f");
+       DisplayedValues=DISPLAY_ABBREV;
+       strcpy(HeaderFontSize,"9px");
+       strcpy(TitleFontSize,"11px");
+       strcpy(AuthUserTemplateFile,"sarg_htaccess");
+       set_download_suffix("7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso,lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar,tgz,vcd,vob,wma,wmv,zip");
+       Graphs=true;
 #if defined(FONTDIR)
-   strcpy(GraphFont,FONTDIR"/DejaVuSans.ttf");
+       strcpy(GraphFont,FONTDIR"/DejaVuSans.ttf");
 #else
-   GraphFont[0]='\0';
+       GraphFont[0]='\0';
 #endif
-   strcpy(Ulimit,"20000");
-   NtlmUserFormat=NTLMUSERFORMAT_DOMAINUSER;
-   IndexTree=INDEX_TREE_FILE;
-   strcpy(RealtimeTypes,"GET,PUT,CONNECT");
-   RealtimeUnauthRec=REALTIME_UNAUTH_REC_SHOW;
-   RedirectorFilterOutDate=true;
-   DansguardianFilterOutDate=true;
-   DataFileUrl=DATAFILEURL_IP;
-   strcpy(MaxElapsed,"28800000");
-   BytesInSitesUsersReport=0;
-   UserAuthentication=0;
-   strcpy(LDAPHost,"127.0.0.1");
-   LDAPPort=389;
-   LDAPProtocolVersion=3;
-   LDAPBindDN[0]='\0';
-   LDAPBindPW[0]='\0';
-   LDAPBaseSearch[0]='\0';
-   strcpy(LDAPFilterSearch, "(uid=%s)");
-   strcpy(LDAPTargetAttr, "cn");
-   SortTableJs[0]='\0';
-
-   dia[0]='\0';
-   mes[0]='\0';
-   ano[0]='\0';
-   hora[0]='\0';
-   tmp[0]='\0';
-   tmp3[0]='\0';
-   wtemp[0]='\0';
-   us[0]='\0';
-   date[0]='\0';
-   df[0]='\0';
-   uagent[0]='\0';
-   hexclude[0]='\0';
-   addr[0]='\0';
-   hm=-1;
-   hmf=-1;
-   site[0]='\0';
-   outdir[0]='\0';
-   elap[0]='\0';
-   email[0]='\0';
-   zip[0]='\0';
-   UserInvalidChar[0]='\0';
-   DataFile[0]='\0';
-   SquidGuardConf[0]='\0';
-   DansGuardianConf[0]='\0';
-   start_hour[0]='\0';
-   end_hour[0]='\0';
-   hm_str[0]='\0';
-
-   denied_count=0;
-   download_count=0;
-   authfail_count=0;
-   dansguardian_count=0;
-   squidguard_count=0;
-   useragent_count=0;
-   DeniedReportLimit=10;
-   AuthfailReportLimit=10;
-   DansGuardianReportLimit=10;
-   SquidGuardReportLimit=10;
-   DownloadReportLimit=50;
-   UserReportLimit=0;
-   debug=0;
-   debugz=0;
-   debugm=0;
-   iprel=false;
-   userip=false;
-   realt=false;
-   realtime_refresh=3;
-   realtime_access_log_lines=1000;
-   cost=0.01;
-   nocost=50000000;
-   ndownload=0;
-   squid24=false;
-   dfrom=0;
-   duntil=0;
-
-   bzero(IncludeUsers, sizeof(IncludeUsers));
-   bzero(ExcludeString, sizeof(ExcludeString));
-   first_user_file=NULL;
-   memset(&period,0,sizeof(period));
-
-   NAccessLog=0;
-   for(x=0; x<MAXLOGS; x++)
-      AccessLog[x][0]='\0';
-   AccessLogFromCmdLine=0;
-   RedirectorLogFromCmdLine=0;
-
-   strcpy(Title,_("Squid User Access Report"));
-
-   while((ch = getopt_long_only(argc, argv, "a:b:c:d:e:f:g:u:l:L:o:s:t:w:hijmnprvxyz",long_options,&option_index)) != -1){
-      switch(ch)
-      {
-         case 0:
-            break;
-         case 2:
-            lastlog=atoi(optarg);
-            break;
-         case 3:
-            lastlog=0;
-            break;
-         case 'a':
-            strcpy(addr,optarg);
-            break;
-         case 'b':
-            strcpy(uagent,optarg);
-            break;
-         case 'c':
-            strcpy(hexclude,optarg);
-            break;
-         case 'd':
-            strncpy(date,optarg,sizeof(date)-1);
-            date[sizeof(date)-1]='\0';
-            date_from(date, &dfrom, &duntil);
-            break;
-         case 'e':
-            strcpy(email,optarg);
-            break;
-         case 'f':
-            strcpy(ConfigFile,optarg);
-            break;
-         case 'g':
-            strcpy(df,optarg);
-            break;
-         case 'h':
-            usage(argv[0]);
-            exit(EXIT_SUCCESS);
-         case 'i':
-            iprel=true;
-            break;
-         case 'l':
-            if (NAccessLog>=MAXLOGS) {
-               debuga(_("Too many log files passed on command line with option -l.\n"));
-               exit(EXIT_FAILURE);
-            }
-            if (strlen(optarg)>=MAX_LOG_FILELEN) {
-               debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg);
-               exit(EXIT_FAILURE);
-            }
-            strcpy(AccessLog[NAccessLog],optarg);
-            NAccessLog++;
-            AccessLogFromCmdLine++;
-            break;
-         case 'L':
-            if (NRedirectorLogs>MAX_REDIRECTOR_LOGS) {
-               debuga(_("Too many redirector logs passed on command line with option -L.\n"));
-               exit(EXIT_FAILURE);
-            }
-            if (strlen(optarg)>=MAX_REDIRECTOR_FILELEN) {
-               debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg);
-               exit(EXIT_FAILURE);
-            }
-            strcpy(RedirectorLogs[NRedirectorLogs],optarg);
-            NRedirectorLogs++;
-            RedirectorLogFromCmdLine++;
-            break;
-         case 'm':
-            debugm++;
-            break;
-         case 'n':
-            dns=true;
-            break;
-         case 'o':
-            strcpy(outdir,optarg);
-            break;
-         case 'p':
-            userip=true;
-            break;
-         case 'r':
-            realt=true;
-            break;
-         case 's':
-            strcpy(site,optarg);
-            break;
-         case 't':
-         {
-            int h1,m1,h2,m2;
-
-            if(strstr(optarg,"-") == 0) {
-               if(sscanf(optarg,"%d:%d",&h1,&m1)!=2) {
-                  debuga(_("Time period passed on the command line with option -t must be MM:SS\n"));
-                  exit(EXIT_FAILURE);
-               }
-               hm=h1*100+m1;
-               hmf=hm;
-               snprintf(hm_str,sizeof(hm_str),"%02d:%02d",h1,m1);
-            } else {
-               if(sscanf(optarg,"%d:%d-%d:%d",&h1,&m1,&h2,&m2)!=4) {
-                  debuga(_("Time range passed on the command line with option -t must be MM:SS-MM:SS\n"));
-                  exit(EXIT_FAILURE);
-               }
-               hm=h1*100+m1;
-               hmf=h2*100+m2;
-               snprintf(hm_str,sizeof(hm_str),"%02d:%02d-%02d:%02d",h1,m1,h2,m2);
-            }
-            break;
-         }
-         case 'u':
-            strcpy(us,optarg);
-            break;
-         case 'v':
-            version();
-            break;
-         case 'w':
-            strcpy(tmp,optarg);
-            break;
-         case 'x':
-            debug++;
-            break;
-         case 'y':
-            langcode++;
-            break;
-         case 'z':
-            debugz++;
-            break;
-         /*case ':':
-            debuga(_("Option -%c require an argument\n"),optopt);
-            errflg++;
-            break;*/
-         case '?':
-            usage(argv[0]);
-            exit(EXIT_FAILURE);
-         default:
-            abort();
-      }
-   }
-
-   if (errflg>0) {
-      usage(argv[0]);
-      exit(2);
-   }
-
-   if (optind<argc) {
-      for (iarq=optind ; iarq<argc ; iarq++) {
-         if (NAccessLog>=MAXLOGS) {
-            debuga(_("Too many log files passed on command line.\n"));
-            exit(EXIT_FAILURE);
-         }
-         if (strlen(argv[iarq])>=MAX_LOG_FILELEN) {
-            debuga(_("Log file name too long passed on command line: %s\n"),argv[iarq]);
-            exit(EXIT_FAILURE);
-         }
-         strcpy(AccessLog[NAccessLog],argv[iarq]);
-         NAccessLog++;
-         AccessLogFromCmdLine++;
-      }
-   }
-
-   if(debug) debuga(_("Init\n"));
-
-   if(ConfigFile[0] == '\0') snprintf(ConfigFile,sizeof(ConfigFile),"%s/sarg.conf",SYSCONFDIR);
-   if(access(ConfigFile, R_OK) != 0) {
-      debuga(_("Cannot open config file: %s - %s\n"),ConfigFile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if(access(ConfigFile, R_OK) == 0)
-      getconf();
-
-   if(userip) UserIp=true;
-
-   if(dns) Ip2Name=true;
-
-   if (lastlog>=0) LastLog=lastlog;
-
-   if(realt) {
-      realtime();
-      exit(EXIT_SUCCESS);
-   }
-
-   if(IndexTree == INDEX_TREE_FILE)
-      strcpy(ImageFile,"../images");
-   else
-      strcpy(ImageFile,"../../../images");
-
-   dataonly=0;
-   if(DataFile[0] != '\0')
-      dataonly++;
-
-   if(NAccessLog == 0) {
-      strcpy(AccessLog[0],"/var/log/squid/access.log");
-      NAccessLog++;
-   }
-
-   if(output_css) {
-      css_content(stdout);
-      exit(EXIT_SUCCESS);
-   }
-   if(split) {
-      for (iarq=0 ; iarq<NAccessLog ; iarq++)
-         splitlog(AccessLog[iarq], df, dfrom, duntil, convert);
-      exit(EXIT_SUCCESS);
-   }
-   if(convert) {
-      for (iarq=0 ; iarq<NAccessLog ; iarq++)
-         convlog(AccessLog[iarq], df, dfrom, duntil);
-      exit(EXIT_SUCCESS);
-   }
-
-   load_excludecodes(ExcludeCodes);
-
-   if(access(PasswdFile, R_OK) == 0) {
-      getusers(PasswdFile,debug);
-      puser++;
-   }
-
-   if(hexclude[0] == '\0')
-      strcpy(hexclude,ExcludeHosts);
-   if(hexclude[0] != '\0') {
-      gethexclude(hexclude,debug);
-      fhost=true;
-   }
-
-   if(ReportType == 0) {
-      ReportType=REPORT_TYPE_TOPUSERS | REPORT_TYPE_TOPSITES | REPORT_TYPE_USERS_SITES |
-                 REPORT_TYPE_SITES_USERS | REPORT_TYPE_DATE_TIME | REPORT_TYPE_DENIED |
-                 REPORT_TYPE_AUTH_FAILURES | REPORT_TYPE_SITE_USER_TIME_DATE | REPORT_TYPE_DOWNLOADS;
-   }
-
-   if(access(ExcludeUsers, R_OK) == 0) {
-      getuexclude(ExcludeUsers,debug);
-      fuser=true;
-   }
-
-   indexonly=0;
-   if(fuser) {
-      if(is_indexonly())
-         indexonly++;
-   }
-   if(strcmp(ExcludeUsers,"indexonly") == 0) indexonly++;
-   if(Index == INDEX_ONLY) indexonly++;
-
-   if(MaxElapsed[0] != '\0') max_elapsed=atol(MaxElapsed);
-
-   if(outdir[0] == '\0') strcpy(outdir,OutputDir);
-   strcat(outdir,"/");
-
-   if(uagent[0] == '\0') strcpy(uagent,UserAgentLog);
-
-   if(tmp[0] == '\0') strcpy(tmp,TempDir);
-   else strcpy(TempDir,tmp);
-   /*
-   For historical reasons, the temporary directory is the subdirectory "sarg" of the path
-   provided by the user.
-   */
-   strcat(tmp,"/sarg");
-
-   if (tmp[0]!='\0' && strncmp(outdir,tmp,strlen(tmp))==0) {
-      debuga(_("The output directory \"%s\" must be outside of the temporary directory \"%s\"\n"),outdir,tmp);
-      exit(EXIT_FAILURE);
-   }
-
-   if(df[0] == '\0') strcpy(df,DateFormat);
-   else strcpy(DateFormat,df);
-
-   if(df[0] == '\0') {
-      strcpy(df,"u");
-      strcpy(DateFormat,"u");
-   }
-   if (df[0]=='w')
-      IndexTree=INDEX_TREE_FILE;
-
-   if(email[0] == '\0' && OutputEmail[0] != '\0') strcpy(email,OutputEmail);
-
-   if(email[0] != '\0') {
-      my_mkdir(tmp);
-      strcpy(outdir,tmp);
-      strcat(outdir,"/");
-   }
-
-   if(access(tmp, R_OK) == 0) {
-      unlinkdir(tmp,1);
-   }
-   my_mkdir(tmp);
-   snprintf(denied_unsort,sizeof(denied_unsort),"%s/denied.log.unsort",tmp);
-   snprintf(denied_sort,sizeof(denied_sort),"%s/denied.log",tmp);
-   snprintf(authfail_unsort,sizeof(authfail_unsort),"%s/authfail.log.unsort",tmp);
-
-   if(debug) {
-      debuga(_("Parameters:\n"));
-      debuga(_("          Hostname or IP address (-a) = %s\n"),addr);
-      debuga(_("                   Useragent log (-b) = %s\n"),uagent);
-      debuga(_("                    Exclude file (-c) = %s\n"),hexclude);
-      debuga(_("                 Date from-until (-d) = %s\n"),date);
-      debuga(_("   Email address to send reports (-e) = %s\n"),email);
-      debuga(_("                     Config file (-f) = %s\n"),ConfigFile);
-      if(strcmp(df,"e") == 0)
-         debuga(_("                     Date format (-g) = Europe (dd/mm/yyyy)\n"));
-      if(strcmp(df,"u") == 0)
-         debuga(_("                     Date format (-g) = USA (mm/dd/yyyy)\n"));
-      if(strcmp(df,"w") == 0)
-         debuga(_("                     Date format (-g) = Sites & Users (yyyy/ww)\n"));
-      debuga(_("                       IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
-      for (iarq=0 ; iarq<NAccessLog ; iarq++)
-         debuga(_("                       Input log (-l) = %s\n"),AccessLog[iarq]);
-      for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
-         debuga(_("                  Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
-      debuga(_("              Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
-      debuga(_("                      Output dir (-o) = %s\n"),outdir);
-      debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
-      debuga(_("                   Accessed site (-s) = %s\n"),site);
-      debuga(_("                            Time (-t) = %s\n"),hm_str);
-      debuga(_("                            User (-u) = %s\n"),us);
-      debuga(_("                   Temporary dir (-w) = %s\n"),tmp);
-      debuga(_("                  Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
-      debuga(_("                Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
-      debuga(_(" Previous reports to keep (--lastlog) = %d\n"),LastLog);
-      debuga("\n");
-   }
-
-   if(debugm) {
-      printf(_("Parameters:\n"));
-      printf(_("          Hostname or IP address (-a) = %s\n"),addr);
-      printf(_("                   Useragent log (-b) = %s\n"),uagent);
-      printf(_("                    Exclude file (-c) = %s\n"),hexclude);
-      printf(_("                 Date from-until (-d) = %s\n"),date);
-      printf(_("   Email address to send reports (-e) = %s\n"),email);
-      printf(_("                     Config file (-f) = %s\n"),ConfigFile);
-      if(strcmp(df,"e") == 0)
-         printf(_("                     Date format (-g) = Europe (dd/mm/yyyy)\n"));
-      if(strcmp(df,"u") == 0)
-         printf(_("                     Date format (-g) = USA (mm/dd/yyyy)\n"));
-      if(strcmp(df,"w") == 0)
-         printf(_("                     Date format (-g) = Sites & Users (yyyy/ww)\n"));
-      printf(_("                       IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
-      for (iarq=0 ; iarq<NAccessLog ; iarq++)
-         printf(_("                       Input log (-l) = %s\n"),AccessLog[iarq]);
-      for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
-         printf(_("                  Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
-      printf(_("              Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
-      printf(_("                      Output dir (-o) = %s\n"),outdir);
-      printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
-      printf(_("                   Accessed site (-s) = %s\n"),site);
-      printf(_("                            Time (-t) = %s\n"),hm_str);
-      printf(_("                            User (-u) = %s\n"),us);
-      printf(_("                   Temporary dir (-w) = %s\n"),tmp);
-      printf(_("                  Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
-      printf(_("                Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
-      printf(_(" Previous reports to keep (--lastlog) = %d\n"),LastLog);
-      printf(_("sarg version: %s\n"),VERSION);
-   }
-
-   if(debug)
-      debuga(_("sarg version: %s\n"),VERSION);
+       strcpy(Ulimit,"20000");
+       NtlmUserFormat=NTLMUSERFORMAT_DOMAINUSER;
+       IndexTree=INDEX_TREE_FILE;
+       strcpy(RealtimeTypes,"GET,PUT,CONNECT");
+       RealtimeUnauthRec=REALTIME_UNAUTH_REC_SHOW;
+       RedirectorFilterOutDate=true;
+       DansguardianFilterOutDate=true;
+       DataFileUrl=DATAFILEURL_IP;
+       strcpy(MaxElapsed,"28800000");
+       BytesInSitesUsersReport=0;
+       UserAuthentication=0;
+       strcpy(LDAPHost,"127.0.0.1");
+       LDAPPort=389;
+       LDAPProtocolVersion=3;
+       LDAPBindDN[0]='\0';
+       LDAPBindPW[0]='\0';
+       LDAPBaseSearch[0]='\0';
+       strcpy(LDAPFilterSearch, "(uid=%s)");
+       strcpy(LDAPTargetAttr, "cn");
+       SortTableJs[0]='\0';
+
+       dia[0]='\0';
+       mes[0]='\0';
+       ano[0]='\0';
+       hora[0]='\0';
+       tmp[0]='\0';
+       tmp3[0]='\0';
+       wtemp[0]='\0';
+       us[0]='\0';
+       date[0]='\0';
+       df[0]='\0';
+       uagent[0]='\0';
+       hexclude[0]='\0';
+       addr[0]='\0';
+       hm=-1;
+       hmf=-1;
+       site[0]='\0';
+       outdir[0]='\0';
+       elap[0]='\0';
+       email[0]='\0';
+       zip[0]='\0';
+       UserInvalidChar[0]='\0';
+       DataFile[0]='\0';
+       SquidGuardConf[0]='\0';
+       DansGuardianConf[0]='\0';
+       start_hour[0]='\0';
+       end_hour[0]='\0';
+       hm_str[0]='\0';
+
+       denied_count=0;
+       download_count=0;
+       authfail_count=0;
+       dansguardian_count=0;
+       squidguard_count=0;
+       useragent_count=0;
+       DeniedReportLimit=10;
+       AuthfailReportLimit=10;
+       DansGuardianReportLimit=10;
+       SquidGuardReportLimit=10;
+       DownloadReportLimit=50;
+       UserReportLimit=0;
+       debug=0;
+       debugz=0;
+       debugm=0;
+       iprel=false;
+       userip=false;
+       realt=false;
+       realtime_refresh=3;
+       realtime_access_log_lines=1000;
+       cost=0.01;
+       nocost=50000000;
+       ndownload=0;
+       squid24=false;
+       dfrom=0;
+       duntil=0;
+
+       bzero(IncludeUsers, sizeof(IncludeUsers));
+       bzero(ExcludeString, sizeof(ExcludeString));
+       first_user_file=NULL;
+       memset(&period,0,sizeof(period));
+
+       NAccessLog=0;
+       for(x=0; x<MAXLOGS; x++)
+               AccessLog[x][0]='\0';
+       AccessLogFromCmdLine=0;
+       RedirectorLogFromCmdLine=0;
+
+       strcpy(Title,_("Squid User Access Report"));
+
+       while((ch = getopt_long_only(argc, argv, "a:b:c:d:e:f:g:u:l:L:o:s:t:w:hijmnprvxyz",long_options,&option_index)) != -1){
+               switch(ch)
+               {
+                       case 0:
+                               break;
+                       case 2:
+                               lastlog=atoi(optarg);
+                               break;
+                       case 3:
+                               lastlog=0;
+                               break;
+                       case 'a':
+                               strcpy(addr,optarg);
+                               break;
+                       case 'b':
+                               strcpy(uagent,optarg);
+                               break;
+                       case 'c':
+                               strcpy(hexclude,optarg);
+                               break;
+                       case 'd':
+                               strncpy(date,optarg,sizeof(date)-1);
+                               date[sizeof(date)-1]='\0';
+                               date_from(date, &dfrom, &duntil);
+                               break;
+                       case 'e':
+                               strcpy(email,optarg);
+                               break;
+                       case 'f':
+                               strcpy(ConfigFile,optarg);
+                               break;
+                       case 'g':
+                               strcpy(df,optarg);
+                               break;
+                       case 'h':
+                               usage(argv[0]);
+                               exit(EXIT_SUCCESS);
+                       case 'i':
+                               iprel=true;
+                               break;
+                       case 'l':
+                               if (NAccessLog>=MAXLOGS) {
+                                       debuga(_("Too many log files passed on command line with option -l.\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (strlen(optarg)>=MAX_LOG_FILELEN) {
+                                       debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg);
+                                       exit(EXIT_FAILURE);
+                               }
+                               strcpy(AccessLog[NAccessLog],optarg);
+                               NAccessLog++;
+                               AccessLogFromCmdLine++;
+                               break;
+                       case 'L':
+                               if (NRedirectorLogs>MAX_REDIRECTOR_LOGS) {
+                                       debuga(_("Too many redirector logs passed on command line with option -L.\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (strlen(optarg)>=MAX_REDIRECTOR_FILELEN) {
+                                       debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg);
+                                       exit(EXIT_FAILURE);
+                               }
+                               strcpy(RedirectorLogs[NRedirectorLogs],optarg);
+                               NRedirectorLogs++;
+                               RedirectorLogFromCmdLine++;
+                               break;
+                       case 'm':
+                               debugm++;
+                               break;
+                       case 'n':
+                               dns=true;
+                               break;
+                       case 'o':
+                               strcpy(outdir,optarg);
+                               break;
+                       case 'p':
+                               userip=true;
+                               break;
+                       case 'r':
+                               realt=true;
+                               break;
+                       case 's':
+                               strcpy(site,optarg);
+                               break;
+                       case 't':
+                       {
+                               int h1,m1,h2,m2;
+
+                               if(strstr(optarg,"-") == 0) {
+                                       if(sscanf(optarg,"%d:%d",&h1,&m1)!=2) {
+                                               debuga(_("Time period passed on the command line with option -t must be MM:SS\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       hm=h1*100+m1;
+                                       hmf=hm;
+                                       snprintf(hm_str,sizeof(hm_str),"%02d:%02d",h1,m1);
+                               } else {
+                                       if(sscanf(optarg,"%d:%d-%d:%d",&h1,&m1,&h2,&m2)!=4) {
+                                               debuga(_("Time range passed on the command line with option -t must be MM:SS-MM:SS\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       hm=h1*100+m1;
+                                       hmf=h2*100+m2;
+                                       snprintf(hm_str,sizeof(hm_str),"%02d:%02d-%02d:%02d",h1,m1,h2,m2);
+                               }
+                               break;
+                       }
+                       case 'u':
+                               strcpy(us,optarg);
+                               break;
+                       case 'v':
+                               version();
+                               break;
+                       case 'w':
+                               strcpy(tmp,optarg);
+                               break;
+                       case 'x':
+                               debug++;
+                               break;
+                       case 'y':
+                               langcode++;
+                               break;
+                       case 'z':
+                               debugz++;
+                               break;
+                       /*case ':':
+                               debuga(_("Option -%c require an argument\n"),optopt);
+                               errflg++;
+                               break;*/
+                       case '?':
+                               usage(argv[0]);
+                               exit(EXIT_FAILURE);
+                       default:
+                               abort();
+               }
+       }
+
+       if (errflg>0) {
+               usage(argv[0]);
+               exit(2);
+       }
+
+       if (optind<argc) {
+               for (iarq=optind ; iarq<argc ; iarq++) {
+                       if (NAccessLog>=MAXLOGS) {
+                               debuga(_("Too many log files passed on command line.\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       if (strlen(argv[iarq])>=MAX_LOG_FILELEN) {
+                               debuga(_("Log file name too long passed on command line: %s\n"),argv[iarq]);
+                               exit(EXIT_FAILURE);
+                       }
+                       strcpy(AccessLog[NAccessLog],argv[iarq]);
+                       NAccessLog++;
+                       AccessLogFromCmdLine++;
+               }
+       }
+
+       if(debug) debuga(_("Init\n"));
+
+       if(ConfigFile[0] == '\0') snprintf(ConfigFile,sizeof(ConfigFile),"%s/sarg.conf",SYSCONFDIR);
+       if(access(ConfigFile, R_OK) != 0) {
+               debuga(_("Cannot open config file: %s - %s\n"),ConfigFile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if(access(ConfigFile, R_OK) == 0)
+               getconf();
+
+       if(userip) UserIp=true;
+
+       if(dns) Ip2Name=true;
+
+       if (lastlog>=0) LastLog=lastlog;
+
+       if(realt) {
+               realtime();
+               exit(EXIT_SUCCESS);
+       }
+
+       if(IndexTree == INDEX_TREE_FILE)
+               strcpy(ImageFile,"../images");
+       else
+               strcpy(ImageFile,"../../../images");
+
+       dataonly=0;
+       if(DataFile[0] != '\0')
+               dataonly++;
+
+       if(NAccessLog == 0) {
+               strcpy(AccessLog[0],"/var/log/squid/access.log");
+               NAccessLog++;
+       }
+
+       if(output_css) {
+               css_content(stdout);
+               exit(EXIT_SUCCESS);
+       }
+       if(split) {
+               for (iarq=0 ; iarq<NAccessLog ; iarq++)
+                       splitlog(AccessLog[iarq], df, dfrom, duntil, convert);
+               exit(EXIT_SUCCESS);
+       }
+       if(convert) {
+               for (iarq=0 ; iarq<NAccessLog ; iarq++)
+                       convlog(AccessLog[iarq], df, dfrom, duntil);
+               exit(EXIT_SUCCESS);
+       }
+
+       load_excludecodes(ExcludeCodes);
+
+       if(access(PasswdFile, R_OK) == 0) {
+               getusers(PasswdFile,debug);
+               puser++;
+       }
+
+       if(hexclude[0] == '\0')
+               strcpy(hexclude,ExcludeHosts);
+       if(hexclude[0] != '\0') {
+               gethexclude(hexclude,debug);
+               fhost=true;
+       }
+
+       if(ReportType == 0) {
+               ReportType=REPORT_TYPE_TOPUSERS | REPORT_TYPE_TOPSITES | REPORT_TYPE_USERS_SITES |
+                                       REPORT_TYPE_SITES_USERS | REPORT_TYPE_DATE_TIME | REPORT_TYPE_DENIED |
+                                       REPORT_TYPE_AUTH_FAILURES | REPORT_TYPE_SITE_USER_TIME_DATE | REPORT_TYPE_DOWNLOADS;
+       }
+
+       if(access(ExcludeUsers, R_OK) == 0) {
+               getuexclude(ExcludeUsers,debug);
+               fuser=true;
+       }
+
+       indexonly=0;
+       if(fuser) {
+               if(is_indexonly())
+                       indexonly++;
+       }
+       if(strcmp(ExcludeUsers,"indexonly") == 0) indexonly++;
+       if(Index == INDEX_ONLY) indexonly++;
+
+       if(MaxElapsed[0] != '\0') max_elapsed=atol(MaxElapsed);
+
+       if(outdir[0] == '\0') strcpy(outdir,OutputDir);
+       strcat(outdir,"/");
+
+       if(uagent[0] == '\0') strcpy(uagent,UserAgentLog);
+
+       if(tmp[0] == '\0') strcpy(tmp,TempDir);
+       else strcpy(TempDir,tmp);
+       /*
+       For historical reasons, the temporary directory is the subdirectory "sarg" of the path
+       provided by the user.
+       */
+       strcat(tmp,"/sarg");
+
+       if (tmp[0]!='\0' && strncmp(outdir,tmp,strlen(tmp))==0) {
+               debuga(_("The output directory \"%s\" must be outside of the temporary directory \"%s\"\n"),outdir,tmp);
+               exit(EXIT_FAILURE);
+       }
+
+       if(df[0] == '\0') strcpy(df,DateFormat);
+       else strcpy(DateFormat,df);
+
+       if(df[0] == '\0') {
+               strcpy(df,"u");
+               strcpy(DateFormat,"u");
+       }
+       if (df[0]=='w')
+               IndexTree=INDEX_TREE_FILE;
+
+       if(email[0] == '\0' && OutputEmail[0] != '\0') strcpy(email,OutputEmail);
+
+       if(email[0] != '\0') {
+               my_mkdir(tmp);
+               strcpy(outdir,tmp);
+               strcat(outdir,"/");
+       }
+
+       if(access(tmp, R_OK) == 0) {
+               unlinkdir(tmp,1);
+       }
+       my_mkdir(tmp);
+       snprintf(denied_unsort,sizeof(denied_unsort),"%s/denied.log.unsort",tmp);
+       snprintf(denied_sort,sizeof(denied_sort),"%s/denied.log",tmp);
+       snprintf(authfail_unsort,sizeof(authfail_unsort),"%s/authfail.log.unsort",tmp);
+
+       if(debug) {
+               debuga(_("Parameters:\n"));
+               debuga(_("          Hostname or IP address (-a) = %s\n"),addr);
+               debuga(_("                   Useragent log (-b) = %s\n"),uagent);
+               debuga(_("                    Exclude file (-c) = %s\n"),hexclude);
+               debuga(_("                 Date from-until (-d) = %s\n"),date);
+               debuga(_("   Email address to send reports (-e) = %s\n"),email);
+               debuga(_("                     Config file (-f) = %s\n"),ConfigFile);
+               if(strcmp(df,"e") == 0)
+                       debuga(_("                     Date format (-g) = Europe (dd/mm/yyyy)\n"));
+               if(strcmp(df,"u") == 0)
+                       debuga(_("                     Date format (-g) = USA (mm/dd/yyyy)\n"));
+               if(strcmp(df,"w") == 0)
+                       debuga(_("                     Date format (-g) = Sites & Users (yyyy/ww)\n"));
+               debuga(_("                       IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
+               for (iarq=0 ; iarq<NAccessLog ; iarq++)
+                       debuga(_("                       Input log (-l) = %s\n"),AccessLog[iarq]);
+               for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
+                       debuga(_("                  Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
+               debuga(_("              Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
+               debuga(_("                      Output dir (-o) = %s\n"),outdir);
+               debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
+               debuga(_("                   Accessed site (-s) = %s\n"),site);
+               debuga(_("                            Time (-t) = %s\n"),hm_str);
+               debuga(_("                            User (-u) = %s\n"),us);
+               debuga(_("                   Temporary dir (-w) = %s\n"),tmp);
+               debuga(_("                  Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
+               debuga(_("                Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
+               debuga(_(" Previous reports to keep (--lastlog) = %d\n"),LastLog);
+               debuga("\n");
+       }
+
+       if(debugm) {
+               printf(_("Parameters:\n"));
+               printf(_("          Hostname or IP address (-a) = %s\n"),addr);
+               printf(_("                   Useragent log (-b) = %s\n"),uagent);
+               printf(_("                    Exclude file (-c) = %s\n"),hexclude);
+               printf(_("                 Date from-until (-d) = %s\n"),date);
+               printf(_("   Email address to send reports (-e) = %s\n"),email);
+               printf(_("                     Config file (-f) = %s\n"),ConfigFile);
+               if(strcmp(df,"e") == 0)
+                       printf(_("                     Date format (-g) = Europe (dd/mm/yyyy)\n"));
+               if(strcmp(df,"u") == 0)
+                       printf(_("                     Date format (-g) = USA (mm/dd/yyyy)\n"));
+               if(strcmp(df,"w") == 0)
+                       printf(_("                     Date format (-g) = Sites & Users (yyyy/ww)\n"));
+               printf(_("                       IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
+               for (iarq=0 ; iarq<NAccessLog ; iarq++)
+                       printf(_("                       Input log (-l) = %s\n"),AccessLog[iarq]);
+               for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
+                       printf(_("                  Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
+               printf(_("              Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
+               printf(_("                      Output dir (-o) = %s\n"),outdir);
+               printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
+               printf(_("                   Accessed site (-s) = %s\n"),site);
+               printf(_("                            Time (-t) = %s\n"),hm_str);
+               printf(_("                            User (-u) = %s\n"),us);
+               printf(_("                   Temporary dir (-w) = %s\n"),tmp);
+               printf(_("                  Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
+               printf(_("                Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
+               printf(_(" Previous reports to keep (--lastlog) = %d\n"),LastLog);
+               printf(_("sarg version: %s\n"),VERSION);
+       }
+
+       if(debug)
+               debuga(_("sarg version: %s\n"),VERSION);
 
 #ifdef ENABLE_DOUBLE_CHECK_DATA
-   debuga(_("Sarg compiled to report warnings if the output is inconsistent\n"));
+       debuga(_("Sarg compiled to report warnings if the output is inconsistent\n"));
 #endif
 
-   maxopenfiles=MAX_OPEN_USER_FILES;
+       maxopenfiles=MAX_OPEN_USER_FILES;
 #ifdef HAVE_RLIM_T
-   if (Ulimit[0] != '\0') {
-      struct rlimit rl;
-      long l1, l2;
-      int rc=0;
+       if (Ulimit[0] != '\0') {
+               struct rlimit rl;
+               long l1, l2;
+               int rc=0;
 
 #if defined(RLIMIT_NOFILE)
-      getrlimit (RLIMIT_NOFILE, &rl);
+               getrlimit (RLIMIT_NOFILE, &rl);
 #elif defined(RLIMIT_OFILE)
-      getrlimit (RLIMIT_OFILE, &rl);
+               getrlimit (RLIMIT_OFILE, &rl);
 #else
 #warning "No rlimit resource for the number of open files"
 #endif
-      l1 = rl.rlim_cur;
-      l2 = rl.rlim_max;
+               l1 = rl.rlim_cur;
+               l2 = rl.rlim_max;
 
-      rl.rlim_cur = atol(Ulimit);
-      rl.rlim_max = atol(Ulimit);
+               rl.rlim_cur = atol(Ulimit);
+               rl.rlim_max = atol(Ulimit);
 #if defined(RLIMIT_NOFILE)
-      rc=setrlimit (RLIMIT_NOFILE, &rl);
+               rc=setrlimit (RLIMIT_NOFILE, &rl);
 #elif defined(RLIMIT_OFILE)
-      rc=setrlimit (RLIMIT_OFILE, &rl);
+               rc=setrlimit (RLIMIT_OFILE, &rl);
 #else
 #warning "No rlimit resource for the number of open files"
 #endif
-      if(rc == -1) {
-            debuga(_("setrlimit error - %s\n"),strerror(errno));
-      }
+               if(rc == -1) {
+                               debuga(_("setrlimit error - %s\n"),strerror(errno));
+               }
 
-      if(debug)
-         debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING" max="RLIM_STRING,l1,l2,rl.rlim_cur,rl.rlim_max);
-   }
+               if(debug)
+                       debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING" max="RLIM_STRING,l1,l2,rl.rlim_cur,rl.rlim_max);
+       }
 #endif
 
-   init_usertab(UserTabFile);
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read a log file\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(sz_Download_Unsort,sizeof(sz_Download_Unsort),"%s/download.unsort", tmp);
-
-   if(DataFile[0]=='\0') {
-      if((ReportType & REPORT_TYPE_DENIED) != 0) {
-         if((fp_denied=MY_FOPEN(denied_unsort,"w"))==NULL) {
-            debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-      }
-
-      if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
-         if((fp_authfail=MY_FOPEN(authfail_unsort,"w"))==NULL) {
-            debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-      }
-   }
-
-   for (iarq=0 ; iarq<NAccessLog ; iarq++) {
-      strcpy(arq,AccessLog[iarq]);
-
-      strcpy(arqtt,arq);
-
-      if(strcmp(arq,"-")==0) {
-         if(debug)
-            debuga(_("Reading access log file: from stdin\n"));
-         fp_in=stdin;
-         from_stdin=true;
-      } else {
-         if (date[0]!='\0') {
-            if (stat(arq,&logstat)!=0) {
-               debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq,strerror(errno));
-            } else {
-               struct tm *logtime=localtime(&logstat.st_mtime);
-               if ((logtime->tm_year+1900)*10000+(logtime->tm_mon+1)*100+logtime->tm_mday<dfrom) {
-                  debuga(_("Ignoring old log file %s\n"),arq);
-                  continue;
-               }
-            }
-         }
-         fp_in=decomp(arq,&from_pipe);
-         if(fp_in==NULL) {
-            debuga(_("(log) Cannot open log file: %s - %s\n"),arq,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         if(debug) debuga(_("Reading access log file: %s\n"),arq);
-         from_stdin=false;
-      }
-      ilf=ILF_Unknown;
-      download_flag=false;
-      // pre-read the file only if we have to show stats
-      if(ShowReadStatistics && !from_stdin && !from_pipe) {
-         size_t nread,i;
-         bool skipcr=false;
-         char tmp4[MAXLEN];
-
-         recs1=0UL;
-         recs2=0UL;
-
-         while ((nread=fread(tmp4,1,sizeof(tmp4),fp_in))>0) {
-            for (i=0 ; i<nread ; i++)
-               if (skipcr) {
-                  if (tmp4[i]!='\n' && tmp4[i]!='\r') {
-                     skipcr=false;
-                  }
-               } else {
-                  if (tmp4[i]=='\n' || tmp4[i]=='\r') {
-                     skipcr=true;
-                     recs1++;
-                  }
-               }
-         }
-         rewind(fp_in);
-         printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1,(float) 0);
-         putchar('\r');
-         fflush( stdout ) ;
-      }
-
-      longline_reset(line);
-
-      while ((linebuf=longline_read(fp_in,line))!=NULL) {
-         blen=strlen(linebuf);
-
-         if (ilf==ILF_Unknown) {
-            if(strncmp(linebuf,"#Software: Mic",14) == 0) {
-               fixendofline(linebuf);
-               if (debug)
-                  debuga(_("Log is from Microsoft ISA: %s\n"),linebuf);
-               ilf=ILF_Isa;
-               ilf_count[ilf]++;
-               continue;
-            }
-
-            if(strncmp(linebuf,"*** SARG Log ***",16) == 0) {
-               if (getperiod_fromsarglog(arqtt,&period)<0) {
-                  debuga(_("The name of the file is invalid: %s\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               ilf=ILF_Sarg;
-               ilf_count[ilf]++;
-               continue;
-            }
-         }
-
-         if(!fp_log && strcmp(ParsedOutputLog, "no") != 0 && ilf!=ILF_Sarg) {
-            if(access(ParsedOutputLog,R_OK) != 0) {
-               my_mkdir(ParsedOutputLog);
-            }
-            sprintf(arq_log,"%s/sarg_temp.log",ParsedOutputLog);
-            if((fp_log=MY_FOPEN(arq_log,"w"))==NULL) {
-               debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log,strerror(errno));
-               exit(EXIT_FAILURE);
-            }
-            fputs("*** SARG Log ***\n",fp_log);
-         }
-
-         recs2++;
-         if( ShowReadStatistics && !from_stdin && !from_pipe && --OutputNonZero<=0) {
-           double perc = recs2 * 100. / recs1 ;
-           printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs2,perc);
-           putchar('\r');
-           fflush (stdout);
-           OutputNonZero = REPORT_EVERY_X_LINES ;
-         }
-         if(blen < 58) continue;
-         if(strstr(linebuf,"HTTP/0.0") != 0) continue;
-         if(strstr(linebuf,"logfile turned over") != 0) continue;
-         if(linebuf[0] == ' ') continue;
-
-         // exclude_string
-         if(ExcludeString[0] != '\0') {
-            bool exstring=false;
-            getword_start(&gwarea,ExcludeString);
-            while(strchr(gwarea.current,':') != 0) {
-               if (getword_multisep(val1,sizeof(val1),&gwarea,':')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
-                  exit(EXIT_FAILURE);
-               }
-               if((str=(char *) strstr(linebuf,val1)) != (char *) NULL ) {
-                  exstring=true;
-                  break;
-               }
-            }
-            if(!exstring && (str=(char *) strstr(linebuf,gwarea.current)) != (char *) NULL )
-                  exstring=true;
-            if(exstring) continue;
-         }
-
-         totregsl++;
-         if(debugm)
-            printf("BUF=%s\n",linebuf);
-
-         t=NULL;
-         if (ilf==ILF_Squid || ilf==ILF_Common || ilf==ILF_Unknown) {
-            getword_start(&gwarea,linebuf);
-            if (getword(data,sizeof(data),&gwarea,' ')<0) {
-               debuga(_("Maybe you have a broken time in your access.log file\n"));
-               exit(EXIT_FAILURE);
-            }
-            if((str=(char *) strchr(data, '.')) != (char *) NULL && (str=(char *) strchr(str+1, '.')) != (char *) NULL ) {
-               strcpy(ip,data);
-               strcpy(elap,"0");
-               if(squid24) {
-                  if (getword(user,sizeof(user),&gwarea,' ')<0 || getword_skip(255,&gwarea,' ')<0) {
-                     debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-               } else {
-                  if (getword_skip(255,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,' ')<0) {
-                     debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-               }
-               if (getword(data,sizeof(data),&gwarea,']')<0 || getword_skip(MAXLEN,&gwarea,'"')<0 ||
-                     getword(fun,sizeof(fun),&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_ptr(linebuf,&url,&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken url in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_skip(MAXLEN,&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(code2,sizeof(code2),&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(tam,sizeof(tam),&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if((str=(char *) strchr(gwarea.current, ' ')) != (char *) NULL ) {
-                  if (getword(code,sizeof(code),&gwarea,' ')<0) {
-                     debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-               } else {
-                  if (getword(code,sizeof(code),&gwarea,'\0')<0) {
-                     debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-               }
-
-               if ((str = strchr(code, ':')) != NULL)
-                  *str = '/';
-
-               if(strcmp(tam,"\0") == 0)
-                  strcpy(tam,"0");
-
-               ilf=ILF_Common;
-               ilf_count[ilf]++;
-
-               getword_start(&gwarea,data+1);
-               if (getword_multisep(data,sizeof(data),&gwarea,':')<0){
-                  debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_multisep(hora,sizeof(hora),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               getword_start(&gwarea,data);
-               if (getword_atoll(&iday,&gwarea,'/')<0){
-                  debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(mes,sizeof(mes),&gwarea,'/')<0){
-                  debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_atoll(&iyear,&gwarea,'/')<0){
-                  debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-
-               imonth=month2num(mes)+1;
-               idata=builddia(iday,imonth,iyear);
-               computedate(iyear,imonth,iday,&tt);
-               t=&tt;
-            }
-
-            if(ilf==ILF_Unknown || ilf==ILF_Squid) {
-               if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
-                  debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               while(strcmp(elap,"") == 0 && gwarea.current[0] != '\0')
-                  if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
-                     debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-               if(strlen(elap) < 1) continue;
-               if (getword(ip,sizeof(ip),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(code,sizeof(code),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken result code in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(tam,sizeof(tam),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(fun,sizeof(fun),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken request method in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword_ptr(linebuf,&url,&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken url in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (getword(user,sizeof(user),&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               ilf=ILF_Squid;
-               ilf_count[ilf]++;
-
-               tnum=atoi(data);
-               t=localtime(&tnum);
-               if (t == NULL) {
-                  debuga(_("Cannot convert the timestamp from the squid log file\n"));
-                  exit(EXIT_FAILURE);
-               }
-
-               strftime(tbuf2, sizeof(tbuf2), "%H%M", t);
-
-               idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
-            }
-         }
-         if (ilf==ILF_Sarg) {
-            getword_start(&gwarea,linebuf);
-            if (getword(data,sizeof(data),&gwarea,'\t')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword_ptr(linebuf,&url,&gwarea,'\t')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(tam,sizeof(tam),&gwarea,'\t')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(code,sizeof(code),&gwarea,'\t')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(elap,sizeof(elap),&gwarea,'\t')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword(smartfilter,sizeof(smartfilter),&gwarea,'\0')<0){
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            getword_start(&gwarea,data);
-            if (getword_atoll(&iday,&gwarea,'/')<0 || iday<1 || iday>31){
-               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword_atoll(&imonth,&gwarea,'/')<0 || imonth<1 || imonth>12){
-               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword_atoll(&iyear,&gwarea,'\0')<0){
-               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            idata=builddia(iday,imonth,iyear);
-            computedate(iyear,imonth,iday,&tt);
-            t=&tt;
-         }
-         if (ilf==ILF_Isa) {
-            if (linebuf[0] == '#') {
-               int ncols,cols[ISACOL_Last];
-
-               fixendofline(linebuf);
-               getword_start(&gwarea,linebuf);
-               // remove the #Fields: column at the beginning of the line
-               if (getword_skip(1000,&gwarea,' ')<0){
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               for (ncols=0 ; ncols<ISACOL_Last ; ncols++) cols[ncols]=-1;
-               ncols=0;
-               while(gwarea.current[0] != '\0') {
-                  if (getword(val1,sizeof(val1),&gwarea,'\t')<0){
-                     debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  if(strcmp(val1,"c-ip") == 0) cols[ISACOL_Ip]=ncols;
-                  if(strcmp(val1,"cs-username") == 0) cols[ISACOL_UserName]=ncols;
-                  if(strcmp(val1,"date") == 0) cols[ISACOL_Date]=ncols;
-                  if(strcmp(val1,"time") == 0) cols[ISACOL_Time]=ncols;
-                  if(strcmp(val1,"time-taken") == 0) cols[ISACOL_TimeTaken]=ncols;
-                  if(strcmp(val1,"sc-bytes") == 0) cols[ISACOL_Bytes]=ncols;
-                  if(strcmp(val1,"cs-uri") == 0) cols[ISACOL_Uri]=ncols;
-                  if(strcmp(val1,"sc-status") == 0) cols[ISACOL_Status]=ncols;
-                  ncols++;
-               }
-               if (cols[ISACOL_Ip]>=0) {
-                  isa_ncols=ncols;
-                  for (ncols=0 ; ncols<ISACOL_Last ; ncols++)
-                     isa_cols[ncols]=cols[ncols];
-               }
-               continue;
-            }
-            if (!isa_ncols) continue;
-            getword_start(&gwarea,linebuf);
-            for (x=0 ; x<isa_ncols ; x++) {
-               if (getword_ptr(linebuf,&str,&gwarea,'\t')<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
-                  exit(EXIT_FAILURE);
-               }
-               if (x==isa_cols[ISACOL_Ip]) {
-                  if (strlen(str)>=sizeof(ip)) {
-                     debuga(_("Maybe you have a broken IP in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(ip,str);
-               } else if (x==isa_cols[ISACOL_UserName]) {
-                  if (strlen(str)>=sizeof(user)) {
-                     debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(user,str);
-               } else if (x==isa_cols[ISACOL_Date]) {
-                  if (strlen(str)>=sizeof(data)) {
-                     debuga(_("Maybe you have a broken date in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(data,str);
-               } else if (x==isa_cols[ISACOL_Time]) {
-                  if (strlen(str)>=sizeof(hora)) {
-                     debuga(_("Maybe you have a broken time in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(hora,str);
-               } else if (x==isa_cols[ISACOL_TimeTaken]) {
-                  if (strlen(str)>=sizeof(elap)) {
-                     debuga(_("Maybe you have a broken download duration in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(elap,str);
-               } else if (x==isa_cols[ISACOL_Bytes]) {
-                  if (strlen(str)>=sizeof(tam)) {
-                     debuga(_("Maybe you have a broken download size in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(tam,str);
-               } else if (x==isa_cols[ISACOL_Uri]) {
-                  url=str;
-               } else if (x==isa_cols[ISACOL_Status]) {
-                  if (strlen(str)>=sizeof(code)) {
-                     debuga(_("Maybe you have a broken access code in your %s file\n"),arq);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(code,str);
-               }
-            }
-
-            if(strcmp(code,"401") == 0 || strcmp(code,"403") == 0 || strcmp(code,"407") == 0) {
-               sprintf(val1,"DENIED/%s",code);
-               strcpy(code,val1);
-            }
-            getword_start(&gwarea,data);
-            if (getword_atoll(&iyear,&gwarea,'-')<0){
-               debuga(_("Maybe you have a broken year in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword_atoll(&imonth,&gwarea,'-')<0){
-               debuga(_("Maybe you have a broken month in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-            if (getword_atoll(&iday,&gwarea,'\0')<0){
-               debuga(_("Maybe you have a broken day in your %s file\n"),arq);
-               exit(EXIT_FAILURE);
-            }
-
-            idata=builddia(iday,imonth,iyear);
-            computedate(iyear,imonth,iday,&tt);
-            t=&tt;
-         }
-         if (t==NULL) {
-            debuga(_("Unknown input log file format\n"));
-            break;
-         }
-
-         strftime(dia, sizeof(dia), "%d/%m/%Y", t);
-         snprintf(hora,sizeof(hora),"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
-
-         if(debugm)
-            printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date,idata,dfrom,duntil);
-
-         if(date[0] != '\0'){
-            if(idata < dfrom || idata > duntil) continue;
-         }
-
-         // Record only hours usage which is required
-         if (t) {
-            if( bsearch( &( t -> tm_wday ), weekdays.list, weekdays.len,
-                                             sizeof( int ), compar ) == NULL )
-               continue;
-
-            if( bsearch( &( t -> tm_hour ), hours.list, hours.len,
-                                             sizeof( int ), compar ) == NULL )
-               continue;
-         }
-
-
-         if(strlen(user) > MAX_USER_LEN) {
-            if (debugm) printf(_("User ID too long: %s\n"),user);
-            totregsx++;
-            continue;
-         }
-
-         // include_users
-         if(IncludeUsers[0] != '\0') {
-            sprintf(val1,":%s:",user);
-            if((str=(char *) strstr(IncludeUsers,val1)) == (char *) NULL )
-               continue;
-         }
-
-         if(vercode(code)) {
-            if (debugm) printf(_("Excluded code: %s\n"),code);
-            totregsx++;
-            continue;
-         }
-
-         if(testvaliduserchar(user))
-            continue;
+       init_usertab(UserTabFile);
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read a log file\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(sz_Download_Unsort,sizeof(sz_Download_Unsort),"%s/download.unsort", tmp);
+
+       if(DataFile[0]=='\0') {
+               if((ReportType & REPORT_TYPE_DENIED) != 0) {
+                       if((fp_denied=MY_FOPEN(denied_unsort,"w"))==NULL) {
+                               debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+               }
+
+               if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
+                       if((fp_authfail=MY_FOPEN(authfail_unsort,"w"))==NULL) {
+                               debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+               }
+       }
+
+       for (iarq=0 ; iarq<NAccessLog ; iarq++) {
+               strcpy(arq,AccessLog[iarq]);
+
+               strcpy(arqtt,arq);
+
+               if(strcmp(arq,"-")==0) {
+                       if(debug)
+                               debuga(_("Reading access log file: from stdin\n"));
+                       fp_in=stdin;
+                       from_stdin=true;
+               } else {
+                       if (date[0]!='\0') {
+                               if (stat(arq,&logstat)!=0) {
+                                       debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq,strerror(errno));
+                               } else {
+                                       struct tm *logtime=localtime(&logstat.st_mtime);
+                                       if ((logtime->tm_year+1900)*10000+(logtime->tm_mon+1)*100+logtime->tm_mday<dfrom) {
+                                               debuga(_("Ignoring old log file %s\n"),arq);
+                                               continue;
+                                       }
+                               }
+                       }
+                       fp_in=decomp(arq,&from_pipe);
+                       if(fp_in==NULL) {
+                               debuga(_("(log) Cannot open log file: %s - %s\n"),arq,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       if(debug) debuga(_("Reading access log file: %s\n"),arq);
+                       from_stdin=false;
+               }
+               ilf=ILF_Unknown;
+               download_flag=false;
+               // pre-read the file only if we have to show stats
+               if(ShowReadStatistics && !from_stdin && !from_pipe) {
+                       size_t nread,i;
+                       bool skipcr=false;
+                       char tmp4[MAXLEN];
+
+                       recs1=0UL;
+                       recs2=0UL;
+
+                       while ((nread=fread(tmp4,1,sizeof(tmp4),fp_in))>0) {
+                               for (i=0 ; i<nread ; i++)
+                                       if (skipcr) {
+                                               if (tmp4[i]!='\n' && tmp4[i]!='\r') {
+                                                       skipcr=false;
+                                               }
+                                       } else {
+                                               if (tmp4[i]=='\n' || tmp4[i]=='\r') {
+                                                       skipcr=true;
+                                                       recs1++;
+                                               }
+                                       }
+                       }
+                       rewind(fp_in);
+                       printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1,(float) 0);
+                       putchar('\r');
+                       fflush( stdout ) ;
+               }
+
+               longline_reset(line);
+
+               while ((linebuf=longline_read(fp_in,line))!=NULL) {
+                       blen=strlen(linebuf);
+
+                       if (ilf==ILF_Unknown) {
+                               if(strncmp(linebuf,"#Software: Mic",14) == 0) {
+                                       fixendofline(linebuf);
+                                       if (debug)
+                                               debuga(_("Log is from Microsoft ISA: %s\n"),linebuf);
+                                       ilf=ILF_Isa;
+                                       ilf_count[ilf]++;
+                                       continue;
+                               }
+
+                               if(strncmp(linebuf,"*** SARG Log ***",16) == 0) {
+                                       if (getperiod_fromsarglog(arqtt,&period)<0) {
+                                               debuga(_("The name of the file is invalid: %s\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       ilf=ILF_Sarg;
+                                       ilf_count[ilf]++;
+                                       continue;
+                               }
+                       }
+
+                       if(!fp_log && strcmp(ParsedOutputLog, "no") != 0 && ilf!=ILF_Sarg) {
+                               if(access(ParsedOutputLog,R_OK) != 0) {
+                                       my_mkdir(ParsedOutputLog);
+                               }
+                               sprintf(arq_log,"%s/sarg_temp.log",ParsedOutputLog);
+                               if((fp_log=MY_FOPEN(arq_log,"w"))==NULL) {
+                                       debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log,strerror(errno));
+                                       exit(EXIT_FAILURE);
+                               }
+                               fputs("*** SARG Log ***\n",fp_log);
+                       }
+
+                       recs2++;
+                       if( ShowReadStatistics && !from_stdin && !from_pipe && --OutputNonZero<=0) {
+                       double perc = recs2 * 100. / recs1 ;
+                       printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs2,perc);
+                       putchar('\r');
+                       fflush (stdout);
+                       OutputNonZero = REPORT_EVERY_X_LINES ;
+                       }
+                       if(blen < 58) continue;
+                       if(strstr(linebuf,"HTTP/0.0") != 0) continue;
+                       if(strstr(linebuf,"logfile turned over") != 0) continue;
+                       if(linebuf[0] == ' ') continue;
+
+                       // exclude_string
+                       if(ExcludeString[0] != '\0') {
+                               bool exstring=false;
+                               getword_start(&gwarea,ExcludeString);
+                               while(strchr(gwarea.current,':') != 0) {
+                                       if (getword_multisep(val1,sizeof(val1),&gwarea,':')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if((str=(char *) strstr(linebuf,val1)) != (char *) NULL ) {
+                                               exstring=true;
+                                               break;
+                                       }
+                               }
+                               if(!exstring && (str=(char *) strstr(linebuf,gwarea.current)) != (char *) NULL )
+                                               exstring=true;
+                               if(exstring) continue;
+                       }
+
+                       totregsl++;
+                       if(debugm)
+                               printf("BUF=%s\n",linebuf);
+
+                       t=NULL;
+                       if (ilf==ILF_Squid || ilf==ILF_Common || ilf==ILF_Unknown) {
+                               getword_start(&gwarea,linebuf);
+                               if (getword(data,sizeof(data),&gwarea,' ')<0) {
+                                       debuga(_("Maybe you have a broken time in your access.log file\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                               if((str=(char *) strchr(data, '.')) != (char *) NULL && (str=(char *) strchr(str+1, '.')) != (char *) NULL ) {
+                                       strcpy(ip,data);
+                                       strcpy(elap,"0");
+                                       if(squid24) {
+                                               if (getword(user,sizeof(user),&gwarea,' ')<0 || getword_skip(255,&gwarea,' ')<0) {
+                                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                       } else {
+                                               if (getword_skip(255,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,' ')<0) {
+                                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                       }
+                                       if (getword(data,sizeof(data),&gwarea,']')<0 || getword_skip(MAXLEN,&gwarea,'"')<0 ||
+                                                       getword(fun,sizeof(fun),&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_ptr(linebuf,&url,&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken url in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_skip(MAXLEN,&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(code2,sizeof(code2),&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(tam,sizeof(tam),&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if((str=(char *) strchr(gwarea.current, ' ')) != (char *) NULL ) {
+                                               if (getword(code,sizeof(code),&gwarea,' ')<0) {
+                                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                       } else {
+                                               if (getword(code,sizeof(code),&gwarea,'\0')<0) {
+                                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                       }
+
+                                       if ((str = strchr(code, ':')) != NULL)
+                                               *str = '/';
+
+                                       if(strcmp(tam,"\0") == 0)
+                                               strcpy(tam,"0");
+
+                                       ilf=ILF_Common;
+                                       ilf_count[ilf]++;
+
+                                       getword_start(&gwarea,data+1);
+                                       if (getword_multisep(data,sizeof(data),&gwarea,':')<0){
+                                               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_multisep(hora,sizeof(hora),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       getword_start(&gwarea,data);
+                                       if (getword_atoll(&iday,&gwarea,'/')<0){
+                                               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(mes,sizeof(mes),&gwarea,'/')<0){
+                                               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_atoll(&iyear,&gwarea,'/')<0){
+                                               debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+
+                                       imonth=month2num(mes)+1;
+                                       idata=builddia(iday,imonth,iyear);
+                                       computedate(iyear,imonth,iday,&tt);
+                                       t=&tt;
+                               }
+
+                               if(ilf==ILF_Unknown || ilf==ILF_Squid) {
+                                       if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
+                                               debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       while(strcmp(elap,"") == 0 && gwarea.current[0] != '\0')
+                                               if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
+                                                       debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                       if(strlen(elap) < 1) continue;
+                                       if (getword(ip,sizeof(ip),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(code,sizeof(code),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken result code in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(tam,sizeof(tam),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(fun,sizeof(fun),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken request method in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword_ptr(linebuf,&url,&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken url in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (getword(user,sizeof(user),&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       ilf=ILF_Squid;
+                                       ilf_count[ilf]++;
+
+                                       tnum=atoi(data);
+                                       t=localtime(&tnum);
+                                       if (t == NULL) {
+                                               debuga(_("Cannot convert the timestamp from the squid log file\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+
+                                       strftime(tbuf2, sizeof(tbuf2), "%H%M", t);
+
+                                       idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
+                               }
+                       }
+                       if (ilf==ILF_Sarg) {
+                               getword_start(&gwarea,linebuf);
+                               if (getword(data,sizeof(data),&gwarea,'\t')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword_ptr(linebuf,&url,&gwarea,'\t')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(tam,sizeof(tam),&gwarea,'\t')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(code,sizeof(code),&gwarea,'\t')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(elap,sizeof(elap),&gwarea,'\t')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword(smartfilter,sizeof(smartfilter),&gwarea,'\0')<0){
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               getword_start(&gwarea,data);
+                               if (getword_atoll(&iday,&gwarea,'/')<0 || iday<1 || iday>31){
+                                       debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword_atoll(&imonth,&gwarea,'/')<0 || imonth<1 || imonth>12){
+                                       debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword_atoll(&iyear,&gwarea,'\0')<0){
+                                       debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               idata=builddia(iday,imonth,iyear);
+                               computedate(iyear,imonth,iday,&tt);
+                               t=&tt;
+                       }
+                       if (ilf==ILF_Isa) {
+                               if (linebuf[0] == '#') {
+                                       int ncols,cols[ISACOL_Last];
+
+                                       fixendofline(linebuf);
+                                       getword_start(&gwarea,linebuf);
+                                       // remove the #Fields: column at the beginning of the line
+                                       if (getword_skip(1000,&gwarea,' ')<0){
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       for (ncols=0 ; ncols<ISACOL_Last ; ncols++) cols[ncols]=-1;
+                                       ncols=0;
+                                       while(gwarea.current[0] != '\0') {
+                                               if (getword(val1,sizeof(val1),&gwarea,'\t')<0){
+                                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               if(strcmp(val1,"c-ip") == 0) cols[ISACOL_Ip]=ncols;
+                                               if(strcmp(val1,"cs-username") == 0) cols[ISACOL_UserName]=ncols;
+                                               if(strcmp(val1,"date") == 0) cols[ISACOL_Date]=ncols;
+                                               if(strcmp(val1,"time") == 0) cols[ISACOL_Time]=ncols;
+                                               if(strcmp(val1,"time-taken") == 0) cols[ISACOL_TimeTaken]=ncols;
+                                               if(strcmp(val1,"sc-bytes") == 0) cols[ISACOL_Bytes]=ncols;
+                                               if(strcmp(val1,"cs-uri") == 0) cols[ISACOL_Uri]=ncols;
+                                               if(strcmp(val1,"sc-status") == 0) cols[ISACOL_Status]=ncols;
+                                               ncols++;
+                                       }
+                                       if (cols[ISACOL_Ip]>=0) {
+                                               isa_ncols=ncols;
+                                               for (ncols=0 ; ncols<ISACOL_Last ; ncols++)
+                                                       isa_cols[ncols]=cols[ncols];
+                                       }
+                                       continue;
+                               }
+                               if (!isa_ncols) continue;
+                               getword_start(&gwarea,linebuf);
+                               for (x=0 ; x<isa_ncols ; x++) {
+                                       if (getword_ptr(linebuf,&str,&gwarea,'\t')<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if (x==isa_cols[ISACOL_Ip]) {
+                                               if (strlen(str)>=sizeof(ip)) {
+                                                       debuga(_("Maybe you have a broken IP in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(ip,str);
+                                       } else if (x==isa_cols[ISACOL_UserName]) {
+                                               if (strlen(str)>=sizeof(user)) {
+                                                       debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(user,str);
+                                       } else if (x==isa_cols[ISACOL_Date]) {
+                                               if (strlen(str)>=sizeof(data)) {
+                                                       debuga(_("Maybe you have a broken date in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(data,str);
+                                       } else if (x==isa_cols[ISACOL_Time]) {
+                                               if (strlen(str)>=sizeof(hora)) {
+                                                       debuga(_("Maybe you have a broken time in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(hora,str);
+                                       } else if (x==isa_cols[ISACOL_TimeTaken]) {
+                                               if (strlen(str)>=sizeof(elap)) {
+                                                       debuga(_("Maybe you have a broken download duration in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(elap,str);
+                                       } else if (x==isa_cols[ISACOL_Bytes]) {
+                                               if (strlen(str)>=sizeof(tam)) {
+                                                       debuga(_("Maybe you have a broken download size in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(tam,str);
+                                       } else if (x==isa_cols[ISACOL_Uri]) {
+                                               url=str;
+                                       } else if (x==isa_cols[ISACOL_Status]) {
+                                               if (strlen(str)>=sizeof(code)) {
+                                                       debuga(_("Maybe you have a broken access code in your %s file\n"),arq);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(code,str);
+                                       }
+                               }
+
+                               if(strcmp(code,"401") == 0 || strcmp(code,"403") == 0 || strcmp(code,"407") == 0) {
+                                       sprintf(val1,"DENIED/%s",code);
+                                       strcpy(code,val1);
+                               }
+                               getword_start(&gwarea,data);
+                               if (getword_atoll(&iyear,&gwarea,'-')<0){
+                                       debuga(_("Maybe you have a broken year in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword_atoll(&imonth,&gwarea,'-')<0){
+                                       debuga(_("Maybe you have a broken month in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if (getword_atoll(&iday,&gwarea,'\0')<0){
+                                       debuga(_("Maybe you have a broken day in your %s file\n"),arq);
+                                       exit(EXIT_FAILURE);
+                               }
+
+                               idata=builddia(iday,imonth,iyear);
+                               computedate(iyear,imonth,iday,&tt);
+                               t=&tt;
+                       }
+                       if (t==NULL) {
+                               debuga(_("Unknown input log file format\n"));
+                               break;
+                       }
+
+                       strftime(dia, sizeof(dia), "%d/%m/%Y", t);
+                       snprintf(hora,sizeof(hora),"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
+
+                       if(debugm)
+                               printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date,idata,dfrom,duntil);
+
+                       if(date[0] != '\0'){
+                               if(idata < dfrom || idata > duntil) continue;
+                       }
+
+                       // Record only hours usage which is required
+                       if (t) {
+                               if( bsearch( &( t -> tm_wday ), weekdays.list, weekdays.len,
+                                                                                                                       sizeof( int ), compar ) == NULL )
+                                       continue;
+
+                               if( bsearch( &( t -> tm_hour ), hours.list, hours.len,
+                                                                                                                       sizeof( int ), compar ) == NULL )
+                                       continue;
+                       }
+
+
+                       if(strlen(user) > MAX_USER_LEN) {
+                               if (debugm) printf(_("User ID too long: %s\n"),user);
+                               totregsx++;
+                               continue;
+                       }
+
+                       // include_users
+                       if(IncludeUsers[0] != '\0') {
+                               sprintf(val1,":%s:",user);
+                               if((str=(char *) strstr(IncludeUsers,val1)) == (char *) NULL )
+                                       continue;
+                       }
+
+                       if(vercode(code)) {
+                               if (debugm) printf(_("Excluded code: %s\n"),code);
+                               totregsx++;
+                               continue;
+                       }
+
+                       if(testvaliduserchar(user))
+                               continue;
 
 #if 0
-         if((str = strstr(user,"%20")) != NULL) {
-            /*
-            This is a patch introduced to solve bug #1624251 reported at sourceforge but
-            the side effect is to truncate the name at the first space and merge the reports
-            of people whose name is identical up to the first space.
-
-            The old code used to truncate the user name at the first % if a %20 was
-            found anywhere in the string. That means the string could be truncated
-            at the wrong place if another % occured before the %20. This new code should
-            avoid that problem and only truncate at the space. There is no bug
-            report indicating that anybody noticed this.
-            */
-            *str='\0';
-         }
-
-         /*
-         Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
-         found in the user name.
-         */
-         while((str = strstr(user,"%5c")) != NULL) {
-            *str='.';
-            for (x=3 ; str[x] ; x++) str[x-2]=str[x];
-         }
+                       if((str = strstr(user,"%20")) != NULL) {
+                               /*
+                               This is a patch introduced to solve bug #1624251 reported at sourceforge but
+                               the side effect is to truncate the name at the first space and merge the reports
+                               of people whose name is identical up to the first space.
+
+                               The old code used to truncate the user name at the first % if a %20 was
+                               found anywhere in the string. That means the string could be truncated
+                               at the wrong place if another % occured before the %20. This new code should
+                               avoid that problem and only truncate at the space. There is no bug
+                               report indicating that anybody noticed this.
+                               */
+                               *str='\0';
+                       }
+
+                       /*
+                       Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
+                       found in the user name.
+                       */
+                       while((str = strstr(user,"%5c")) != NULL) {
+                               *str='.';
+                               for (x=3 ; str[x] ; x++) str[x-2]=str[x];
+                       }
 #endif
 
-         urly=url;
-
-         if(ilf!=ILF_Sarg) {
-            /*
-            The full URL is not saved in sarg log. There is no point in testing the URL to detect
-            a downloaded file.
-            */
-            download_flag=is_download_suffix(url);
-            if (download_flag) {
-               download_url=url;
-               download_count++;
-            }
-         } else
-            download_flag=false;
-
-         // remove any protocol:// at the beginning of the URL
-         if ((str = strchr(url,'/')) != NULL && str[1] == '/') {
-            int i;
-
-            str+=2;
-            for (i=0 ; str[i] ; i++)
-               url[i]=str[i];
-            url[i]='\0';
-         }
-
-         if(!LongUrl) {
-            url_hostname(url,hostname,sizeof(hostname));
-            url=hostname;
-         }
-
-         if(url[0] == '\0') continue;
-
-         if(addr[0] != '\0'){
-            if(strcmp(addr,ip)!=0) continue;
-         }
-         if(fhost) {
-            if(!vhexclude(url)) {
-               if (debugm) printf(_("Excluded site: %s\n"),url);
-               totregsx++;
-               continue;
-            }
-         }
-
-         if(hm >= 0 && hmf >= 0) {
-            hmr=t->tm_hour*100+t->tm_min;
-            if(hmr < hm || hmr > hmf) continue;
-         }
-
-         if(site[0] != '\0'){
-            if(strstr(url,site)==0) continue;
-         }
-
-         if(UserIp) {
-            strcpy(user,ip);
-            id_is_ip=true;
-         } else {
-            id_is_ip=false;
-            if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) {
-               if(RecordsWithoutUser == RECORDWITHOUTUSER_IP) {
-                  strcpy(user,ip);
-                  id_is_ip=true;
-               }
-               if(RecordsWithoutUser == RECORDWITHOUTUSER_IGNORE)
-                  continue;
-               if(RecordsWithoutUser == RECORDWITHOUTUSER_EVERYBODY)
-                  strcpy(user,"everybody");
-            } else {
-               strlow(user);
-               if(NtlmUserFormat == NTLMUSERFORMAT_USER) {
-                  if((str = strchr(user,'_')) != 0) {
-                     strcpy(warea,str+1);
-                     strcpy(user,warea);
-                  }
-                  if((str = strchr(user,'+')) != 0) {
-                     strcpy(warea,str+1);
-                     strcpy(user,warea);
-                  }
-               }
-            }
-         }
-
-         if(us[0] != '\0'){
-            if(strcmp(user,us)!=0) continue;
-         }
-
-         if(puser) {
-            sprintf(wuser,":%s:",user);
-            if(strstr(userfile, wuser) == 0)
-               continue;
-         }
-
-         if(fuser) {
-            if(!vuexclude(user)) {
-               if (debugm) printf(_("Excluded user: %s\n"),user);
-               totregsx++;
-               continue;
-            }
-         }
-
-         if(strcmp(user,"-") ==0 || strcmp(user," ") ==0 || strcmp(user,"") ==0 || strcmp(user,":") ==0)
-            continue;
-
-         if(max_elapsed) {
-            if(atol(elap)>max_elapsed) {
-               elap[0]='0';
-               elap[1]='\0';
-            }
-         }
-
-         if((str=(char *) strstr(linebuf, "[SmartFilter:")) != (char *) NULL ) {
-            fixendofline(str);
-            sprintf(smartfilter,"\"%s\"",str+1);
-         } else sprintf(smartfilter,"\"\"");
-
-         nopen=0;
-         prev_ufile=NULL;
-         for (ufile=first_user_file ; ufile && strcmp(user,ufile->user->id)!=0 ; ufile=ufile->next) {
-            prev_ufile=ufile;
-            if (ufile->file) nopen++;
-         }
-         if (!ufile) {
-            ufile=malloc(sizeof(*ufile));
-            if (!ufile) {
-               debuga(_("Not enough memory to store the user %s\n"),user);
-               exit(EXIT_FAILURE);
-            }
-            memset(ufile,0,sizeof(*ufile));
-            ufile->next=first_user_file;
-            first_user_file=ufile;
-            uinfo=userinfo_create(user);
-            ufile->user=uinfo;
-            uinfo->id_is_ip=id_is_ip;
-         } else {
-            if (prev_ufile) {
-               prev_ufile->next=ufile->next;
-               ufile->next=first_user_file;
-               first_user_file=ufile;
-            }
-         }
-
-         if (ufile->file==NULL) {
-            if (nopen>=maxopenfiles) {
-               x=0;
-               for (ufile1=first_user_file ; ufile1 ; ufile1=ufile1->next) {
-                  if (ufile1->file!=NULL) {
-                     if (x>=maxopenfiles) {
-                        if (fclose(ufile1->file)==EOF) {
-                           debuga(_("Failed to close the log file of user %s - %s\n"),ufile1->user->id,strerror(errno));
-                           exit(EXIT_FAILURE);
-                        }
-                        ufile1->file=NULL;
-                     }
-                     x++;
-                  }
-               }
-            }
-            if (snprintf (tmp3, sizeof(tmp3), "%s/%s.unsort", tmp, ufile->user->filename)>=sizeof(tmp3)) {
-               debuga(_("Temporary user file name too long: %s/%s.unsort\n"), tmp, ufile->user->filename);
-               exit(EXIT_FAILURE);
-            }
-            if ((ufile->file = MY_FOPEN (tmp3, "a")) == NULL) {
-               debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3, strerror(errno));
-               exit (1);
-            }
-         }
-
-         /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
-            if ( fp_Write_User )
-               fclose( fp_Write_User ) ;
-            sprintf (tmp3, "%s/%s.unsort", tmp, user);
-
-            if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
-               fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
-               exit (1);
-            }
-            strcpy( sz_Last_User , user ) ;
-         }*/
-         if (fprintf(ufile->file, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,ip,url,tam,code,elap,smartfilter)<=0) {
-            debuga(_("Write error in the log file of user %s\n"),user);
-            exit(EXIT_FAILURE);
-         }
-
-         if(fp_log && ilf!=ILF_Sarg)
-            fprintf(fp_log, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,url,tam,code,elap,smartfilter);
-
-         totregsg++;
-
-         if(!dataonly && download_flag && download_url && strstr(code,"DENIED") == 0) {
-            ndownload = 1;
-
-            if ( ! fp_Download_Unsort ) {
-               if ((fp_Download_Unsort = MY_FOPEN ( sz_Download_Unsort, "a")) == NULL) {
-                  debuga(_("(log) Cannot open temporary file: %s - %s\n"),sz_Download_Unsort, strerror(errno));
-                  exit (1);
-               }
-            }
-            fprintf(fp_Download_Unsort,"%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,download_url);
-         }
-
-         if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
-            if(fp_denied && strstr(code,"DENIED/403") != 0) {
-               fprintf(fp_denied, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
-               denied_count++;
-            }
-            if(fp_authfail && (strstr(code,"DENIED/401") != 0 || strstr(code,"DENIED/407") != 0)) {
-               fprintf(fp_authfail, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
-               authfail_count++;
-            }
-         }
-
-         if (ilf!=ILF_Sarg) {
-            if(!totper || idata<mindate){
-               mindate=idata;
-               memcpy(&period.start,t,sizeof(*t));
-               strcpy(start_hour,tbuf2);
-            }
-            if (!totper || idata>maxdate) {
-               maxdate=idata;
-               memcpy(&period.end,t,sizeof(*t));
-            }
-            totper=true;
-         }
-
-         if(debugm){
-            printf("IP=\t%s\n",ip);
-            printf("USER=\t%s\n",user);
-            printf("ELAP=\t%s\n",elap);
-            printf("DATE=\t%s\n",dia);
-            printf("TIME=\t%s\n",hora);
-            printf("FUNC=\t%s\n",fun);
-            printf("URL=\t%s\n",url);
-            printf("CODE=\t%s\n",code);
-            printf("LEN=\t%s\n",tam);
-         }
-      }
-      if (!from_stdin) {
-         if (from_pipe)
-            pclose(fp_in);
-         else {
-            fclose(fp_in);
-            if( ShowReadStatistics )
-               printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1, (float) 100 );
-         }
-      }
-   }
-
-   if (debug)
-      debuga(_("   Records read: %ld, written: %ld, excluded: %ld\n"),totregsl,totregsg,totregsx);
-
-   longline_destroy(&line);
-   if ( fp_Download_Unsort )
-     fclose (fp_Download_Unsort);
-
-   for (ufile=first_user_file ; ufile ; ufile=ufile1) {
-      ufile1=ufile->next;
-      if (ufile->file!=NULL) fclose(ufile->file);
-      free(ufile);
-   }
-
-   free_download();
-   free_excludecodes();
-   free_exclude();
-
-   if(debug) {
-      int totalcount=0;
-
-      for (ilf=0 ; ilf<ILF_Last ; ilf++) totalcount+=ilf_count[ilf];
-
-      if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]>0)
-         debuga(_("Log with mixed records format (squid and common log)\n"));
-
-      if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]==0)
-         debuga(_("Common log format\n"));
-
-      if(ilf_count[ILF_Common]==0 && ilf_count[ILF_Squid]>0)
-         debuga(_("Squid log format\n"));
-
-      if(ilf_count[ILF_Sarg]>0)
-         debuga(_("Sarg log format\n"));
-
-      if(totalcount==0 && totregsg)
-         debuga(_("Log with invalid format\n"));
-   }
-
-   if(!totregsg){
-      debuga(_("No records found\n"));
-      debuga(_("End\n"));
-      if(fp_denied) fclose(fp_denied);
-      if(fp_authfail) fclose(fp_authfail);
-      userinfo_free();
-      if(userfile) free(userfile);
-      close_usertab();
-      exit(EXIT_SUCCESS);
-   }
-
-   if (date[0]!='\0') {
-      char date0[30], date1[30];
-
-      strftime(date0,sizeof(date0),"%d/%m/%Y",&period.start);
-      strftime(date1,sizeof(date1),"%d/%m/%Y",&period.end);
-      debuga(_("Period covered by log files: %s-%s\n"),date0,date1);
-      getperiod_fromrange(&period,dfrom,duntil);
-   }
-   if (getperiod_buildtext(&period)<0) {
-      debuga(_("Failed to build the string representation of the date range\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   if(debugz){
-      debugaz("data",dia);
-      debugaz("period",period.text);
-   }
-
-   if(debug)
-      debuga(_("Period: %s\n"),period.text);
+                       urly=url;
+
+                       if(ilf!=ILF_Sarg) {
+                               /*
+                               The full URL is not saved in sarg log. There is no point in testing the URL to detect
+                               a downloaded file.
+                               */
+                               download_flag=is_download_suffix(url);
+                               if (download_flag) {
+                                       download_url=url;
+                                       download_count++;
+                               }
+                       } else
+                               download_flag=false;
+
+                       // remove any protocol:// at the beginning of the URL
+                       if ((str = strchr(url,'/')) != NULL && str[1] == '/') {
+                               int i;
+
+                               str+=2;
+                               for (i=0 ; str[i] ; i++)
+                                       url[i]=str[i];
+                               url[i]='\0';
+                       }
+
+                       if(!LongUrl) {
+                               url_hostname(url,hostname,sizeof(hostname));
+                               url=hostname;
+                       }
+
+                       if(url[0] == '\0') continue;
+
+                       if(addr[0] != '\0'){
+                               if(strcmp(addr,ip)!=0) continue;
+                       }
+                       if(fhost) {
+                               if(!vhexclude(url)) {
+                                       if (debugm) printf(_("Excluded site: %s\n"),url);
+                                       totregsx++;
+                                       continue;
+                               }
+                       }
+
+                       if(hm >= 0 && hmf >= 0) {
+                               hmr=t->tm_hour*100+t->tm_min;
+                               if(hmr < hm || hmr > hmf) continue;
+                       }
+
+                       if(site[0] != '\0'){
+                               if(strstr(url,site)==0) continue;
+                       }
+
+                       if(UserIp) {
+                               strcpy(user,ip);
+                               id_is_ip=true;
+                       } else {
+                               id_is_ip=false;
+                               if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) {
+                                       if(RecordsWithoutUser == RECORDWITHOUTUSER_IP) {
+                                               strcpy(user,ip);
+                                               id_is_ip=true;
+                                       }
+                                       if(RecordsWithoutUser == RECORDWITHOUTUSER_IGNORE)
+                                               continue;
+                                       if(RecordsWithoutUser == RECORDWITHOUTUSER_EVERYBODY)
+                                               strcpy(user,"everybody");
+                               } else {
+                                       strlow(user);
+                                       if(NtlmUserFormat == NTLMUSERFORMAT_USER) {
+                                               if((str = strchr(user,'_')) != 0) {
+                                                       strcpy(warea,str+1);
+                                                       strcpy(user,warea);
+                                               }
+                                               if((str = strchr(user,'+')) != 0) {
+                                                       strcpy(warea,str+1);
+                                                       strcpy(user,warea);
+                                               }
+                                       }
+                               }
+                       }
+
+                       if(us[0] != '\0'){
+                               if(strcmp(user,us)!=0) continue;
+                       }
+
+                       if(puser) {
+                               sprintf(wuser,":%s:",user);
+                               if(strstr(userfile, wuser) == 0)
+                                       continue;
+                       }
+
+                       if(fuser) {
+                               if(!vuexclude(user)) {
+                                       if (debugm) printf(_("Excluded user: %s\n"),user);
+                                       totregsx++;
+                                       continue;
+                               }
+                       }
+
+                       if(strcmp(user,"-") ==0 || strcmp(user," ") ==0 || strcmp(user,"") ==0 || strcmp(user,":") ==0)
+                               continue;
+
+                       if(max_elapsed) {
+                               if(atol(elap)>max_elapsed) {
+                                       elap[0]='0';
+                                       elap[1]='\0';
+                               }
+                       }
+
+                       if((str=(char *) strstr(linebuf, "[SmartFilter:")) != (char *) NULL ) {
+                               fixendofline(str);
+                               sprintf(smartfilter,"\"%s\"",str+1);
+                       } else sprintf(smartfilter,"\"\"");
+
+                       nopen=0;
+                       prev_ufile=NULL;
+                       for (ufile=first_user_file ; ufile && strcmp(user,ufile->user->id)!=0 ; ufile=ufile->next) {
+                               prev_ufile=ufile;
+                               if (ufile->file) nopen++;
+                       }
+                       if (!ufile) {
+                               ufile=malloc(sizeof(*ufile));
+                               if (!ufile) {
+                                       debuga(_("Not enough memory to store the user %s\n"),user);
+                                       exit(EXIT_FAILURE);
+                               }
+                               memset(ufile,0,sizeof(*ufile));
+                               ufile->next=first_user_file;
+                               first_user_file=ufile;
+                               uinfo=userinfo_create(user);
+                               ufile->user=uinfo;
+                               uinfo->id_is_ip=id_is_ip;
+                       } else {
+                               if (prev_ufile) {
+                                       prev_ufile->next=ufile->next;
+                                       ufile->next=first_user_file;
+                                       first_user_file=ufile;
+                               }
+                       }
+
+                       if (ufile->file==NULL) {
+                               if (nopen>=maxopenfiles) {
+                                       x=0;
+                                       for (ufile1=first_user_file ; ufile1 ; ufile1=ufile1->next) {
+                                               if (ufile1->file!=NULL) {
+                                                       if (x>=maxopenfiles) {
+                                                               if (fclose(ufile1->file)==EOF) {
+                                                                       debuga(_("Failed to close the log file of user %s - %s\n"),ufile1->user->id,strerror(errno));
+                                                                       exit(EXIT_FAILURE);
+                                                               }
+                                                               ufile1->file=NULL;
+                                                       }
+                                                       x++;
+                                               }
+                                       }
+                               }
+                               if (snprintf (tmp3, sizeof(tmp3), "%s/%s.unsort", tmp, ufile->user->filename)>=sizeof(tmp3)) {
+                                       debuga(_("Temporary user file name too long: %s/%s.unsort\n"), tmp, ufile->user->filename);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if ((ufile->file = MY_FOPEN (tmp3, "a")) == NULL) {
+                                       debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3, strerror(errno));
+                                       exit (1);
+                               }
+                       }
+
+                       /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
+                               if ( fp_Write_User )
+                                       fclose( fp_Write_User ) ;
+                               sprintf (tmp3, "%s/%s.unsort", tmp, user);
+
+                               if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
+                                       fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
+                                       exit (1);
+                               }
+                               strcpy( sz_Last_User , user ) ;
+                       }*/
+                       if (fprintf(ufile->file, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,ip,url,tam,code,elap,smartfilter)<=0) {
+                               debuga(_("Write error in the log file of user %s\n"),user);
+                               exit(EXIT_FAILURE);
+                       }
+
+                       if(fp_log && ilf!=ILF_Sarg)
+                               fprintf(fp_log, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,url,tam,code,elap,smartfilter);
+
+                       totregsg++;
+
+                       if(!dataonly && download_flag && download_url && strstr(code,"DENIED") == 0) {
+                               ndownload = 1;
+
+                               if ( ! fp_Download_Unsort ) {
+                                       if ((fp_Download_Unsort = MY_FOPEN ( sz_Download_Unsort, "a")) == NULL) {
+                                               debuga(_("(log) Cannot open temporary file: %s - %s\n"),sz_Download_Unsort, strerror(errno));
+                                               exit (1);
+                                       }
+                               }
+                               fprintf(fp_Download_Unsort,"%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,download_url);
+                       }
+
+                       if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
+                               if(fp_denied && strstr(code,"DENIED/403") != 0) {
+                                       fprintf(fp_denied, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
+                                       denied_count++;
+                               }
+                               if(fp_authfail && (strstr(code,"DENIED/401") != 0 || strstr(code,"DENIED/407") != 0)) {
+                                       fprintf(fp_authfail, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
+                                       authfail_count++;
+                               }
+                       }
+
+                       if (ilf!=ILF_Sarg) {
+                               if(!totper || idata<mindate){
+                                       mindate=idata;
+                                       memcpy(&period.start,t,sizeof(*t));
+                                       strcpy(start_hour,tbuf2);
+                               }
+                               if (!totper || idata>maxdate) {
+                                       maxdate=idata;
+                                       memcpy(&period.end,t,sizeof(*t));
+                               }
+                               totper=true;
+                       }
+
+                       if(debugm){
+                               printf("IP=\t%s\n",ip);
+                               printf("USER=\t%s\n",user);
+                               printf("ELAP=\t%s\n",elap);
+                               printf("DATE=\t%s\n",dia);
+                               printf("TIME=\t%s\n",hora);
+                               printf("FUNC=\t%s\n",fun);
+                               printf("URL=\t%s\n",url);
+                               printf("CODE=\t%s\n",code);
+                               printf("LEN=\t%s\n",tam);
+                       }
+               }
+               if (!from_stdin) {
+                       if (from_pipe)
+                               pclose(fp_in);
+                       else {
+                               fclose(fp_in);
+                               if( ShowReadStatistics )
+                                       printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1, (float) 100 );
+                       }
+               }
+       }
+
+       if (debug)
+               debuga(_("   Records read: %ld, written: %ld, excluded: %ld\n"),totregsl,totregsg,totregsx);
+
+       longline_destroy(&line);
+       if ( fp_Download_Unsort )
+       fclose (fp_Download_Unsort);
+
+       for (ufile=first_user_file ; ufile ; ufile=ufile1) {
+               ufile1=ufile->next;
+               if (ufile->file!=NULL) fclose(ufile->file);
+               free(ufile);
+       }
+
+       free_download();
+       free_excludecodes();
+       free_exclude();
+
+       if(debug) {
+               int totalcount=0;
+
+               for (ilf=0 ; ilf<ILF_Last ; ilf++) totalcount+=ilf_count[ilf];
+
+               if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]>0)
+                       debuga(_("Log with mixed records format (squid and common log)\n"));
+
+               if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]==0)
+                       debuga(_("Common log format\n"));
+
+               if(ilf_count[ILF_Common]==0 && ilf_count[ILF_Squid]>0)
+                       debuga(_("Squid log format\n"));
+
+               if(ilf_count[ILF_Sarg]>0)
+                       debuga(_("Sarg log format\n"));
+
+               if(totalcount==0 && totregsg)
+                       debuga(_("Log with invalid format\n"));
+       }
+
+       if(!totregsg){
+               debuga(_("No records found\n"));
+               debuga(_("End\n"));
+               if(fp_denied) fclose(fp_denied);
+               if(fp_authfail) fclose(fp_authfail);
+               userinfo_free();
+               if(userfile) free(userfile);
+               close_usertab();
+               exit(EXIT_SUCCESS);
+       }
+
+       if (date[0]!='\0') {
+               char date0[30], date1[30];
+
+               strftime(date0,sizeof(date0),"%d/%m/%Y",&period.start);
+               strftime(date1,sizeof(date1),"%d/%m/%Y",&period.end);
+               debuga(_("Period covered by log files: %s-%s\n"),date0,date1);
+               getperiod_fromrange(&period,dfrom,duntil);
+       }
+       if (getperiod_buildtext(&period)<0) {
+               debuga(_("Failed to build the string representation of the date range\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       if(debugz){
+               debugaz("data",dia);
+               debugaz("period",period.text);
+       }
+
+       if(debug)
+               debuga(_("Period: %s\n"),period.text);
 
 //   fclose(fp_ou);
-   if(fp_denied)
-      fclose(fp_denied);
-   if(fp_authfail)
-      fclose(fp_authfail);
-
-   if(fp_log != NULL) {
-      fclose(fp_log);
-      strcpy(end_hour,tbuf2);
-      strftime(val2,sizeof(val2),"%d%m%Y",&period.start);
-      strftime(val1,sizeof(val1),"%d%m%Y",&period.end);
-      sprintf(val4,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog,val2,start_hour,val1,end_hour);
-      if (rename(arq_log,val4)) {
-         debuga(_("failed to rename %s to %s - %s\n"),arq_log,val4,strerror(errno));
-      } else {
-         strcpy(arq_log,val4);
-
-         if(strcmp(ParsedOutputLogCompress,"nocompress") != 0 && ParsedOutputLogCompress[0] != '\0') {
-            /*
-            No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
-            necessary around the command name, put them in the configuration file.
-            */
-            sprintf(val1,"%s \"%s\"",ParsedOutputLogCompress,arq_log);
-            cstatus=system(val1);
-            if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-               debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
-               debuga(_("command: %s\n"),val1);
-               exit(EXIT_FAILURE);
-            }
-         }
-      }
-      if(debug)
-         debuga(_("Sarg parsed log saved as %s\n"),arq_log);
-   }
-
-   if(DataFile[0] == '\0' && (ReportType & REPORT_TYPE_DENIED) != 0) {
-      sprintf(csort,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp,denied_sort,denied_unsort);
-      cstatus=system(csort);
-      if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-         debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-         debuga(_("sort command: %s\n"),csort);
-         exit(EXIT_FAILURE);
-      }
-      unlink(denied_unsort);
-   }
-
-   sort_users_log(tmp, debug);
-
-   if(DataFile[0] != '\0')
-      data_file(tmp);
-   else
-      gerarel();
-
-   if((ReportType & REPORT_TYPE_DENIED) != 0)
-      unlink(denied_sort);
-
-   if(strcmp(tmp,"/tmp") != 0) {
-      unlinkdir(tmp,0);
-   }
-
-   userinfo_free();
-   if(userfile)
-      free(userfile);
-   close_usertab();
-
-   if(debug)
-      debuga(_("End\n"));
-
-   exit(EXIT_SUCCESS);
-
+       if(fp_denied)
+               fclose(fp_denied);
+       if(fp_authfail)
+               fclose(fp_authfail);
+
+       if(fp_log != NULL) {
+               fclose(fp_log);
+               strcpy(end_hour,tbuf2);
+               strftime(val2,sizeof(val2),"%d%m%Y",&period.start);
+               strftime(val1,sizeof(val1),"%d%m%Y",&period.end);
+               sprintf(val4,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog,val2,start_hour,val1,end_hour);
+               if (rename(arq_log,val4)) {
+                       debuga(_("failed to rename %s to %s - %s\n"),arq_log,val4,strerror(errno));
+               } else {
+                       strcpy(arq_log,val4);
+
+                       if(strcmp(ParsedOutputLogCompress,"nocompress") != 0 && ParsedOutputLogCompress[0] != '\0') {
+                               /*
+                               No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
+                               necessary around the command name, put them in the configuration file.
+                               */
+                               sprintf(val1,"%s \"%s\"",ParsedOutputLogCompress,arq_log);
+                               cstatus=system(val1);
+                               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                                       debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
+                                       debuga(_("command: %s\n"),val1);
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+               }
+               if(debug)
+                       debuga(_("Sarg parsed log saved as %s\n"),arq_log);
+       }
+
+       if(DataFile[0] == '\0' && (ReportType & REPORT_TYPE_DENIED) != 0) {
+               sprintf(csort,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp,denied_sort,denied_unsort);
+               cstatus=system(csort);
+               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                       debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+                       debuga(_("sort command: %s\n"),csort);
+                       exit(EXIT_FAILURE);
+               }
+               unlink(denied_unsort);
+       }
+
+       sort_users_log(tmp, debug);
+
+       if(DataFile[0] != '\0')
+               data_file(tmp);
+       else
+               gerarel();
+
+       if((ReportType & REPORT_TYPE_DENIED) != 0)
+               unlink(denied_sort);
+
+       if(strcmp(tmp,"/tmp") != 0) {
+               unlinkdir(tmp,0);
+       }
+
+       userinfo_free();
+       if(userfile)
+               free(userfile);
+       close_usertab();
+
+       if(debug)
+               debuga(_("End\n"));
+
+       exit(EXIT_SUCCESS);
 }
 
 
 static void getusers(const char *pwdfile, int debug)
 {
-
-   FILE *fp_usr;
-   char buf[255];
-   char *str;
-   long int nreg=0;
-
-   if(debug)
-      debuga(_("Loading password file from %s\n"),pwdfile);
-
-   if ((fp_usr = fopen(pwdfile, "r")) == NULL) {
-      debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if (fseek(fp_usr, 0, SEEK_END)==-1) {
-      debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   nreg = ftell(fp_usr);
-   if (nreg<0) {
-      debuga(_("Cannot get the size of file %s\n"),pwdfile);
-      exit(EXIT_FAILURE);
-   }
-   nreg = nreg+5000;
-   if (fseek(fp_usr, 0, SEEK_SET)==-1) {
-      debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if((userfile=(char *) malloc(nreg))==NULL){
-      debuga(_("malloc error (%ld)\n"),nreg);
-      exit(EXIT_FAILURE);
-   }
-
-   bzero(userfile,nreg);
-   strcpy(userfile,":");
-
-   while(fgets(buf,sizeof(buf),fp_usr)!=NULL) {
-      str=strchr(buf,':');
-      if (!str) {
-         debuga(_("You have an invalid user in your %s file\n"),pwdfile);
-         exit(EXIT_FAILURE);
-      }
-      str[1]='\0';
-      strcat(userfile,buf);
-   }
-
-   fclose(fp_usr);
-
-   return;
+       FILE *fp_usr;
+       char buf[255];
+       char *str;
+       long int nreg=0;
+
+       if(debug)
+               debuga(_("Loading password file from %s\n"),pwdfile);
+
+       if ((fp_usr = fopen(pwdfile, "r")) == NULL) {
+               debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (fseek(fp_usr, 0, SEEK_END)==-1) {
+               debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       nreg = ftell(fp_usr);
+       if (nreg<0) {
+               debuga(_("Cannot get the size of file %s\n"),pwdfile);
+               exit(EXIT_FAILURE);
+       }
+       nreg = nreg+5000;
+       if (fseek(fp_usr, 0, SEEK_SET)==-1) {
+               debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if((userfile=(char *) malloc(nreg))==NULL){
+               debuga(_("malloc error (%ld)\n"),nreg);
+               exit(EXIT_FAILURE);
+       }
+
+       bzero(userfile,nreg);
+       strcpy(userfile,":");
+
+       while(fgets(buf,sizeof(buf),fp_usr)!=NULL) {
+               str=strchr(buf,':');
+               if (!str) {
+                       debuga(_("You have an invalid user in your %s file\n"),pwdfile);
+                       exit(EXIT_FAILURE);
+               }
+               str[1]='\0';
+               strcat(userfile,buf);
+       }
+
+       fclose(fp_usr);
+
+       return;
 }
index 9ef816de4cade7ad28ca9a564dc9d2e07bc41c57..07dfc2544a2308ccc963164c8b544bcfb5270f68 100644 (file)
 
 struct longlinestruct
 {
-   //! The buffer to store the data read from the log file.
-   char *buffer;
-   //! The size of the buffer.
-   size_t size;
-   //! The number of bytes stored in the buffer.
-   size_t length;
-   //! The position of the beginning of the current string.
-   size_t start;
-   //! The position of the end of the current string.
-   size_t end;
+       //! The buffer to store the data read from the log file.
+       char *buffer;
+       //! The size of the buffer.
+       size_t size;
+       //! The number of bytes stored in the buffer.
+       size_t length;
+       //! The position of the beginning of the current string.
+       size_t start;
+       //! The position of the end of the current string.
+       size_t end;
 };
 
 longline longline_create(void)
 {
-   longline line;
+       longline line;
 
-   line=malloc(sizeof(*line));
-   if (line==NULL) return(NULL);
-   line->size=INITIAL_LINE_BUFFER_SIZE;
-   line->buffer=malloc(line->size);
-   if (line->buffer==NULL) {
-      free(line);
-      return(NULL);
-   }
-   line->start=0;
-   line->end=0;
-   line->length=0;
-   return(line);
+       line=malloc(sizeof(*line));
+       if (line==NULL) return(NULL);
+       line->size=INITIAL_LINE_BUFFER_SIZE;
+       line->buffer=malloc(line->size);
+       if (line->buffer==NULL) {
+               free(line);
+               return(NULL);
+       }
+       line->start=0;
+       line->end=0;
+       line->length=0;
+       return(line);
 }
 
 void longline_reset(longline line)
 {
-   if (line!=NULL) {
-      line->start=0;
-      line->end=0;
-      line->length=0;
-   }
+       if (line!=NULL) {
+               line->start=0;
+               line->end=0;
+               line->length=0;
+       }
 }
 
 char *longline_read(FILE *fp_in,longline line)
 {
-   int i;
-   char *newbuf;
-   size_t nread;
+       int i;
+       char *newbuf;
+       size_t nread;
 
-   if (line==NULL || line->buffer==NULL) return(NULL);
+       if (line==NULL || line->buffer==NULL) return(NULL);
 
-   while (true) {
-      for (i=line->end ; i<line->length && (line->buffer[i]=='\n' || line->buffer[i]=='\r') ; i++);
-      if (i<line->length) {
-         line->end=i;
-         break;
-      }
-      nread=(feof(fp_in)!=0) ? 0 : fread(line->buffer,1,line->size,fp_in);
-      if (nread==0) return(NULL);
-      line->length=nread;
-      line->end=0;
-   }
+       while (true) {
+               for (i=line->end ; i<line->length && (line->buffer[i]=='\n' || line->buffer[i]=='\r') ; i++);
+               if (i<line->length) {
+                       line->end=i;
+                       break;
+               }
+               nread=(feof(fp_in)!=0) ? 0 : fread(line->buffer,1,line->size,fp_in);
+               if (nread==0) return(NULL);
+               line->length=nread;
+               line->end=0;
+       }
 
-   line->start=line->end;
-   while (true) {
-      for (i=line->end ; i<line->length ; i++) {
-         if ((unsigned char)line->buffer[i]>=' ') continue;
-         if (line->buffer[i]=='\n' || line->buffer[i]=='\r') break;
-      }
+       line->start=line->end;
+       while (true) {
+               for (i=line->end ; i<line->length ; i++) {
+                       if ((unsigned char)line->buffer[i]>=' ') continue;
+                       if (line->buffer[i]=='\n' || line->buffer[i]=='\r') break;
+               }
 
-      line->end=i;
-      if (line->end<line->length) break;
+               line->end=i;
+               if (line->end<line->length) break;
 
-      if (line->start>0) {
-         for (i=line->start ; i<line->length ; i++) line->buffer[i-line->start]=line->buffer[i];
-         line->length-=line->start;
-         line->end-=line->start;
-         line->start=0;
-      }
-      if (line->length>=line->size) {
-         line->size+=8192;
-         newbuf=realloc(line->buffer,line->size);
-         if (!newbuf) {
-            debuga(_("Not enough memory to read one more line from the input log file\n"));
-            exit(EXIT_FAILURE);
-         }
-         line->buffer=newbuf;
-      }
-      nread=(feof(fp_in)!=0) ? 0 : fread(line->buffer+line->length,1,line->size-line->length,fp_in);
-      if (nread==0) {
-         if (line->end<=line->start) return(NULL);
-         if (line->end>=line->size) {
-            line->end=line->size;
-            line->size++;
-            newbuf=realloc(line->buffer,line->size);
-            if (!newbuf) {
-               debuga(_("Not enough memory to read one more line from the input log file\n"));
-               exit(EXIT_FAILURE);
-            }
-            line->buffer=newbuf;
-         }
-         line->buffer[line->end]='\0';
-         return(line->buffer+line->start);
-      }
-      line->length+=nread;
-   }
-   line->buffer[line->end++]='\0';
-   return(line->buffer+line->start);
+               if (line->start>0) {
+                       for (i=line->start ; i<line->length ; i++) line->buffer[i-line->start]=line->buffer[i];
+                       line->length-=line->start;
+                       line->end-=line->start;
+                       line->start=0;
+               }
+               if (line->length>=line->size) {
+                       line->size+=8192;
+                       newbuf=realloc(line->buffer,line->size);
+                       if (!newbuf) {
+                               debuga(_("Not enough memory to read one more line from the input log file\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       line->buffer=newbuf;
+               }
+               nread=(feof(fp_in)!=0) ? 0 : fread(line->buffer+line->length,1,line->size-line->length,fp_in);
+               if (nread==0) {
+                       if (line->end<=line->start) return(NULL);
+                       if (line->end>=line->size) {
+                               line->end=line->size;
+                               line->size++;
+                               newbuf=realloc(line->buffer,line->size);
+                               if (!newbuf) {
+                                       debuga(_("Not enough memory to read one more line from the input log file\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                               line->buffer=newbuf;
+                       }
+                       line->buffer[line->end]='\0';
+                       return(line->buffer+line->start);
+               }
+               line->length+=nread;
+       }
+       line->buffer[line->end++]='\0';
+       return(line->buffer+line->start);
 }
 
 void longline_destroy(longline *line_ptr)
 {
-   longline line;
+       longline line;
 
-   if (line_ptr==NULL || *line_ptr==NULL) return;
-   line=*line_ptr;
-   *line_ptr=NULL;
-   if (line->buffer!=NULL) free(line->buffer);
-   free(line);
+       if (line_ptr==NULL || *line_ptr==NULL) return;
+       line=*line_ptr;
+       *line_ptr=NULL;
+       if (line->buffer!=NULL) free(line->buffer);
+       free(line);
 }
index 9d47fdd4e21b667089c791dff877ed6ffc9b9a69..6dc382cc723c8c5fdd581e7c55d1f5249ee5b908 100755 (executable)
@@ -34,262 +34,259 @@ static void header(void);
 
 void realtime(void)
 {
-
-   getlog();
-
+       getlog();
 }
 
 static void getlog(void)
 {
-   FILE *tmp, *fp;
-   char template1[255]="/var/tmp/sargtpl1.XXXXXX";
-   char template2[255]="/var/tmp/sargtpl2.XXXXXX";
-   char cmd[512];
-   char *buf;
-   int  fd1,fd2;
-   int cstatus;
-   longline line;
+       FILE *tmp, *fp;
+       char template1[255]="/var/tmp/sargtpl1.XXXXXX";
+       char template2[255]="/var/tmp/sargtpl2.XXXXXX";
+       char cmd[512];
+       char *buf;
+       int  fd1,fd2;
+       int cstatus;
+       longline line;
 
-   init_usertab(UserTabFile);
+       init_usertab(UserTabFile);
 
-   fd1 = mkstemp(template1);
-   fd2 = mkstemp(template2);
+       fd1 = mkstemp(template1);
+       fd2 = mkstemp(template2);
 
-   if((fd1 == -1 ) || ((tmp = fdopen (fd1, "w+" )) == NULL)  ) {    /* failure, bail out */
-       debuga(_("(realtime) mkstemp error - %s\n"),strerror(errno));
-       exit(EXIT_FAILURE);
-   }
+       if((fd1 == -1 ) || ((tmp = fdopen (fd1, "w+" )) == NULL)  ) {    /* failure, bail out */
+               debuga(_("(realtime) mkstemp error - %s\n"),strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the log file\n"));
-      exit(EXIT_FAILURE);
-   }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the log file\n"));
+               exit(EXIT_FAILURE);
+       }
 
-   sprintf(cmd,"tail -%d \"%s\"",realtime_access_log_lines,AccessLog[0]);
-   fp = popen(cmd, "r");
-   if (!fp) {
-      debuga(_("Failed to get the %d trailing lines of %s: %s\n"),realtime_access_log_lines,AccessLog[0],strerror(errno));
-      debuga(_("tail command: %s\n"),cmd);
-      exit(EXIT_FAILURE);
-   }
-   while((buf=longline_read(fp,line)) != NULL )
-      if (getdata(buf,tmp)<0) {
-         debuga(_("Maybe a broken record or garbage was returned by %s\n"),cmd);
-         exit(EXIT_FAILURE);
-      }
-   pclose(fp);
-   fclose(tmp);
-   longline_destroy(&line);
+       sprintf(cmd,"tail -%d \"%s\"",realtime_access_log_lines,AccessLog[0]);
+       fp = popen(cmd, "r");
+       if (!fp) {
+               debuga(_("Failed to get the %d trailing lines of %s: %s\n"),realtime_access_log_lines,AccessLog[0],strerror(errno));
+               debuga(_("tail command: %s\n"),cmd);
+               exit(EXIT_FAILURE);
+       }
+       while((buf=longline_read(fp,line)) != NULL )
+               if (getdata(buf,tmp)<0) {
+                       debuga(_("Maybe a broken record or garbage was returned by %s\n"),cmd);
+                       exit(EXIT_FAILURE);
+               }
+       pclose(fp);
+       fclose(tmp);
+       longline_destroy(&line);
 
-   sprintf(cmd,"sort -r -k 1,1 -k 2,2 -o \"%s\" \"%s\"",template2,template1);
-   cstatus=system(cmd);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),cmd);
-      exit(EXIT_FAILURE);
-   }
-   unlink(template1);
-   datashow(template2);
+       sprintf(cmd,"sort -r -k 1,1 -k 2,2 -o \"%s\" \"%s\"",template2,template1);
+       cstatus=system(cmd);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),cmd);
+               exit(EXIT_FAILURE);
+       }
+       unlink(template1);
+       datashow(template2);
 }
 
 static int getdata(char *rec, FILE *ftmp)
 {
-   time_t tt;
-   struct tm *t;
-   char dat[128];
-   char tbuf[128];
-   char typ[128];
-   char warea[MAXLEN];
-   char user[MAX_USER_LEN];
-   char ip[25];
-   char *url;
-   struct getwordstruct gwarea;
+       time_t tt;
+       struct tm *t;
+       char dat[128];
+       char tbuf[128];
+       char typ[128];
+       char warea[MAXLEN];
+       char user[MAX_USER_LEN];
+       char ip[25];
+       char *url;
+       struct getwordstruct gwarea;
 
-   getword_start(&gwarea,rec);
-   if (getword(dat,sizeof(dat),&gwarea,' ')<0) {
-      debuga(_("The time stamp at column 1 is too long\n"));
-      return(-1);
-   }
-   if (getword(warea,sizeof(warea),&gwarea,' ')<0) {
-      debuga(_("The connection duration at column 2 is too long\n"));
-      return(-1);
-   }
-   while(strcmp(warea,"") == 0 && gwarea.current[0] != '\0')
-      if (getword(warea,sizeof(warea),&gwarea,' ')<0) {
-         return(-1);
-      }
-   if (getword(ip,sizeof(ip),&gwarea,' ')<0) {
-      debuga(_("The IP address at column 3 is too long\n"));
-      return(-1);
-   }
-   if (getword_skip(MAXLEN,&gwarea,' ')<0) {
-      debuga(_("The status at column 4 is too long\n"));
-      return(-1);
-   }
-   if (getword_skip(MAXLEN,&gwarea,' ')<0) {
-      debuga(_("The size at column 5 is too long\n"));
-      return(-1);
-   }
-   if (getword(typ,sizeof(typ),&gwarea,' ')<0) {
-      debuga(_("The action at column 6 is too long\n"));
-      return(-1);
-   }
-   if(strncmp(typ,"CONNECT",7) == 0) {
-      if (getword_ptr(rec,&url,&gwarea,' ')<0) {
-         debuga(_("The URL at column 7 is too long\n"));
-         return(-1);
-      }
-      if (getword(user,sizeof(user),&gwarea,' ')<0) {
-         debuga(_("The user ID at column 8 is too long\n"));
-         return(-1);
-      }
-   }else {
-      if (getword_skip(MAXLEN,&gwarea,'/')<0) {
-         debuga(_("The URL at column 7 is too long\n"));
-         return(-1);
-      }
-      if (getword_skip(MAXLEN,&gwarea,'/')<0) {
-         debuga(_("The URL at column 7 is too long\n"));
-         return(-1);
-      }
-      if (getword_ptr(rec,&url,&gwarea,'/')<0) {
-         debuga(_("The URL at column 7 is too long\n"));
-         return(-1);
-      }
-      if (getword_skip(MAXLEN,&gwarea,' ')<0) {
-         debuga(_("The data at column 8 is too long\n"));
-         return(-1);
-      }
-      if (getword(user,sizeof(user),&gwarea,' ')<0) {
-         debuga(_("The user at column 9 is too long\n"));
-         return(-1);
-      }
-   }
+       getword_start(&gwarea,rec);
+       if (getword(dat,sizeof(dat),&gwarea,' ')<0) {
+               debuga(_("The time stamp at column 1 is too long\n"));
+               return(-1);
+       }
+       if (getword(warea,sizeof(warea),&gwarea,' ')<0) {
+               debuga(_("The connection duration at column 2 is too long\n"));
+               return(-1);
+       }
+       while(strcmp(warea,"") == 0 && gwarea.current[0] != '\0')
+               if (getword(warea,sizeof(warea),&gwarea,' ')<0) {
+                       return(-1);
+               }
+       if (getword(ip,sizeof(ip),&gwarea,' ')<0) {
+               debuga(_("The IP address at column 3 is too long\n"));
+               return(-1);
+       }
+       if (getword_skip(MAXLEN,&gwarea,' ')<0) {
+               debuga(_("The status at column 4 is too long\n"));
+               return(-1);
+       }
+       if (getword_skip(MAXLEN,&gwarea,' ')<0) {
+               debuga(_("The size at column 5 is too long\n"));
+               return(-1);
+       }
+       if (getword(typ,sizeof(typ),&gwarea,' ')<0) {
+               debuga(_("The action at column 6 is too long\n"));
+               return(-1);
+       }
+       if(strncmp(typ,"CONNECT",7) == 0) {
+               if (getword_ptr(rec,&url,&gwarea,' ')<0) {
+                       debuga(_("The URL at column 7 is too long\n"));
+                       return(-1);
+               }
+               if (getword(user,sizeof(user),&gwarea,' ')<0) {
+                       debuga(_("The user ID at column 8 is too long\n"));
+                       return(-1);
+               }
+       }else {
+               if (getword_skip(MAXLEN,&gwarea,'/')<0) {
+                       debuga(_("The URL at column 7 is too long\n"));
+                       return(-1);
+               }
+               if (getword_skip(MAXLEN,&gwarea,'/')<0) {
+                       debuga(_("The URL at column 7 is too long\n"));
+                       return(-1);
+               }
+               if (getword_ptr(rec,&url,&gwarea,'/')<0) {
+                       debuga(_("The URL at column 7 is too long\n"));
+                       return(-1);
+               }
+               if (getword_skip(MAXLEN,&gwarea,' ')<0) {
+                       debuga(_("The data at column 8 is too long\n"));
+                       return(-1);
+               }
+               if (getword(user,sizeof(user),&gwarea,' ')<0) {
+                       debuga(_("The user at column 9 is too long\n"));
+                       return(-1);
+               }
+       }
 
-   if(strncmp(user,"-",1) == 0 && RealtimeUnauthRec==REALTIME_UNAUTH_REC_IGNORE)
-      return(0);
+       if(strncmp(user,"-",1) == 0 && RealtimeUnauthRec==REALTIME_UNAUTH_REC_IGNORE)
+               return(0);
 
-   tt=atoi(dat);
-   t=localtime(&tt);
-   if(strncmp(DateFormat,"u",1) == 0)
-      strftime(tbuf, sizeof(tbuf), "%Y-%m-%d\t%H:%M", t);
-   else if(strncmp(DateFormat,"e",1) == 0)
-      strftime(tbuf, sizeof(tbuf), "%d-%m-%Y\t%H:%M", t);
+       tt=atoi(dat);
+       t=localtime(&tt);
+       if(strncmp(DateFormat,"u",1) == 0)
+               strftime(tbuf, sizeof(tbuf), "%Y-%m-%d\t%H:%M", t);
+       else if(strncmp(DateFormat,"e",1) == 0)
+               strftime(tbuf, sizeof(tbuf), "%d-%m-%Y\t%H:%M", t);
 
-   fprintf(ftmp,"%s\t%s\t%s\t%s\t%s\n",tbuf,ip,user,url,typ);
-   return(0);
+       fprintf(ftmp,"%s\t%s\t%s\t%s\t%s\n",tbuf,ip,user,url,typ);
+       return(0);
 }
 
 static void datashow(const char *tmp)
 {
-   FILE *fin;
-   char dat[128];
-   char tim[128];
-   char *buf;
-   char *url;
-   char *ourl=NULL;
-   char ouser[MAX_USER_LEN]="";
-   char typ[128];
-   char user[MAX_USER_LEN];
-   char u2[MAX_USER_LEN];
-   char ip[25];
-   int url_len;
-   int ourl_size=0;
-   struct getwordstruct gwarea;
-   longline line;
-
-   if((fin=fopen(tmp,"r"))==NULL) {
-      debuga(_("(realtime) open error %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       FILE *fin;
+       char dat[128];
+       char tim[128];
+       char *buf;
+       char *url;
+       char *ourl=NULL;
+       char ouser[MAX_USER_LEN]="";
+       char typ[128];
+       char user[MAX_USER_LEN];
+       char u2[MAX_USER_LEN];
+       char ip[25];
+       int url_len;
+       int ourl_size=0;
+       struct getwordstruct gwarea;
+       longline line;
 
-   header();
+       if((fin=fopen(tmp,"r"))==NULL) {
+               debuga(_("(realtime) open error %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the log file\n"));
-      exit(EXIT_FAILURE);
-   }
+       header();
 
-   while((buf=longline_read(fin,line))!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword(dat,sizeof(dat),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(tim,sizeof(tim),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if(strlen(dat) < 3 || strlen(user) < 1) continue;
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken url in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(typ,sizeof(typ),&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-      if(strstr(RealtimeTypes,typ) == 0)
-         continue;
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the log file\n"));
+               exit(EXIT_FAILURE);
+       }
 
-      if(strcmp(ouser,user) == 0 && ourl && strcmp(ourl,url) == 0)
-         continue;
+       while((buf=longline_read(fin,line))!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword(dat,sizeof(dat),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(tim,sizeof(tim),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if(strlen(dat) < 3 || strlen(user) < 1) continue;
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken url in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(typ,sizeof(typ),&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+               if(strstr(RealtimeTypes,typ) == 0)
+                       continue;
 
-      if(UserIp)
-         strcpy(user,ip);
-      strcpy(u2,user);
-      if(Ip2Name)
-         ip2name(u2,sizeof(u2));
-      user_find(name, sizeof(name), u2);
+               if(strcmp(ouser,user) == 0 && ourl && strcmp(ourl,url) == 0)
+                       continue;
 
-      printf("<tr><td class=\"data\">%s %s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data2\"><a href=\"http://%s\">%s</td></tr>\n",dat,tim,ip,name,typ,url,url);
-      strcpy(ouser,user);
+               if(UserIp)
+                       strcpy(user,ip);
+               strcpy(u2,user);
+               if(Ip2Name)
+                       ip2name(u2,sizeof(u2));
+               user_find(name, sizeof(name), u2);
 
-      url_len=strlen(url);
-      if (!ourl || url_len>=ourl_size) {
-         ourl_size=url_len+1;
-         ourl=realloc(ourl,ourl_size);
-         if (!ourl) {
-            debuga(_("Not enough memory to store the url\n"));
-            exit(EXIT_FAILURE);
-         }
-      }
-      strcpy(ourl,url);
-   }
-   longline_destroy(&line);
-   if (ourl) free(ourl);
+               printf("<tr><td class=\"data\">%s %s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data2\"><a href=\"http://%s\">%s</td></tr>\n",dat,tim,ip,name,typ,url,url);
+               strcpy(ouser,user);
 
-   puts("</table>\n</div>\n</body>\n</html>\n");
-   fclose(fin);
-   unlink(tmp);
-   fflush(NULL);
+               url_len=strlen(url);
+               if (!ourl || url_len>=ourl_size) {
+                       ourl_size=url_len+1;
+                       ourl=realloc(ourl,ourl_size);
+                       if (!ourl) {
+                               debuga(_("Not enough memory to store the url\n"));
+                               exit(EXIT_FAILURE);
+                       }
+               }
+               strcpy(ourl,url);
+       }
+       longline_destroy(&line);
+       if (ourl) free(ourl);
 
+       puts("</table>\n</div>\n</body>\n</html>\n");
+       fclose(fin);
+       unlink(tmp);
+       fflush(NULL);
 }
 
 static void header(void)
 {
-   puts("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
-   puts(" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
-   puts("<html>\n");
-   puts("<head>\n");
-   if(realtime_refresh)
-      printf("  <meta http-equiv=refresh content=\"%d\" url=\"sarg-php/sarg-realtime.php\"; charset=\"%s\">\n",realtime_refresh,CharSet);
-   else
-      printf("  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-   css(stdout);
-   puts("</head>\n");
-   printf("<body style=\"font-family:%s;font-size:%s;background-color:%s;background-image:url(%s)\">\n",FontFace,TitleFontSize,BgColor,BgImage);
-   puts("<div align=\"center\"><table cellpadding=\"1\" cellspacing=\"1\">\n");
-   printf("<tr><th class=\"title_l\" colspan=\"10\">SARG %s</th></tr>\n",_("Realtime"));
-   printf("<tr><th class=\"text\" colspan=\"10\">%s: %d s</th></tr>\n",_("Auto refresh"),realtime_refresh);
-   printf("<tr><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("DATE/TIME"),_("IP/NAME"),_("USERID"),_("TYPE"),_("ACCESSED SITE"));
+       puts("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
+       puts(" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
+       puts("<html>\n");
+       puts("<head>\n");
+       if(realtime_refresh)
+               printf("  <meta http-equiv=refresh content=\"%d\" url=\"sarg-php/sarg-realtime.php\"; charset=\"%s\">\n",realtime_refresh,CharSet);
+       else
+               printf("  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
+       css(stdout);
+       puts("</head>\n");
+       printf("<body style=\"font-family:%s;font-size:%s;background-color:%s;background-image:url(%s)\">\n",FontFace,TitleFontSize,BgColor,BgImage);
+       puts("<div align=\"center\"><table cellpadding=\"1\" cellspacing=\"1\">\n");
+       printf("<tr><th class=\"title_l\" colspan=\"10\">SARG %s</th></tr>\n",_("Realtime"));
+       printf("<tr><th class=\"text\" colspan=\"10\">%s: %d s</th></tr>\n",_("Auto refresh"),realtime_refresh);
+       printf("<tr><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_c\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("DATE/TIME"),_("IP/NAME"),_("USERID"),_("TYPE"),_("ACCESSED SITE"));
 }
index 2b587d0031eaf947c3be5c8a705055d7cf04716e..c22e79e37994cf1374a2997aa66ac148a94c3380 100644 (file)
--- a/repday.c
+++ b/repday.c
@@ -31,201 +31,200 @@ extern numlist hours;
 
 void report_day(const struct userinfostruct *uinfo)
 {
-
-   FILE *fp_in, *fp_ou;
-
-   char buf[200];
-   char data[20];
-   long long int hour;
-   const char *label;
-   char arqout[MAXLEN];
-   char wdirname[2048];
-   char colsep;
-   int  ihour=0;
-   int day,month,year;
-   int daylist[MAX_DATETIME_DAYS];
-   int daysort[MAX_DATETIME_DAYS];
-   int ndaylist;
-   int daynum;
-   int dayidx;
-   long long int bytes;
-   long long int elap;
-   long long int tbytes[MAX_DATETIME_DAYS*24];
-   long long int telap[MAX_DATETIME_DAYS*24];
-   long long int tt;
-   long long int tttime[24];
-   int i, j;
-   struct getwordstruct gwarea;
-   struct tm t;
-
-   snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename);
-   if(access(wdirname, R_OK) != 0) return;
-
-   if (snprintf(arqout,sizeof(arqout),"%s/%s/d%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqout)) {
-      debuga(_("Output file name too long: %s/%s/d%s.html\n"),outdirname,uinfo->filename,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_in=fopen(wdirname,"r"))==NULL) {
-     debuga(_("(repday) Cannot open log file %s\n"),wdirname);
-     exit(EXIT_FAILURE);
-   }
-
-   memset(tbytes,0,sizeof(tbytes));
-   memset(telap,0,sizeof(telap));
-   ndaylist=0;
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,'\t')<0) {
-         debuga(_("Invalid date in file %s\n"),wdirname);
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
-      if (day<1 || day>31 || month<1 || month>12 || year>9999) continue;
-      daynum=(year*10000)+(month*100)+day;
-      for (dayidx=0 ; dayidx<ndaylist && daynum!=daylist[dayidx] ; dayidx++);
-      if (dayidx>=ndaylist) {
-         if (dayidx>=sizeof(daylist)/sizeof(*daylist)) {
-            debuga(_("Too many different dates in %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         daylist[ndaylist++]=daynum;
-      }
-
-      if (getword_atoll(&hour,&gwarea,'\t')<0) {
-         debuga(_("Invalid time in file %s\n"),wdirname);
-         exit(EXIT_FAILURE);
-      }
-      ihour=(int)hour;
-      i=dayidx*24+ihour;
-
-      if ((datetimeby & DATETIME_BYTE)!=0) {
-         colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
-         if (getword_atoll(&bytes,&gwarea,colsep)<0) {
-            debuga(_("Invalid number of bytes in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         tbytes[i]+=bytes;
-      }
-      if ((datetimeby & DATETIME_ELAP)!=0) {
-         if (getword_atoll(&elap,&gwarea,'\0')<0) {
-            debuga(_("Invalid elapsed time in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         telap[i]+=elap;
-      }
-   }
-   fclose(fp_in);
-
-   if((fp_ou=fopen(arqout,"w"))==NULL) {
-     debuga(_("(repday) Cannot open log file %s\n"),arqout);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Day report"),HTML_JS_NONE);
-   fprintf(fp_ou,"<tr><td class=\"header_c\" colspan=\"2\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
-   fprintf(fp_ou,"<tr><th class=\"header_c\" colspan=\"2\">%s:&nbsp;%s</th></tr>\n",_("User"),uinfo->label);
-   close_html_header(fp_ou);
-
-   dayidx=0;
-   for (i=0 ; i<ndaylist ; i++) {
-      daynum=daylist[i];
-      for (j=dayidx ; j>0 && daynum<daylist[daysort[j-1]] ; j--) daysort[j]=daysort[j-1];
-      daysort[j]=i;
-      dayidx++;
-   }
-
-   if((datetimeby & DATETIME_BYTE)!=0) {
-      label=_("BYTES");
-      fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
-      fputs("<tr><th class=\"header_c\"></th>",fp_ou);
-      for( i = 0; i < hours.len; i++ )
-         fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label );
-      fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label );
-
-      memset(tttime,0,sizeof(tttime));
-      for (dayidx=0 ; dayidx<ndaylist ; dayidx++) {
-         daynum=daysort[dayidx];
-         day=daylist[daynum]%100;
-         month=(daylist[daynum]/100)%100;
-         year=daylist[daynum]/10000;
-         computedate(year,month,day,&t);
-         strftime(data,sizeof(data),"%x",&t);
-         fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data );
-         tt=0;
-         for( i = 0; i < hours.len; i++ ) {
-            ihour=hours.list[i];
-            if (tbytes[daynum*24+ihour]>0) {
-               fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixnum(tbytes[daynum*24+ihour],1));
-               tt+=tbytes[daynum*24+ihour];
-               tttime[ihour]+=tbytes[daynum*24+ihour];
-            } else
-               fputs("<td class=\"data\"></td>\n",fp_ou);
-         }
-         fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixnum(tt,1));
-      }
-
-      fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") );
-      tt=0;
-      for( i = 0; i < hours.len; i++ ) {
-         if (tttime[i]>0) {
-            fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixnum(tttime[i],1));
-            tt+=tttime[i];
-         } else
-            fputs("<td class=\"header_r\"></td>\n",fp_ou);
-      }
-      fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixnum(tt,1));
-      fputs("</table>\n",fp_ou);
-   }
-
-   if((datetimeby & DATETIME_ELAP)!=0) {
-      label=_("H:M:S");
-      fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
-      fputs("<tr><th class=\"header_c\"></th>",fp_ou);
-      for( i = 0; i < hours.len; i++ )
-         fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label );
-      fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label );
-
-      memset(tttime,0,sizeof(tttime));
-      for (dayidx=0 ; dayidx<ndaylist ; dayidx++) {
-         daynum=daysort[dayidx];
-         day=daylist[daynum]%100;
-         month=(daylist[daynum]/100)%100;
-         year=daylist[daynum]/10000;
-         computedate(year,month,day,&t);
-         strftime(data,sizeof(data),"%x",&t);
-         fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data );
-         tt=0;
-         for( i = 0; i < hours.len; i++ ) {
-            ihour=hours.list[i];
-            if (telap[daynum*24+ihour]>0) {
-               fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixtime(telap[daynum*24+ihour]));
-               tt+=telap[daynum*24+ihour];
-               tttime[ihour]+=telap[daynum*24+ihour];
-            } else
-               fputs("<td class=\"data\"></td>\n",fp_ou);
-         }
-         fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixtime(tt));
-      }
-
-      fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") );
-      tt=0;
-      for( i = 0; i < hours.len; i++ ) {
-         if (tttime[i]>0) {
-            fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixtime(tttime[i]));
-            tt+=tttime[i];
-         } else
-            fputs("<td class=\"header_r\"></td>\n",fp_ou);
-      }
-      fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixtime(tt));
-      fputs("</table>\n",fp_ou);
-   }
-
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),arqout);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno));
-   return;
+       FILE *fp_in, *fp_ou;
+
+       char buf[200];
+       char data[20];
+       long long int hour;
+       const char *label;
+       char arqout[MAXLEN];
+       char wdirname[2048];
+       char colsep;
+       int  ihour=0;
+       int day,month,year;
+       int daylist[MAX_DATETIME_DAYS];
+       int daysort[MAX_DATETIME_DAYS];
+       int ndaylist;
+       int daynum;
+       int dayidx;
+       long long int bytes;
+       long long int elap;
+       long long int tbytes[MAX_DATETIME_DAYS*24];
+       long long int telap[MAX_DATETIME_DAYS*24];
+       long long int tt;
+       long long int tttime[24];
+       int i, j;
+       struct getwordstruct gwarea;
+       struct tm t;
+
+       snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,uinfo->filename);
+       if(access(wdirname, R_OK) != 0) return;
+
+       if (snprintf(arqout,sizeof(arqout),"%s/%s/d%s.html",outdirname,uinfo->filename,uinfo->filename)>=sizeof(arqout)) {
+               debuga(_("Output file name too long: %s/%s/d%s.html\n"),outdirname,uinfo->filename,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_in=fopen(wdirname,"r"))==NULL) {
+       debuga(_("(repday) Cannot open log file %s\n"),wdirname);
+       exit(EXIT_FAILURE);
+       }
+
+       memset(tbytes,0,sizeof(tbytes));
+       memset(telap,0,sizeof(telap));
+       ndaylist=0;
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,'\t')<0) {
+                       debuga(_("Invalid date in file %s\n"),wdirname);
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
+               if (day<1 || day>31 || month<1 || month>12 || year>9999) continue;
+               daynum=(year*10000)+(month*100)+day;
+               for (dayidx=0 ; dayidx<ndaylist && daynum!=daylist[dayidx] ; dayidx++);
+               if (dayidx>=ndaylist) {
+                       if (dayidx>=sizeof(daylist)/sizeof(*daylist)) {
+                               debuga(_("Too many different dates in %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       daylist[ndaylist++]=daynum;
+               }
+
+               if (getword_atoll(&hour,&gwarea,'\t')<0) {
+                       debuga(_("Invalid time in file %s\n"),wdirname);
+                       exit(EXIT_FAILURE);
+               }
+               ihour=(int)hour;
+               i=dayidx*24+ihour;
+
+               if ((datetimeby & DATETIME_BYTE)!=0) {
+                       colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
+                       if (getword_atoll(&bytes,&gwarea,colsep)<0) {
+                               debuga(_("Invalid number of bytes in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       tbytes[i]+=bytes;
+               }
+               if ((datetimeby & DATETIME_ELAP)!=0) {
+                       if (getword_atoll(&elap,&gwarea,'\0')<0) {
+                               debuga(_("Invalid elapsed time in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       telap[i]+=elap;
+               }
+       }
+       fclose(fp_in);
+
+       if((fp_ou=fopen(arqout,"w"))==NULL) {
+       debuga(_("(repday) Cannot open log file %s\n"),arqout);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Day report"),HTML_JS_NONE);
+       fprintf(fp_ou,"<tr><td class=\"header_c\" colspan=\"2\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
+       fprintf(fp_ou,"<tr><th class=\"header_c\" colspan=\"2\">%s:&nbsp;%s</th></tr>\n",_("User"),uinfo->label);
+       close_html_header(fp_ou);
+
+       dayidx=0;
+       for (i=0 ; i<ndaylist ; i++) {
+               daynum=daylist[i];
+               for (j=dayidx ; j>0 && daynum<daylist[daysort[j-1]] ; j--) daysort[j]=daysort[j-1];
+               daysort[j]=i;
+               dayidx++;
+       }
+
+       if((datetimeby & DATETIME_BYTE)!=0) {
+               label=_("BYTES");
+               fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
+               fputs("<tr><th class=\"header_c\"></th>",fp_ou);
+               for( i = 0; i < hours.len; i++ )
+                       fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label );
+               fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label );
+
+               memset(tttime,0,sizeof(tttime));
+               for (dayidx=0 ; dayidx<ndaylist ; dayidx++) {
+                       daynum=daysort[dayidx];
+                       day=daylist[daynum]%100;
+                       month=(daylist[daynum]/100)%100;
+                       year=daylist[daynum]/10000;
+                       computedate(year,month,day,&t);
+                       strftime(data,sizeof(data),"%x",&t);
+                       fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data );
+                       tt=0;
+                       for( i = 0; i < hours.len; i++ ) {
+                               ihour=hours.list[i];
+                               if (tbytes[daynum*24+ihour]>0) {
+                                       fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixnum(tbytes[daynum*24+ihour],1));
+                                       tt+=tbytes[daynum*24+ihour];
+                                       tttime[ihour]+=tbytes[daynum*24+ihour];
+                               } else
+                                       fputs("<td class=\"data\"></td>\n",fp_ou);
+                       }
+                       fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixnum(tt,1));
+               }
+
+               fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") );
+               tt=0;
+               for( i = 0; i < hours.len; i++ ) {
+                       if (tttime[i]>0) {
+                               fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixnum(tttime[i],1));
+                               tt+=tttime[i];
+                       } else
+                               fputs("<td class=\"header_r\"></td>\n",fp_ou);
+               }
+               fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixnum(tt,1));
+               fputs("</table>\n",fp_ou);
+       }
+
+       if((datetimeby & DATETIME_ELAP)!=0) {
+               label=_("H:M:S");
+               fputs("<table class=\"report\" cellpadding=\"0\" cellspacing=\"2\">\n", fp_ou);
+               fputs("<tr><th class=\"header_c\"></th>",fp_ou);
+               for( i = 0; i < hours.len; i++ )
+                       fprintf(fp_ou, "<td class=\"header_c\">%02d%s<br>%s</td>\n", hours.list[ i ], _("H"), label );
+               fprintf(fp_ou, "<td class=\"header_c\">%s<br>%s</td></tr>\n", _("TOTAL"), label );
+
+               memset(tttime,0,sizeof(tttime));
+               for (dayidx=0 ; dayidx<ndaylist ; dayidx++) {
+                       daynum=daysort[dayidx];
+                       day=daylist[daynum]%100;
+                       month=(daylist[daynum]/100)%100;
+                       year=daylist[daynum]/10000;
+                       computedate(year,month,day,&t);
+                       strftime(data,sizeof(data),"%x",&t);
+                       fprintf(fp_ou, "<tr><td class=\"data\">%s</td>\n", data );
+                       tt=0;
+                       for( i = 0; i < hours.len; i++ ) {
+                               ihour=hours.list[i];
+                               if (telap[daynum*24+ihour]>0) {
+                                       fprintf(fp_ou, "<td class=\"data\">%s</td>\n",fixtime(telap[daynum*24+ihour]));
+                                       tt+=telap[daynum*24+ihour];
+                                       tttime[ihour]+=telap[daynum*24+ihour];
+                               } else
+                                       fputs("<td class=\"data\"></td>\n",fp_ou);
+                       }
+                       fprintf(fp_ou, "<td class=\"data\">%s</td></tr>\n",fixtime(tt));
+               }
+
+               fprintf(fp_ou, "<tr><td class=\"header_l\">%s</td>\n", _("TOTAL") );
+               tt=0;
+               for( i = 0; i < hours.len; i++ ) {
+                       if (tttime[i]>0) {
+                               fprintf(fp_ou, "<td class=\"header_r\">%s</td>\n",fixtime(tttime[i]));
+                               tt+=tttime[i];
+                       } else
+                               fputs("<td class=\"header_r\"></td>\n",fp_ou);
+               }
+               fprintf(fp_ou, "<td class=\"header_r\">%s</td></tr>\n",fixtime(tt));
+               fputs("</table>\n",fp_ou);
+       }
+
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),arqout);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno));
+       return;
 }
index aa53a3bd4cea416cdc73e1ac92583651688dcc9f..499c75c2dbfa648b91f0624d6c76e8443c0d511f 100644 (file)
--- a/report.c
+++ b/report.c
@@ -39,784 +39,774 @@ static void grava_SmartFilter(const char *dirname, const char *user, const char
 
 void gerarel(void)
 {
-
-   FILE *fp_in;
-   FILE *fp_gen;
-
-   char *buf;
-   char accdia[11], acchora[9], accip[MAXLEN], *accurl;
-   char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
-   char wdirname[MAXLEN];
-   char *oldurl=NULL;
-   char oldmsg[50], acccode[MAXLEN/2 - 1], oldacccode[MAXLEN/2 - 1], user[MAX_USER_LEN];
-   char ipantes[MAXLEN], nameantes[MAXLEN];
-   char accsmart[MAXLEN];
-   char crc2[MAXLEN/2 -1];
-   char siteind[MAX_TRUNCATED_URL];
-   char arqtt[256];
-   char *oldurltt=NULL;
-   char oldaccdiatt[11],oldacchoratt[9];
-   char tmp3[MAXLEN];
-   char tmp4[5];
-   char u2[MAX_USER_LEN];
-   long long int nbytes=0;
-   long long int nelap=0;
-   long long int nacc=0;
-   long long int rtotal=0;
-   long long int incache=0;
-   long long int oucache=0;
-   long long int accbytes, accelap;
-   char *str;
-   DIR *dirp;
-   struct dirent *direntp;
-   const char logext[]=".log";
-   const char *sort_field;
-   const char *sort_order;
-   int dlen;
-   int url_len;
-   int ourl_size=0;
-   int ourltt_size=0;
-   int same_url;
-   int new_user;
-   struct getwordstruct gwarea;
-   longline line;
-   struct userinfostruct *uinfo,*puinfo;
-
-   ipantes[0]='\0';
-   smartfilter=0;
-
-   if (vrfydir(&period, addr, site, us, email)<0) {
-      debuga(_("Cannot create the output directory name containing the period as part of the name\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   if(debugz){
-      debugaz("outdirname",outdirname);
-   }
-
-   if(UserAgentLog[0] != '\0' && email[0] == '\0') useragent();
-
-   snprintf(wdirname,sizeof(wdirname),"%s/sarg-general",outdirname);
-   if((fp_gen=MY_FOPEN(wdirname,"w"))==NULL){
-      debuga(_("(report) Cannot open file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
-
-   puinfo=NULL;
-   fp_tt=NULL;
-
-   if ((dirp = opendir(tmp)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ((direntp = readdir( dirp )) != NULL ) {
-      dlen=strlen(direntp->d_name)-(sizeof(logext)-1);
-      if (dlen<0) continue;
-      if((strcmp(direntp->d_name+dlen,logext) != 0) ||
-         (strncmp(direntp->d_name,"download.log",12) == 0) ||
-         (strncmp(direntp->d_name,"denied.log",10) == 0) ||
-         (strncmp(direntp->d_name,"authfail.log.unsort",19) == 0))
-         continue;
-      if (snprintf(tmp3,sizeof(tmp3),"%s/%s",tmp,direntp->d_name)>=sizeof(tmp3)) {
-         debuga(_("(report) directory entry too long: %s/%s\n"),tmp,direntp->d_name);
-         exit(EXIT_FAILURE);
-      }
-      if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
-         debuga(_("(report) Cannot open file %s\n"),tmp);
-         exit(EXIT_FAILURE);
-      }
-
-      if (dlen>0) {
-         if (dlen>=sizeof(user)) continue;
-         strncpy(user,direntp->d_name,dlen);
-         user[dlen]=0;
-      } else {
-         user[0]='\0';
-      }
-
-      uinfo=userinfo_find_from_file(user);
-      if (!uinfo) {
-         debuga(_("Ignoring unknown user file %s\n"),user);
-         continue;
-      }
-      strcpy(u2,uinfo->id);
-      if(Ip2Name && uinfo->id_is_ip) {
-         strcpy(ipantes,u2);
-         ip2name(u2,sizeof(u2));
-         strcpy(nameantes,u2);
-      }
-      user_find(uinfo->label,MAX_USER_LEN, u2);
-
-      maketmp(user,tmp,debug,indexonly);
-      maketmp_hour(user,tmp,indexonly);
-      sort_labels(&sort_field,&sort_order);
-
-      ttopen=0;
-      oldurltt=NULL;
-      ourltt_size=0;
-      memset(oldaccdiatt,0,sizeof(oldaccdiatt));
-      memset(oldacchoratt,0,sizeof(oldacchoratt));
-      new_user=1;
-
-      if ((line=longline_create())==NULL) {
-         debuga(_("Not enough memory to read the downloaded files\n"));
-         exit(EXIT_FAILURE);
-      }
-
-      while((buf=longline_read(fp_in,line))!=NULL) {
-         getword_start(&gwarea,buf);
-         if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
-             getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
-             getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
-             getword(acccode,sizeof(acccode),&gwarea,'\t')<0) {
-            debuga(_("There is a broken record or garbage in file %s\n"),tmp3);
-            exit(EXIT_FAILURE);
-         }
-         if(strncmp(acccode,"TCP_DENIED/407",14) == 0) continue;
-         if (getword_atoll(&accelap,&gwarea,'\t')<0) {
-            debuga(_("There is a broken elapsed time in file %s\n"),tmp3);
-            exit(EXIT_FAILURE);
-         }
-         if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
-            debuga(_("There is a broken smart info in file %s\n"),tmp3);
-            exit(EXIT_FAILURE);
-         }
-
-         if(accsmart[0] != '\0') {
-            smartfilter++;
-            grava_SmartFilter(outdirname,uinfo->id,accip,accdia,acchora,accurl,accsmart);
-         }
-
-         if(Ip2Name) {
-            if(strcmp(accip,ipantes) != 0) {
-               strcpy(ipantes,accip);
-               ip2name(accip,sizeof(accip));
-               strcpy(nameantes,accip);
-            } else strcpy(accip,nameantes);
-         }
-
-         gravatmp_hora(outdirname,uinfo,accdia,acchora,accelap,accbytes,indexonly);
-
-         if(iprel){
-            gravaporuser(uinfo,outdirname,accurl,accip,accdia,acchora,accbytes,accelap,indexonly);
-         }
-
-         if(!rtotal){
-            url_len=strlen(accurl);
-            if (!oldurl || url_len>=ourl_size) {
-               ourl_size=url_len+1;
-               oldurl=realloc(oldurl,ourl_size);
-               if (!oldurl) {
-                  debuga(_("Not enough memory to store the url\n"));
-                  exit(EXIT_FAILURE);
-               }
-            }
-            strcpy(oldurl,accurl);
-            strcpy(oldacccode,acccode);
-            puinfo=uinfo;
-            strcpy(oldaccip,accip);
-            strcpy(oldaccdia,accdia);
-            strcpy(oldacchora,acchora);
-            new_user=0;
-            rtotal++;
-         }
-         same_url=(strcmp(oldurl,accurl) == 0);
-
-         if(site[0] != '\0') {
-            if(new_user){
-               if(strstr(oldacccode,"DENIED") != 0)
-                  strcpy(oldmsg,"DENIED");
-               else
-                  strcpy(oldmsg,"OK");
-               gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
-               gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
-               nacc=0;
-               nbytes=0;
-               nelap=0;
-               incache=0;
-               oucache=0;
-            }
-         } else {
-            if(!same_url || new_user){
-               if(strstr(oldacccode,"DENIED") != 0)
-                  strcpy(oldmsg,"DENIED");
-               else
-                  strcpy(oldmsg,"OK");
-               gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
-               gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
-               nacc=0;
-               nbytes=0;
-               nelap=0;
-               incache=0;
-               oucache=0;
-            }
-         }
-         nacc++;
-         nbytes+=accbytes;
-         nelap+=accelap;
-
-         if ((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0 &&
-             (!oldurltt || strcmp(oldurltt,accurl) || strcmp(oldaccdiatt,accdia) || strcmp(oldacchoratt,acchora))) {
-
-            if(!ttopen) {
-               snprintf(arqtt,sizeof(arqtt),"%s/%s",outdirname,uinfo->filename);
-               if(access(arqtt, R_OK) != 0)
-                  my_mkdir(arqtt);
-               url_to_file(accurl,siteind,sizeof(siteind));
-               snprintf(arqtt,sizeof(arqtt),"%s/%s/tt%s-%s.html",outdirname,uinfo->filename,uinfo->filename,siteind);
-               if ((fp_tt = fopen(arqtt, "w")) == 0) {
-                  debuga(_("(report) Cannot open file %s\n"),arqtt);
-                  exit(EXIT_FAILURE);
-               }
-               ttopen=1;
-
-               /*
-               if(Privacy)
-                  sprintf(httplink,"<font size=%s color=%s><href=http://%s>%s",        \
-                              FontSize,PrivacyStringColor,PrivacyString,PrivacyString);
-               else
-                  sprintf(httplink,"<font size=%s><a href=\"http://%s\">%s</a>",FontSize,accurl,accurl);
-               */
-
-               write_html_header(fp_tt,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Site access report"),HTML_JS_NONE);
-               fprintf(fp_tt,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
-               fprintf(fp_tt,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("User"),uinfo->label);
-               fputs("<tr><td class=\"header_c\">",fp_tt);
-               fprintf(fp_tt,_("Sort:&nbsp;%s, %s"),sort_field,sort_order);
-               fputs("</td></tr>\n",fp_tt);
-               fprintf(fp_tt,"<tr><th class=\"header_c\">%s</th></tr>\n",_("User"));
-               close_html_header(fp_tt);
-
-               fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_tt);
-               strncpy(tmp4,_("DATE/TIME"),4);
-               tmp4[4]='\0';
-               fprintf(fp_tt,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("ACCESSED SITE"),tmp4,_("DATE/TIME")+5);
-            }
-
-            fputs("<tr><td class=\"data\">",fp_tt);
-            output_html_string(fp_tt,accurl,100);
-            fprintf(fp_tt,"</td><td class=\"data\">%s</td><td class=\"data\">%s</td></tr>\n",accdia,acchora);
-
-            url_len=strlen(accurl);
-            if (!oldurltt || url_len>=ourltt_size) {
-               ourltt_size=url_len+1;
-               oldurltt=realloc(oldurltt,ourltt_size);
-               if (!oldurltt) {
-                  debuga(_("Not enough memory to store the url\n"));
-                  exit(EXIT_FAILURE);
-               }
-            }
-            strcpy(oldurltt,accurl);
-            strcpy(oldaccdiatt,accdia);
-            strcpy(oldacchoratt,acchora);
-         }
-
-         strcpy(crc2,acccode);
-         str=strchr(crc2,'/');
-         if (str) *str='\0';
-         if(strstr(crc2,"MISS") != 0)
-            oucache+=accbytes;
-         else incache+=accbytes;
-
-         if(new_user) {
-            new_user=0;
-            day_totalize(tmp,puinfo,indexonly);
-         }
-
-         puinfo=uinfo;
-         strcpy(oldacccode,acccode);
-         strcpy(oldaccip,accip);
-         if (!same_url) {
-            url_len=strlen(accurl);
-            if (url_len>=ourl_size) {
-               ourl_size=url_len+1;
-               oldurl=realloc(oldurl,ourl_size);
-               if (!oldurl) {
-                  debuga(_("Not enough memory to store the url\n"));
-                  exit(EXIT_FAILURE);
-               }
-            }
-            strcpy(oldurl,accurl);
-         }
-         strcpy(oldaccdia,accdia);
-         strcpy(oldacchora,acchora);
-
-      }
-      fclose(fp_in);
-      longline_destroy(&line);
-      if (oldurltt) free(oldurltt);
-      unlink(tmp3);
-   }
-   closedir(dirp);
-
-   if (oldurl) {
-      if(strstr(oldacccode,"DENIED") != 0)
-         strcpy(oldmsg,"DENIED");
-      else
-         strcpy(oldmsg,"OK");
-      gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
-      gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
-      free(oldurl);
-   }
-   fclose(fp_gen);
-   if (puinfo) day_totalize(tmp,puinfo,indexonly);
-
-   tmpsort();
-
-   totalger(outdirname, debug, outdir);
-
-   if(email[0] == '\0') {
-      if((ReportType & REPORT_TYPE_DOWNLOADS) != 0) download_report();
-
-      if(DansGuardianConf[0] != '\0') {
-         dansguardian_log();
-      }
-
-      squidguard_log();
-
-      topuser();
-
-      if((ReportType & REPORT_TYPE_TOPSITES) != 0) topsites();
-
-      if((ReportType & REPORT_TYPE_SITES_USERS) != 0) siteuser();
-      gen_denied_report();
-
-      authfail_report();
-
-      if(smartfilter) smartfilter_report();
-
-      if(DansGuardianConf[0] != '\0') dansguardian_report();
-
-      squidguard_report();
-
-      if((ReportType & REPORT_TYPE_USERS_SITES) != 0) htmlrel();
-
-      make_index();
-
-      if(SuccessfulMsg) debuga(_("Successful report generated on %s\n"),outdirname);
-    } else {
-      geramail(outdirname, debug, outdir, email, tmp);
-
-      if((strcmp(email,"stdout") != 0) && SuccessfulMsg)
-         debuga(_("Successful report generated and sent to %s\n"),email);
-   }
-
-   if(indexonly) {
-      index_only(outdirname, debug);
-   }
-
-   removetmp(outdirname);
-   return;
+       FILE *fp_in;
+       FILE *fp_gen;
+
+       char *buf;
+       char accdia[11], acchora[9], accip[MAXLEN], *accurl;
+       char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
+       char wdirname[MAXLEN];
+       char *oldurl=NULL;
+       char oldmsg[50], acccode[MAXLEN/2 - 1], oldacccode[MAXLEN/2 - 1], user[MAX_USER_LEN];
+       char ipantes[MAXLEN], nameantes[MAXLEN];
+       char accsmart[MAXLEN];
+       char crc2[MAXLEN/2 -1];
+       char siteind[MAX_TRUNCATED_URL];
+       char arqtt[256];
+       char *oldurltt=NULL;
+       char oldaccdiatt[11],oldacchoratt[9];
+       char tmp3[MAXLEN];
+       char tmp4[5];
+       char u2[MAX_USER_LEN];
+       long long int nbytes=0;
+       long long int nelap=0;
+       long long int nacc=0;
+       long long int rtotal=0;
+       long long int incache=0;
+       long long int oucache=0;
+       long long int accbytes, accelap;
+       char *str;
+       DIR *dirp;
+       struct dirent *direntp;
+       const char logext[]=".log";
+       const char *sort_field;
+       const char *sort_order;
+       int dlen;
+       int url_len;
+       int ourl_size=0;
+       int ourltt_size=0;
+       int same_url;
+       int new_user;
+       struct getwordstruct gwarea;
+       longline line;
+       struct userinfostruct *uinfo,*puinfo;
+
+       ipantes[0]='\0';
+       smartfilter=0;
+
+       if (vrfydir(&period, addr, site, us, email)<0) {
+               debuga(_("Cannot create the output directory name containing the period as part of the name\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       if(debugz){
+               debugaz("outdirname",outdirname);
+       }
+
+       if(UserAgentLog[0] != '\0' && email[0] == '\0') useragent();
+
+       snprintf(wdirname,sizeof(wdirname),"%s/sarg-general",outdirname);
+       if((fp_gen=MY_FOPEN(wdirname,"w"))==NULL){
+               debuga(_("(report) Cannot open file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
+
+       puinfo=NULL;
+       fp_tt=NULL;
+
+       if ((dirp = opendir(tmp)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ((direntp = readdir( dirp )) != NULL ) {
+               dlen=strlen(direntp->d_name)-(sizeof(logext)-1);
+               if (dlen<0) continue;
+               if((strcmp(direntp->d_name+dlen,logext) != 0) ||
+                       (strncmp(direntp->d_name,"download.log",12) == 0) ||
+                       (strncmp(direntp->d_name,"denied.log",10) == 0) ||
+                       (strncmp(direntp->d_name,"authfail.log.unsort",19) == 0))
+                       continue;
+               if (snprintf(tmp3,sizeof(tmp3),"%s/%s",tmp,direntp->d_name)>=sizeof(tmp3)) {
+                       debuga(_("(report) directory entry too long: %s/%s\n"),tmp,direntp->d_name);
+                       exit(EXIT_FAILURE);
+               }
+               if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
+                       debuga(_("(report) Cannot open file %s\n"),tmp);
+                       exit(EXIT_FAILURE);
+               }
+
+               if (dlen>0) {
+                       if (dlen>=sizeof(user)) continue;
+                       strncpy(user,direntp->d_name,dlen);
+                       user[dlen]=0;
+               } else {
+                       user[0]='\0';
+               }
+
+               uinfo=userinfo_find_from_file(user);
+               if (!uinfo) {
+                       debuga(_("Ignoring unknown user file %s\n"),user);
+                       continue;
+               }
+               strcpy(u2,uinfo->id);
+               if(Ip2Name && uinfo->id_is_ip) {
+                       strcpy(ipantes,u2);
+                       ip2name(u2,sizeof(u2));
+                       strcpy(nameantes,u2);
+               }
+               user_find(uinfo->label,MAX_USER_LEN, u2);
+
+               maketmp(user,tmp,debug,indexonly);
+               maketmp_hour(user,tmp,indexonly);
+               sort_labels(&sort_field,&sort_order);
+
+               ttopen=0;
+               oldurltt=NULL;
+               ourltt_size=0;
+               memset(oldaccdiatt,0,sizeof(oldaccdiatt));
+               memset(oldacchoratt,0,sizeof(oldacchoratt));
+               new_user=1;
+
+               if ((line=longline_create())==NULL) {
+                       debuga(_("Not enough memory to read the downloaded files\n"));
+                       exit(EXIT_FAILURE);
+               }
+
+               while((buf=longline_read(fp_in,line))!=NULL) {
+                       getword_start(&gwarea,buf);
+                       if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
+                               getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
+                               getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
+                               getword(acccode,sizeof(acccode),&gwarea,'\t')<0) {
+                               debuga(_("There is a broken record or garbage in file %s\n"),tmp3);
+                               exit(EXIT_FAILURE);
+                       }
+                       if(strncmp(acccode,"TCP_DENIED/407",14) == 0) continue;
+                       if (getword_atoll(&accelap,&gwarea,'\t')<0) {
+                               debuga(_("There is a broken elapsed time in file %s\n"),tmp3);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
+                               debuga(_("There is a broken smart info in file %s\n"),tmp3);
+                               exit(EXIT_FAILURE);
+                       }
+
+                       if(accsmart[0] != '\0') {
+                               smartfilter++;
+                               grava_SmartFilter(outdirname,uinfo->id,accip,accdia,acchora,accurl,accsmart);
+                       }
+
+                       if(Ip2Name) {
+                               if(strcmp(accip,ipantes) != 0) {
+                                       strcpy(ipantes,accip);
+                                       ip2name(accip,sizeof(accip));
+                                       strcpy(nameantes,accip);
+                               } else strcpy(accip,nameantes);
+                       }
+
+                       gravatmp_hora(outdirname,uinfo,accdia,acchora,accelap,accbytes,indexonly);
+
+                       if(iprel){
+                               gravaporuser(uinfo,outdirname,accurl,accip,accdia,acchora,accbytes,accelap,indexonly);
+                       }
+
+                       if(!rtotal){
+                               url_len=strlen(accurl);
+                               if (!oldurl || url_len>=ourl_size) {
+                                       ourl_size=url_len+1;
+                                       oldurl=realloc(oldurl,ourl_size);
+                                       if (!oldurl) {
+                                               debuga(_("Not enough memory to store the url\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                               }
+                               strcpy(oldurl,accurl);
+                               strcpy(oldacccode,acccode);
+                               puinfo=uinfo;
+                               strcpy(oldaccip,accip);
+                               strcpy(oldaccdia,accdia);
+                               strcpy(oldacchora,acchora);
+                               new_user=0;
+                               rtotal++;
+                       }
+                       same_url=(strcmp(oldurl,accurl) == 0);
+
+                       if(site[0] != '\0') {
+                               if(new_user){
+                                       if(strstr(oldacccode,"DENIED") != 0)
+                                               strcpy(oldmsg,"DENIED");
+                                       else
+                                               strcpy(oldmsg,"OK");
+                                       gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
+                                       gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
+                                       nacc=0;
+                                       nbytes=0;
+                                       nelap=0;
+                                       incache=0;
+                                       oucache=0;
+                               }
+                       } else {
+                               if(!same_url || new_user){
+                                       if(strstr(oldacccode,"DENIED") != 0)
+                                               strcpy(oldmsg,"DENIED");
+                                       else
+                                               strcpy(oldmsg,"OK");
+                                       gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
+                                       gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
+                                       nacc=0;
+                                       nbytes=0;
+                                       nelap=0;
+                                       incache=0;
+                                       oucache=0;
+                               }
+                       }
+                       nacc++;
+                       nbytes+=accbytes;
+                       nelap+=accelap;
+
+                       if ((ReportType & REPORT_TYPE_SITE_USER_TIME_DATE) != 0 &&
+                               (!oldurltt || strcmp(oldurltt,accurl) || strcmp(oldaccdiatt,accdia) || strcmp(oldacchoratt,acchora))) {
+
+                               if(!ttopen) {
+                                       snprintf(arqtt,sizeof(arqtt),"%s/%s",outdirname,uinfo->filename);
+                                       if(access(arqtt, R_OK) != 0)
+                                               my_mkdir(arqtt);
+                                       url_to_file(accurl,siteind,sizeof(siteind));
+                                       snprintf(arqtt,sizeof(arqtt),"%s/%s/tt%s-%s.html",outdirname,uinfo->filename,uinfo->filename,siteind);
+                                       if ((fp_tt = fopen(arqtt, "w")) == 0) {
+                                               debuga(_("(report) Cannot open file %s\n"),arqtt);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       ttopen=1;
+
+                                       /*
+                                       if(Privacy)
+                                               sprintf(httplink,"<font size=%s color=%s><href=http://%s>%s",   \
+                                                                               FontSize,PrivacyStringColor,PrivacyString,PrivacyString);
+                                       else
+                                               sprintf(httplink,"<font size=%s><a href=\"http://%s\">%s</a>",FontSize,accurl,accurl);
+                                       */
+
+                                       write_html_header(fp_tt,(IndexTree == INDEX_TREE_DATE) ? 4 : 2,_("Site access report"),HTML_JS_NONE);
+                                       fprintf(fp_tt,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("Period"),period.html);
+                                       fprintf(fp_tt,"<tr><td class=\"header_c\">%s:&nbsp;%s</td></tr>\n",_("User"),uinfo->label);
+                                       fputs("<tr><td class=\"header_c\">",fp_tt);
+                                       fprintf(fp_tt,_("Sort:&nbsp;%s, %s"),sort_field,sort_order);
+                                       fputs("</td></tr>\n",fp_tt);
+                                       fprintf(fp_tt,"<tr><th class=\"header_c\">%s</th></tr>\n",_("User"));
+                                       close_html_header(fp_tt);
+
+                                       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_tt);
+                                       strncpy(tmp4,_("DATE/TIME"),4);
+                                       tmp4[4]='\0';
+                                       fprintf(fp_tt,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("ACCESSED SITE"),tmp4,_("DATE/TIME")+5);
+                               }
+
+                               fputs("<tr><td class=\"data\">",fp_tt);
+                               output_html_string(fp_tt,accurl,100);
+                               fprintf(fp_tt,"</td><td class=\"data\">%s</td><td class=\"data\">%s</td></tr>\n",accdia,acchora);
+
+                               url_len=strlen(accurl);
+                               if (!oldurltt || url_len>=ourltt_size) {
+                                       ourltt_size=url_len+1;
+                                       oldurltt=realloc(oldurltt,ourltt_size);
+                                       if (!oldurltt) {
+                                               debuga(_("Not enough memory to store the url\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                               }
+                               strcpy(oldurltt,accurl);
+                               strcpy(oldaccdiatt,accdia);
+                               strcpy(oldacchoratt,acchora);
+                       }
+
+                       strcpy(crc2,acccode);
+                       str=strchr(crc2,'/');
+                       if (str) *str='\0';
+                       if(strstr(crc2,"MISS") != 0)
+                               oucache+=accbytes;
+                       else incache+=accbytes;
+
+                       if(new_user) {
+                               new_user=0;
+                               day_totalize(tmp,puinfo,indexonly);
+                       }
+
+                       puinfo=uinfo;
+                       strcpy(oldacccode,acccode);
+                       strcpy(oldaccip,accip);
+                       if (!same_url) {
+                               url_len=strlen(accurl);
+                               if (url_len>=ourl_size) {
+                                       ourl_size=url_len+1;
+                                       oldurl=realloc(oldurl,ourl_size);
+                                       if (!oldurl) {
+                                               debuga(_("Not enough memory to store the url\n"));
+                                               exit(EXIT_FAILURE);
+                                       }
+                               }
+                               strcpy(oldurl,accurl);
+                       }
+                       strcpy(oldaccdia,accdia);
+                       strcpy(oldacchora,acchora);
+
+               }
+               fclose(fp_in);
+               longline_destroy(&line);
+               if (oldurltt) free(oldurltt);
+               unlink(tmp3);
+       }
+       closedir(dirp);
+
+       if (oldurl) {
+               if(strstr(oldacccode,"DENIED") != 0)
+                       strcpy(oldmsg,"DENIED");
+               else
+                       strcpy(oldmsg,"OK");
+               gravatmp(puinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
+               gravager(fp_gen,puinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
+               free(oldurl);
+       }
+       fclose(fp_gen);
+       if (puinfo) day_totalize(tmp,puinfo,indexonly);
+
+       tmpsort();
+
+       totalger(outdirname, debug, outdir);
+
+       if(email[0] == '\0') {
+               if((ReportType & REPORT_TYPE_DOWNLOADS) != 0) download_report();
+
+               if(DansGuardianConf[0] != '\0') {
+                       dansguardian_log();
+               }
+
+               squidguard_log();
+
+               topuser();
+
+               if((ReportType & REPORT_TYPE_TOPSITES) != 0) topsites();
+
+               if((ReportType & REPORT_TYPE_SITES_USERS) != 0) siteuser();
+               gen_denied_report();
+
+               authfail_report();
+
+               if(smartfilter) smartfilter_report();
+
+               if(DansGuardianConf[0] != '\0') dansguardian_report();
+
+               squidguard_report();
+
+               if((ReportType & REPORT_TYPE_USERS_SITES) != 0) htmlrel();
+
+               make_index();
+
+               if(SuccessfulMsg) debuga(_("Successful report generated on %s\n"),outdirname);
+       } else {
+               geramail(outdirname, debug, outdir, email, tmp);
+
+               if((strcmp(email,"stdout") != 0) && SuccessfulMsg)
+                       debuga(_("Successful report generated and sent to %s\n"),email);
+       }
+
+       if(indexonly) {
+               index_only(outdirname, debug);
+       }
+
+       removetmp(outdirname);
+       return;
 }
 
 static void maketmp(const char *user, const char *dirname, int debug, int indexonly)
 {
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
 
-   FILE *fp_ou;
-
-   char wdirname[MAXLEN];
+       if(indexonly) return;
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
 
-   if(indexonly) return;
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+       if(debug) debuga(_("Making file: %s/%s\n"),tmp,user);
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.utmp",tmp,user)>=sizeof(wdirname)) {
+               debuga(_("Temporary file name too long: %s/%s.utmp\n"),tmp,user);
+               exit(EXIT_FAILURE);
+       }
 
-   if(debug) debuga(_("Making file: %s/%s\n"),tmp,user);
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.utmp",tmp,user)>=sizeof(wdirname)) {
-      debuga(_("Temporary file name too long: %s/%s.utmp\n"),tmp,user);
-      exit(EXIT_FAILURE);
-   }
+       if((fp_ou=fopen(wdirname,"w"))==NULL){
+               debuga(_("(report) Cannot open file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
 
-   if((fp_ou=fopen(wdirname,"w"))==NULL){
-      debuga(_("(report) Cannot open file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
-
-   fclose(fp_ou);
-   return;
+       fclose(fp_ou);
+       return;
 }
 
 
 static void maketmp_hour(const char *user, const char *dirname, int indexonly)
 {
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
 
-   FILE *fp_ou;
-
-   char wdirname[MAXLEN];
+       if(indexonly) return;
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+       if(datetimeby==0) return;
 
-   if(indexonly) return;
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
-   if(datetimeby==0) return;
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,user)>=sizeof(wdirname)) {
+               debuga(_("Temporary file name too long: %s/%s.htmp\n"),tmp,user);
+               exit(EXIT_FAILURE);
+       }
 
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,user)>=sizeof(wdirname)) {
-      debuga(_("Temporary file name too long: %s/%s.htmp\n"),tmp,user);
-      exit(EXIT_FAILURE);
-   }
+       if((fp_ou=fopen(wdirname,"w"))==NULL){
+               debuga(_("(report-1) Cannot open file %s - %s\n"),wdirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if((fp_ou=fopen(wdirname,"w"))==NULL){
-      debuga(_("(report-1) Cannot open file %s - %s\n"),wdirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   fclose(fp_ou);
-   return;
+       fclose(fp_ou);
+       return;
 }
 
 
 static void gravatmp(const struct userinfostruct *uinfo, const char *oldurl, long long int nacc, long long int nbytes, const char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache)
 {
-   FILE *fp_ou;
-   char wdirname[MAXLEN];
-
-   if(indexonly) return;
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
-
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.utmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("Temporary file name too long: %s/%s.utmp\n"),tmp,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
-      debuga(_("(report) Cannot open file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
-
-   /*
-   This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-   to print a long long int unless it is exactly 64-bits long.
-   */
-   fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%s\t%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",(uint64_t)nacc,(uint64_t)nbytes,oldurl,oldmsg,(uint64_t)nelap,(uint64_t)incache,(uint64_t)oucache);
-
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   ttopen=0;
-
-   if(fp_tt) {
-      fputs("</table>\n</div>\n",fp_tt);
-      fputs("</body>\n</html>\n",fp_tt);
-      fclose(fp_tt);
-      fp_tt=NULL;
-   }
-
-   return;
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
+
+       if(indexonly) return;
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.utmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("Temporary file name too long: %s/%s.utmp\n"),tmp,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
+               debuga(_("(report) Cannot open file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
+
+       /*
+       This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+       to print a long long int unless it is exactly 64-bits long.
+       */
+       fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%s\t%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",(uint64_t)nacc,(uint64_t)nbytes,oldurl,oldmsg,(uint64_t)nelap,(uint64_t)incache,(uint64_t)oucache);
+
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       ttopen=0;
+
+       if(fp_tt) {
+               fputs("</table>\n</div>\n",fp_tt);
+               fputs("</body>\n</html>\n",fp_tt);
+               fclose(fp_tt);
+               fp_tt=NULL;
+       }
+
+       return;
 }
 
 static void gravatmp_hora(const char *dirname, const struct userinfostruct *uinfo, const char *data, const char *hora, long long int elap, long long int bytes, int indexonly)
 {
-
-   FILE *fp_ou;
-   char wdirname[MAXLEN];
-   int hour;
-
-   if(indexonly || ((ReportType & REPORT_TYPE_USERS_SITES) == 0) || datetimeby==0) return;
-
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("Path too long %s/%s.htmp\n"),tmp,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
-      debuga(_("(report-2) Cannot open file %s - %s\n"),wdirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   hour=atoi(hora);
-   fprintf(fp_ou,"%s\t%d",data,hour);
-   if((datetimeby & DATETIME_BYTE)!=0) fprintf(fp_ou,"\t%"PRIu64,(uint64_t)bytes);
-   if((datetimeby & DATETIME_ELAP)!=0) fprintf(fp_ou,"\t%"PRIu64,(uint64_t)elap);
-   fputs("\n",fp_ou);
-
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   return;
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
+       int hour;
+
+       if(indexonly || ((ReportType & REPORT_TYPE_USERS_SITES) == 0) || datetimeby==0) return;
+
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("Path too long %s/%s.htmp\n"),tmp,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
+               debuga(_("(report-2) Cannot open file %s - %s\n"),wdirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       hour=atoi(hora);
+       fprintf(fp_ou,"%s\t%d",data,hour);
+       if((datetimeby & DATETIME_BYTE)!=0) fprintf(fp_ou,"\t%"PRIu64,(uint64_t)bytes);
+       if((datetimeby & DATETIME_ELAP)!=0) fprintf(fp_ou,"\t%"PRIu64,(uint64_t)elap);
+       fputs("\n",fp_ou);
+
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),wdirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       return;
 }
 
 
 static void gravaporuser(const struct userinfostruct *uinfo, const char *dirname, const char *url, const char *ip, const char *data, const char *hora, long long int tam, long long int elap, int indexonly)
 {
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
 
-   FILE *fp_ou;
-   char wdirname[MAXLEN];
+       if(indexonly || ((ReportType & REPORT_TYPE_USERS_SITES) == 0)) return;
 
-   if(indexonly || ((ReportType & REPORT_TYPE_USERS_SITES) == 0)) return;
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.ip",tmp,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("Path too long %s/%s.ip\n"),tmp,uinfo->filename);
+               exit(EXIT_FAILURE);
+       }
 
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.ip",tmp,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("Path too long %s/%s.ip\n"),tmp,uinfo->filename);
-      exit(EXIT_FAILURE);
-   }
+       if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
+               debuga(_("(report) Cannot open file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
 
-   if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
-      debuga(_("(report) Cannot open file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
+       /*
+       This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+       to print a long long int unless it is exactly 64-bits long.
+       */
+       fprintf(fp_ou,"%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\n",ip,url,data,hora,(uint64_t)tam,(uint64_t)elap);
 
-   /*
-   This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-   to print a long long int unless it is exactly 64-bits long.
-   */
-   fprintf(fp_ou,"%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\n",ip,url,data,hora,(uint64_t)tam,(uint64_t)elap);
-
-   fclose(fp_ou);
-
-   return;
+       fclose(fp_ou);
 
+       return;
 }
 
 
 static void gravager(FILE *fp_gen, const struct userinfostruct *uinfo, long long int nacc, const char *url, long long int nbytes, const char *ip, const char *hora, const char *dia, long long int nelap, long long int incache, long long int oucache)
 {
-   /*
-   This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-   to print a long long int unless it is exactly 64-bits long.
-   */
-   fprintf(fp_gen,"%s\t%"PRIu64"\t%"PRIu64"\t%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",uinfo->id,(uint64_t)nacc,(uint64_t)nbytes,url,ip,hora,dia,(uint64_t)nelap,(uint64_t)incache,(uint64_t)oucache);
-   return;
+       /*
+       This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+       to print a long long int unless it is exactly 64-bits long.
+       */
+       fprintf(fp_gen,"%s\t%"PRIu64"\t%"PRIu64"\t%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",uinfo->id,(uint64_t)nacc,(uint64_t)nbytes,url,ip,hora,dia,(uint64_t)nelap,(uint64_t)incache,(uint64_t)oucache);
+       return;
 }
 
 int ger_read(char *buffer,struct generalitemstruct *item,const char *filename)
 {
-   int i;
-   int sign;
-   long long int number;
-
-   if (strncmp(buffer,"TOTAL\t",6)==0) {
-      item->total=1;
-      buffer+=6;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid total number of accesses in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nacc=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid total size in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nbytes=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid total elapsed time in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nelap=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid total cache hit in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->incache=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\0') {
-         debuga(_("Invalid total cache miss in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      item->oucache=number*sign;
-   } else {
-      item->total=0;
-
-      item->user=buffer;
-      for (i=0 ; i<MAX_USER_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
-      if (*buffer!='\t') {
-         debuga(_("User name too long or invalid in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      *buffer++='\0';
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid number of accesses in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nacc=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid number of bytes in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nbytes=number*sign;
-
-      item->url=buffer;
-      while ((unsigned char)*buffer>=' ') buffer++;
-      if (*buffer!='\t') {
-         debuga(_("URL too long or invalid in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      *buffer++='\0';
-
-      item->ip=buffer;
-      for (i=0 ; i<MAX_IP_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
-      if (*buffer!='\t') {
-         debuga(_("IP address too long or invalid in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      *buffer++='\0';
-
-      item->time=buffer;
-      for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
-      if (*buffer!='\t') {
-         debuga(_("Time too long or invalid in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      *buffer++='\0';
-
-      item->date=buffer;
-      for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
-      if (*buffer!='\t') {
-         debuga(_("Date too long or invalid in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      *buffer++='\0';
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid elapsed time in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->nelap=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\t') {
-         debuga(_("Invalid cache hit size in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      buffer++;
-      item->incache=number*sign;
-
-      sign=+1;
-      if (*buffer == '-') {
-         buffer++;
-         sign=-1;
-      } else if (*buffer == '+') {
-         buffer++;
-      }
-      number=0LL;
-      while (isdigit(*buffer))
-         number=(number * 10) + (*buffer++)-'0';
-      if (*buffer!='\0') {
-         debuga(_("Invalid cache miss size in %s\n"),filename);
-         exit(EXIT_FAILURE);
-      }
-      item->oucache=number*sign;
-   }
-   return(0);
+       int i;
+       int sign;
+       long long int number;
+
+       if (strncmp(buffer,"TOTAL\t",6)==0) {
+               item->total=1;
+               buffer+=6;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid total number of accesses in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nacc=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid total size in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nbytes=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid total elapsed time in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nelap=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid total cache hit in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->incache=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\0') {
+                       debuga(_("Invalid total cache miss in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               item->oucache=number*sign;
+       } else {
+               item->total=0;
+
+               item->user=buffer;
+               for (i=0 ; i<MAX_USER_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
+               if (*buffer!='\t') {
+                       debuga(_("User name too long or invalid in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               *buffer++='\0';
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid number of accesses in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nacc=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid number of bytes in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nbytes=number*sign;
+
+               item->url=buffer;
+               while ((unsigned char)*buffer>=' ') buffer++;
+               if (*buffer!='\t') {
+                       debuga(_("URL too long or invalid in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               *buffer++='\0';
+
+               item->ip=buffer;
+               for (i=0 ; i<MAX_IP_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
+               if (*buffer!='\t') {
+                       debuga(_("IP address too long or invalid in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               *buffer++='\0';
+
+               item->time=buffer;
+               for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
+               if (*buffer!='\t') {
+                       debuga(_("Time too long or invalid in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               *buffer++='\0';
+
+               item->date=buffer;
+               for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
+               if (*buffer!='\t') {
+                       debuga(_("Date too long or invalid in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               *buffer++='\0';
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid elapsed time in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->nelap=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\t') {
+                       debuga(_("Invalid cache hit size in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               buffer++;
+               item->incache=number*sign;
+
+               sign=+1;
+               if (*buffer == '-') {
+                       buffer++;
+                       sign=-1;
+               } else if (*buffer == '+') {
+                       buffer++;
+               }
+               number=0LL;
+               while (isdigit(*buffer))
+                       number=(number * 10) + (*buffer++)-'0';
+               if (*buffer!='\0') {
+                       debuga(_("Invalid cache miss size in %s\n"),filename);
+                       exit(EXIT_FAILURE);
+               }
+               item->oucache=number*sign;
+       }
+       return(0);
 }
 
 static void grava_SmartFilter(const char *dirname, const char *user, const char *ip, const char *data, const char *hora, const char *url, const char *smart)
 {
+       FILE *fp_ou;
+       char wdirname[MAXLEN];
 
-   FILE *fp_ou;
-   char wdirname[MAXLEN];
-
-   sprintf(wdirname,"%s/smartfilter.unsort",dirname);
-
-   if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
-      debuga(_("(report) Cannot open file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
+       sprintf(wdirname,"%s/smartfilter.unsort",dirname);
 
-   fprintf(fp_ou,"%s\t%s\t%s\t%s\t%s\t%s\n",user,data,hora,ip,url,smart);
-   fputs("</body>\n</html>\n",fp_tt);
+       if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
+               debuga(_("(report) Cannot open file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
 
-   fclose(fp_ou);
+       fprintf(fp_ou,"%s\t%s\t%s\t%s\t%s\t%s\n",user,data,hora,ip,url,smart);
+       fputs("</body>\n</html>\n",fp_tt);
 
-   return;
+       fclose(fp_ou);
 
+       return;
 }
index 48bf8762f1f5ccf42911927d37140b3608e2da45..d38f4c915f4bcb7b8ae6f4d34509855adc1dea68 100644 (file)
 
 void siteuser(void)
 {
-
-   FILE *fp_in, *fp_ou;
-
-   char *buf;
-   char wuser[MAXLEN];
-   char *ourl;
-   char csort[255];
-   char general[MAXLEN];
-   char general2[MAXLEN];
-   char sites[MAXLEN];
-   char report[MAXLEN];
-   int regs=0;
-   int ucount=0;
-   int ourl_size;
-   int url_len;
-   char *users;
-   long long int obytes;
-   int cstatus;
-   longline line;
-   struct generalitemstruct item;
-   const struct userinfostruct *uinfo;
-
-   if(Privacy)
-      return;
-
-   nsitesusers = 0;
-   sprintf(general,"%s/sarg-general",outdirname);
-   sprintf(sites,"%s/sarg-sites",outdirname);
-   sprintf(general2,"%s/sarg-general2",outdirname);
-   sprintf(report,"%s/siteuser.html",outdirname);
-
-   sprintf(csort,"sort -k 4,4 -k 1,1 -o \"%s\" \"%s\"",general2,general);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_in=fopen(general2,"r"))==NULL) {
-     debuga(_("(siteuser) Cannot open log file %s\n"),general2);
-     debuga(_("sort command: %s\n"),csort);
-     exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=fopen(report,"w"))==NULL) {
-     debuga(_("(siteuser) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Sites & Users"),HTML_JS_SORTTABLE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Sites & Users"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\"",fp_ou);
-   if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
-   fprintf(fp_ou,">\n<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l",_("NUM"));
-   if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
-   fprintf(fp_ou,"\">%s</th>",_("ACCESSED SITE"));
-   if(BytesInSitesUsersReport)
-      fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("BYTES"));
-   fputs("<th class=\"header_l",fp_ou);
-   if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
-   fprintf(fp_ou,"\">%s</th></tr></thead>\n",_("USERS"));
-
-   ourl=NULL;
-   ourl_size=0;
-   obytes=0;
-
-   if((users=(char *) malloc(204800))==NULL){
-      debuga(_("ERROR: Cannot load. Memory fault\n"));
-      exit(EXIT_FAILURE);
-   }
-   strcpy(users," ");
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),general2);
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      ger_read(buf,&item,general2);
-      if(item.total) continue;
-      uinfo=userinfo_find_from_id(item.user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),item.user,general2);
-         exit(EXIT_FAILURE);
-      }
-
-      if (item.nacc > 0) nsitesusers = 1;
-      if(!regs) {
-         url_len=strlen(item.url);
-         if (!ourl || url_len>=ourl_size) {
-            ourl_size=url_len+1;
-            ourl=realloc(ourl,ourl_size);
-            if (!ourl) {
-               debuga(_("Not enough memory to store the url\n"));
-               exit(EXIT_FAILURE);
-            }
-         }
-         strcpy(ourl,item.url);
-         obytes=item.nbytes;
-         regs++;
-      }
-
-      sprintf(wuser," %s ",uinfo->label);
-      if(strstr(users,wuser) == 0 && strcmp(item.url,ourl) == 0) {
-         strcat(users,uinfo->label);
-         strcat(users," ");
-         ucount++;
-         if(ucount>4) {
-            strcat(users,"<br>");
-            ucount=0;
-         }
-      }
-
-      if(SiteUsersReportLimit) {
-         if(regs >= SiteUsersReportLimit)
-            continue;
-      }
-
-      if(strcmp(item.url,ourl) != 0 && nsitesusers) {
-         fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2\">",regs);
-         if(BlockIt[0]!='\0') {
-            fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
-            output_html_url(fp_ou,ourl);
-            fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
-         }
-         fputs("<a href=\"http://",fp_ou);
-         output_html_url(fp_ou,ourl);
-         fputs("\">",fp_ou);
-         output_html_string(fp_ou,ourl,100);
-         fputs("</a></td>",fp_ou);
-
-         if (BytesInSitesUsersReport) {
-            fputs("<td class=\"data\"",fp_ou);
-            if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)obytes);
-            fprintf(fp_ou,">%s</td>",fixnum(obytes,1));
-         }
-         fprintf(fp_ou,"<td class=\"data2\">%s</td></tr>\n",users);
-
-         regs++;
-         ucount=0;
-         strcpy(users,uinfo->label);
-         strcat(users," ");
-         url_len=strlen(item.url);
-         if (url_len>=ourl_size) {
-            ourl_size=url_len+1;
-            ourl=realloc(ourl,ourl_size);
-            if (!ourl) {
-               debuga(_("Not enough memory to store the url\n"));
-               exit(EXIT_FAILURE);
-            }
-         }
-         strcpy(ourl,item.url);
-         obytes=item.nbytes;
-      }
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   if(nsitesusers) {
-      fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2\">",regs);
-      if(BlockIt[0]!='\0') {
-         fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
-         output_html_url(fp_ou,ourl);
-         fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
-      }
-      fputs("<a href=\"http://",fp_ou);
-      output_html_url(fp_ou,ourl);
-      fputs("\">",fp_ou);
-      output_html_string(fp_ou,ourl,100);
-      fputs("</a></td>",fp_ou);
-      if (BytesInSitesUsersReport) {
-         fputs("<td class=\"data\"",fp_ou);
-         if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)obytes);
-         fprintf(fp_ou,">%s</td>",fixnum(obytes,1));
-      }
-      fprintf(fp_ou,"<td class=\"data2\">%s</td></tr>\n",users);
-   }
-   if (ourl) free(ourl);
-
-   unlink(general2);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   if(users)
-      free(users);
-
-   return;
+       FILE *fp_in, *fp_ou;
+
+       char *buf;
+       char wuser[MAXLEN];
+       char *ourl;
+       char csort[255];
+       char general[MAXLEN];
+       char general2[MAXLEN];
+       char sites[MAXLEN];
+       char report[MAXLEN];
+       int regs=0;
+       int ucount=0;
+       int ourl_size;
+       int url_len;
+       char *users;
+       long long int obytes;
+       int cstatus;
+       longline line;
+       struct generalitemstruct item;
+       const struct userinfostruct *uinfo;
+
+       if(Privacy)
+               return;
+
+       nsitesusers = 0;
+       sprintf(general,"%s/sarg-general",outdirname);
+       sprintf(sites,"%s/sarg-sites",outdirname);
+       sprintf(general2,"%s/sarg-general2",outdirname);
+       sprintf(report,"%s/siteuser.html",outdirname);
+
+       sprintf(csort,"sort -k 4,4 -k 1,1 -o \"%s\" \"%s\"",general2,general);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_in=fopen(general2,"r"))==NULL) {
+       debuga(_("(siteuser) Cannot open log file %s\n"),general2);
+       debuga(_("sort command: %s\n"),csort);
+       exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=fopen(report,"w"))==NULL) {
+       debuga(_("(siteuser) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Sites & Users"),HTML_JS_SORTTABLE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Sites & Users"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\"",fp_ou);
+       if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
+       fprintf(fp_ou,">\n<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l",_("NUM"));
+       if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
+       fprintf(fp_ou,"\">%s</th>",_("ACCESSED SITE"));
+       if(BytesInSitesUsersReport)
+               fprintf(fp_ou,"<th class=\"header_l\">%s</th>",_("BYTES"));
+       fputs("<th class=\"header_l",fp_ou);
+       if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
+       fprintf(fp_ou,"\">%s</th></tr></thead>\n",_("USERS"));
+
+       ourl=NULL;
+       ourl_size=0;
+       obytes=0;
+
+       if((users=(char *) malloc(204800))==NULL){
+               debuga(_("ERROR: Cannot load. Memory fault\n"));
+               exit(EXIT_FAILURE);
+       }
+       strcpy(users," ");
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),general2);
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               ger_read(buf,&item,general2);
+               if(item.total) continue;
+               uinfo=userinfo_find_from_id(item.user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),item.user,general2);
+                       exit(EXIT_FAILURE);
+               }
+
+               if (item.nacc > 0) nsitesusers = 1;
+               if(!regs) {
+                       url_len=strlen(item.url);
+                       if (!ourl || url_len>=ourl_size) {
+                               ourl_size=url_len+1;
+                               ourl=realloc(ourl,ourl_size);
+                               if (!ourl) {
+                                       debuga(_("Not enough memory to store the url\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+                       strcpy(ourl,item.url);
+                       obytes=item.nbytes;
+                       regs++;
+               }
+
+               sprintf(wuser," %s ",uinfo->label);
+               if(strstr(users,wuser) == 0 && strcmp(item.url,ourl) == 0) {
+                       strcat(users,uinfo->label);
+                       strcat(users," ");
+                       ucount++;
+                       if(ucount>4) {
+                               strcat(users,"<br>");
+                               ucount=0;
+                       }
+               }
+
+               if(SiteUsersReportLimit) {
+                       if(regs >= SiteUsersReportLimit)
+                               continue;
+               }
+
+               if(strcmp(item.url,ourl) != 0 && nsitesusers) {
+                       fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2\">",regs);
+                       if(BlockIt[0]!='\0') {
+                               fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
+                               output_html_url(fp_ou,ourl);
+                               fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
+                       }
+                       fputs("<a href=\"http://",fp_ou);
+                       output_html_url(fp_ou,ourl);
+                       fputs("\">",fp_ou);
+                       output_html_string(fp_ou,ourl,100);
+                       fputs("</a></td>",fp_ou);
+
+                       if (BytesInSitesUsersReport) {
+                               fputs("<td class=\"data\"",fp_ou);
+                               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)obytes);
+                               fprintf(fp_ou,">%s</td>",fixnum(obytes,1));
+                       }
+                       fprintf(fp_ou,"<td class=\"data2\">%s</td></tr>\n",users);
+
+                       regs++;
+                       ucount=0;
+                       strcpy(users,uinfo->label);
+                       strcat(users," ");
+                       url_len=strlen(item.url);
+                       if (url_len>=ourl_size) {
+                               ourl_size=url_len+1;
+                               ourl=realloc(ourl,ourl_size);
+                               if (!ourl) {
+                                       debuga(_("Not enough memory to store the url\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+                       strcpy(ourl,item.url);
+                       obytes=item.nbytes;
+               }
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       if(nsitesusers) {
+               fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2\">",regs);
+               if(BlockIt[0]!='\0') {
+                       fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
+                       output_html_url(fp_ou,ourl);
+                       fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
+               }
+               fputs("<a href=\"http://",fp_ou);
+               output_html_url(fp_ou,ourl);
+               fputs("\">",fp_ou);
+               output_html_string(fp_ou,ourl,100);
+               fputs("</a></td>",fp_ou);
+               if (BytesInSitesUsersReport) {
+                       fputs("<td class=\"data\"",fp_ou);
+                       if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(int64_t)obytes);
+                       fprintf(fp_ou,">%s</td>",fixnum(obytes,1));
+               }
+               fprintf(fp_ou,"<td class=\"data2\">%s</td></tr>\n",users);
+       }
+       if (ourl) free(ourl);
+
+       unlink(general2);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       if(users)
+               free(users);
+
+       return;
 }
index d0d281f611ea61021e4a182d795a2e07bfa01047..aa6d5a2993a281e3d2c1b251b26cdf8aebfae58e 100644 (file)
 
 void smartfilter_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL, *fp_user = NULL;
-
-   char buf[MAXLEN];
-   char url[MAXLEN];
-   char csort[255];
-   char smart_in[MAXLEN];
-   char smart_ou[MAXLEN];
-   char sites[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char data[15];
-   char hora[15];
-   char smartcat[256];
-   char smartheader[15];
-   char ftime[128];
-   char smartuser[MAXLEN];
-   int  fuser=0;
-   int cstatus;
-   struct getwordstruct gwarea;
-   const struct userinfostruct *uinfo;
-
-   ouser[0]='\0';
-
-   strcpy(smartheader,_("SmartFilter"));
-   strup(smartheader);
-
-   sprintf(smart_in,"%s/smartfilter.unsort",outdirname);
-   sprintf(sites,"%s/sarg-sites",outdirname);
-   sprintf(smart_ou,"%s/smartfilter.log",outdirname);
-   sprintf(report,"%s/smartfilter.html",outdirname);
-
-   if (snprintf(csort,sizeof(csort),"sort -n -k 1,1 -k 2,2 -k 3,3 -o \"%s\" \"%s\"",smart_ou,smart_in)>=sizeof(csort)) {
-      debuga(_("cannot build the sort command to sort file %s\n"),smart_in);
-      exit(EXIT_FAILURE);
-   }
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(smart_ou,"r"))==NULL) {
-      debuga(_("(smartfilter) Cannot open log file %s\n"),smart_ou);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   unlink(smart_in);
-
-   if((fp_ou=fopen(report,"w"))==NULL) {
-     debuga(_("(smartfilter) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   fprintf(fp_ou, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-   fputs("</head>\n",fp_ou);
-   if(strlen(FontFace) > 0) fprintf(fp_ou,"<font face=%s>\n",FontFace);
-   fprintf(fp_ou,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage);
-   fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ou);
-   write_logo_image(fp_ou);
-
-   fprintf(fp_ou,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title);
-   fprintf(fp_ou,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">",HeaderBgColor,FontSize);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</font></td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th bgcolor=\"%s\" align=\"center\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("SmartFilter"));
-   fputs("</table></div>\n",fp_ou);
-
-   fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
-   fputs("<tr><td></td></tr>\n",fp_ou);
-   fputs("<tr><td></td></tr>\n",fp_ou);
-   fputs("<tr><td></td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th bgcolor=%s><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader);
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(data,sizeof(data),&gwarea,'\t')<0 ||
-          getword(hora,sizeof(hora),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0 ||
-          getword(url,sizeof(url),&gwarea,'\t')<0 || getword(smartcat,sizeof(smartcat),&gwarea,'\n')<0) {
-         debuga(_("There is a broken record or garbage in file %s\n"),smart_ou);
-         exit(EXIT_FAILURE);
-      }
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,smart_ou);
-         exit(EXIT_FAILURE);
-      }
-      if(strcmp(ouser,user) != 0) {
-         strcpy(ouser,user);
-         sprintf(smartuser,"%s/denied_%s.html",outdirname,uinfo->filename);
-         if(fuser) {
-            fuser=0;
-            fputs("</table>\n",fp_user);
-            if(ShowSargInfo) {
-               zdate(ftime, sizeof(ftime), DateFormat);
-               fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
-            }
-            fputs("</body>\n</html>\n",fp_user);
-            fclose(fp_user);
-         }
-         if ((fp_user = fopen(smartuser, "a")) == 0) {
-            debuga(_("(smartfilter) Cannot open file %s\n"),smartuser);
-            exit(EXIT_FAILURE);
-         }
-         fuser=1;
-
-         fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"",fp_ou);
-         fputs(" \"http://www.w3.org/TR/html4/loose.dtd\">\n",fp_ou);
-         fputs("<html>\n",fp_user);
-         fputs("<head>\n",fp_user);
-         fprintf(fp_user,"  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-         fputs("</head>\n",fp_user);
-
-         if(FontFace[0] != 0) {
-            /*
-            Before merging the sprintf and the fputs, the code looked like this:
-            sprintf(html2,"<font face=%s>\n",FontFace);
-            fputs(url,fp_user);
-            The two lines don't use the same buffer so the string formated by sprintf is not the string
-            written to fp_user. I (fmarchal) assumed it was a typo and replaced it by a fprintf but
-            that font tag is not valid outside of the body. So, the generated html was likely
-            containing garbage not rendered by the browser.
-            */
-            fprintf(fp_user,"<font face=%s>\n",FontFace);
-         }
-         fprintf(fp_user,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage);
-         fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_user);
-         if(LogoImage[0]!='\0') fprintf(fp_user,"<tr><th align=left><img src=\"%s\" border=\"0\" align=\"absmiddle\" width=\"%s\" height=\"%s\"><font color=\"%s\">%s</font>\n",LogoImage,Width,Height,LogoTextColor,LogoText);
-         fprintf(fp_user,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title);
-         fputs("<tr><td align=center bgcolor=\"%s\"><font size=\"%s\">",fp_user);
-         fprintf(fp_user,_("Period: %s"),period.html);
-         fputs("</font></td></tr>\n",fp_user);
-         fprintf(fp_user,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">%s:</font><font size=\"%s\"> %s</font></td></tr>\n",HeaderBgColor,FontSize,_("User"),FontSize,uinfo->label);
-         fputs("</table></div>\n",fp_user);
-         fputs("<div align=\"center\"><table cellpadding=0 cellspacing=2>\n",fp_user);
-         fputs("<tr><td></td></tr>\n",fp_user);
-         fputs("<tr><td></td></tr>\n",fp_user);
-         fputs("<tr><td></td></tr>\n",fp_user);
-         fprintf(fp_user,"<tr><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader);
-      }
-      fprintf(fp_user,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat);
-
-      fprintf(fp_ou,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat);
-   }
-
-   fputs("</table>\n",fp_ou);
-
-   if(ShowSargInfo) {
-      zdate(ftime, sizeof(ftime), DateFormat);
-      fprintf(fp_ou,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
-   }
-
-   fputs("</body>\n</html>\n",fp_user);
-
-   fclose(fp_ou);
-   if(fp_user) {
-      fputs("</table>\n",fp_user);
-      if(ShowSargInfo) {
-         zdate(ftime, sizeof(ftime), DateFormat);
-         fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
-      }
-      fputs("</body>\n</html>\n",fp_user);
-      fclose(fp_user);
-   }
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL, *fp_user = NULL;
+
+       char buf[MAXLEN];
+       char url[MAXLEN];
+       char csort[255];
+       char smart_in[MAXLEN];
+       char smart_ou[MAXLEN];
+       char sites[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char data[15];
+       char hora[15];
+       char smartcat[256];
+       char smartheader[15];
+       char ftime[128];
+       char smartuser[MAXLEN];
+       int  fuser=0;
+       int cstatus;
+       struct getwordstruct gwarea;
+       const struct userinfostruct *uinfo;
+
+       ouser[0]='\0';
+
+       strcpy(smartheader,_("SmartFilter"));
+       strup(smartheader);
+
+       sprintf(smart_in,"%s/smartfilter.unsort",outdirname);
+       sprintf(sites,"%s/sarg-sites",outdirname);
+       sprintf(smart_ou,"%s/smartfilter.log",outdirname);
+       sprintf(report,"%s/smartfilter.html",outdirname);
+
+       if (snprintf(csort,sizeof(csort),"sort -n -k 1,1 -k 2,2 -k 3,3 -o \"%s\" \"%s\"",smart_ou,smart_in)>=sizeof(csort)) {
+               debuga(_("cannot build the sort command to sort file %s\n"),smart_in);
+               exit(EXIT_FAILURE);
+       }
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(smart_ou,"r"))==NULL) {
+               debuga(_("(smartfilter) Cannot open log file %s\n"),smart_ou);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       unlink(smart_in);
+
+       if((fp_ou=fopen(report,"w"))==NULL) {
+       debuga(_("(smartfilter) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       fprintf(fp_ou, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
+       fputs("</head>\n",fp_ou);
+       if(strlen(FontFace) > 0) fprintf(fp_ou,"<font face=%s>\n",FontFace);
+       fprintf(fp_ou,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage);
+       fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ou);
+       write_logo_image(fp_ou);
+
+       fprintf(fp_ou,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title);
+       fprintf(fp_ou,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">",HeaderBgColor,FontSize);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</font></td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th bgcolor=\"%s\" align=\"center\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("SmartFilter"));
+       fputs("</table></div>\n",fp_ou);
+
+       fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
+       fputs("<tr><td></td></tr>\n",fp_ou);
+       fputs("<tr><td></td></tr>\n",fp_ou);
+       fputs("<tr><td></td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th bgcolor=%s><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th><th bgcolor=\"%s\"><font size=\"%s\">%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader);
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0 || getword(data,sizeof(data),&gwarea,'\t')<0 ||
+                       getword(hora,sizeof(hora),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0 ||
+                       getword(url,sizeof(url),&gwarea,'\t')<0 || getword(smartcat,sizeof(smartcat),&gwarea,'\n')<0) {
+                       debuga(_("There is a broken record or garbage in file %s\n"),smart_ou);
+                       exit(EXIT_FAILURE);
+               }
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,smart_ou);
+                       exit(EXIT_FAILURE);
+               }
+               if(strcmp(ouser,user) != 0) {
+                       strcpy(ouser,user);
+                       sprintf(smartuser,"%s/denied_%s.html",outdirname,uinfo->filename);
+                       if(fuser) {
+                               fuser=0;
+                               fputs("</table>\n",fp_user);
+                               if(ShowSargInfo) {
+                                       zdate(ftime, sizeof(ftime), DateFormat);
+                                       fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
+                               }
+                               fputs("</body>\n</html>\n",fp_user);
+                               fclose(fp_user);
+                       }
+                       if ((fp_user = fopen(smartuser, "a")) == 0) {
+                               debuga(_("(smartfilter) Cannot open file %s\n"),smartuser);
+                               exit(EXIT_FAILURE);
+                       }
+                       fuser=1;
+
+                       fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"",fp_ou);
+                       fputs(" \"http://www.w3.org/TR/html4/loose.dtd\">\n",fp_ou);
+                       fputs("<html>\n",fp_user);
+                       fputs("<head>\n",fp_user);
+                       fprintf(fp_user,"  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
+                       fputs("</head>\n",fp_user);
+
+                       if(FontFace[0] != 0) {
+                               /*
+                               Before merging the sprintf and the fputs, the code looked like this:
+                               sprintf(html2,"<font face=%s>\n",FontFace);
+                               fputs(url,fp_user);
+                               The two lines don't use the same buffer so the string formated by sprintf is not the string
+                               written to fp_user. I (fmarchal) assumed it was a typo and replaced it by a fprintf but
+                               that font tag is not valid outside of the body. So, the generated html was likely
+                               containing garbage not rendered by the browser.
+                               */
+                               fprintf(fp_user,"<font face=%s>\n",FontFace);
+                       }
+                       fprintf(fp_user,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor,TxColor,BgImage);
+                       fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_user);
+                       if(LogoImage[0]!='\0') fprintf(fp_user,"<tr><th align=left><img src=\"%s\" border=\"0\" align=\"absmiddle\" width=\"%s\" height=\"%s\"><font color=\"%s\">%s</font>\n",LogoImage,Width,Height,LogoTextColor,LogoText);
+                       fprintf(fp_user,"<tr><th align=\"center\"><b><font color=\"%s\" size=\"+1\">%s</font></b></th></tr>\n",TiColor,Title);
+                       fputs("<tr><td align=center bgcolor=\"%s\"><font size=\"%s\">",fp_user);
+                       fprintf(fp_user,_("Period: %s"),period.html);
+                       fputs("</font></td></tr>\n",fp_user);
+                       fprintf(fp_user,"<tr><td align=\"center\" bgcolor=\"%s\"><font size=\"%s\">%s:</font><font size=\"%s\"> %s</font></td></tr>\n",HeaderBgColor,FontSize,_("User"),FontSize,uinfo->label);
+                       fputs("</table></div>\n",fp_user);
+                       fputs("<div align=\"center\"><table cellpadding=0 cellspacing=2>\n",fp_user);
+                       fputs("<tr><td></td></tr>\n",fp_user);
+                       fputs("<tr><td></td></tr>\n",fp_user);
+                       fputs("<tr><td></td></tr>\n",fp_user);
+                       fprintf(fp_user,"<tr><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th><th bgcolor=%s><font size=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,_("USERID"),HeaderBgColor,FontSize,_("IP/NAME"),HeaderBgColor,FontSize,_("DATE/TIME"),HeaderBgColor,FontSize,_("ACCESSED SITE"),HeaderBgColor,FontSize,smartheader);
+               }
+               fprintf(fp_user,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat);
+
+               fprintf(fp_ou,"<tr><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s</font></td><td bgcolor=%s align=center><font size=%s>%s-%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td></th>\n",TxBgColor,FontSize,uinfo->label,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat);
+       }
+
+       fputs("</table>\n",fp_ou);
+
+       if(ShowSargInfo) {
+               zdate(ftime, sizeof(ftime), DateFormat);
+               fprintf(fp_ou,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
+       }
+
+       fputs("</body>\n</html>\n",fp_user);
+
+       fclose(fp_ou);
+       if(fp_user) {
+               fputs("</table>\n",fp_user);
+               if(ShowSargInfo) {
+                       zdate(ftime, sizeof(ftime), DateFormat);
+                       fprintf(fp_user,"<br><br><div align=\"center\"><font size=\"-2\">%s <a href=\"%s\">%s-%s</a> %s %s</font></div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
+               }
+               fputs("</body>\n</html>\n",fp_user);
+               fclose(fp_user);
+       }
+
+       return;
 }
diff --git a/sort.c b/sort.c
index c2867e68113e82084ba3a30745c3fa50c6f07c45..083c450c0eef65e7b36c09feb0b755351c7b6c3c 100644 (file)
--- a/sort.c
+++ b/sort.c
 
 void tmpsort(void)
 {
-
-   DIR *dirp;
-   struct dirent *direntp;
-   int cstatus;
-   const char tmpext[]=".utmp";
-   int dlen;
-   char csort[MAXLEN];
-   char arqou[MAXLEN], arqin[MAXLEN], wnome[MAXLEN];
-   const char *field1="2,2";
-   const char *field2="1,1";
-   const char *field3="3,3";
-   const char *order;
-
-   if(indexonly) return;
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
-
-   if((UserSort & USER_SORT_CONNECT) != 0) {
-      field1="1,1";
-      field2="2,2";
-      field3="3,3";
-   } else if((UserSort & USER_SORT_SITE) != 0) {
-      field1="3,3";
-      field2="2,2";
-      field3="1,1";
-   } else if((UserSort & USER_SORT_TIME) != 0) {
-      field1="5,5";
-      field2="2,2";
-      field3="1,1";
-   }
-
-   if((UserSort & USER_SORT_REVERSE) == 0)
-      order="";
-   else
-      order="-r";
-
-   if ((dirp = opendir(tmp)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ((direntp = readdir( dirp )) != NULL ){
-      dlen=strlen(direntp->d_name)-(sizeof(tmpext)-1);
-      if (dlen<0) continue;
-      if(strcmp(direntp->d_name+dlen,tmpext) != 0)
-         continue;
-
-      if (dlen>0) {
-         if (dlen>=sizeof(wnome)) continue;
-         strncpy(wnome,direntp->d_name,dlen);
-         wnome[dlen]='\0';
-      } else {
-         wnome[0]='\0';
-      }
-
-      strcpy(arqou,tmp);
-      strcat(arqou,"/");
-      strcpy(arqin,arqou);
-      strcat(arqou,wnome);
-      strcat(arqin,direntp->d_name);
-
-      if(debug) {
-         debuga(_("Sorting file: %s\n"),arqou);
-      }
-
-      strcat(arqou,".txt");
-      sprintf(csort,"sort -n -T \"%s\" %s -k %s -k %s -k %s -o \"%s\" \"%s\"",tmp,order,field1,field2,field3,arqou,arqin);
-      cstatus=system(csort);
-      if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-         debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-         debuga(_("sort command: %s\n"),csort);
-         exit(EXIT_FAILURE);
-      }
-      unlink(arqin);
-
-   }
-
-   (void)closedir( dirp );
-   return;
+       DIR *dirp;
+       struct dirent *direntp;
+       int cstatus;
+       const char tmpext[]=".utmp";
+       int dlen;
+       char csort[MAXLEN];
+       char arqou[MAXLEN], arqin[MAXLEN], wnome[MAXLEN];
+       const char *field1="2,2";
+       const char *field2="1,1";
+       const char *field3="3,3";
+       const char *order;
+
+       if(indexonly) return;
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+
+       if((UserSort & USER_SORT_CONNECT) != 0) {
+               field1="1,1";
+               field2="2,2";
+               field3="3,3";
+       } else if((UserSort & USER_SORT_SITE) != 0) {
+               field1="3,3";
+               field2="2,2";
+               field3="1,1";
+       } else if((UserSort & USER_SORT_TIME) != 0) {
+               field1="5,5";
+               field2="2,2";
+               field3="1,1";
+       }
+
+       if((UserSort & USER_SORT_REVERSE) == 0)
+               order="";
+       else
+               order="-r";
+
+       if ((dirp = opendir(tmp)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ((direntp = readdir( dirp )) != NULL ){
+               dlen=strlen(direntp->d_name)-(sizeof(tmpext)-1);
+               if (dlen<0) continue;
+               if(strcmp(direntp->d_name+dlen,tmpext) != 0)
+                       continue;
+
+               if (dlen>0) {
+                       if (dlen>=sizeof(wnome)) continue;
+                       strncpy(wnome,direntp->d_name,dlen);
+                       wnome[dlen]='\0';
+               } else {
+                       wnome[0]='\0';
+               }
+
+               strcpy(arqou,tmp);
+               strcat(arqou,"/");
+               strcpy(arqin,arqou);
+               strcat(arqou,wnome);
+               strcat(arqin,direntp->d_name);
+
+               if(debug) {
+                       debuga(_("Sorting file: %s\n"),arqou);
+               }
+
+               strcat(arqou,".txt");
+               sprintf(csort,"sort -n -T \"%s\" %s -k %s -k %s -k %s -o \"%s\" \"%s\"",tmp,order,field1,field2,field3,arqou,arqin);
+               cstatus=system(csort);
+               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                       debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+                       debuga(_("sort command: %s\n"),csort);
+                       exit(EXIT_FAILURE);
+               }
+               unlink(arqin);
+
+       }
+
+       (void)closedir( dirp );
+       return;
 }
 
 void sort_users_log(const char *tmp, int debug)
 {
-   DIR *dirp;
-   struct dirent *direntp;
-   char csort[MAXLEN];
-   char user[MAXLEN];
-   char wdname[MAXLEN];
-   int cstatus;
-   int dlen;
-   int clen;
-   const char unsortext[]=".unsort";
-
-   if(debug) {
-      debuga(_("pre-sorting files\n"));
-   }
-
-   if ((dirp = opendir(tmp)) == NULL) {
-      debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   while ( (direntp = readdir( dirp )) != NULL ){
-      dlen=strlen(direntp->d_name)-(sizeof(unsortext)-1);
-      if (dlen<0) continue;
-      if(strcmp(direntp->d_name+dlen,unsortext) != 0)
-         continue;
-      if(strcmp(direntp->d_name,"authfail.log.unsort") == 0)
-         continue;
-
-      if (dlen>0) {
-         if (dlen>=sizeof(user)) continue;
-         strncpy(user,direntp->d_name,dlen);
-         user[dlen]=0;
-      } else {
-         user[0]='\0';
-      }
-
-      if(strcmp(direntp->d_name,"download.unsort") == 0)
-         clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -k 3,3 -k 1,1 -k 2,2 -k 5,5 -o \"%s/%s.log\" \"%s/%s.unsort\"",
-              tmp, tmp, user, tmp, user);
-      else
-         clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -k 4,4 -k 1,1 -k 2,2 -o \"%s/%s.log\" \"%s/%s.unsort\"",
-              tmp, tmp, user, tmp, user);
-      if (clen>=sizeof(csort)) {
-         debuga(_("user name too long to sort %s\n"),csort);
-         exit(EXIT_FAILURE);
-      }
-      cstatus=system(csort);
-      if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-         debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-         debuga(_("sort command: %s\n"),csort);
-         exit(EXIT_FAILURE);
-      }
-      if (snprintf(wdname,sizeof(wdname),"%s/%s.unsort",tmp,user)>=sizeof(wdname)) {
-         debuga(_("user name too long for %s/%s.unsort\n"),tmp,user);
-         exit(EXIT_FAILURE);
-      }
-      unlink(wdname);
-   }
-   (void)closedir( dirp );
-
-   return;
+       DIR *dirp;
+       struct dirent *direntp;
+       char csort[MAXLEN];
+       char user[MAXLEN];
+       char wdname[MAXLEN];
+       int cstatus;
+       int dlen;
+       int clen;
+       const char unsortext[]=".unsort";
+
+       if(debug) {
+               debuga(_("pre-sorting files\n"));
+       }
+
+       if ((dirp = opendir(tmp)) == NULL) {
+               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       while ( (direntp = readdir( dirp )) != NULL ){
+               dlen=strlen(direntp->d_name)-(sizeof(unsortext)-1);
+               if (dlen<0) continue;
+               if(strcmp(direntp->d_name+dlen,unsortext) != 0)
+                       continue;
+               if(strcmp(direntp->d_name,"authfail.log.unsort") == 0)
+                       continue;
+
+               if (dlen>0) {
+                       if (dlen>=sizeof(user)) continue;
+                       strncpy(user,direntp->d_name,dlen);
+                       user[dlen]=0;
+               } else {
+                       user[0]='\0';
+               }
+
+               if(strcmp(direntp->d_name,"download.unsort") == 0)
+                       clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -k 3,3 -k 1,1 -k 2,2 -k 5,5 -o \"%s/%s.log\" \"%s/%s.unsort\"",
+                               tmp, tmp, user, tmp, user);
+               else
+                       clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -k 4,4 -k 1,1 -k 2,2 -o \"%s/%s.log\" \"%s/%s.unsort\"",
+                               tmp, tmp, user, tmp, user);
+               if (clen>=sizeof(csort)) {
+                       debuga(_("user name too long to sort %s\n"),csort);
+                       exit(EXIT_FAILURE);
+               }
+               cstatus=system(csort);
+               if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+                       debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+                       debuga(_("sort command: %s\n"),csort);
+                       exit(EXIT_FAILURE);
+               }
+               if (snprintf(wdname,sizeof(wdname),"%s/%s.unsort",tmp,user)>=sizeof(wdname)) {
+                       debuga(_("user name too long for %s/%s.unsort\n"),tmp,user);
+                       exit(EXIT_FAILURE);
+               }
+               unlink(wdname);
+       }
+       (void)closedir( dirp );
+
+       return;
 }
 
 void sort_labels(const char **label,const char **order)
 {
-   if((UserSort & USER_SORT_CONNECT) != 0) {
-      *label=_("connect");
-   } else if((UserSort & USER_SORT_SITE) != 0) {
-      *label=_("site");
-   } else if((UserSort & USER_SORT_TIME) != 0) {
-      *label=_("time");
-   } else {
-      *label=_("bytes");
-   }
-
-   if((UserSort & USER_SORT_REVERSE) == 0)
-      *order=_("normal");
-   else
-      *order=_("reverse");
+       if((UserSort & USER_SORT_CONNECT) != 0) {
+               *label=_("connect");
+       } else if((UserSort & USER_SORT_SITE) != 0) {
+               *label=_("site");
+       } else if((UserSort & USER_SORT_TIME) != 0) {
+               *label=_("time");
+       } else {
+               *label=_("bytes");
+       }
+
+       if((UserSort & USER_SORT_REVERSE) == 0)
+               *order=_("normal");
+       else
+               *order=_("reverse");
 }
index 4c51c489e6a1603787fccfab69087f6e32989123..092bd58b23f5003514e88d419ed8ceff82fc4f0f 100644 (file)
 
 void splitlog(const char *arq, char *df, int dfrom, int duntil, int convert)
 {
-   FILE *fp_in;
-   char *buf;
-   char data[30];
-   char dia[11];
-   time_t tt;
-   int idata=0;
-   struct tm *t;
-   struct getwordstruct gwarea;
-   longline line;
+       FILE *fp_in;
+       char *buf;
+       char data[30];
+       char dia[11];
+       time_t tt;
+       int idata=0;
+       struct tm *t;
+       struct getwordstruct gwarea;
+       longline line;
 
-   if(arq[0] == '\0')
-      arq="/var/log/squid/access.log";
+       if(arq[0] == '\0')
+               arq="/var/log/squid/access.log";
 
-   if((fp_in=MY_FOPEN(arq,"r"))==NULL) {
-      debuga(_("(splitlog) Cannot open log file %s - %s\n"),arq,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if((fp_in=MY_FOPEN(arq,"r"))==NULL) {
+               debuga(_("(splitlog) Cannot open log file %s - %s\n"),arq,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the log file %s\n"),arq);
-      exit(EXIT_FAILURE);
-   }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the log file %s\n"),arq);
+               exit(EXIT_FAILURE);
+       }
 
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(data,sizeof(data),&gwarea,' ')<0) {
-         debuga(_("Invalid date found in file %s\n"),arq);
-         exit(EXIT_FAILURE);
-      }
-      tt=atoi(data);
-      t=localtime(&tt);
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(data,sizeof(data),&gwarea,' ')<0) {
+                       debuga(_("Invalid date found in file %s\n"),arq);
+                       exit(EXIT_FAILURE);
+               }
+               tt=atoi(data);
+               t=localtime(&tt);
 
-      if(dfrom) {
-         idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
-         if(idata < dfrom || idata > duntil)
-            continue;
-      }
+               if(dfrom) {
+                       idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
+                       if(idata < dfrom || idata > duntil)
+                               continue;
+               }
 
-      if(!convert) {
-         printf("%s %s\n",data,gwarea.current);
-      } else {
-         if(df[0]=='e')
-            strftime(dia, sizeof(dia), "%d/%m/%Y", t);
-         else
-            strftime(dia, sizeof(dia), "%m/%d/%Y", t);
+               if(!convert) {
+                       printf("%s %s\n",data,gwarea.current);
+               } else {
+                       if(df[0]=='e')
+                               strftime(dia, sizeof(dia), "%d/%m/%Y", t);
+                       else
+                               strftime(dia, sizeof(dia), "%m/%d/%Y", t);
 
-         printf("%s %02d:%02d:%02d %s\n",dia,t->tm_hour,t->tm_min,t->tm_sec,gwarea.current);
-      }
-   }
+                       printf("%s %02d:%02d:%02d %s\n",dia,t->tm_hour,t->tm_min,t->tm_sec,gwarea.current);
+               }
+       }
 
-   longline_destroy(&line);
-   if (fclose(fp_in)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),arq,strerror(errno));
-   }
+       longline_destroy(&line);
+       if (fclose(fp_in)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),arq,strerror(errno));
+       }
 }
index 79262293f0f94a97507d19429c5d7c654f427f2e..0c758790b434f00104ccff1cf9f392bd5323b453 100644 (file)
@@ -33,355 +33,355 @@ static int nfiles_done = 0;
 
 static void read_log(const char *wentp, FILE *fp_ou,int dfrom,int duntil)
 {
-   FILE *fp_in = NULL;
-   char *buf;
-   char leks[5], sep[2], res[MAXLEN];
-   char hour[15];
-   char source[128], list[128];
-   char url[MAX_URL_LEN];
-   char user[MAX_USER_LEN];
-   char ip[25];
-   long long int lmon, lday, lyear;
-   int mon, day, year;
-   int  idata=0;
-   int  i;
-   char *str;
-   bool id_is_ip;
-   struct getwordstruct gwarea;
-   struct getwordstruct gwarea1;
-   struct userinfostruct *uinfo;
-   longline line;
+       FILE *fp_in = NULL;
+       char *buf;
+       char leks[5], sep[2], res[MAXLEN];
+       char hour[15];
+       char source[128], list[128];
+       char url[MAX_URL_LEN];
+       char user[MAX_USER_LEN];
+       char ip[25];
+       long long int lmon, lday, lyear;
+       int mon, day, year;
+       int  idata=0;
+       int  i;
+       char *str;
+       bool id_is_ip;
+       struct getwordstruct gwarea;
+       struct getwordstruct gwarea1;
+       struct userinfostruct *uinfo;
+       longline line;
 
-   if(debug) {
-      debuga(_("Reading redirector log file %s\n"),wentp);
-   }
+       if(debug) {
+               debuga(_("Reading redirector log file %s\n"),wentp);
+       }
 
-   /* With squidGuard, you can log groups in only one log file.
-      We must parse each log files only one time.  Example :
-      dest porn {
-          domainlist porn/domains
-          urllist    porn/urls
-          log file1.log
-      }
-      dest aggressive {
-          domainlist aggressive/domains
-          urllist    aggressive/urls
-          log file2.log
-      }
-      dest audio-video {
-          domainlist audio-video/domains
-          urllist    audio-video/urls
-          log file1.log
-      }
-   */
-   for (i=0; i<nfiles_done; i++)
-      if (!strcmp(wentp, files_done[i])) return;
+       /* With squidGuard, you can log groups in only one log file.
+               We must parse each log files only one time.  Example :
+               dest porn {
+                       domainlist porn/domains
+                       urllist    porn/urls
+                       log file1.log
+               }
+               dest aggressive {
+                       domainlist aggressive/domains
+                       urllist    aggressive/urls
+                       log file2.log
+               }
+               dest audio-video {
+                       domainlist audio-video/domains
+                       urllist    audio-video/urls
+                       log file1.log
+               }
+       */
+       for (i=0; i<nfiles_done; i++)
+               if (!strcmp(wentp, files_done[i])) return;
 
-   nfiles_done++;
-   files_done = realloc(files_done, nfiles_done*sizeof(char *));
-   if (!files_done) {
-      debuga(_("Not enough memory to store the name of the new redirector log to be read - %s\n"),strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   files_done[nfiles_done-1] = strdup(wentp);
-   if (!files_done[nfiles_done-1]) {
-      debuga(_("Not enough memory to store the name of the new redirector log to be read - %s\n"),strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       nfiles_done++;
+       files_done = realloc(files_done, nfiles_done*sizeof(char *));
+       if (!files_done) {
+               debuga(_("Not enough memory to store the name of the new redirector log to be read - %s\n"),strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       files_done[nfiles_done-1] = strdup(wentp);
+       if (!files_done[nfiles_done-1]) {
+               debuga(_("Not enough memory to store the name of the new redirector log to be read - %s\n"),strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if ((fp_in=fopen(wentp,"r"))==NULL) {
-      debuga(_("(squidguard) Cannot open log file %s\n"),wentp);
-      exit(EXIT_FAILURE);
-   }
+       if ((fp_in=fopen(wentp,"r"))==NULL) {
+               debuga(_("(squidguard) Cannot open log file %s\n"),wentp);
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the redirector log\n"));
-      exit(EXIT_FAILURE);
-   }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the redirector log\n"));
+               exit(EXIT_FAILURE);
+       }
 
-   while ((buf=longline_read(fp_in,line)) != NULL) {
-      getword_start(&gwarea,buf);
-      if(RedirectorLogFormat[0] != '\0') {
-         getword_start(&gwarea1,RedirectorLogFormat);
-         leks[0]='\0';
-         if (getword(leks,sizeof(leks),&gwarea1,'#')<0) {
-            debuga(_("There is a broken record or garbage in your %s file\n"),wentp);
-            exit(EXIT_FAILURE);
-         }
-         year=0;
-         mon=0;
-         day=0;
-         hour[0]='\0';
-         source[0]='\0';
-         list[0]='\0';
-         ip[0]='\0';
-         user[0]='\0';
-         url[0]='\0';
-         while(strcmp(leks,"end") != 0) {
-            if (getword(leks,sizeof(leks),&gwarea1,'#')<0 || getword(sep,sizeof(sep),&gwarea1,'#')<0) {
-               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),wentp);
-               exit(EXIT_FAILURE);
-            }
-            if(strcmp(leks,"end") != 0) {
-               if (getword_limit(res,sizeof(res),&gwarea,sep[0])<0) {
-                  debuga(_("Maybe you have a broken record or garbage in your %s file\n"),wentp);
-                  exit(EXIT_FAILURE);
-               }
-               if(strcmp(leks,"year") == 0) {
-                  year=atoi(res);
-               } else if(strcmp(leks,"mon") == 0) {
-                  mon=atoi(res);
-               } else if(strcmp(leks,"day") == 0) {
-                  day=atoi(res);
-               } else if(strcmp(leks,"hour") == 0) {
-                  if (strlen(res)>=sizeof(hour)) {
-                     debuga(_("Hour string too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(hour,res);
-               } else if(strcmp(leks,"source") == 0) {
-                  if (strlen(res)>=sizeof(source)) {
-                     debuga(_("Banning source name too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(source,res);
-               } else if(strcmp(leks,"list") == 0) {
-                  if (strlen(res)>=sizeof(list)) {
-                     debuga(_("Banning list name too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(list,res);
-               } else if(strcmp(leks,"ip") == 0) {
-                  if (strlen(res)>=sizeof(ip)) {
-                     debuga(_("IP address too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(ip,res);
-               } else if(strcmp(leks,"user") == 0) {
-                  if (strlen(res)>=sizeof(user)) {
-                     debuga(_("User ID too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(user,res);
-               } else if(strcmp(leks,"url") == 0) {
-                  if (strlen(res)>=sizeof(url)) {
-                     debuga(_("URL too long in redirector log file %s\n"),wentp);
-                     exit(EXIT_FAILURE);
-                  }
-                  strcpy(url,res);
-               }
-            }
-         }
-      } else {
-         if (getword_atoll(&lyear,&gwarea,'-')<0 || getword_atoll(&lmon,&gwarea,'-')<0 ||
-             getword_atoll(&lday,&gwarea,' ')<0) {
-            debuga(_("Invalid date found in file %s\n"),wentp);
-            exit(EXIT_FAILURE);
-          }
-          year=(int)lyear;
-          mon=(int)lmon;
-          day=(int)lday;
-          if (getword(hour,sizeof(hour),&gwarea,' ')<0) {
-             debuga(_("Invalid time found in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          if (getword_skip(MAXLEN,&gwarea,'(')<0 || getword(source,sizeof(source),&gwarea,'/')<0) {
-             debuga(_("Invalid redirected source in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          if (getword(list,sizeof(list),&gwarea,'/')<0) {
-             debuga(_("Invalid redirected list in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword_limit(url,sizeof(url),&gwarea,' ')<0) {
-             debuga(_("Invalid URL in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          if (getword(ip,sizeof(ip),&gwarea,'/')<0) {
-             debuga(_("Invalid source IP in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,' ')<0) {
-             debuga(_("Invalid user in file %s\n"),wentp);
-             exit(EXIT_FAILURE);
-          }
-          /*
-          The URL may be "http://url:port/data" if the method is GET or simply "url:port/" if the method is CONNECT.
-          The following code removes the protocol:// if it is detected and always truncates the URL after the domain name.
-          It will fail if the URL doesn't start with the protocol and contains two consecutive / in the path (i.e.
-          the URL is not normalized).
-          */
-          str=strchr(url,'/');
-          if (str) {
-             if (str[1]=='/') {
-               str+=2;
-               for (i=0 ; *str && *str!='/' ; i++) url[i]=*str++;
-               url[i]='\0';
-             } else {
-               *str='\0';
-             }
-          }
-      }
+       while ((buf=longline_read(fp_in,line)) != NULL) {
+               getword_start(&gwarea,buf);
+               if(RedirectorLogFormat[0] != '\0') {
+                       getword_start(&gwarea1,RedirectorLogFormat);
+                       leks[0]='\0';
+                       if (getword(leks,sizeof(leks),&gwarea1,'#')<0) {
+                               debuga(_("There is a broken record or garbage in your %s file\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       year=0;
+                       mon=0;
+                       day=0;
+                       hour[0]='\0';
+                       source[0]='\0';
+                       list[0]='\0';
+                       ip[0]='\0';
+                       user[0]='\0';
+                       url[0]='\0';
+                       while(strcmp(leks,"end") != 0) {
+                               if (getword(leks,sizeof(leks),&gwarea1,'#')<0 || getword(sep,sizeof(sep),&gwarea1,'#')<0) {
+                                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),wentp);
+                                       exit(EXIT_FAILURE);
+                               }
+                               if(strcmp(leks,"end") != 0) {
+                                       if (getword_limit(res,sizeof(res),&gwarea,sep[0])<0) {
+                                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),wentp);
+                                               exit(EXIT_FAILURE);
+                                       }
+                                       if(strcmp(leks,"year") == 0) {
+                                               year=atoi(res);
+                                       } else if(strcmp(leks,"mon") == 0) {
+                                               mon=atoi(res);
+                                       } else if(strcmp(leks,"day") == 0) {
+                                               day=atoi(res);
+                                       } else if(strcmp(leks,"hour") == 0) {
+                                               if (strlen(res)>=sizeof(hour)) {
+                                                       debuga(_("Hour string too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(hour,res);
+                                       } else if(strcmp(leks,"source") == 0) {
+                                               if (strlen(res)>=sizeof(source)) {
+                                                       debuga(_("Banning source name too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(source,res);
+                                       } else if(strcmp(leks,"list") == 0) {
+                                               if (strlen(res)>=sizeof(list)) {
+                                                       debuga(_("Banning list name too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(list,res);
+                                       } else if(strcmp(leks,"ip") == 0) {
+                                               if (strlen(res)>=sizeof(ip)) {
+                                                       debuga(_("IP address too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(ip,res);
+                                       } else if(strcmp(leks,"user") == 0) {
+                                               if (strlen(res)>=sizeof(user)) {
+                                                       debuga(_("User ID too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(user,res);
+                                       } else if(strcmp(leks,"url") == 0) {
+                                               if (strlen(res)>=sizeof(url)) {
+                                                       debuga(_("URL too long in redirector log file %s\n"),wentp);
+                                                       exit(EXIT_FAILURE);
+                                               }
+                                               strcpy(url,res);
+                                       }
+                               }
+                       }
+               } else {
+                       if (getword_atoll(&lyear,&gwarea,'-')<0 || getword_atoll(&lmon,&gwarea,'-')<0 ||
+                               getword_atoll(&lday,&gwarea,' ')<0) {
+                               debuga(_("Invalid date found in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       year=(int)lyear;
+                       mon=(int)lmon;
+                       day=(int)lday;
+                       if (getword(hour,sizeof(hour),&gwarea,' ')<0) {
+                               debuga(_("Invalid time found in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(MAXLEN,&gwarea,'(')<0 || getword(source,sizeof(source),&gwarea,'/')<0) {
+                               debuga(_("Invalid redirected source in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword(list,sizeof(list),&gwarea,'/')<0) {
+                               debuga(_("Invalid redirected list in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword_limit(url,sizeof(url),&gwarea,' ')<0) {
+                               debuga(_("Invalid URL in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword(ip,sizeof(ip),&gwarea,'/')<0) {
+                               debuga(_("Invalid source IP in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,' ')<0) {
+                               debuga(_("Invalid user in file %s\n"),wentp);
+                               exit(EXIT_FAILURE);
+                       }
+                       /*
+                       The URL may be "http://url:port/data" if the method is GET or simply "url:port/" if the method is CONNECT.
+                       The following code removes the protocol:// if it is detected and always truncates the URL after the domain name.
+                       It will fail if the URL doesn't start with the protocol and contains two consecutive / in the path (i.e.
+                       the URL is not normalized).
+                       */
+                       str=strchr(url,'/');
+                       if (str) {
+                               if (str[1]=='/') {
+                                       str+=2;
+                                       for (i=0 ; *str && *str!='/' ; i++) url[i]=*str++;
+                                       url[i]='\0';
+                               } else {
+                                       *str='\0';
+                               }
+                       }
+               }
 
-      //sprintf(warea,"%04d%02d%02d",year,mon,day);
+               //sprintf(warea,"%04d%02d%02d",year,mon,day);
 
-      if(RedirectorFilterOutDate) {
-         idata = year*10000+mon*100+day;
-         if(idata < dfrom || idata > duntil)
-            continue;
-      }
+               if(RedirectorFilterOutDate) {
+                       idata = year*10000+mon*100+day;
+                       if(idata < dfrom || idata > duntil)
+                               continue;
+               }
 
-      if(UserIp) {
-         strcpy(user,ip);
-         id_is_ip=true;
-      } else {
-         id_is_ip=false;
-         if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) {
-            if(RecordsWithoutUser == RECORDWITHOUTUSER_IP) {
-               strcpy(user,ip);
-               id_is_ip=true;
-            }
-            if(RecordsWithoutUser == RECORDWITHOUTUSER_IGNORE)
-               continue;
-            if(RecordsWithoutUser == RECORDWITHOUTUSER_EVERYBODY)
-               strcpy(user,"everybody");
-         }
-      }
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         uinfo=userinfo_create(user);
-         uinfo->id_is_ip=id_is_ip;
-         if(Ip2Name && id_is_ip) ip2name(user,sizeof(user));
-         user_find(uinfo->label,MAX_USER_LEN, user);
-      }
-      fprintf(fp_ou,"%s\t%04d%02d%02d\t%s\t%s\t%s\t",uinfo->id,year,mon,day,hour,ip,url);
-      if (source[0] && list[0])
-         fprintf(fp_ou,"%s/%s\n",source,list);
-      else if (source[0])
-         fprintf(fp_ou,"%s\n",source);
-      else
-         fprintf(fp_ou,"%s\n",list);
-      squidguard_count++;
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-   return;
+               if(UserIp) {
+                       strcpy(user,ip);
+                       id_is_ip=true;
+               } else {
+                       id_is_ip=false;
+                       if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) {
+                               if(RecordsWithoutUser == RECORDWITHOUTUSER_IP) {
+                                       strcpy(user,ip);
+                                       id_is_ip=true;
+                               }
+                               if(RecordsWithoutUser == RECORDWITHOUTUSER_IGNORE)
+                                       continue;
+                               if(RecordsWithoutUser == RECORDWITHOUTUSER_EVERYBODY)
+                                       strcpy(user,"everybody");
+                       }
+               }
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       uinfo=userinfo_create(user);
+                       uinfo->id_is_ip=id_is_ip;
+                       if(Ip2Name && id_is_ip) ip2name(user,sizeof(user));
+                       user_find(uinfo->label,MAX_USER_LEN, user);
+               }
+               fprintf(fp_ou,"%s\t%04d%02d%02d\t%s\t%s\t%s\t",uinfo->id,year,mon,day,hour,ip,url);
+               if (source[0] && list[0])
+                       fprintf(fp_ou,"%s/%s\n",source,list);
+               else if (source[0])
+                       fprintf(fp_ou,"%s\n",source);
+               else
+                       fprintf(fp_ou,"%s\n",list);
+               squidguard_count++;
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+       return;
 }
 
 
 void squidguard_log(void)
 {
-   FILE *fp_ou = NULL, *fp_guard = NULL;
-   char buf[MAXLEN];
-   char guard_in[MAXLEN];
-   char guard_ou[MAXLEN];
-   char logdir[MAXLEN];
-   char user[MAXLEN];
-   char tmp6[MAXLEN];
-   int i;
-   int  y;
-   int cstatus;
-   int dfrom, duntil;
-   char *str;
-   char *str2;
+       FILE *fp_ou = NULL, *fp_guard = NULL;
+       char buf[MAXLEN];
+       char guard_in[MAXLEN];
+       char guard_ou[MAXLEN];
+       char logdir[MAXLEN];
+       char user[MAXLEN];
+       char tmp6[MAXLEN];
+       int i;
+       int  y;
+       int cstatus;
+       int dfrom, duntil;
+       char *str;
+       char *str2;
 
-   str2 = user;
+       str2 = user;
 
-   if(SquidGuardConf[0] == '\0' && NRedirectorLogs == 0)
-     return;
+       if(SquidGuardConf[0] == '\0' && NRedirectorLogs == 0)
+       return;
 
-   sprintf(guard_in,"%s/redirector.unsort",tmp);
-   sprintf(guard_ou,"%s/redirector.log",tmp);
-   if((fp_ou=fopen(guard_in,"a"))==NULL) {
-      debuga(_("(squidguard) Cannot open log file %s\n"),guard_in);
-      exit(EXIT_FAILURE);
-   }
+       sprintf(guard_in,"%s/redirector.unsort",tmp);
+       sprintf(guard_ou,"%s/redirector.log",tmp);
+       if((fp_ou=fopen(guard_in,"a"))==NULL) {
+               debuga(_("(squidguard) Cannot open log file %s\n"),guard_in);
+               exit(EXIT_FAILURE);
+       }
 
-   dfrom=(period.start.tm_year+1900)*10000+(period.start.tm_mon+1)*100+period.start.tm_mday;
-   duntil=(period.end.tm_year+1900)*10000+(period.end.tm_mon+1)*100+period.end.tm_mday;
+       dfrom=(period.start.tm_year+1900)*10000+(period.start.tm_mon+1)*100+period.start.tm_mday;
+       duntil=(period.end.tm_year+1900)*10000+(period.end.tm_mon+1)*100+period.end.tm_mday;
 
-   if (NRedirectorLogs>0) {
-      for (i=0 ; i<NRedirectorLogs ; i++)
-         read_log(RedirectorLogs[i],fp_ou,dfrom,duntil);
-   } else {
-      if(access(SquidGuardConf, R_OK) != 0) {
-         debuga(_("Cannot open squidGuard config file: %s\n"),SquidGuardConf);
-         exit(EXIT_FAILURE);
-      }
+       if (NRedirectorLogs>0) {
+               for (i=0 ; i<NRedirectorLogs ; i++)
+                       read_log(RedirectorLogs[i],fp_ou,dfrom,duntil);
+       } else {
+               if(access(SquidGuardConf, R_OK) != 0) {
+                       debuga(_("Cannot open squidGuard config file: %s\n"),SquidGuardConf);
+                       exit(EXIT_FAILURE);
+               }
 
-      if((fp_guard=fopen(SquidGuardConf,"r"))==NULL) {
-         debuga(_("(squidguard) Cannot open log file %s\n"),SquidGuardConf);
-         exit(EXIT_FAILURE);
-      }
+               if((fp_guard=fopen(SquidGuardConf,"r"))==NULL) {
+                       debuga(_("(squidguard) Cannot open log file %s\n"),SquidGuardConf);
+                       exit(EXIT_FAILURE);
+               }
 
-      logdir[0]=0;
-      while(fgets(buf,sizeof(buf),fp_guard)!=NULL) {
-         fixendofline(buf);
-         if((str=get_param_value("logdir",buf))!=NULL) {
-            /*
-            We want to tolerate spaces inside the directory name but we must also
-            remove the trailing spaces left by the editor after the directory name.
-            This should not be a problem as nobody use a file name with trailing spaces.
-            */
-            for (y=strlen(str)-1 ; y>=0 && (unsigned char)str[y]<=' ' ; y--);
-            if (y>=sizeof(logdir)-1) y=sizeof(logdir)-2;
-            logdir[y+1] = '\0';
-            while (y>=0) {
-               logdir[y] = str[y];
-               y--;
-            }
-         } else if((str=get_param_value("log",buf))!=NULL) {
-            if((str2=get_param_value("anonymous",str))!=NULL)
-               str=str2;
+               logdir[0]=0;
+               while(fgets(buf,sizeof(buf),fp_guard)!=NULL) {
+                       fixendofline(buf);
+                       if((str=get_param_value("logdir",buf))!=NULL) {
+                               /*
+                               We want to tolerate spaces inside the directory name but we must also
+                               remove the trailing spaces left by the editor after the directory name.
+                               This should not be a problem as nobody use a file name with trailing spaces.
+                               */
+                               for (y=strlen(str)-1 ; y>=0 && (unsigned char)str[y]<=' ' ; y--);
+                               if (y>=sizeof(logdir)-1) y=sizeof(logdir)-2;
+                               logdir[y+1] = '\0';
+                               while (y>=0) {
+                                       logdir[y] = str[y];
+                                       y--;
+                               }
+                       } else if((str=get_param_value("log",buf))!=NULL) {
+                               if((str2=get_param_value("anonymous",str))!=NULL)
+                                       str=str2;
 
-            /*
-            If logdir is defined, we prepend it to the log file name, otherwise, we assume
-            the log directive provides an absolute file name to the log file. Therefore,
-            we don't need to add an additionnal / at the beginning of the log file name.
-            */
-            y=(logdir[0]) ? sprintf(wentp,"%s/",logdir) : 0;
-            /*
-            Spaces are allowed in the name of the log file. The file name ends at the first #
-            because it is assumed it is an end of line comment. Any space before the # is then
-            removed. Any control character (i.e. a character with a code lower than 32) ends
-            the file name. That includes the terminating zero.
-            */
-            while((unsigned char)*str>=' ' && *str!='#' && y<sizeof(wentp)-1)
-               wentp[y++]=*str++;
-            if(*str=='#') {
-               str--;
-               while(*str==' ' && y>0) {
-                  str--;
-                  y--;
-               }
-            }
-            wentp[y]=0;
-            read_log(wentp,fp_ou,dfrom,duntil);
-         }
-      }
-   }
+                               /*
+                               If logdir is defined, we prepend it to the log file name, otherwise, we assume
+                               the log directive provides an absolute file name to the log file. Therefore,
+                               we don't need to add an additionnal / at the beginning of the log file name.
+                               */
+                               y=(logdir[0]) ? sprintf(wentp,"%s/",logdir) : 0;
+                               /*
+                               Spaces are allowed in the name of the log file. The file name ends at the first #
+                               because it is assumed it is an end of line comment. Any space before the # is then
+                               removed. Any control character (i.e. a character with a code lower than 32) ends
+                               the file name. That includes the terminating zero.
+                               */
+                               while((unsigned char)*str>=' ' && *str!='#' && y<sizeof(wentp)-1)
+                                       wentp[y++]=*str++;
+                               if(*str=='#') {
+                                       str--;
+                                       while(*str==' ' && y>0) {
+                                               str--;
+                                               y--;
+                                       }
+                               }
+                               wentp[y]=0;
+                               read_log(wentp,fp_ou,dfrom,duntil);
+                       }
+               }
+       }
 
-   if (fp_guard) fclose(fp_guard);
-   if (fp_ou) fclose(fp_ou);
+       if (fp_guard) fclose(fp_guard);
+       if (fp_ou) fclose(fp_ou);
 
-   if (files_done) {
-      for (y=0; y<nfiles_done; y++)
-         if (files_done[y]) free(files_done[y]);
-      free(files_done);
-   }
+       if (files_done) {
+               for (y=0; y<nfiles_done; y++)
+                       if (files_done[y]) free(files_done[y]);
+               free(files_done);
+       }
 
-   if(debug) {
-      debuga(_("Sorting file: %s\n"),guard_ou);
-   }
+       if(debug) {
+               debuga(_("Sorting file: %s\n"),guard_ou);
+       }
 
-   sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 \"%s\" -o \"%s\"",guard_in, guard_ou);
-   cstatus=system(tmp6);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),tmp6);
-      exit(EXIT_FAILURE);
-   }
+       sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 \"%s\" -o \"%s\"",guard_in, guard_ou);
+       cstatus=system(tmp6);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),tmp6);
+               exit(EXIT_FAILURE);
+       }
 
-   unlink(guard_in);
-   return;
+       unlink(guard_in);
+       return;
 }
index 31aadb17f2e0f371a49d2b9bb937a0701a0b962f..c00d3d480c4aef12675834b339cb8c7e14d75aff 100644 (file)
 
 void squidguard_report(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL;
-
-   char *buf;
-   char *url;
-   char squidguard_in[MAXLEN];
-   char report[MAXLEN];
-   char ip[MAXLEN];
-   char rule[255];
-   char oip[MAXLEN];
-   char user[MAXLEN];
-   char ouser[MAXLEN];
-   char data[15];
-   char hora[15];
-   char ouser2[255];
-   char oname[MAXLEN];
-   bool  z=false;
-   int  count=0;
-   long long int data2;
-   bool new_user;
-   struct getwordstruct gwarea;
-   const struct userinfostruct *uinfo;
-   struct tm t;
-   longline line;
-
-   ouser[0]='\0';
-   ouser2[0]='\0';
-
-   sprintf(squidguard_in,"%s/redirector.log",tmp);
-   if(!squidguard_count) {
-      unlink(squidguard_in);
-      return;
-   }
-
-   snprintf(report,sizeof(report),"%s/redirector.html",outdirname);
-
-   if((fp_in=fopen(squidguard_in,"r"))==NULL) {
-     debuga(_("(squidguard) Cannot open log file %s\n"),squidguard_in);
-     exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=fopen(report,"w"))==NULL) {
-     debuga(_("(squidguard) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the processed redirector log\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Redirector report"),HTML_JS_NONE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Redirector report"));
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=1 cellspacing=2>\n",fp_ou);
-   fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"),_("RULE"));
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("Invalid user in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&data2,&gwarea,'\t')<0) {
-         debuga(_("Invalid date in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
-         debuga(_("Invalid time in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("Invalid IP address in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("Invalid URL in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(rule,sizeof(rule),&gwarea,'\n')<0) {
-         debuga(_("Invalid rule in file %s\n"),squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,squidguard_in);
-         exit(EXIT_FAILURE);
-      }
-
-      computedate(data2/10000,(data2/100)%10,data2%100,&t);
-      strftime(data,sizeof(data),"%x",&t);
-
-      new_user=false;
-      if(!z) {
-         strcpy(ouser,user);
-         strcpy(oip,ip);
-         strcpy(oname,ip);
-         if (Ip2Name && !uinfo->id_is_ip) ip2name(oname,sizeof(oname));
-         z=true;
-         new_user=true;
-      } else {
-         if(strcmp(ouser,user) != 0) {
-            strcpy(ouser,user);
-            new_user=true;
-         }
-         if(strcmp(oip,ip) != 0) {
-            strcpy(oip,ip);
-            strcpy(oname,ip);
-            if (Ip2Name && !uinfo->id_is_ip) ip2name(oname,sizeof(oname));
-            new_user=true;
-         }
-      }
-
-      if(SquidGuardReportLimit) {
-         if(strcmp(ouser2,uinfo->label) == 0) {
-            count++;
-         } else {
-            count=1;
-            strcpy(ouser2,uinfo->label);
-         }
-         if(count >= SquidGuardReportLimit)
-            continue;
-      }
-
-      if (new_user)
-         fprintf(fp_ou,"<tr><td class=\"data2\">%s</td><td class=\"data2\">%s</td>",uinfo->label,ip);
-      else
-         fputs("<tr><td class=\"data2\"></td><td class=\"data2\"></td>",fp_ou);
-      fprintf(fp_ou,"<td class=\"data2\">%s-%s</td><td class=\"data2\"><a href=\"http://",data,hora);
-      output_html_url(fp_ou,url);
-      fputs("\">",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fprintf(fp_ou,"</a></td><td class=\"data2\">%s</td></tr>\n",rule);
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   unlink(squidguard_in);
-
-   return;
+       FILE *fp_in = NULL, *fp_ou = NULL;
+
+       char *buf;
+       char *url;
+       char squidguard_in[MAXLEN];
+       char report[MAXLEN];
+       char ip[MAXLEN];
+       char rule[255];
+       char oip[MAXLEN];
+       char user[MAXLEN];
+       char ouser[MAXLEN];
+       char data[15];
+       char hora[15];
+       char ouser2[255];
+       char oname[MAXLEN];
+       bool  z=false;
+       int  count=0;
+       long long int data2;
+       bool new_user;
+       struct getwordstruct gwarea;
+       const struct userinfostruct *uinfo;
+       struct tm t;
+       longline line;
+
+       ouser[0]='\0';
+       ouser2[0]='\0';
+
+       sprintf(squidguard_in,"%s/redirector.log",tmp);
+       if(!squidguard_count) {
+               unlink(squidguard_in);
+               return;
+       }
+
+       snprintf(report,sizeof(report),"%s/redirector.html",outdirname);
+
+       if((fp_in=fopen(squidguard_in,"r"))==NULL) {
+       debuga(_("(squidguard) Cannot open log file %s\n"),squidguard_in);
+       exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=fopen(report,"w"))==NULL) {
+       debuga(_("(squidguard) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the processed redirector log\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Redirector report"),HTML_JS_NONE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Redirector report"));
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=1 cellspacing=2>\n",fp_ou);
+       fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"),_("RULE"));
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("Invalid user in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&data2,&gwarea,'\t')<0) {
+                       debuga(_("Invalid date in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
+                       debuga(_("Invalid time in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("Invalid IP address in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("Invalid URL in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(rule,sizeof(rule),&gwarea,'\n')<0) {
+                       debuga(_("Invalid rule in file %s\n"),squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,squidguard_in);
+                       exit(EXIT_FAILURE);
+               }
+
+               computedate(data2/10000,(data2/100)%10,data2%100,&t);
+               strftime(data,sizeof(data),"%x",&t);
+
+               new_user=false;
+               if(!z) {
+                       strcpy(ouser,user);
+                       strcpy(oip,ip);
+                       strcpy(oname,ip);
+                       if (Ip2Name && !uinfo->id_is_ip) ip2name(oname,sizeof(oname));
+                       z=true;
+                       new_user=true;
+               } else {
+                       if(strcmp(ouser,user) != 0) {
+                               strcpy(ouser,user);
+                               new_user=true;
+                       }
+                       if(strcmp(oip,ip) != 0) {
+                               strcpy(oip,ip);
+                               strcpy(oname,ip);
+                               if (Ip2Name && !uinfo->id_is_ip) ip2name(oname,sizeof(oname));
+                               new_user=true;
+                       }
+               }
+
+               if(SquidGuardReportLimit) {
+                       if(strcmp(ouser2,uinfo->label) == 0) {
+                               count++;
+                       } else {
+                               count=1;
+                               strcpy(ouser2,uinfo->label);
+                       }
+                       if(count >= SquidGuardReportLimit)
+                               continue;
+               }
+
+               if (new_user)
+                       fprintf(fp_ou,"<tr><td class=\"data2\">%s</td><td class=\"data2\">%s</td>",uinfo->label,ip);
+               else
+                       fputs("<tr><td class=\"data2\"></td><td class=\"data2\"></td>",fp_ou);
+               fprintf(fp_ou,"<td class=\"data2\">%s-%s</td><td class=\"data2\"><a href=\"http://",data,hora);
+               output_html_url(fp_ou,url);
+               fputs("\">",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fprintf(fp_ou,"</a></td><td class=\"data2\">%s</td></tr>\n",rule);
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       unlink(squidguard_in);
+
+       return;
 }
index 0ae966e56b0ba21d5ee847f14ee8a25390d95a56..eca6745e2a6f933578c813147278ee09f72d5238 100644 (file)
 
 void topsites(void)
 {
-
-   FILE *fp_in, *fp_ou;
-
-   char *buf;
-   char *url;
-   char *ourl=NULL;
-   char csort[255];
-   char general[MAXLEN];
-   char general2[MAXLEN];
-   char general3[MAXLEN];
-   char sites[MAXLEN];
-   char report[MAXLEN];
-   const char *sortf;
-   const char *sortt;
-   long long int nacc;
-   long long int nbytes;
-   long long int ntime;
-   long long int tnacc=0;
-   long long int tnbytes=0;
-   long long int tntime=0;
-   long long int twork1=0, twork2=0, twork3=0;
-   int regs=0;
-   int cstatus;
-   int url_len;
-   int ourl_size=0;
-   struct getwordstruct gwarea;
-   longline line;
-   struct generalitemstruct item;
-
-   if(Privacy)
-      return;
-
-   sprintf(general,"%s/sarg-general",outdirname);
-   sprintf(sites,"%s/sarg-sites",outdirname);
-   sprintf(general2,"%s/sarg-general2",outdirname);
-   sprintf(general3,"%s/sarg-general3",outdirname);
-
-   if ((ReportType & REPORT_TYPE_TOPUSERS) == 0)
-      sprintf(report,"%s/index.html",outdirname);
-   else
-      sprintf(report,"%s/topsites.html",outdirname);
-
-   sprintf(csort,"sort -k 4,4 -o \"%s\" \"%s\"",general2,general);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_in=fopen(general2,"r"))==NULL) {
-     debuga(_("(topsites) Cannot open log file %s\n"),general2);
-     debuga(_("sort command: %s\n"),csort);
-     exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=fopen(general3,"w"))==NULL) {
-     debuga(_("(topsites) Cannot open log file %s\n"),general3);
-     exit(EXIT_FAILURE);
-   }
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),general2);
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      ger_read(buf,&item,general2);
-      if(item.total) continue;
-
-      if(!regs) {
-         url_len=strlen(item.url);
-         if (!ourl || url_len>=ourl_size) {
-            ourl_size=url_len+1;
-            ourl=realloc(ourl,ourl_size);
-            if (!ourl) {
-               debuga(_("Not enough memory to store the url\n"));
-               exit(EXIT_FAILURE);
-            }
-         }
-         strcpy(ourl,item.url);
-         regs++;
-      }
-
-      if(strcmp(item.url,ourl) != 0) {
-         /*
-         This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-         to print a long long int unless it is exactly 64-bits long.
-         */
-         fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%s\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)tntime,ourl);
-         url_len=strlen(item.url);
-         if (url_len>=ourl_size) {
-            ourl_size=url_len+1;
-            ourl=realloc(ourl,ourl_size);
-            if (!ourl) {
-               debuga(_("Not enough memory to store the url\n"));
-               exit(EXIT_FAILURE);
-            }
-         }
-         strcpy(ourl,item.url);
-         tnacc=0;
-         tnbytes=0;
-         tntime=0;
-      }
-
-      tnacc+=item.nacc;
-      tnbytes+=item.nbytes;
-      tntime+=item.nelap;
-   }
-   fclose(fp_in);
-   unlink(general2);
-   longline_destroy(&line);
-
-   if (ourl) {
-      /*
-      This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-      to print a long long int unless it is exactly 64-bits long.
-      */
-      fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%s\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)tntime,ourl);
-      free(ourl);
-   }
-
-   fclose(fp_ou);
-
-   if((TopsitesSort & TOPSITE_SORT_CONNECT) != 0) {
-      sortf="-k 1,1 -k 2,2";
-   } else if((TopsitesSort & TOPSITE_SORT_BYTES) != 0) {
-      sortf="-k 2,2 -k 1,1";
-   } else if((TopsitesSort & TOPSITE_SORT_TIME) != 0) {
-      sortf="-k 3,3";
-   } else {
-      sortf="-k 2,2 -k 1,1"; //default is BYTES
-   }
-   if((TopsitesSort & TOPSITE_SORT_REVERSE) != 0) {
-      sortt="-r";
-   } else {
-      sortt="";
-   }
-
-   sprintf(csort,"sort %s -n %s -o \"%s\" \"%s\"",sortt,sortf,sites,general3);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(sites,"r"))==NULL) {
-      debuga(_("(topsites) Cannot open log file %s\n"),sites);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(general2);
-   unlink(general3);
-
-   if((fp_ou=fopen(report,"w"))==NULL) {
-     debuga(_("(topsites) Cannot open log file %s\n"),report);
-     exit(EXIT_FAILURE);
-   }
-
-   write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Top sites"),HTML_JS_SORTTABLE);
-   fputs("<tr><td class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_ou);
-   fputs("<tr><th class=\"header_c\">",fp_ou);
-   fprintf(fp_ou,_("Top %d sites"),TopSitesNum);
-   fputs("</th></tr>\n",fp_ou);
-   close_html_header(fp_ou);
-
-   fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_ou);
-   if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
-   fputs(">\n",fp_ou);
-   fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l",_("NUM"));
-   if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
-   fprintf(fp_ou,"\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr></thead>\n",_("ACCESSED SITE"),_("CONNECT"),_("BYTES"),_("TIME"));
-
-   regs=0;
-   ntopsites = 0;
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read file %s\n"),sites);
-      exit(EXIT_FAILURE);
-   }
-
-   while(regs<TopSitesNum && (buf=longline_read(fp_in,line))!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword_atoll(&nacc,&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),sites);
-         exit(EXIT_FAILURE);
-      }
-      if (nacc == 0) continue;
-      if (getword_atoll(&nbytes,&gwarea,'\t')<0 || getword_atoll(&ntime,&gwarea,'\t')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),sites);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
-         debuga(_("The url is invalid in file %s\n"),sites);
-         exit(EXIT_FAILURE);
-      }
-
-      twork1=nacc;
-      twork2=nbytes;
-      twork3=ntime;
-
-      fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2 link\">",++regs);
-
-      if(BlockIt[0] != '\0') {
-         fprintf(fp_ou,"<a href=\"%s%s?url=\"",wwwDocumentRoot,BlockIt);
-         output_html_url(fp_ou,url);
-         fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
-      }
-
-      fputs("<a href=\"http://",fp_ou);
-      output_html_url(fp_ou,url);
-      fputs("\">",fp_ou);
-      output_html_string(fp_ou,url,100);
-      fputs("</a></td><td class=\"data\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork1);
-      fprintf(fp_ou,">%s</td>",fixnum(twork1,1));
-      fputs("<td class=\"data\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork2);
-      fprintf(fp_ou,">%s</td>",fixnum(twork2,1));
-      fputs("<td class=\"data\"",fp_ou);
-      if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork3);
-      fprintf(fp_ou,">%s</td></tr>\n",fixtime(twork3));
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   fputs("</table></div>\n",fp_ou);
-   if (write_html_trailer(fp_ou)<0)
-      debuga(_("Write error in file %s\n"),report);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
-
-   return;
-
+       FILE *fp_in, *fp_ou;
+
+       char *buf;
+       char *url;
+       char *ourl=NULL;
+       char csort[255];
+       char general[MAXLEN];
+       char general2[MAXLEN];
+       char general3[MAXLEN];
+       char sites[MAXLEN];
+       char report[MAXLEN];
+       const char *sortf;
+       const char *sortt;
+       long long int nacc;
+       long long int nbytes;
+       long long int ntime;
+       long long int tnacc=0;
+       long long int tnbytes=0;
+       long long int tntime=0;
+       long long int twork1=0, twork2=0, twork3=0;
+       int regs=0;
+       int cstatus;
+       int url_len;
+       int ourl_size=0;
+       struct getwordstruct gwarea;
+       longline line;
+       struct generalitemstruct item;
+
+       if(Privacy)
+               return;
+
+       sprintf(general,"%s/sarg-general",outdirname);
+       sprintf(sites,"%s/sarg-sites",outdirname);
+       sprintf(general2,"%s/sarg-general2",outdirname);
+       sprintf(general3,"%s/sarg-general3",outdirname);
+
+       if ((ReportType & REPORT_TYPE_TOPUSERS) == 0)
+               sprintf(report,"%s/index.html",outdirname);
+       else
+               sprintf(report,"%s/topsites.html",outdirname);
+
+       sprintf(csort,"sort -k 4,4 -o \"%s\" \"%s\"",general2,general);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_in=fopen(general2,"r"))==NULL) {
+       debuga(_("(topsites) Cannot open log file %s\n"),general2);
+       debuga(_("sort command: %s\n"),csort);
+       exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=fopen(general3,"w"))==NULL) {
+       debuga(_("(topsites) Cannot open log file %s\n"),general3);
+       exit(EXIT_FAILURE);
+       }
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),general2);
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               ger_read(buf,&item,general2);
+               if(item.total) continue;
+
+               if(!regs) {
+                       url_len=strlen(item.url);
+                       if (!ourl || url_len>=ourl_size) {
+                               ourl_size=url_len+1;
+                               ourl=realloc(ourl,ourl_size);
+                               if (!ourl) {
+                                       debuga(_("Not enough memory to store the url\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+                       strcpy(ourl,item.url);
+                       regs++;
+               }
+
+               if(strcmp(item.url,ourl) != 0) {
+                       /*
+                       This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+                       to print a long long int unless it is exactly 64-bits long.
+                       */
+                       fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%s\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)tntime,ourl);
+                       url_len=strlen(item.url);
+                       if (url_len>=ourl_size) {
+                               ourl_size=url_len+1;
+                               ourl=realloc(ourl,ourl_size);
+                               if (!ourl) {
+                                       debuga(_("Not enough memory to store the url\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+                       strcpy(ourl,item.url);
+                       tnacc=0;
+                       tnbytes=0;
+                       tntime=0;
+               }
+
+               tnacc+=item.nacc;
+               tnbytes+=item.nbytes;
+               tntime+=item.nelap;
+       }
+       fclose(fp_in);
+       unlink(general2);
+       longline_destroy(&line);
+
+       if (ourl) {
+               /*
+               This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+               to print a long long int unless it is exactly 64-bits long.
+               */
+               fprintf(fp_ou,"%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%s\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)tntime,ourl);
+               free(ourl);
+       }
+
+       fclose(fp_ou);
+
+       if((TopsitesSort & TOPSITE_SORT_CONNECT) != 0) {
+               sortf="-k 1,1 -k 2,2";
+       } else if((TopsitesSort & TOPSITE_SORT_BYTES) != 0) {
+               sortf="-k 2,2 -k 1,1";
+       } else if((TopsitesSort & TOPSITE_SORT_TIME) != 0) {
+               sortf="-k 3,3";
+       } else {
+               sortf="-k 2,2 -k 1,1"; //default is BYTES
+       }
+       if((TopsitesSort & TOPSITE_SORT_REVERSE) != 0) {
+               sortt="-r";
+       } else {
+               sortt="";
+       }
+
+       sprintf(csort,"sort %s -n %s -o \"%s\" \"%s\"",sortt,sortf,sites,general3);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(sites,"r"))==NULL) {
+               debuga(_("(topsites) Cannot open log file %s\n"),sites);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(general2);
+       unlink(general3);
+
+       if((fp_ou=fopen(report,"w"))==NULL) {
+       debuga(_("(topsites) Cannot open log file %s\n"),report);
+       exit(EXIT_FAILURE);
+       }
+
+       write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Top sites"),HTML_JS_SORTTABLE);
+       fputs("<tr><td class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_ou);
+       fputs("<tr><th class=\"header_c\">",fp_ou);
+       fprintf(fp_ou,_("Top %d sites"),TopSitesNum);
+       fputs("</th></tr>\n",fp_ou);
+       close_html_header(fp_ou);
+
+       fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_ou);
+       if (SortTableJs[0]) fputs(" class=\"sortable\"",fp_ou);
+       fputs(">\n",fp_ou);
+       fprintf(fp_ou,"<thead><tr><th class=\"header_l\">%s</th><th class=\"header_l",_("NUM"));
+       if (SortTableJs[0]) fputs(" sorttable_alpha",fp_ou);
+       fprintf(fp_ou,"\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr></thead>\n",_("ACCESSED SITE"),_("CONNECT"),_("BYTES"),_("TIME"));
+
+       regs=0;
+       ntopsites = 0;
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read file %s\n"),sites);
+               exit(EXIT_FAILURE);
+       }
+
+       while(regs<TopSitesNum && (buf=longline_read(fp_in,line))!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword_atoll(&nacc,&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),sites);
+                       exit(EXIT_FAILURE);
+               }
+               if (nacc == 0) continue;
+               if (getword_atoll(&nbytes,&gwarea,'\t')<0 || getword_atoll(&ntime,&gwarea,'\t')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),sites);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
+                       debuga(_("The url is invalid in file %s\n"),sites);
+                       exit(EXIT_FAILURE);
+               }
+
+               twork1=nacc;
+               twork2=nbytes;
+               twork3=ntime;
+
+               fprintf(fp_ou,"<tr><td class=\"data\">%d</td><td class=\"data2 link\">",++regs);
+
+               if(BlockIt[0] != '\0') {
+                       fprintf(fp_ou,"<a href=\"%s%s?url=\"",wwwDocumentRoot,BlockIt);
+                       output_html_url(fp_ou,url);
+                       fputs("\"><img src=\"../images/sarg-squidguard-block.png\"></a>&nbsp;",fp_ou);
+               }
+
+               fputs("<a href=\"http://",fp_ou);
+               output_html_url(fp_ou,url);
+               fputs("\">",fp_ou);
+               output_html_string(fp_ou,url,100);
+               fputs("</a></td><td class=\"data\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork1);
+               fprintf(fp_ou,">%s</td>",fixnum(twork1,1));
+               fputs("<td class=\"data\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork2);
+               fprintf(fp_ou,">%s</td>",fixnum(twork2,1));
+               fputs("<td class=\"data\"",fp_ou);
+               if (SortTableJs[0]) fprintf(fp_ou," sorttable_customkey=\"%"PRId64"\"",(uint64_t)twork3);
+               fprintf(fp_ou,">%s</td></tr>\n",fixtime(twork3));
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       fputs("</table></div>\n",fp_ou);
+       if (write_html_trailer(fp_ou)<0)
+               debuga(_("Write error in file %s\n"),report);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),report,strerror(errno));
+
+       return;
 }
index 9d269560f0531e5fc966da311a6844038742b2bd..b2a3e4329bbd6801a83220d9f796f49a9a2c43d4 100644 (file)
--- a/topuser.c
+++ b/topuser.c
 
 void topuser(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL, *fp_top1 = NULL, *fp_top2 = NULL, *fp_top3 = NULL;
-   long long int ttnbytes=0, ttnacc=0, tnacc=0;
-   long long int tnbytes=0, ttnelap=0, tnelap=0;
-   long long int tnincache=0, tnoucache=0, ttnincache=0, ttnoucache=0;
-   long long int nbytes;
-   long long int nacc;
-   long long int elap, incac, oucac;
-   double perc=0.00;
-   double perc2=0.00;
-   double inperc=0.00, ouperc=0.00;
-   int posicao=0;
-   char olduser[MAX_USER_LEN], csort[MAXLEN];
-   char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN];
-   char user[MAX_USER_LEN], tusr[MAXLEN];
-   char ipantes[MAXLEN], nameantes[MAXLEN];
-   const char *sfield="-n -k 2,2";
-   const char *order;
-   const char *sort_field;
-   const char *sort_order;
-   char title[80];
-   char *warea;
-   int  totuser=0;
-   int  topcount=0;
-   int cstatus;
-   struct getwordstruct gwarea;
-   longline line;
-   struct generalitemstruct item;
-   const struct userinfostruct *uinfo;
-
-   ipantes[0]='\0';
-   nameantes[0]='\0';
-
-   ntopuser = 0;
-   snprintf(wger,sizeof(wger),"%s/sarg-general",outdirname);
-   if((fp_in=fopen(wger,"r"))==NULL) {
-      debuga(_("(topuser) Cannot open file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(top2,sizeof(top2),"%s/top.tmp",outdirname);
-   if((fp_top2=fopen(top2,"w"))==NULL) {
-      debuga(_("(topuser) Cannot open file %s\n"),top2);
-      exit(EXIT_FAILURE);
-   }
-
-   olduser[0]='\0';
-   totuser=0;
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
-
-   while((warea=longline_read(fp_in,line))!=NULL) {
-      ger_read(warea,&item,wger);
-      if(item.total) continue;
-      if(strcmp(olduser,item.user) != 0) {
-         totuser++;
-
-         if (olduser[0] != '\0') {
-            /*
-            This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-            to print a long long int unless it is exactly 64-bits long.
-            */
-            fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap,(uint64_t)tnincache,(uint64_t)tnoucache);
-
-            ttnbytes+=tnbytes;
-            ttnacc+=tnacc;
-            ttnelap+=tnelap;
-            ttnincache+=tnincache;
-            ttnoucache+=tnoucache;
-         }
-         strcpy(olduser,item.user);
-         tnbytes=0;
-         tnacc=0;
-         tnelap=0;
-         tnincache=0;
-         tnoucache=0;
-      }
-
-      tnbytes+=item.nbytes;
-      tnacc+=item.nacc;
-      tnelap+=item.nelap;
-      tnincache+=item.incache;
-      tnoucache+=item.oucache;
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   if (olduser[0] != '\0') {
-      /*
-      This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-      to print a long long int unless it is exactly 64-bits long.
-      */
-      fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap,(uint64_t)tnincache,(uint64_t)tnoucache);
-
-      ttnbytes+=tnbytes;
-      ttnacc+=tnacc;
-      ttnelap+=tnelap;
-      ttnincache+=tnincache;
-      ttnoucache+=tnoucache;
-   }
-   fclose(fp_top2);
-
-   if((TopuserSort & TOPUSER_SORT_USER) != 0) {
-      sfield="-k 1,1";
-      sort_field=_("user");
-   } else if((TopuserSort & TOPUSER_SORT_CONNECT) != 0) {
-      sfield="-n -k 3,3";
-      sort_field=_("connect");
-   } else if((TopuserSort & TOPUSER_SORT_TIME) != 0) {
-      sfield="-n -k 4,4";
-      sort_field=_("time");
-   } else {
-      sort_field=_("bytes");
-   }
-
-   if((TopuserSort & TOPUSER_SORT_REVERSE) == 0) {
-      order="";
-      sort_order=_("normal");
-   } else {
-      order="-r";
-      sort_order=_("reverse");
-   }
-
-   snprintf(top1,sizeof(top1),"%s/top",outdirname);
-   sprintf(csort,"sort -T \"%s\" %s %s -o \"%s\" \"%s\"", tmp, order, sfield, top1, top2);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_top1=fopen(top1,"r"))==NULL) {
-      debuga(_("(topuser) Cannot open file %s\n"),top1);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(top2);
-
-   snprintf(top3,sizeof(top3),"%s/index.html",outdirname);
-   if((fp_top3=fopen(top3,"w"))==NULL) {
-      debuga(_("(topuser) Cannot open file %s\n"),top3);
-      exit(EXIT_FAILURE);
-   }
-
-   snprintf(title,sizeof(title),_("SARG report for %s"),period.text);
-   write_html_header(fp_top3,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,title,HTML_JS_SORTTABLE);
-   fputs("<tr><td class=\"header_c\">",fp_top3);
-   fprintf(fp_top3,_("Period: %s"),period.html);
-   fputs("</td></tr>\n",fp_top3);
-   fputs("<tr><td class=\"header_c\">",fp_top3);
-   fprintf(fp_top3,_("Sort: %s, %s"),sort_field,sort_order);
-   fputs("</td></tr>\n",fp_top3);
-   fprintf(fp_top3,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Top users"));
-   close_html_header(fp_top3);
-
-   fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_top3);
-
-   if((ReportType & REPORT_TYPE_TOPSITES) != 0 && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"topsites.html\">%s</a></td></tr>\n",_("Top sites"));
-   if((ReportType & REPORT_TYPE_SITES_USERS) != 0 && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"siteuser.html\">%s</a></td></tr>\n",_("Sites & Users"));
-   if(dansguardian_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"dansguardian.html\">%s</a></td></tr>\n",_("DansGuardian"));
-   if(squidguard_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"redirector.html\">%s</a></td></tr>\n",_("Redirector"));
-   if ((ReportType & REPORT_TYPE_DOWNLOADS) != 0 && download_count && !Privacy && ndownload) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"download.html\">%s</a></td></tr>\n",_("Downloads"));
-   if ((ReportType & REPORT_TYPE_DENIED) != 0 && denied_count && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"denied.html\">%s</a></td></tr>\n",_("Denied accesses"));
-   if ((ReportType & REPORT_TYPE_AUTH_FAILURES) != 0 && authfail_count && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"authfail.html\">%s</a></td></tr>\n",_("Authentication Failures"));
-   if(smartfilter) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"smartfilter.html\">%s</a></td></tr>\n",_("SmartFilter"));
-   if(UserAgentLog[0] != '\0' && useragent_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"useragent.html\">%s</a></td></tr>\n",_("Useragent"));
-   fputs("<tr><td></td></tr>\n</table></div>\n",fp_top3);
-
-   if ((ReportType & REPORT_TYPE_TOPUSERS) == 0) {
-      fputs("</body>\n</html>\n",fp_top3);
-      fclose (fp_top3);
-      return;
-   }
-
-   fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_top3);
-   if (SortTableJs[0])
-      fputs(" class=\"sortable\"",fp_top3);
-   fputs(">\n<thead><tr>",fp_top3);
-
-   if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("NUM"));
-   if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0) {
-      fputs("<th class=\"header_l",fp_top3);
-      if (SortTableJs[0]) fputs(" sorttable_nosort",fp_top3);
-      fputs("\"></th>",fp_top3);
-   }
-   if((TopUserFields & TOPUSERFIELDS_USERID) != 0) {
-      fputs("<th class=\"header_l",fp_top3);
-      if (SortTableJs[0]) fputs(" sorttable_alpha",fp_top3);
-      fprintf(fp_top3,"\">%s</th>",_("USERID"));
-   }
-   if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("CONNECT"));
-   if((TopUserFields & TOPUSERFIELDS_BYTES) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("BYTES"));
-   if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%%%s</th>",_("BYTES"));
-   if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
-      fprintf(fp_top3,"<th class=\"header_c\" colspan=\"2\">%s</th><th style=\"display:none;\"></th>",_("IN-CACHE-OUT"));
-   if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("ELAPSED TIME"));
-   if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("MILLISEC"));
-   if((TopUserFields & TOPUSERFIELDS_PTIME) != 0)
-      fprintf(fp_top3,"<th class=\"header_l\">%%%s</th>",_("TIME"));
-
-   fputs("</tr></thead>\n",fp_top3);
-
-   ntopuser = 0;
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the downloaded files\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   while((warea=longline_read(fp_top1,line))!=NULL) {
-      getword_start(&gwarea,warea);
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("There is a broken user in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&nbytes,&gwarea,'\t')<0) {
-         debuga(_("There is a broken number of bytes in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&nacc,&gwarea,'\t')<0) {
-         debuga(_("There is a broken number of access in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&elap,&gwarea,'\t')<0) {
-         debuga(_("There is a broken elpased time in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&incac,&gwarea,'\t')<0) {
-         debuga(_("There is a broken in-cache size in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(&oucac,&gwarea,'\n')<0) {
-         debuga(_("There is a broken out-of-cache size in file %s\n"),top1);
-         exit(EXIT_FAILURE);
-      }
-      if(nacc < 1)
-         continue;
-      ntopuser = 1;
-      if(TopUsersNum > 0 && topcount >= TopUsersNum) break;
-      tnbytes=nbytes;
-      tnelap=elap;
-
-      uinfo=userinfo_find_from_id(user);
-      if (!uinfo) {
-         debuga(_("Unknown user ID %s in file %s\n"),user,top1);
-         exit(EXIT_FAILURE);
-      }
-
-      fputs("<tr>",fp_top3);
-
-      posicao++;
-      if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
-         fprintf(fp_top3,"<td class=\"data\">%d</td>",posicao);
-
-      if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0) {
-         fputs("<td class=\"data2\">",fp_top3);
+       FILE *fp_in = NULL, *fp_ou = NULL, *fp_top1 = NULL, *fp_top2 = NULL, *fp_top3 = NULL;
+       long long int ttnbytes=0, ttnacc=0, tnacc=0;
+       long long int tnbytes=0, ttnelap=0, tnelap=0;
+       long long int tnincache=0, tnoucache=0, ttnincache=0, ttnoucache=0;
+       long long int nbytes;
+       long long int nacc;
+       long long int elap, incac, oucac;
+       double perc=0.00;
+       double perc2=0.00;
+       double inperc=0.00, ouperc=0.00;
+       int posicao=0;
+       char olduser[MAX_USER_LEN], csort[MAXLEN];
+       char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN];
+       char user[MAX_USER_LEN], tusr[MAXLEN];
+       char ipantes[MAXLEN], nameantes[MAXLEN];
+       const char *sfield="-n -k 2,2";
+       const char *order;
+       const char *sort_field;
+       const char *sort_order;
+       char title[80];
+       char *warea;
+       int  totuser=0;
+       int  topcount=0;
+       int cstatus;
+       struct getwordstruct gwarea;
+       longline line;
+       struct generalitemstruct item;
+       const struct userinfostruct *uinfo;
+
+       ipantes[0]='\0';
+       nameantes[0]='\0';
+
+       ntopuser = 0;
+       snprintf(wger,sizeof(wger),"%s/sarg-general",outdirname);
+       if((fp_in=fopen(wger,"r"))==NULL) {
+               debuga(_("(topuser) Cannot open file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(top2,sizeof(top2),"%s/top.tmp",outdirname);
+       if((fp_top2=fopen(top2,"w"))==NULL) {
+               debuga(_("(topuser) Cannot open file %s\n"),top2);
+               exit(EXIT_FAILURE);
+       }
+
+       olduser[0]='\0';
+       totuser=0;
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
+
+       while((warea=longline_read(fp_in,line))!=NULL) {
+               ger_read(warea,&item,wger);
+               if(item.total) continue;
+               if(strcmp(olduser,item.user) != 0) {
+                       totuser++;
+
+                       if (olduser[0] != '\0') {
+                               /*
+                               This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+                               to print a long long int unless it is exactly 64-bits long.
+                               */
+                               fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap,(uint64_t)tnincache,(uint64_t)tnoucache);
+
+                               ttnbytes+=tnbytes;
+                               ttnacc+=tnacc;
+                               ttnelap+=tnelap;
+                               ttnincache+=tnincache;
+                               ttnoucache+=tnoucache;
+                       }
+                       strcpy(olduser,item.user);
+                       tnbytes=0;
+                       tnacc=0;
+                       tnelap=0;
+                       tnincache=0;
+                       tnoucache=0;
+               }
+
+               tnbytes+=item.nbytes;
+               tnacc+=item.nacc;
+               tnelap+=item.nelap;
+               tnincache+=item.incache;
+               tnoucache+=item.oucache;
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       if (olduser[0] != '\0') {
+               /*
+               This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+               to print a long long int unless it is exactly 64-bits long.
+               */
+               fprintf(fp_top2,"%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",olduser,(uint64_t)tnbytes,(uint64_t)tnacc,(uint64_t)tnelap,(uint64_t)tnincache,(uint64_t)tnoucache);
+
+               ttnbytes+=tnbytes;
+               ttnacc+=tnacc;
+               ttnelap+=tnelap;
+               ttnincache+=tnincache;
+               ttnoucache+=tnoucache;
+       }
+       fclose(fp_top2);
+
+       if((TopuserSort & TOPUSER_SORT_USER) != 0) {
+               sfield="-k 1,1";
+               sort_field=_("user");
+       } else if((TopuserSort & TOPUSER_SORT_CONNECT) != 0) {
+               sfield="-n -k 3,3";
+               sort_field=_("connect");
+       } else if((TopuserSort & TOPUSER_SORT_TIME) != 0) {
+               sfield="-n -k 4,4";
+               sort_field=_("time");
+       } else {
+               sort_field=_("bytes");
+       }
+
+       if((TopuserSort & TOPUSER_SORT_REVERSE) == 0) {
+               order="";
+               sort_order=_("normal");
+       } else {
+               order="-r";
+               sort_order=_("reverse");
+       }
+
+       snprintf(top1,sizeof(top1),"%s/top",outdirname);
+       sprintf(csort,"sort -T \"%s\" %s %s -o \"%s\" \"%s\"", tmp, order, sfield, top1, top2);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_top1=fopen(top1,"r"))==NULL) {
+               debuga(_("(topuser) Cannot open file %s\n"),top1);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(top2);
+
+       snprintf(top3,sizeof(top3),"%s/index.html",outdirname);
+       if((fp_top3=fopen(top3,"w"))==NULL) {
+               debuga(_("(topuser) Cannot open file %s\n"),top3);
+               exit(EXIT_FAILURE);
+       }
+
+       snprintf(title,sizeof(title),_("SARG report for %s"),period.text);
+       write_html_header(fp_top3,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,title,HTML_JS_SORTTABLE);
+       fputs("<tr><td class=\"header_c\">",fp_top3);
+       fprintf(fp_top3,_("Period: %s"),period.html);
+       fputs("</td></tr>\n",fp_top3);
+       fputs("<tr><td class=\"header_c\">",fp_top3);
+       fprintf(fp_top3,_("Sort: %s, %s"),sort_field,sort_order);
+       fputs("</td></tr>\n",fp_top3);
+       fprintf(fp_top3,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Top users"));
+       close_html_header(fp_top3);
+
+       fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_top3);
+
+       if((ReportType & REPORT_TYPE_TOPSITES) != 0 && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"topsites.html\">%s</a></td></tr>\n",_("Top sites"));
+       if((ReportType & REPORT_TYPE_SITES_USERS) != 0 && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"siteuser.html\">%s</a></td></tr>\n",_("Sites & Users"));
+       if(dansguardian_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"dansguardian.html\">%s</a></td></tr>\n",_("DansGuardian"));
+       if(squidguard_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"redirector.html\">%s</a></td></tr>\n",_("Redirector"));
+       if ((ReportType & REPORT_TYPE_DOWNLOADS) != 0 && download_count && !Privacy && ndownload) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"download.html\">%s</a></td></tr>\n",_("Downloads"));
+       if ((ReportType & REPORT_TYPE_DENIED) != 0 && denied_count && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"denied.html\">%s</a></td></tr>\n",_("Denied accesses"));
+       if ((ReportType & REPORT_TYPE_AUTH_FAILURES) != 0 && authfail_count && !Privacy) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"authfail.html\">%s</a></td></tr>\n",_("Authentication Failures"));
+       if(smartfilter) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"smartfilter.html\">%s</a></td></tr>\n",_("SmartFilter"));
+       if(UserAgentLog[0] != '\0' && useragent_count) fprintf(fp_top3,"<tr><td class=\"link\" colspan=\"0\"><a href=\"useragent.html\">%s</a></td></tr>\n",_("Useragent"));
+       fputs("<tr><td></td></tr>\n</table></div>\n",fp_top3);
+
+       if ((ReportType & REPORT_TYPE_TOPUSERS) == 0) {
+               fputs("</body>\n</html>\n",fp_top3);
+               fclose (fp_top3);
+               return;
+       }
+
+       fputs("<div class=\"report\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_top3);
+       if (SortTableJs[0])
+               fputs(" class=\"sortable\"",fp_top3);
+       fputs(">\n<thead><tr>",fp_top3);
+
+       if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("NUM"));
+       if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0) {
+               fputs("<th class=\"header_l",fp_top3);
+               if (SortTableJs[0]) fputs(" sorttable_nosort",fp_top3);
+               fputs("\"></th>",fp_top3);
+       }
+       if((TopUserFields & TOPUSERFIELDS_USERID) != 0) {
+               fputs("<th class=\"header_l",fp_top3);
+               if (SortTableJs[0]) fputs(" sorttable_alpha",fp_top3);
+               fprintf(fp_top3,"\">%s</th>",_("USERID"));
+       }
+       if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("CONNECT"));
+       if((TopUserFields & TOPUSERFIELDS_BYTES) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("BYTES"));
+       if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%%%s</th>",_("BYTES"));
+       if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
+               fprintf(fp_top3,"<th class=\"header_c\" colspan=\"2\">%s</th><th style=\"display:none;\"></th>",_("IN-CACHE-OUT"));
+       if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("ELAPSED TIME"));
+       if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("MILLISEC"));
+       if((TopUserFields & TOPUSERFIELDS_PTIME) != 0)
+               fprintf(fp_top3,"<th class=\"header_l\">%%%s</th>",_("TIME"));
+
+       fputs("</tr></thead>\n",fp_top3);
+
+       ntopuser = 0;
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the downloaded files\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       while((warea=longline_read(fp_top1,line))!=NULL) {
+               getword_start(&gwarea,warea);
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("There is a broken user in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&nbytes,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken number of bytes in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&nacc,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken number of access in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&elap,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken elpased time in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&incac,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken in-cache size in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(&oucac,&gwarea,'\n')<0) {
+                       debuga(_("There is a broken out-of-cache size in file %s\n"),top1);
+                       exit(EXIT_FAILURE);
+               }
+               if(nacc < 1)
+                       continue;
+               ntopuser = 1;
+               if(TopUsersNum > 0 && topcount >= TopUsersNum) break;
+               tnbytes=nbytes;
+               tnelap=elap;
+
+               uinfo=userinfo_find_from_id(user);
+               if (!uinfo) {
+                       debuga(_("Unknown user ID %s in file %s\n"),user,top1);
+                       exit(EXIT_FAILURE);
+               }
+
+               fputs("<tr>",fp_top3);
+
+               posicao++;
+               if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
+                       fprintf(fp_top3,"<td class=\"data\">%d</td>",posicao);
+
+               if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0) {
+                       fputs("<td class=\"data2\">",fp_top3);
 #ifdef HAVE_GD
-         if(Graphs && GraphFont[0]!='\0') {
-            //fprintf(fp_top3,"<a href=\"%s/graph_day.png\"><img src=\"%s/graph.png\" title=\"%s\" alt=\"G\"></a>&nbsp;",uinfo->filename,ImageFile,_("Graphic"));
-            fprintf(fp_top3,"<a href=\"%s/graph.html\"><img src=\"%s/graph.png\" title=\"%s\" alt=\"G\"></a>&nbsp;",uinfo->filename,ImageFile,_("Graphic"));
-         }
+                       if(Graphs && GraphFont[0]!='\0') {
+                               //fprintf(fp_top3,"<a href=\"%s/graph_day.png\"><img src=\"%s/graph.png\" title=\"%s\" alt=\"G\"></a>&nbsp;",uinfo->filename,ImageFile,_("Graphic"));
+                               fprintf(fp_top3,"<a href=\"%s/graph.html\"><img src=\"%s/graph.png\" title=\"%s\" alt=\"G\"></a>&nbsp;",uinfo->filename,ImageFile,_("Graphic"));
+                       }
 #endif
-         fprintf(fp_top3,"<a href=\"%s/d%s.html\"><img src=\"%s/datetime.png\" title=\"%s\" alt=\"T\"></a></td>",uinfo->filename,uinfo->filename,ImageFile,_("date/time report"));
-      } else {
-         sprintf(val1,"%s/d%s.html",outdirname,uinfo->filename);
-         unlink(val1);
-      }
-      if((TopUserFields & TOPUSERFIELDS_USERID) != 0) {
-         if((ReportType & REPORT_TYPE_USERS_SITES) == 0)
-            fprintf(fp_top3,"<td class=\"data2\">%s</td>",name);
-         else
-            fprintf(fp_top3,"<td class=\"data2\"><a href=\"%s/%s.html\">%s</a></td>",uinfo->filename,uinfo->filename,uinfo->label);
-      }
-      if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0) {
-         fputs("<td class=\"data\"",fp_top3);
-         if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)nacc);
-         fprintf(fp_top3,">%s</td>",fixnum(nacc,1));
-      }
-      if((TopUserFields & TOPUSERFIELDS_BYTES) != 0) {
-         fputs("<td class=\"data\"",fp_top3);
-         if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnbytes);
-         fprintf(fp_top3,">%s</td>",fixnum(tnbytes,1));
-      }
-      if((TopUserFields & TOPUSERFIELDS_SETYB) != 0) {
-         perc=(ttnbytes) ? tnbytes * 100. / ttnbytes : 0.;
-         fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td>",perc);
-      }
-      if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0) {
-         inperc=(tnbytes) ? incac * 100. / tnbytes : 0.;
-         ouperc=(tnbytes) ? oucac * 100. / tnbytes : 0.;
-         fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td><td class=\"data\">%3.2lf%%</td>",inperc,ouperc);
+                       fprintf(fp_top3,"<a href=\"%s/d%s.html\"><img src=\"%s/datetime.png\" title=\"%s\" alt=\"T\"></a></td>",uinfo->filename,uinfo->filename,ImageFile,_("date/time report"));
+               } else {
+                       sprintf(val1,"%s/d%s.html",outdirname,uinfo->filename);
+                       unlink(val1);
+               }
+               if((TopUserFields & TOPUSERFIELDS_USERID) != 0) {
+                       if((ReportType & REPORT_TYPE_USERS_SITES) == 0)
+                               fprintf(fp_top3,"<td class=\"data2\">%s</td>",name);
+                       else
+                               fprintf(fp_top3,"<td class=\"data2\"><a href=\"%s/%s.html\">%s</a></td>",uinfo->filename,uinfo->filename,uinfo->label);
+               }
+               if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0) {
+                       fputs("<td class=\"data\"",fp_top3);
+                       if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)nacc);
+                       fprintf(fp_top3,">%s</td>",fixnum(nacc,1));
+               }
+               if((TopUserFields & TOPUSERFIELDS_BYTES) != 0) {
+                       fputs("<td class=\"data\"",fp_top3);
+                       if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnbytes);
+                       fprintf(fp_top3,">%s</td>",fixnum(tnbytes,1));
+               }
+               if((TopUserFields & TOPUSERFIELDS_SETYB) != 0) {
+                       perc=(ttnbytes) ? tnbytes * 100. / ttnbytes : 0.;
+                       fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td>",perc);
+               }
+               if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0) {
+                       inperc=(tnbytes) ? incac * 100. / tnbytes : 0.;
+                       ouperc=(tnbytes) ? oucac * 100. / tnbytes : 0.;
+                       fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td><td class=\"data\">%3.2lf%%</td>",inperc,ouperc);
 #ifdef ENABLE_DOUBLE_CHECK_DATA
-         if (fabs(inperc+ouperc-100.)>=0.01) {
-            debuga(_("The total of the in-cache and cache-miss is not 100%% at position %d (user %s)\n"),posicao,uinfo->label);
-         }
+                       if (fabs(inperc+ouperc-100.)>=0.01) {
+                               debuga(_("The total of the in-cache and cache-miss is not 100%% at position %d (user %s)\n"),posicao,uinfo->label);
+                       }
 #endif
-      }
-      if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0) {
-         fputs("<td class=\"data\"",fp_top3);
-         if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnelap);
-         fprintf(fp_top3,">%s</td>",buildtime(tnelap));
-      }
-      if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0) {
-         fputs("<td class=\"data\"",fp_top3);
-         if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnelap);
-         fprintf(fp_top3,">%s</td>",fixnum2(tnelap,1));
-      }
-      if((TopUserFields & TOPUSERFIELDS_PTIME) != 0) {
-         perc2=(ttnelap) ? elap * 100. / ttnelap : 0.;
-         fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td>",perc2);
-      }
-
-      fputs("</tr>\n",fp_top3);
-
-      topcount++;
-   }
-   fclose(fp_top1);
-   unlink(top1);
-   longline_destroy(&line);
-
-   if((TopUserFields & TOPUSERFIELDS_TOTAL) != 0) {
-      fputs("<tfoot><tr>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
-         fputs("<td></td>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0)
-         fputs("<td></td>",fp_top3);
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("TOTAL"));
-
-      if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum(ttnacc,1));
-      if((TopUserFields & TOPUSERFIELDS_BYTES) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%15s</th>",fixnum(ttnbytes,1));
-      if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
-         fputs("<td></td>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
-      {
-         inperc=(ttnbytes) ? ttnincache * 100. / ttnbytes : 0.;
-         ouperc=(ttnbytes) ? ttnoucache *100. / ttnbytes : 0.;
-         fprintf(fp_top3,"<th class=\"header_r\">%3.2lf%%</th><th class=\"header_r\">%3.2lf%%</th>",inperc,ouperc);
+               }
+               if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0) {
+                       fputs("<td class=\"data\"",fp_top3);
+                       if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnelap);
+                       fprintf(fp_top3,">%s</td>",buildtime(tnelap));
+               }
+               if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0) {
+                       fputs("<td class=\"data\"",fp_top3);
+                       if (SortTableJs[0]) fprintf(fp_top3," sorttable_customkey=\"%"PRId64"\"",(int64_t)tnelap);
+                       fprintf(fp_top3,">%s</td>",fixnum2(tnelap,1));
+               }
+               if((TopUserFields & TOPUSERFIELDS_PTIME) != 0) {
+                       perc2=(ttnelap) ? elap * 100. / ttnelap : 0.;
+                       fprintf(fp_top3,"<td class=\"data\">%3.2lf%%</td>",perc2);
+               }
+
+               fputs("</tr>\n",fp_top3);
+
+               topcount++;
+       }
+       fclose(fp_top1);
+       unlink(top1);
+       longline_destroy(&line);
+
+       if((TopUserFields & TOPUSERFIELDS_TOTAL) != 0) {
+               fputs("<tfoot><tr>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
+                       fputs("<td></td>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0)
+                       fputs("<td></td>",fp_top3);
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("TOTAL"));
+
+               if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum(ttnacc,1));
+               if((TopUserFields & TOPUSERFIELDS_BYTES) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%15s</th>",fixnum(ttnbytes,1));
+               if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
+                       fputs("<td></td>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
+               {
+                       inperc=(ttnbytes) ? ttnincache * 100. / ttnbytes : 0.;
+                       ouperc=(ttnbytes) ? ttnoucache *100. / ttnbytes : 0.;
+                       fprintf(fp_top3,"<th class=\"header_r\">%3.2lf%%</th><th class=\"header_r\">%3.2lf%%</th>",inperc,ouperc);
 #ifdef ENABLE_DOUBLE_CHECK_DATA
-         if (fabs(inperc+ouperc-100.)>=0.01) {
-            debuga(_("The total of the in-cache and cache-miss is not 100%%\n"));
-         }
+                       if (fabs(inperc+ouperc-100.)>=0.01) {
+                               debuga(_("The total of the in-cache and cache-miss is not 100%%\n"));
+                       }
 #endif
-      }
-      if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",buildtime(ttnelap));
-      if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum2(ttnelap,1));
-
-      fputs("</tr>\n",fp_top3);
-   }
-
-   if(ntopuser && (TopUserFields & TOPUSERFIELDS_AVERAGE) != 0) {
-      fputs("<tr>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
-         fputs("<td></td>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0)
-         fputs("<td></td>",fp_top3);
-      fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("AVERAGE"));
-
-      if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum(ttnacc/totuser,1));
-      if((TopUserFields & TOPUSERFIELDS_BYTES) != 0) {
-         tnbytes=(totuser) ? ttnbytes / totuser : 0;
-         fprintf(fp_top3,"<th class=\"header_r\">%15s</th>",fixnum(tnbytes,1));
-      }
-      if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
-         fputs("<td></td>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
-         fputs("<td></td><td></td>",fp_top3);
-      if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",buildtime(ttnelap/totuser));
-      if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
-         fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum2(ttnelap/totuser,1));
-      fputs("</tr></tfoot>\n",fp_top3);
-   }
-
-   fputs("</table></div>\n",fp_top3);
-   if (write_html_trailer(fp_top3)<0)
-      debuga(_("Write error in top user list %s\n"),top3);
-   if (fclose(fp_top3)==EOF)
-      debuga(_("Failed to close the top user list %s - %s\n"),top3,strerror(errno));
-
-   snprintf(tusr,sizeof(tusr),"%s/sarg-users",outdirname);
-   if((fp_ou=fopen(tusr,"w"))==NULL) {
-      debuga(_("(topuser) Cannot open file %s\n"),tusr);
-      exit(EXIT_FAILURE);
-   }
-   fprintf(fp_ou,"%d\n",totuser);
-   if (fclose(fp_ou)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),tusr,strerror(errno));
-
-   return;
+               }
+               if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",buildtime(ttnelap));
+               if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum2(ttnelap,1));
+
+               fputs("</tr>\n",fp_top3);
+       }
+
+       if(ntopuser && (TopUserFields & TOPUSERFIELDS_AVERAGE) != 0) {
+               fputs("<tr>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_NUM) != 0)
+                       fputs("<td></td>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_DATE_TIME) !=0 && (ReportType & REPORT_TYPE_DATE_TIME) != 0)
+                       fputs("<td></td>",fp_top3);
+               fprintf(fp_top3,"<th class=\"header_l\">%s</th>",_("AVERAGE"));
+
+               if((TopUserFields & TOPUSERFIELDS_CONNECT) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum(ttnacc/totuser,1));
+               if((TopUserFields & TOPUSERFIELDS_BYTES) != 0) {
+                       tnbytes=(totuser) ? ttnbytes / totuser : 0;
+                       fprintf(fp_top3,"<th class=\"header_r\">%15s</th>",fixnum(tnbytes,1));
+               }
+               if((TopUserFields & TOPUSERFIELDS_SETYB) != 0)
+                       fputs("<td></td>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_IN_CACHE_OUT) != 0)
+                       fputs("<td></td><td></td>",fp_top3);
+               if((TopUserFields & TOPUSERFIELDS_USED_TIME) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",buildtime(ttnelap/totuser));
+               if((TopUserFields & TOPUSERFIELDS_MILISEC) != 0)
+                       fprintf(fp_top3,"<th class=\"header_r\">%s</th>",fixnum2(ttnelap/totuser,1));
+               fputs("</tr></tfoot>\n",fp_top3);
+       }
+
+       fputs("</table></div>\n",fp_top3);
+       if (write_html_trailer(fp_top3)<0)
+               debuga(_("Write error in top user list %s\n"),top3);
+       if (fclose(fp_top3)==EOF)
+               debuga(_("Failed to close the top user list %s - %s\n"),top3,strerror(errno));
+
+       snprintf(tusr,sizeof(tusr),"%s/sarg-users",outdirname);
+       if((fp_ou=fopen(tusr,"w"))==NULL) {
+               debuga(_("(topuser) Cannot open file %s\n"),tusr);
+               exit(EXIT_FAILURE);
+       }
+       fprintf(fp_ou,"%d\n",totuser);
+       if (fclose(fp_ou)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),tusr,strerror(errno));
+
+       return;
 }
index 38adc11f4713bd36267d2b033916cd3f1e0133e2..bf6ddf52a814b16b9dff35f842272bf9d2834775 100644 (file)
--- a/totday.c
+++ b/totday.c
 
 void day_totalize(const char *tmp, const struct userinfostruct *uinfo, int indexonly)
 {
+       FILE *fp_in, *fp_ou;
 
-   FILE *fp_in, *fp_ou;
+       char buf[200];
+       char date[20];
+       long long int hour;
+       long long int bytes;
+       long long int elap;
+       long long int tbytes[MAX_DATETIME_DAYS*24];
+       long long int telap[MAX_DATETIME_DAYS*24];
+       int day,month,year;
+       int daylist[MAX_DATETIME_DAYS];
+       int ndaylist;
+       int daynum;
+       int dayidx;
+       int i;
+       char wdirname[2048];
+       char arqout[2048];
+       char colsep;
+       struct getwordstruct gwarea;
 
-   char buf[200];
-   char date[20];
-   long long int hour;
-   long long int bytes;
-   long long int elap;
-   long long int tbytes[MAX_DATETIME_DAYS*24];
-   long long int telap[MAX_DATETIME_DAYS*24];
-   int day,month,year;
-   int daylist[MAX_DATETIME_DAYS];
-   int ndaylist;
-   int daynum;
-   int dayidx;
-   int i;
-   char wdirname[2048];
-   char arqout[2048];
-   char colsep;
-   struct getwordstruct gwarea;
+       if(indexonly) return;
+       if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
+       if (datetimeby==0) return;
 
-   if(indexonly) return;
-   if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
-   if (datetimeby==0) return;
+       if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
+               debuga(_("File name too long: %s/%s%s\n"),tmp,uinfo->filename,".htmp");
+               exit(EXIT_FAILURE);
+       }
+       if (snprintf(arqout,sizeof(arqout),"%s/%s.day",tmp,uinfo->filename)>=sizeof(arqout)) {
+               debuga(_("File name too long: %s/%s%s\n"),tmp,uinfo->filename,".day");
+               exit(EXIT_FAILURE);
+       }
 
-   if (snprintf(wdirname,sizeof(wdirname),"%s/%s.htmp",tmp,uinfo->filename)>=sizeof(wdirname)) {
-      debuga(_("File name too long: %s/%s%s\n"),tmp,uinfo->filename,".htmp");
-      exit(EXIT_FAILURE);
-   }
-   if (snprintf(arqout,sizeof(arqout),"%s/%s.day",tmp,uinfo->filename)>=sizeof(arqout)) {
-      debuga(_("File name too long: %s/%s%s\n"),tmp,uinfo->filename,".day");
-      exit(EXIT_FAILURE);
-   }
+       if((fp_in=fopen(wdirname,"r"))==NULL) {
+               debuga(_("(totday) Cannot open log file %s\n"),wdirname);
+               exit(EXIT_FAILURE);
+       }
 
-   if((fp_in=fopen(wdirname,"r"))==NULL) {
-      debuga(_("(totday) Cannot open log file %s\n"),wdirname);
-      exit(EXIT_FAILURE);
-   }
+       memset(tbytes,0,sizeof(tbytes));
+       memset(telap,0,sizeof(tbytes));
+       ndaylist=0;
 
-   memset(tbytes,0,sizeof(tbytes));
-   memset(telap,0,sizeof(tbytes));
-   ndaylist=0;
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword(date,sizeof(date),&gwarea,'\t')<0 || getword_atoll(&hour,&gwarea,'\t')<0) {
+                       debuga(_("There is a broken record or garbage in file %s\n"),wdirname);
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(date,"%d/%d/%d",&day,&month,&year)!=3) continue;
+               if (day<1 || day>31 || month<1 || month>12 || year>9999) continue;
+               if (hour<0 || hour>=24) continue;
+               daynum=(year*10000)+(month*100)+day;
+               for (dayidx=0 ; dayidx<ndaylist && daynum!=daylist[dayidx] ; dayidx++);
+               if (dayidx>=ndaylist) {
+                       if (dayidx>=sizeof(daylist)/sizeof(*daylist)) {
+                               debuga(_("Too many different dates in %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       daylist[ndaylist++]=daynum;
+               }
+               i=dayidx*24+hour;
+               if ((datetimeby & DATETIME_BYTE)!=0) {
+                       colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
+                       if (getword_atoll(&bytes,&gwarea,colsep)<0) {
+                               debuga(_("Invalid number of bytes in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       tbytes[i]+=bytes;
+               }
+               if ((datetimeby & DATETIME_ELAP)!=0) {
+                       if (getword_atoll(&elap,&gwarea,'\0')<0) {
+                               debuga(_("Invalid elapsed time in file %s\n"),wdirname);
+                               exit(EXIT_FAILURE);
+                       }
+                       telap[i]+=elap;
+               }
+       }
+       fclose(fp_in);
 
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword(date,sizeof(date),&gwarea,'\t')<0 || getword_atoll(&hour,&gwarea,'\t')<0) {
-         debuga(_("There is a broken record or garbage in file %s\n"),wdirname);
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(date,"%d/%d/%d",&day,&month,&year)!=3) continue;
-      if (day<1 || day>31 || month<1 || month>12 || year>9999) continue;
-      if (hour<0 || hour>=24) continue;
-      daynum=(year*10000)+(month*100)+day;
-      for (dayidx=0 ; dayidx<ndaylist && daynum!=daylist[dayidx] ; dayidx++);
-      if (dayidx>=ndaylist) {
-         if (dayidx>=sizeof(daylist)/sizeof(*daylist)) {
-            debuga(_("Too many different dates in %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         daylist[ndaylist++]=daynum;
-      }
-      i=dayidx*24+hour;
-      if ((datetimeby & DATETIME_BYTE)!=0) {
-         colsep=((datetimeby & DATETIME_ELAP)!=0) ? '\t' : '\0';
-         if (getword_atoll(&bytes,&gwarea,colsep)<0) {
-            debuga(_("Invalid number of bytes in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         tbytes[i]+=bytes;
-      }
-      if ((datetimeby & DATETIME_ELAP)!=0) {
-         if (getword_atoll(&elap,&gwarea,'\0')<0) {
-            debuga(_("Invalid elapsed time in file %s\n"),wdirname);
-            exit(EXIT_FAILURE);
-         }
-         telap[i]+=elap;
-      }
-   }
-   fclose(fp_in);
+       if((fp_ou=fopen(arqout,"w"))==NULL) {
+       debuga(_("(totday) Cannot open log file %s\n"),arqout);
+       exit(EXIT_FAILURE);
+       }
 
-   if((fp_ou=fopen(arqout,"w"))==NULL) {
-     debuga(_("(totday) Cannot open log file %s\n"),arqout);
-     exit(EXIT_FAILURE);
-   }
+       for (i=0 ; i<sizeof(tbytes)/sizeof(*tbytes) ; i++) {
+               if (tbytes[i]==0 && telap[i]==0) continue;
+               dayidx=i/24;
+               if (dayidx>sizeof(daylist)/sizeof(*daylist)) continue;
+               hour=i%24;
+               daynum=daylist[dayidx];
+               day=daynum%100;
+               month=(daynum/100)%100;
+               year=daynum/10000;
+               fprintf(fp_ou,"%d/%d/%d\t%d",day,month,year,(int)hour);
+               if ((datetimeby & DATETIME_BYTE)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)tbytes[i]);
+               if ((datetimeby & DATETIME_ELAP)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)telap[i]);
+               fputs("\n",fp_ou);
+       }
 
-   for (i=0 ; i<sizeof(tbytes)/sizeof(*tbytes) ; i++) {
-      if (tbytes[i]==0 && telap[i]==0) continue;
-      dayidx=i/24;
-      if (dayidx>sizeof(daylist)/sizeof(*daylist)) continue;
-      hour=i%24;
-      daynum=daylist[dayidx];
-      day=daynum%100;
-      month=(daynum/100)%100;
-      year=daynum/10000;
-      fprintf(fp_ou,"%d/%d/%d\t%d",day,month,year,(int)hour);
-      if ((datetimeby & DATETIME_BYTE)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)tbytes[i]);
-      if ((datetimeby & DATETIME_ELAP)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)telap[i]);
-      fputs("\n",fp_ou);
-   }
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if (unlink(wdirname)==-1) {
-      debuga(_("Cannot delete temporary file %s - %s\n"),wdirname,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   return;
+       if (unlink(wdirname)==-1) {
+               debuga(_("Cannot delete temporary file %s - %s\n"),wdirname,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       return;
 }
index a521b774fbf046ecc798b2ea7f25f2e6dc46bdc8..2127394cf33530ed690249af19a4e819689d78eb 100644 (file)
--- a/totger.c
+++ b/totger.c
 
 int totalger(const char *dirname, int debug, const char *outdir)
 {
-   FILE *fp_in;
-   long long int tnacc=0;
-   long long int tnbytes=0;
-   long long int telap=0;
-   long long int tincache=0, toucache=0;
-   char wger[MAXLEN];
-   char *warea;
-   longline line;
-   struct generalitemstruct item;
+       FILE *fp_in;
+       long long int tnacc=0;
+       long long int tnbytes=0;
+       long long int telap=0;
+       long long int tincache=0, toucache=0;
+       char wger[MAXLEN];
+       char *warea;
+       longline line;
+       struct generalitemstruct item;
 
-   snprintf(wger,sizeof(wger),"%s/sarg-general",dirname);
-   if((fp_in=fopen(wger,"r+"))==NULL) {
-      debuga(_("(totger) Cannot open file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
+       snprintf(wger,sizeof(wger),"%s/sarg-general",dirname);
+       if((fp_in=fopen(wger,"r+"))==NULL) {
+               debuga(_("(totger) Cannot open file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
 
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the temporary file %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the temporary file %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
 
-   while((warea=longline_read(fp_in,line))!=NULL)
-   {
-      ger_read(warea,&item,wger);
-      tnacc+=item.nacc;
-      tnbytes+=item.nbytes;
-      telap+=item.nelap;
-      tincache+=item.incache;
-      toucache+=item.oucache;
-   }
+       while((warea=longline_read(fp_in,line))!=NULL)
+       {
+               ger_read(warea,&item,wger);
+               tnacc+=item.nacc;
+               tnbytes+=item.nbytes;
+               telap+=item.nelap;
+               tincache+=item.incache;
+               toucache+=item.oucache;
+       }
 
-   longline_destroy(&line);
+       longline_destroy(&line);
 
-   if (fseek(fp_in,0,SEEK_END)==-1) {
-      debuga(_("Failed to move to the end of %s - %s\n"),wger,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       if (fseek(fp_in,0,SEEK_END)==-1) {
+               debuga(_("Failed to move to the end of %s - %s\n"),wger,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   /*
-   This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
-   to print a long long int unless it is exactly 64-bits long.
-   */
-   if (fprintf(fp_in,"TOTAL\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)telap,(uint64_t)tincache,(uint64_t)toucache)<0) {
-      debuga(_("Failed to write the total line in %s\n"),wger);
-      exit(EXIT_FAILURE);
-   }
-   if (fclose(fp_in)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),wger,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
+       /*
+       This complicated printf is due to Microsoft's inability to comply with any standard. Msvcrt is unable
+       to print a long long int unless it is exactly 64-bits long.
+       */
+       if (fprintf(fp_in,"TOTAL\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",(uint64_t)tnacc,(uint64_t)tnbytes,(uint64_t)telap,(uint64_t)tincache,(uint64_t)toucache)<0) {
+               debuga(_("Failed to write the total line in %s\n"),wger);
+               exit(EXIT_FAILURE);
+       }
+       if (fclose(fp_in)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),wger,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
 
-   return (0);
+       return (0);
 }
diff --git a/usage.c b/usage.c
index e7337ca0f8e0694ada4e5fe811bec01bb56f6243..f622af2be98c0fb7dba69e8c036646946e3556a7 100644 (file)
--- a/usage.c
+++ b/usage.c
 
 void usage(const char *prog)
 {
-  printf(_("Usage: %s [options...]\n"), prog);
-  puts  (_("     -a Hostname or IP address"));
-  puts  (_("     -b Useragent log"));
-  puts  (_("     -c Exclude file"));
-  puts  (_("     -d Date from-until dd/mm/yyyy-dd/mm/yyyy"));
-  puts  (_("     -e Email address to send reports (stdout for console)"));
-  printf(_("     -f Config file (%s/sarg.conf)\n"),SYSCONFDIR);
-  puts  (_("     -g Date format [e=Europe -> dd/mm/yyyy, u=USA -> mm/dd/yyyy]"));
-  puts  (_("     -h This help"));
-  puts  (_("     -i Reports by user and IP address"));
-  puts  (_("     -l Input log"));
-  puts  (_("     -n Resolve IP Address"));
-  puts  (_("     -o Output dir"));
-  puts  (_("     -p Use Ip Address instead of userid (reports)"));
-  puts  (_("     -s Accessed site [Eg. www.microsoft.com, www.netscape.com]"));
-  puts  (_("     -t Time [HH, HH:MM]"));
-  puts  (_("     -u User"));
-  puts  (_("     -w Temporary dir"));
-  puts  (_("     -x Debug messages"));
-  puts  (_("     -z Process messages"));
-  puts  (_("     -convert Convert the access.log file to a legible date"));
-  puts  (_("     -split Split the log file by date in -d parameter"));
-  printf("\n\t%s-%s\n",PGM,VERSION);
-  puts  ("\thttp://sarg.sourceforge.net");
-  puts  (_("\n\tPlease donate to the sarg project:"));
-  puts  ("\t\thttp://sarg.sourceforge.net/donations.php\n");
+       printf(_("Usage: %s [options...]\n"), prog);
+       puts  (_("     -a Hostname or IP address"));
+       puts  (_("     -b Useragent log"));
+       puts  (_("     -c Exclude file"));
+       puts  (_("     -d Date from-until dd/mm/yyyy-dd/mm/yyyy"));
+       puts  (_("     -e Email address to send reports (stdout for console)"));
+       printf(_("     -f Config file (%s/sarg.conf)\n"),SYSCONFDIR);
+       puts  (_("     -g Date format [e=Europe -> dd/mm/yyyy, u=USA -> mm/dd/yyyy]"));
+       puts  (_("     -h This help"));
+       puts  (_("     -i Reports by user and IP address"));
+       puts  (_("     -l Input log"));
+       puts  (_("     -n Resolve IP Address"));
+       puts  (_("     -o Output dir"));
+       puts  (_("     -p Use Ip Address instead of userid (reports)"));
+       puts  (_("     -s Accessed site [Eg. www.microsoft.com, www.netscape.com]"));
+       puts  (_("     -t Time [HH, HH:MM]"));
+       puts  (_("     -u User"));
+       puts  (_("     -w Temporary dir"));
+       puts  (_("     -x Debug messages"));
+       puts  (_("     -z Process messages"));
+       puts  (_("     -convert Convert the access.log file to a legible date"));
+       puts  (_("     -split Split the log file by date in -d parameter"));
+       printf("\n\t%s-%s\n",PGM,VERSION);
+       puts  ("\thttp://sarg.sourceforge.net");
+       puts  (_("\n\tPlease donate to the sarg project:"));
+       puts  ("\t\thttp://sarg.sourceforge.net/donations.php\n");
 
-  return;
+       return;
 }
index a0f967ce6540c1dad667f80bf338685b92b6255b..7dad9712f08984af1e376b421bb2177824f085d4 100644 (file)
 
 void useragent(void)
 {
-
-   FILE *fp_in = NULL, *fp_ou = NULL, *fp_ht = NULL;
-   char buf[MAXLEN];
-   char ip[MAXLEN], data[MAXLEN], agent[MAXLEN], user[MAXLEN];
-   char ipbefore[MAXLEN], namebefore[MAXLEN];
-   char tagent[MAXLEN];
-   char user_old[MAXLEN]="$#%0a3bc6";
-   char agent_old[MAXLEN]="$#%0a3bc6";
-   char hfile[MAXLEN];
-   char idate[MAXLEN], fdate[MAXLEN];
-   char tmp2[MAXLEN];
-   char tmp3[MAXLEN];
-   char day[4],month[5],year[5], wdate[20];
-   char csort[MAXLEN];
-   int  agentot=0, agentot2=0, agentdif=0, cont=0, nagent;
-   unsigned long totregsl=0;
-   int cstatus;
-   int ndate;
-   double perc;
-   struct getwordstruct gwarea, gwarea1;
-
-   ip[0]='\0';
-   data[0]='\0';
-   agent[0]='\0';
-   user[0]='\0';
-   user_old[0]='\0';
-   agent_old[0]='\0';
-   ipbefore[0]='\0';
-   namebefore[0]='\0';
-
-   sprintf(tmp3,"%s/squagent.unsort",tmp);
-   sprintf(tmp2,"%s/squagent.log",tmp);
-
-   if((fp_in=fopen(UserAgentLog,"r"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),UserAgentLog);
-      exit(EXIT_FAILURE);
-   }
-
-   if((fp_ou=fopen(tmp3,"w"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),tmp3);
-      exit(EXIT_FAILURE);
-   }
-
-   if(debug) {
-      debuga(_("Reading useragent log: %s\n"),UserAgentLog);
-   }
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      totregsl++;
-      getword_start(&gwarea,buf);
-      if (getword(ip,sizeof(ip),&gwarea,' ')<0 || getword_skip(MAXLEN,&gwarea,'[')<0 ||
-          getword(data,sizeof(data),&gwarea,' ')<0) {
-         debuga(_("Maybe you have a broken record or garbage in your %s file\n"),UserAgentLog);
-         exit(EXIT_FAILURE);
-      }
-      getword_start(&gwarea1,data);
-      if (getword(day,sizeof(day),&gwarea1,'/')<0 || getword(month,sizeof(month),&gwarea1,'/')<0 ||
-          getword(year,sizeof(year),&gwarea1,':')<0) {
-         debuga(_("Maybe you have a broken date in your %s file\n"),UserAgentLog);
-         exit(EXIT_FAILURE);
-      }
-      buildymd(day,month,year,wdate);
-      ndate=atoi(wdate);
-      if (ndate<dfrom) continue;
-      if (ndate>duntil) break;
-      if(totregsl == 1)
-         strcpy(idate,data);
-      strcpy(fdate,data);
-      if (getword_skip(MAXLEN,&gwarea,'"')<0 || getword(agent,sizeof(agent),&gwarea,'"')<0) {
-         debuga(_("Maybe you have a broken useragent entry in your %s file\n"),UserAgentLog);
-         exit(EXIT_FAILURE);
-      }
-
-      if(gwarea.current[0]!='\0') {
-         if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,'\n')<0) {
-            debuga(_("Maybe you have a broken record or garbage in your %s file\n"),UserAgentLog);
-            exit(EXIT_FAILURE);
-         }
-         if(user[0] == '-')
-            strcpy(user,ip);
-         if(user[0] == '\0')
-            strcpy(user,ip);
-      } else {
-         strcpy(user,ip);
-      }
-
-      fprintf(fp_ou,"%s\t%s\t%s\n",ip,agent,user);
-      useragent_count++;
-   }
-
-   if(debug) {
-      debuga(_("   Records read: %ld\n"),totregsl);
-   }
-
-   fclose(fp_in);
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),tmp3,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if(debug) {
-      debuga(_("Sorting file: %s\n"),tmp2);
-   }
-
-   sprintf(csort,"sort -n -t \"\t\" -k 3,3 -k 2,2 -k 1,1 -o \"%s\" \"%s\"",tmp2,tmp3);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(tmp2,"r"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),tmp2);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(tmp3);
-
-   snprintf(hfile,sizeof(hfile),"%s/useragent.html", outdirname);
-   if((fp_ht=fopen(hfile,"w"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),hfile);
-      exit(EXIT_FAILURE);
-   }
-
-   if(debug)
-      debuga(_("Making Useragent report\n"));
-
-   write_html_header(fp_ht,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Squid Useragent's Report"),HTML_JS_NONE);
-   fprintf(fp_ht,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Squid Useragent's Report"));
-   fprintf(fp_ht,"<tr><td class=\"header_c\">%s: %s - %s</td></tr>\n",_("Period"),idate,fdate);
-   close_html_header(fp_ht);
-
-   fputs("<br><br>\n",fp_ht);
-
-   fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ht);
-   fputs("<tr><td>&nbsp;</td><td>&nbsp;</td></tr>",fp_ht);
-
-   fprintf(fp_ht,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("AGENT"));
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid IP address in file %s\n"),tmp2);
-         exit(EXIT_FAILURE);
-      }
-
-      if(Ip2Name) {
-         if(strcmp(ip,ipbefore) != 0) {
-            strcpy(ipbefore,ip);
-            ip2name(ip,sizeof(ip));
-            strcpy(namebefore,ip);
-         } else strcpy(ip,namebefore);
-      }
-
-      if (getword(agent,sizeof(agent),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid useragent in file %s\n"),tmp2);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(user,sizeof(user),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid user ID in file %s\n"),tmp2);
-         exit(EXIT_FAILURE);
-      }
-
-      if(strcmp(user,user_old) != 0) {
-         fprintf(fp_ht,"<tr><td class=\"data2\">%s</td><td class=\"data2\">",user);
-         output_html_string(fp_ht,agent,250);
-         fputs("</td></tr>\n",fp_ht);
-         strcpy(user_old,user);
-         strcpy(agent_old,agent);
-      } else if(strcmp(agent,agent_old) != 0) {
-         fputs("<tr><td></td><td class=\"data2\">",fp_ht);
-         output_html_string(fp_ht,agent,250);
-         fputs("</td></tr>\n",fp_ht);
-         strcpy(agent_old,agent);
-      }
-   }
-
-   fputs("</table>\n",fp_ht);
-   fclose(fp_in);
-
-   sprintf(csort,"sort -t \"\t\" -k 2,2 -o \"%s\" \"%s\"",tmp3,tmp2);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(tmp3,"r"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),tmp3);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(tmp2);
-
-   if((fp_ou=fopen(tmp2,"w"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),tmp2);
-      exit(EXIT_FAILURE);
-   }
-
-   agent_old[0]='\0';
-   cont=0;
-
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword_start(&gwarea,buf);
-      if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid IP address in file %s\n"),tmp3);
-         exit(EXIT_FAILURE);
-      }
-      if (getword(agent,sizeof(agent),&gwarea,'\t')<0) {
-         debuga(_("There is an invalid useragent in file %s\n"),tmp3);
-         exit(EXIT_FAILURE);
-      }
-
-      if(!cont) {
-         cont++;
-         strcpy(agent_old,agent);
-      }
-
-      if(strcmp(agent,agent_old) != 0) {
-         agentdif++;
-         fprintf(fp_ou,"%06d %s\n",agentot,agent_old);
-         strcpy(agent_old,agent);
-         agentot2+=agentot;
-         agentot=0;
-      }
-      agentot++;
-   }
-   agentdif++;
-   fprintf(fp_ou,"%06d %s\n",agentot,agent);
-   agentot2+=agentot;
-
-   fclose(fp_in);
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to close file %s - %s\n"),tmp3,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(tmp3);
-
-   sprintf(csort,"sort -n -r -k 1,1 -o \"%s\" \"%s\"",tmp3,tmp2);
-   cstatus=system(csort);
-   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
-      debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(tmp3,"r"))==NULL) {
-      debuga(_("(useragent) Cannot open file %s\n"),tmp3);
-      debuga(_("sort command: %s\n"),csort);
-      exit(EXIT_FAILURE);
-   }
-
-   unlink(tmp2);
-
-   fputs("<br><br>\n",fp_ht);
-
-   fputs("<table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ht);
-   fprintf(fp_ht,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_c\">%%</th></tr>\n",_("AGENT"),_("TOTAL"));
-
-   perc=0.;
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      fixendofline(buf);
-      getword_start(&gwarea,buf);
-      if (getword(tagent,sizeof(tagent),&gwarea,' ')<0) {
-         debuga(_("There is an invalid useragent in file %s\n"),tmp3);
-         exit(EXIT_FAILURE);
-      }
-      nagent=atoi(tagent);
-      perc=(agentot2>0) ? nagent * 100. / agentot2 : 0.;
-
-      fputs("<tr><td class=\"data2\">",fp_ht);
-      output_html_string(fp_ht,gwarea.current,250);
-      fprintf(fp_ht,"</td><td class=\"data\">%d</td><td class=\"data\">%3.2lf</td></tr>\n",nagent,perc);
-   }
-   fclose(fp_in);
-
-   fputs("</table></div>\n",fp_ht);
-   if (write_html_trailer(fp_ht)<0)
-      debuga(_("Write error in file %s\n"),hfile);
-   if (fclose(fp_ht)==EOF)
-      debuga(_("Failed to close file %s - %s\n"),hfile,strerror(errno));
-
-   unlink(tmp3);
-
-   return;
-
+       FILE *fp_in = NULL, *fp_ou = NULL, *fp_ht = NULL;
+       char buf[MAXLEN];
+       char ip[MAXLEN], data[MAXLEN], agent[MAXLEN], user[MAXLEN];
+       char ipbefore[MAXLEN], namebefore[MAXLEN];
+       char tagent[MAXLEN];
+       char user_old[MAXLEN]="$#%0a3bc6";
+       char agent_old[MAXLEN]="$#%0a3bc6";
+       char hfile[MAXLEN];
+       char idate[MAXLEN], fdate[MAXLEN];
+       char tmp2[MAXLEN];
+       char tmp3[MAXLEN];
+       char day[4],month[5],year[5], wdate[20];
+       char csort[MAXLEN];
+       int  agentot=0, agentot2=0, agentdif=0, cont=0, nagent;
+       unsigned long totregsl=0;
+       int cstatus;
+       int ndate;
+       double perc;
+       struct getwordstruct gwarea, gwarea1;
+
+       ip[0]='\0';
+       data[0]='\0';
+       agent[0]='\0';
+       user[0]='\0';
+       user_old[0]='\0';
+       agent_old[0]='\0';
+       ipbefore[0]='\0';
+       namebefore[0]='\0';
+
+       sprintf(tmp3,"%s/squagent.unsort",tmp);
+       sprintf(tmp2,"%s/squagent.log",tmp);
+
+       if((fp_in=fopen(UserAgentLog,"r"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),UserAgentLog);
+               exit(EXIT_FAILURE);
+       }
+
+       if((fp_ou=fopen(tmp3,"w"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),tmp3);
+               exit(EXIT_FAILURE);
+       }
+
+       if(debug) {
+               debuga(_("Reading useragent log: %s\n"),UserAgentLog);
+       }
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               totregsl++;
+               getword_start(&gwarea,buf);
+               if (getword(ip,sizeof(ip),&gwarea,' ')<0 || getword_skip(MAXLEN,&gwarea,'[')<0 ||
+                       getword(data,sizeof(data),&gwarea,' ')<0) {
+                       debuga(_("Maybe you have a broken record or garbage in your %s file\n"),UserAgentLog);
+                       exit(EXIT_FAILURE);
+               }
+               getword_start(&gwarea1,data);
+               if (getword(day,sizeof(day),&gwarea1,'/')<0 || getword(month,sizeof(month),&gwarea1,'/')<0 ||
+                       getword(year,sizeof(year),&gwarea1,':')<0) {
+                       debuga(_("Maybe you have a broken date in your %s file\n"),UserAgentLog);
+                       exit(EXIT_FAILURE);
+               }
+               buildymd(day,month,year,wdate);
+               ndate=atoi(wdate);
+               if (ndate<dfrom) continue;
+               if (ndate>duntil) break;
+               if(totregsl == 1)
+                       strcpy(idate,data);
+               strcpy(fdate,data);
+               if (getword_skip(MAXLEN,&gwarea,'"')<0 || getword(agent,sizeof(agent),&gwarea,'"')<0) {
+                       debuga(_("Maybe you have a broken useragent entry in your %s file\n"),UserAgentLog);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(gwarea.current[0]!='\0') {
+                       if (getword_skip(MAXLEN,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,'\n')<0) {
+                               debuga(_("Maybe you have a broken record or garbage in your %s file\n"),UserAgentLog);
+                               exit(EXIT_FAILURE);
+                       }
+                       if(user[0] == '-')
+                               strcpy(user,ip);
+                       if(user[0] == '\0')
+                               strcpy(user,ip);
+               } else {
+                       strcpy(user,ip);
+               }
+
+               fprintf(fp_ou,"%s\t%s\t%s\n",ip,agent,user);
+               useragent_count++;
+       }
+
+       if(debug) {
+               debuga(_("   Records read: %ld\n"),totregsl);
+       }
+
+       fclose(fp_in);
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),tmp3,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if(debug) {
+               debuga(_("Sorting file: %s\n"),tmp2);
+       }
+
+       sprintf(csort,"sort -n -t \"\t\" -k 3,3 -k 2,2 -k 1,1 -o \"%s\" \"%s\"",tmp2,tmp3);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(tmp2,"r"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),tmp2);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(tmp3);
+
+       snprintf(hfile,sizeof(hfile),"%s/useragent.html", outdirname);
+       if((fp_ht=fopen(hfile,"w"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),hfile);
+               exit(EXIT_FAILURE);
+       }
+
+       if(debug)
+               debuga(_("Making Useragent report\n"));
+
+       write_html_header(fp_ht,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Squid Useragent's Report"),HTML_JS_NONE);
+       fprintf(fp_ht,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Squid Useragent's Report"));
+       fprintf(fp_ht,"<tr><td class=\"header_c\">%s: %s - %s</td></tr>\n",_("Period"),idate,fdate);
+       close_html_header(fp_ht);
+
+       fputs("<br><br>\n",fp_ht);
+
+       fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ht);
+       fputs("<tr><td>&nbsp;</td><td>&nbsp;</td></tr>",fp_ht);
+
+       fprintf(fp_ht,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("AGENT"));
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid IP address in file %s\n"),tmp2);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(Ip2Name) {
+                       if(strcmp(ip,ipbefore) != 0) {
+                               strcpy(ipbefore,ip);
+                               ip2name(ip,sizeof(ip));
+                               strcpy(namebefore,ip);
+                       } else strcpy(ip,namebefore);
+               }
+
+               if (getword(agent,sizeof(agent),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid useragent in file %s\n"),tmp2);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(user,sizeof(user),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid user ID in file %s\n"),tmp2);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(strcmp(user,user_old) != 0) {
+                       fprintf(fp_ht,"<tr><td class=\"data2\">%s</td><td class=\"data2\">",user);
+                       output_html_string(fp_ht,agent,250);
+                       fputs("</td></tr>\n",fp_ht);
+                       strcpy(user_old,user);
+                       strcpy(agent_old,agent);
+               } else if(strcmp(agent,agent_old) != 0) {
+                       fputs("<tr><td></td><td class=\"data2\">",fp_ht);
+                       output_html_string(fp_ht,agent,250);
+                       fputs("</td></tr>\n",fp_ht);
+                       strcpy(agent_old,agent);
+               }
+       }
+
+       fputs("</table>\n",fp_ht);
+       fclose(fp_in);
+
+       sprintf(csort,"sort -t \"\t\" -k 2,2 -o \"%s\" \"%s\"",tmp3,tmp2);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(tmp3,"r"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),tmp3);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(tmp2);
+
+       if((fp_ou=fopen(tmp2,"w"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),tmp2);
+               exit(EXIT_FAILURE);
+       }
+
+       agent_old[0]='\0';
+       cont=0;
+
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               getword_start(&gwarea,buf);
+               if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid IP address in file %s\n"),tmp3);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword(agent,sizeof(agent),&gwarea,'\t')<0) {
+                       debuga(_("There is an invalid useragent in file %s\n"),tmp3);
+                       exit(EXIT_FAILURE);
+               }
+
+               if(!cont) {
+                       cont++;
+                       strcpy(agent_old,agent);
+               }
+
+               if(strcmp(agent,agent_old) != 0) {
+                       agentdif++;
+                       fprintf(fp_ou,"%06d %s\n",agentot,agent_old);
+                       strcpy(agent_old,agent);
+                       agentot2+=agentot;
+                       agentot=0;
+               }
+               agentot++;
+       }
+       agentdif++;
+       fprintf(fp_ou,"%06d %s\n",agentot,agent);
+       agentot2+=agentot;
+
+       fclose(fp_in);
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to close file %s - %s\n"),tmp3,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(tmp3);
+
+       sprintf(csort,"sort -n -r -k 1,1 -o \"%s\" \"%s\"",tmp3,tmp2);
+       cstatus=system(csort);
+       if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+               debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(tmp3,"r"))==NULL) {
+               debuga(_("(useragent) Cannot open file %s\n"),tmp3);
+               debuga(_("sort command: %s\n"),csort);
+               exit(EXIT_FAILURE);
+       }
+
+       unlink(tmp2);
+
+       fputs("<br><br>\n",fp_ht);
+
+       fputs("<table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ht);
+       fprintf(fp_ht,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_c\">%%</th></tr>\n",_("AGENT"),_("TOTAL"));
+
+       perc=0.;
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               fixendofline(buf);
+               getword_start(&gwarea,buf);
+               if (getword(tagent,sizeof(tagent),&gwarea,' ')<0) {
+                       debuga(_("There is an invalid useragent in file %s\n"),tmp3);
+                       exit(EXIT_FAILURE);
+               }
+               nagent=atoi(tagent);
+               perc=(agentot2>0) ? nagent * 100. / agentot2 : 0.;
+
+               fputs("<tr><td class=\"data2\">",fp_ht);
+               output_html_string(fp_ht,gwarea.current,250);
+               fprintf(fp_ht,"</td><td class=\"data\">%d</td><td class=\"data\">%3.2lf</td></tr>\n",nagent,perc);
+       }
+       fclose(fp_in);
+
+       fputs("</table></div>\n",fp_ht);
+       if (write_html_trailer(fp_ht)<0)
+               debuga(_("Write error in file %s\n"),hfile);
+       if (fclose(fp_ht)==EOF)
+               debuga(_("Failed to close file %s - %s\n"),hfile,strerror(errno));
+
+       unlink(tmp3);
+
+       return;
 }
index fb664d7a5fa1acb153b9a65bd1433780be26fb60..4b315fa1fab9db4e8a378de7bdf089f146303cb6 100644 (file)
@@ -36,12 +36,12 @@ allocations.
 */
 struct usergroupstruct
 {
-   //! The next group of users.
-   struct usergroupstruct *next;
-   //! A group of users.
-   struct userinfostruct list[USERS_PER_GROUP];
-   //! The number of users stored in the list.
-   int nusers;
+       //! The next group of users.
+       struct usergroupstruct *next;
+       //! A group of users.
+       struct userinfostruct list[USERS_PER_GROUP];
+       //! The number of users stored in the list.
+       int nusers;
 };
 
 //! The first group of users.
@@ -49,102 +49,102 @@ static struct usergroupstruct *first_user_group=NULL;
 
 struct userinfostruct *userinfo_create(const char *userid)
 {
-   struct usergroupstruct *group, *last;
-   struct userinfostruct *user;
-   int i, lastuser;
-   int skip;
-   int flen;
-   int count, clen;
-   char cstr[9];
-
-   last=NULL;
-   for (group=first_user_group ; group ; group=group->next) {
-      if (group->nusers<USERS_PER_GROUP) break;
-      last=group;
-   }
-
-   if (!group) {
-      group=malloc(sizeof(*group));
-      if (!group) {
-         debuga(_("Not enough memory to store the user\n"));
-         exit(EXIT_FAILURE);
-      }
-      memset(group,0,sizeof(*group));
-      if (last)
-         last->next=group;
-      else
-         first_user_group=group;
-   }
-   user=group->list+group->nusers++;
-
-   strncpy(user->id,userid,MAX_USER_LEN-1);
-   user->id[MAX_USER_LEN-1]='\0';
-
-   skip=0;
-   for(i=0 ; userid[i] && i<MAX_USER_FNAME_LEN-1 ; i++) {
-      if(isalnum(userid[i]) || userid[i]=='-' || userid[i]=='_') {
-         user->filename[i]=userid[i];
-         skip=0;
-      } else {
-         if (!skip) {
-            user->filename[i]='_';
-            skip=1;
-         }
-      }
-   }
-   user->filename[i]='\0';
-   flen=i;
-
-   count=0;
-   for (group=first_user_group ; group ; group=group->next) {
-      lastuser=(group->next) ? group->nusers : group->nusers-1;
-      for (i=0 ; i<lastuser ; i++) {
-         if (strcasecmp(user->filename,group->list[i].filename)==0) {
-            clen=sprintf(cstr,"-%04X",count++);
-            if (flen+clen<MAX_USER_FNAME_LEN)
-               strcpy(user->filename+flen,cstr);
-            else
-               strcpy(user->filename+MAX_USER_FNAME_LEN-clen,cstr);
-         }
-      }
-   }
-
-   return(user);
+       struct usergroupstruct *group, *last;
+       struct userinfostruct *user;
+       int i, lastuser;
+       int skip;
+       int flen;
+       int count, clen;
+       char cstr[9];
+
+       last=NULL;
+       for (group=first_user_group ; group ; group=group->next) {
+               if (group->nusers<USERS_PER_GROUP) break;
+               last=group;
+       }
+
+       if (!group) {
+               group=malloc(sizeof(*group));
+               if (!group) {
+                       debuga(_("Not enough memory to store the user\n"));
+                       exit(EXIT_FAILURE);
+               }
+               memset(group,0,sizeof(*group));
+               if (last)
+                       last->next=group;
+               else
+                       first_user_group=group;
+       }
+       user=group->list+group->nusers++;
+
+       strncpy(user->id,userid,MAX_USER_LEN-1);
+       user->id[MAX_USER_LEN-1]='\0';
+
+       skip=0;
+       for(i=0 ; userid[i] && i<MAX_USER_FNAME_LEN-1 ; i++) {
+               if(isalnum(userid[i]) || userid[i]=='-' || userid[i]=='_') {
+                       user->filename[i]=userid[i];
+                       skip=0;
+               } else {
+                       if (!skip) {
+                               user->filename[i]='_';
+                               skip=1;
+                       }
+               }
+       }
+       user->filename[i]='\0';
+       flen=i;
+
+       count=0;
+       for (group=first_user_group ; group ; group=group->next) {
+               lastuser=(group->next) ? group->nusers : group->nusers-1;
+               for (i=0 ; i<lastuser ; i++) {
+                       if (strcasecmp(user->filename,group->list[i].filename)==0) {
+                               clen=sprintf(cstr,"-%04X",count++);
+                               if (flen+clen<MAX_USER_FNAME_LEN)
+                                       strcpy(user->filename+flen,cstr);
+                               else
+                                       strcpy(user->filename+MAX_USER_FNAME_LEN-clen,cstr);
+                       }
+               }
+       }
+
+       return(user);
 }
 
 void userinfo_free(void)
 {
-   struct usergroupstruct *group, *next;
+       struct usergroupstruct *group, *next;
 
-   for (group=first_user_group ; group ; group=next) {
-      next=group->next;
-      free(group);
-   }
-   first_user_group=NULL;
+       for (group=first_user_group ; group ; group=next) {
+               next=group->next;
+               free(group);
+       }
+       first_user_group=NULL;
 }
 
 struct userinfostruct *userinfo_find_from_file(const char *filename)
 {
-   struct usergroupstruct *group;
-   int i;
-
-   for (group=first_user_group ; group ; group=group->next) {
-      for (i=0 ; i<group->nusers ; i++)
-         if (strcmp(filename,group->list[i].filename)==0)
-            return(group->list+i);
-   }
-   return(NULL);
+       struct usergroupstruct *group;
+       int i;
+
+       for (group=first_user_group ; group ; group=group->next) {
+               for (i=0 ; i<group->nusers ; i++)
+                       if (strcmp(filename,group->list[i].filename)==0)
+                               return(group->list+i);
+       }
+       return(NULL);
 }
 
 struct userinfostruct *userinfo_find_from_id(const char *id)
 {
-   struct usergroupstruct *group;
-   int i;
-
-   for (group=first_user_group ; group ; group=group->next) {
-      for (i=0 ; i<group->nusers ; i++)
-         if (strcmp(id,group->list[i].id)==0)
-            return(group->list+i);
-   }
-   return(NULL);
+       struct usergroupstruct *group;
+       int i;
+
+       for (group=first_user_group ; group ; group=group->next) {
+               for (i=0 ; i<group->nusers ; i++)
+                       if (strcmp(id,group->list[i].id)==0)
+                               return(group->list+i);
+       }
+       return(NULL);
 }
index 36d84aa3ac33caaa0b369e512b83fd0916b66265..2fbbe30ef31d39d3d2bd9a99f5334e3eda8e66a0 100644 (file)
--- a/usertab.c
+++ b/usertab.c
 
 enum UserTabEnum
 {
-   //! Users matched against the ::UserTabFile file.
-   UTT_File,
-   //! Users matched agains a LDAP.
-   UTT_Ldap,
-   //! No user matching performed.
-   UTT_None
+       //! Users matched against the ::UserTabFile file.
+       UTT_File,
+       //! Users matched agains a LDAP.
+       UTT_Ldap,
+       //! No user matching performed.
+       UTT_None
 };
 
 enum UserTabEnum which_usertab=UTT_None;
@@ -55,220 +55,220 @@ static LDAP *ldap_handle=NULL;
 
 static void init_file_usertab(const char *UserTabFile)
 {
-   FILE *fp_usr;
-   long int nreg;
-   char buf[MAXLEN];
-   int z1, z2;
+       FILE *fp_usr;
+       long int nreg;
+       char buf[MAXLEN];
+       int z1, z2;
 
-   if((fp_usr=fopen(UserTabFile,"r"))==NULL) {
-      debuga(_("(usertab) Cannot open file %s - %s\n"),UserTabFile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   if (fseek(fp_usr, 0, SEEK_END)==-1) {
-      debuga(_("Failed to move till the end of the usertab file %s: %s\n"),UserTabFile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   nreg = ftell(fp_usr);
-   if (nreg<0) {
-      debuga(_("Cannot get the size of file %s"),UserTabFile);
-      exit(EXIT_FAILURE);
-   }
-   nreg += 100;
-   if (fseek(fp_usr, 0, SEEK_SET)==-1) {
-      debuga(_("Failed to rewind the usertab file %s: %s\n"),UserTabFile,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   if((userfile=(char *) malloc(nreg))==NULL){
-      debuga(_("ERROR: Cannot load. Memory fault"));
-      exit(EXIT_FAILURE);
-   }
-   userfile[0]='\t';
-   z2=1;
-   while(fgets(buf,sizeof(buf),fp_usr)!=NULL) {
-      if (buf[0]=='#') continue;
-      fixendofline(buf);
-      z1=0;
-      while(buf[z1] && (unsigned char)buf[z1]>' ') {
-         if (z2+3>=nreg) { //need at least 3 additional bytes for the minimum string "\n\t\0"
-            debuga(_("The list of the users is too long in your %s file.\n"),UserTabFile);
-            exit(EXIT_FAILURE);
-         }
-         userfile[z2++]=buf[z1++];
-      }
-      while(buf[z1] && (unsigned char)buf[z1]<=' ') z1++;
-      userfile[z2++]='\n';
-      while(buf[z1] && (unsigned char)buf[z1]>=' ') {
-         if (z2+2>=nreg) { //need at least 2 additional bytes for "\t\0"
-            debuga(_("The list of the users is too long in your %s file.\n"),UserTabFile);
-            exit(EXIT_FAILURE);
-         }
-         userfile[z2++]=buf[z1++];
-      }
-      while(userfile[z2-1]==' ') z2--;
-      userfile[z2++]='\t';
-   }
-   userfile[z2]='\0';
-   fclose(fp_usr);
+       if((fp_usr=fopen(UserTabFile,"r"))==NULL) {
+               debuga(_("(usertab) Cannot open file %s - %s\n"),UserTabFile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if (fseek(fp_usr, 0, SEEK_END)==-1) {
+               debuga(_("Failed to move till the end of the usertab file %s: %s\n"),UserTabFile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       nreg = ftell(fp_usr);
+       if (nreg<0) {
+               debuga(_("Cannot get the size of file %s"),UserTabFile);
+               exit(EXIT_FAILURE);
+       }
+       nreg += 100;
+       if (fseek(fp_usr, 0, SEEK_SET)==-1) {
+               debuga(_("Failed to rewind the usertab file %s: %s\n"),UserTabFile,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if((userfile=(char *) malloc(nreg))==NULL){
+               debuga(_("ERROR: Cannot load. Memory fault"));
+               exit(EXIT_FAILURE);
+       }
+       userfile[0]='\t';
+       z2=1;
+       while(fgets(buf,sizeof(buf),fp_usr)!=NULL) {
+               if (buf[0]=='#') continue;
+               fixendofline(buf);
+               z1=0;
+               while(buf[z1] && (unsigned char)buf[z1]>' ') {
+                       if (z2+3>=nreg) { //need at least 3 additional bytes for the minimum string "\n\t\0"
+                               debuga(_("The list of the users is too long in your %s file.\n"),UserTabFile);
+                               exit(EXIT_FAILURE);
+                       }
+                       userfile[z2++]=buf[z1++];
+               }
+               while(buf[z1] && (unsigned char)buf[z1]<=' ') z1++;
+               userfile[z2++]='\n';
+               while(buf[z1] && (unsigned char)buf[z1]>=' ') {
+                       if (z2+2>=nreg) { //need at least 2 additional bytes for "\t\0"
+                               debuga(_("The list of the users is too long in your %s file.\n"),UserTabFile);
+                               exit(EXIT_FAILURE);
+                       }
+                       userfile[z2++]=buf[z1++];
+               }
+               while(userfile[z2-1]==' ') z2--;
+               userfile[z2++]='\t';
+       }
+       userfile[z2]='\0';
+       fclose(fp_usr);
 }
 
 static void get_usertab_name(const char *user,char *name,int namelen)
 {
-   char warea[MAXLEN];
-   char *str;
+       char warea[MAXLEN];
+       char *str;
 
-   namelen--;
-   sprintf(warea,"\t%s\n",user);
-   if((str=(char *) strstr(userfile,warea)) == (char *) NULL ) {
-      strncpy(name,user,namelen);
-      name[namelen]=0;
-   } else {
-      str=strchr(str+1,'\n');
-      str++;
-      for(z1=0; *str != '\t' && z1<namelen ; z1++) {
-         name[z1]=*str++;
-      }
-      name[z1]=0;
-   }
+       namelen--;
+       sprintf(warea,"\t%s\n",user);
+       if((str=(char *) strstr(userfile,warea)) == (char *) NULL ) {
+               strncpy(name,user,namelen);
+               name[namelen]=0;
+       } else {
+               str=strchr(str+1,'\n');
+               str++;
+               for(z1=0; *str != '\t' && z1<namelen ; z1++) {
+                       name[z1]=*str++;
+               }
+               name[z1]=0;
+       }
 }
 
 #ifdef HAVE_LDAP_H
 static void init_ldap_usertab(void) {
-   /* Setting LDAP connection and initializing cache */
-   ldap_handle = NULL;
-   if ((ldap_handle = ldap_init(LDAPHost, LDAPPort)) == NULL) {
-      debuga(_("Unable to connect to LDAP server %s on port %d\n"), LDAPHost, LDAPPort);
-      exit(EXIT_FAILURE);
-   }
+       /* Setting LDAP connection and initializing cache */
+       ldap_handle = NULL;
+       if ((ldap_handle = ldap_init(LDAPHost, LDAPPort)) == NULL) {
+               debuga(_("Unable to connect to LDAP server %s on port %d\n"), LDAPHost, LDAPPort);
+               exit(EXIT_FAILURE);
+       }
 
-   int ldap_protocol_version = LDAPProtocolVersion;
-   if (ldap_set_option(ldap_handle, LDAP_OPT_PROTOCOL_VERSION, &ldap_protocol_version) != LDAP_SUCCESS) {
-      debuga(_("Could not set LDAP protocol version %d\n"), ldap_protocol_version);
-      exit(EXIT_FAILURE);
-   }
+       int ldap_protocol_version = LDAPProtocolVersion;
+       if (ldap_set_option(ldap_handle, LDAP_OPT_PROTOCOL_VERSION, &ldap_protocol_version) != LDAP_SUCCESS) {
+               debuga(_("Could not set LDAP protocol version %d\n"), ldap_protocol_version);
+               exit(EXIT_FAILURE);
+       }
 
-   /* Bind to the LDAP server. */
-   int rc;
-   rc = ldap_simple_bind_s( ldap_handle, LDAPBindDN, LDAPBindPW );
-   if ( rc != LDAP_SUCCESS ) {
-      debuga(_("Cannot bind to LDAP server: %s\n"), ldap_err2string(rc));
-      exit(EXIT_FAILURE);
-   }
+       /* Bind to the LDAP server. */
+       int rc;
+       rc = ldap_simple_bind_s( ldap_handle, LDAPBindDN, LDAPBindPW );
+       if ( rc != LDAP_SUCCESS ) {
+               debuga(_("Cannot bind to LDAP server: %s\n"), ldap_err2string(rc));
+               exit(EXIT_FAILURE);
+       }
 
-   /* Initializing cache */
+       /* Initializing cache */
 
-   init_cache();
+       init_cache();
 }
 
 static void get_ldap_name(const char *userlogin,char *mappedname,int namelen)
 {
-   /* Start searching username in cache */
-   // According to rfc2254 section 4, only *()\ and NUL must be escaped. This list is rather conservative !
-   const char strictchars[] = " ~!@^&(){}|<>?:;\"\'\\[]`,\r\n\0";
-   char filtersearch[256], *searched_in_cache;
-   char searchloginname[3*MAX_USER_LEN];
-   char *attr, **vals;
-   LDAPMessage *result, *e;
-   BerElement *ber;
-   int i;
+       /* Start searching username in cache */
+       // According to rfc2254 section 4, only *()\ and NUL must be escaped. This list is rather conservative !
+       const char strictchars[] = " ~!@^&(){}|<>?:;\"\'\\[]`,\r\n\0";
+       char filtersearch[256], *searched_in_cache;
+       char searchloginname[3*MAX_USER_LEN];
+       char *attr, **vals;
+       LDAPMessage *result, *e;
+       BerElement *ber;
+       int i;
 
-   for (i=0 ; i<sizeof(searchloginname)-1 && *userlogin ; userlogin++) {
-      if (strchr(strictchars,*userlogin)) {
-         // escape character according to rfc2254 section 4
-         if (i+3>=sizeof(searchloginname)-1) break;
-         i+=sprintf(searchloginname+i,"\\%02X",*userlogin);
-      } else {
-         searchloginname[i++]=*userlogin;
-      }
-   }
-   searchloginname[i]='\0';
+       for (i=0 ; i<sizeof(searchloginname)-1 && *userlogin ; userlogin++) {
+               if (strchr(strictchars,*userlogin)) {
+                       // escape character according to rfc2254 section 4
+                       if (i+3>=sizeof(searchloginname)-1) break;
+                       i+=sprintf(searchloginname+i,"\\%02X",*userlogin);
+               } else {
+                       searchloginname[i++]=*userlogin;
+               }
+       }
+       searchloginname[i]='\0';
 
-   if (!(searched_in_cache = search_in_cache(searchloginname))) {
-      snprintf(filtersearch, sizeof(filtersearch), LDAPFilterSearch, searchloginname, searchloginname, searchloginname, searchloginname, searchloginname);
+       if (!(searched_in_cache = search_in_cache(searchloginname))) {
+               snprintf(filtersearch, sizeof(filtersearch), LDAPFilterSearch, searchloginname, searchloginname, searchloginname, searchloginname, searchloginname);
 
-      /* Search record(s) in LDAP base */
+               /* Search record(s) in LDAP base */
 
-      int rc= ldap_search_s(ldap_handle, LDAPBaseSearch, LDAP_SCOPE_SUBTREE, filtersearch, NULL, 0, &result);
-      if ( rc != LDAP_SUCCESS ) {
-         debuga(_("LDAP search failed: %s\n"), ldap_err2string(rc));
-         strncpy(mappedname,searchloginname,namelen-1);
-         mappedname[namelen-1]='\0';
-         return;
-      }
+               int rc= ldap_search_s(ldap_handle, LDAPBaseSearch, LDAP_SCOPE_SUBTREE, filtersearch, NULL, 0, &result);
+               if ( rc != LDAP_SUCCESS ) {
+                       debuga(_("LDAP search failed: %s\n"), ldap_err2string(rc));
+                       strncpy(mappedname,searchloginname,namelen-1);
+                       mappedname[namelen-1]='\0';
+                       return;
+               }
 
-      if (!(e = ldap_first_entry(ldap_handle, result)))
-         insert_to_cache(searchloginname, searchloginname);
-      else
-         for (attr = ldap_first_attribute(ldap_handle, e, &ber); attr != NULL; attr = ldap_next_attribute(ldap_handle, e, ber)) {
-            if (!strcasecmp(attr, LDAPTargetAttr)) {
-               if ((vals = (char **)ldap_get_values(ldap_handle, e, attr))!=NULL) {
-                  insert_to_cache(searchloginname, vals[0]);
-                  strncpy(mappedname, vals[0],namelen-1);
-                  mappedname[namelen-1]='\0';
-                  ldap_memfree(vals);
-               }
-               ldap_memfree(attr);
-               break;
-            }
-            ldap_memfree(attr);
-         }
-         ldap_msgfree(result);
-   } else {
-       strncpy(mappedname, searched_in_cache,namelen-1);
-       mappedname[namelen-1]='\0';
-   }
+               if (!(e = ldap_first_entry(ldap_handle, result)))
+                       insert_to_cache(searchloginname, searchloginname);
+               else
+                       for (attr = ldap_first_attribute(ldap_handle, e, &ber); attr != NULL; attr = ldap_next_attribute(ldap_handle, e, ber)) {
+                               if (!strcasecmp(attr, LDAPTargetAttr)) {
+                                       if ((vals = (char **)ldap_get_values(ldap_handle, e, attr))!=NULL) {
+                                               insert_to_cache(searchloginname, vals[0]);
+                                               strncpy(mappedname, vals[0],namelen-1);
+                                               mappedname[namelen-1]='\0';
+                                               ldap_memfree(vals);
+                                       }
+                                       ldap_memfree(attr);
+                                       break;
+                               }
+                               ldap_memfree(attr);
+                       }
+                       ldap_msgfree(result);
+       } else {
+               strncpy(mappedname, searched_in_cache,namelen-1);
+               mappedname[namelen-1]='\0';
+       }
 }
 #endif //HAVE_LDAP_H
 
 void init_usertab(const char *UserTabFile)
 {
-   if (strcmp(UserTabFile, "ldap") == 0) {
-      if(debug)
-         debuga(_("Loading User table: %s\n"),UserTabFile);
+       if (strcmp(UserTabFile, "ldap") == 0) {
+               if(debug)
+                       debuga(_("Loading User table: %s\n"),UserTabFile);
 #ifdef HAVE_LDAP_H
-      which_usertab=UTT_Ldap;
-      init_ldap_usertab();
+               which_usertab=UTT_Ldap;
+               init_ldap_usertab();
 #else
-      debuga(_("LDAP module not compiled in sarg\n"));
-      exit(EXIT_FAILURE);
+               debuga(_("LDAP module not compiled in sarg\n"));
+               exit(EXIT_FAILURE);
 #endif //HAVE_LDAP_H
-   } else if (UserTabFile[0] != '\0') {
-      if(debug)
-         debuga(_("Loading User table: %s\n"),UserTabFile);
-      which_usertab=UTT_File;
-      init_file_usertab(UserTabFile);
-   } else {
-      which_usertab=UTT_None;
-   }
+       } else if (UserTabFile[0] != '\0') {
+               if(debug)
+                       debuga(_("Loading User table: %s\n"),UserTabFile);
+               which_usertab=UTT_File;
+               init_file_usertab(UserTabFile);
+       } else {
+               which_usertab=UTT_None;
+       }
 }
 
 void user_find(char *mappedname, int namelen, const char *userlogin)
 {
-   if (which_usertab==UTT_File) {
-      get_usertab_name(userlogin,mappedname,namelen);
-   }
+       if (which_usertab==UTT_File) {
+               get_usertab_name(userlogin,mappedname,namelen);
+       }
 #ifdef HAVE_LDAP_H
-   else if (which_usertab==UTT_Ldap) {
-      get_ldap_name(userlogin,mappedname,namelen);
-   }
+       else if (which_usertab==UTT_Ldap) {
+               get_ldap_name(userlogin,mappedname,namelen);
+       }
 #endif //HAVE_LDAP_H
-   else {
-      strncpy(mappedname,userlogin,namelen-1);
-      mappedname[namelen-1]='\0';
-   }
+       else {
+               strncpy(mappedname,userlogin,namelen-1);
+               mappedname[namelen-1]='\0';
+       }
 }
 
 void close_usertab(void)
 {
 #ifdef HAVE_LDAP_H
-   if (ldap_handle) {
-      destroy_cache();
-      ldap_unbind(ldap_handle);
-      ldap_handle=NULL;
-   }
+       if (ldap_handle) {
+               destroy_cache();
+               ldap_unbind(ldap_handle);
+               ldap_handle=NULL;
+       }
 #endif //HAVE_LDAP_H
-   if(userfile) {
-      free(userfile);
-      userfile=NULL;
-   }
+       if(userfile) {
+               free(userfile);
+               userfile=NULL;
+       }
 }
 
diff --git a/util.c b/util.c
index 84c85dba921ffefd6090a9c09e439d9b08167b1d..35f08180c55d0b9a83e12bc8a38655ae6cc8b1f9 100644 (file)
--- a/util.c
+++ b/util.c
@@ -43,1250 +43,1242 @@ static char *excludecode=NULL;
 
 /*void fgetword(char *word, char *line, int stop)
 {
-    //VARIANT N1
-    int x;
+       //VARIANT N1
+       int x;
 
-    for (x=0; line[x] && (line[x] != stop); x++) word[x] = line[x];
-    word[x] = '\0';
+       for (x=0; line[x] && (line[x] != stop); x++) word[x] = line[x];
+       word[x] = '\0';
 
-    //VARIANT N2
-    char *tchar;
-    int difflen;
+       //VARIANT N2
+       char *tchar;
+       int difflen;
 
-    tchar = strchr(line, stop);
-    if (tchar == NULL) strcpy(word, line);
-    else
-    {
+       tchar = strchr(line, stop);
+       if (tchar == NULL) strcpy(word, line);
+       else
+       {
        difflen = tchar - line;
        strncpy(word, line, difflen);
        word[difflen] = '\0';
-    }
+       }
 }*/
 
 #if USE_GETWORD_BACKTRACE
 static void getword_backtrace(void)
 {
-   void *buffer[5];
-   int i, n;
-   char **calls;
-
-   n=backtrace(buffer,sizeof(buffer)/sizeof(buffer[0]));
-   if (n<=0) return;
-   calls=backtrace_symbols(buffer,n);
-   if (calls) {
-      debuga(_("getword backtrace:\n"));
-      for (i=0 ; i<n ; i++) {
-         fprintf(stderr,"SARG: %d:%s\n",i+1,calls[i]);
-      }
-      free(calls);
-   }
+       void *buffer[5];
+       int i, n;
+       char **calls;
+
+       n=backtrace(buffer,sizeof(buffer)/sizeof(buffer[0]));
+       if (n<=0) return;
+       calls=backtrace_symbols(buffer,n);
+       if (calls) {
+               debuga(_("getword backtrace:\n"));
+               for (i=0 ; i<n ; i++) {
+                       fprintf(stderr,"SARG: %d:%s\n",i+1,calls[i]);
+               }
+               free(calls);
+       }
 }
 #endif //USE_GETWORD_BACKTRACE
 
 void getword_start(struct getwordstruct *gwarea, const char *line)
 {
-   gwarea->beginning=line;
-   gwarea->current=line;
-   gwarea->modified=0;
+       gwarea->beginning=line;
+       gwarea->current=line;
+       gwarea->modified=0;
 }
 
 void getword_restart(struct getwordstruct *gwarea)
 {
-   if (gwarea->modified) {
-      debuga(_("Cannot parse again the line as it was modified\n"));
-      exit(EXIT_FAILURE);
-   }
-   gwarea->current=gwarea->beginning;
+       if (gwarea->modified) {
+               debuga(_("Cannot parse again the line as it was modified\n"));
+               exit(EXIT_FAILURE);
+       }
+       gwarea->current=gwarea->beginning;
 }
 
 int getword(char *word, int limit, struct getwordstruct *gwarea, char stop)
 {
-  int x;
+       int x;
 
-  for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++) {
-     if(x>=limit) {
-        printf("SARG: getword loop detected after %d bytes.\n",x);
-        printf("SARG: Line=\"%s\"\n",gwarea->beginning);
-        printf("SARG: Record=\"%s\"\n",gwarea->current);
-        printf("SARG: searching for \'x%x\'\n",stop);
-        //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
-        word[(limit>0) ? limit-1 : 0]='\0';
+       for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++) {
+               if(x>=limit) {
+                       printf("SARG: getword loop detected after %d bytes.\n",x);
+                       printf("SARG: Line=\"%s\"\n",gwarea->beginning);
+                       printf("SARG: Record=\"%s\"\n",gwarea->current);
+                       printf("SARG: searching for \'x%x\'\n",stop);
+                       //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
+                       word[(limit>0) ? limit-1 : 0]='\0';
 #if USE_GETWORD_BACKTRACE
-         getword_backtrace();
+                               getword_backtrace();
 #endif
-        return(-1);
-     }
-     word[x] = gwarea->current[x];
-  }
+                       return(-1);
+               }
+               word[x] = gwarea->current[x];
+       }
 
-  word[x] = '\0';
-  if (gwarea->current[x]) ++x;
-  gwarea->current+=x;
-  return(0);
+       word[x] = '\0';
+       if (gwarea->current[x]) ++x;
+       gwarea->current+=x;
+       return(0);
 }
 
 int getword_limit(char *word, int limit, struct getwordstruct *gwarea, char stop)
 {
-  int x;
+       int x;
 
-  limit--;
-  for(x=0; x<limit && gwarea->current[x] && gwarea->current[x] != stop ;x++) {
-     word[x] = gwarea->current[x];
-  }
-  word[x] = '\0';
-  gwarea->current+=x;
-  while (*gwarea->current && *gwarea->current != stop)  gwarea->current++;
-  if (*gwarea->current) ++gwarea->current;
-  return(0);
+       limit--;
+       for(x=0; x<limit && gwarea->current[x] && gwarea->current[x] != stop ;x++) {
+               word[x] = gwarea->current[x];
+       }
+       word[x] = '\0';
+       gwarea->current+=x;
+       while (*gwarea->current && *gwarea->current != stop)  gwarea->current++;
+       if (*gwarea->current) ++gwarea->current;
+       return(0);
 }
 
 int getword_multisep(char *word, int limit, struct getwordstruct *gwarea, char stop)
 {
-  int x;
+       int x;
 
-  for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++) {
-     if(x>=limit) {
-        printf("SARG: getword_multisep loop detected.\n");
-        printf("SARG: Line=\"%s\"\n",gwarea->beginning);
-        printf("SARG: Record=\"%s\"\n",gwarea->current);
-        printf("SARG: searching for \'x%x\'\n",stop);
-        //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
-        if (limit>0) word[limit-1]='\0';
+       for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++) {
+               if(x>=limit) {
+                       printf("SARG: getword_multisep loop detected.\n");
+                       printf("SARG: Line=\"%s\"\n",gwarea->beginning);
+                       printf("SARG: Record=\"%s\"\n",gwarea->current);
+                       printf("SARG: searching for \'x%x\'\n",stop);
+                       //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
+                       if (limit>0) word[limit-1]='\0';
 #if USE_GETWORD_BACKTRACE
-        getword_backtrace();
+                       getword_backtrace();
 #endif
-        //exit(EXIT_FAILURE);
-        return(-1);
-     }
-     word[x] = gwarea->current[x];
-  }
+                       //exit(EXIT_FAILURE);
+                       return(-1);
+               }
+               word[x] = gwarea->current[x];
+       }
 
-  word[x] = '\0';
-  while (gwarea->current[x] && gwarea->current[x]==stop) ++x;
-  gwarea->current+=x;
-  return(0);
+       word[x] = '\0';
+       while (gwarea->current[x] && gwarea->current[x]==stop) ++x;
+       gwarea->current+=x;
+       return(0);
 }
 
 int getword_skip(int limit, struct getwordstruct *gwarea, char stop)
 {
-   int x;
+       int x;
 
-   for(x=0;(gwarea->current[x] && (gwarea->current[x] != stop ));x++) {
-      if(x>=limit) {
-         printf("SARG: getword_skip loop detected after %d bytes.\n",x);
-         printf("SARG: Line=\"%s\"\n",gwarea->beginning);
-         printf("SARG: Record=\"%s\"\n",gwarea->current);
-         printf("SARG: searching for \'x%x\'\n",stop);
-         //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
+       for(x=0;(gwarea->current[x] && (gwarea->current[x] != stop ));x++) {
+               if(x>=limit) {
+                       printf("SARG: getword_skip loop detected after %d bytes.\n",x);
+                       printf("SARG: Line=\"%s\"\n",gwarea->beginning);
+                       printf("SARG: Record=\"%s\"\n",gwarea->current);
+                       printf("SARG: searching for \'x%x\'\n",stop);
+                       //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
 #if USE_GETWORD_BACKTRACE
-         getword_backtrace();
+                       getword_backtrace();
 #endif
-         return(-1);
-      }
-   }
+                       return(-1);
+               }
+       }
 
-   if (gwarea->current[x]) ++x;
-   gwarea->current+=x;
-   return(0);
+       if (gwarea->current[x]) ++x;
+       gwarea->current+=x;
+       return(0);
 }
 
 int getword_atoll(long long int *number, struct getwordstruct *gwarea, char stop)
 {
-   int x;
-   int sign=+1;
-
-   if (gwarea->current[0] == '-') {
-      gwarea->current++;
-      sign=-1;
-   } else if (gwarea->current[0] == '+') {
-      gwarea->current++;
-   }
-   *number=0LL;
-   for(x=0;isdigit(gwarea->current[x]);x++) {
-      *number=(*number * 10) + gwarea->current[x]-'0';
-   }
-   if(gwarea->current[x] && gwarea->current[x]!=stop) {
-      printf("SARG: getword_atoll loop detected after %d bytes.\n",x);
-      printf("SARG: Line=\"%s\"\n",gwarea->beginning);
-      printf("SARG: Record=\"%s\"\n",gwarea->current);
-      printf("SARG: searching for \'x%x\'\n",stop);
-      //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
+       int x;
+       int sign=+1;
+
+       if (gwarea->current[0] == '-') {
+               gwarea->current++;
+               sign=-1;
+       } else if (gwarea->current[0] == '+') {
+               gwarea->current++;
+       }
+       *number=0LL;
+       for(x=0;isdigit(gwarea->current[x]);x++) {
+               *number=(*number * 10) + gwarea->current[x]-'0';
+       }
+       if(gwarea->current[x] && gwarea->current[x]!=stop) {
+               printf("SARG: getword_atoll loop detected after %d bytes.\n",x);
+               printf("SARG: Line=\"%s\"\n",gwarea->beginning);
+               printf("SARG: Record=\"%s\"\n",gwarea->current);
+               printf("SARG: searching for \'x%x\'\n",stop);
+               //printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
 #if USE_GETWORD_BACKTRACE
-      getword_backtrace();
+               getword_backtrace();
 #endif
-      return(-1);
-   }
-   *number*=sign;
+               return(-1);
+       }
+       *number*=sign;
 
-   if (gwarea->current[x]) ++x;
-   gwarea->current+=x;
-   return(0);
+       if (gwarea->current[x]) ++x;
+       gwarea->current+=x;
+       return(0);
 }
 
 
 int getword_ptr(char *orig_line,char **word, struct getwordstruct *gwarea, char stop)
 {
-   /*!
-   \note Why pass the original buffer to the function ? Because we must modify it to
-   insert the terminating ASCII zero for the word we return and that's not compatible
-   with getword_restart(). Moreover, getword_start() sometime works on constant strings
-   so this function require the original buffer to detect any missuse.
-   */
-   int x;
-   int sep;
-   int start;
-
-   if (orig_line && orig_line!=gwarea->beginning) {
-      debuga(_("Invalid buffer passed to getword_ptr\n"));
-      return(-1);
-   }
-
-   start=(gwarea->current-gwarea->beginning);
-   if (word && orig_line) *word=orig_line+start;
-   for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++);
-   sep=(gwarea->current[x]!='\0');
-   if (word && orig_line) orig_line[start+x] = '\0';
-   if (sep) ++x;
-   gwarea->current+=x;
-   gwarea->modified=1;
-   return(0);
+       /*!
+       \note Why pass the original buffer to the function ? Because we must modify it to
+       insert the terminating ASCII zero for the word we return and that's not compatible
+       with getword_restart(). Moreover, getword_start() sometime works on constant strings
+       so this function require the original buffer to detect any missuse.
+       */
+       int x;
+       int sep;
+       int start;
+
+       if (orig_line && orig_line!=gwarea->beginning) {
+               debuga(_("Invalid buffer passed to getword_ptr\n"));
+               return(-1);
+       }
+
+       start=(gwarea->current-gwarea->beginning);
+       if (word && orig_line) *word=orig_line+start;
+       for(x=0;((gwarea->current[x]) && (gwarea->current[x] != stop ));x++);
+       sep=(gwarea->current[x]!='\0');
+       if (word && orig_line) orig_line[start+x] = '\0';
+       if (sep) ++x;
+       gwarea->current+=x;
+       gwarea->modified=1;
+       return(0);
 }
 
 #define MAXLLL 30 //!< Maximum number of digits in long long (a guess).
 long long int my_atoll (const char *nptr)
 {
-  long long int returnval=0LL;
-  int max_digits = MAXLLL ;
+       long long int returnval=0LL;
+       int max_digits = MAXLLL ;
 
-  // Soak up all the white space
-  while (isspace( *nptr )) {
-    nptr++;
-  }
+       // Soak up all the white space
+       while (isspace( *nptr )) {
+               nptr++;
+       }
 
-  //For each character left to right
-  //change the character to a single digit
-  //multiply what we had before by 10 and add the new digit
+       //For each character left to right
+       //change the character to a single digit
+       //multiply what we had before by 10 and add the new digit
 
-  while (--max_digits && isdigit( *nptr ))
-  {
-     returnval = ( returnval * 10 ) + ( *nptr++ - '0' ) ;
-  }
+       while (--max_digits && isdigit( *nptr ))
+       {
+               returnval = ( returnval * 10 ) + ( *nptr++ - '0' ) ;
+       }
 
-  return returnval;
+       return returnval;
 }
 
 int is_absolute(const char *path)
 {
-   if (*path=='/') return(1);
+       if (*path=='/') return(1);
 #ifdef WINDOWS
-   if (isalpha(path[0]) && path[1]==':') return(1);
+       if (isalpha(path[0]) && path[1]==':') return(1);
 #endif
-   return(0);
+       return(0);
 }
 
 void my_mkdir(const char *name)
 {
-   char w0[MAXLEN];
-   int i;
-   int chars;
-
-   if(!is_absolute(name)) {
-      debuga(_("Invalid path (%s). Please, use absolute paths only.\n"),name);
-      debuga(_("process aborted.\n"));
-      exit(EXIT_FAILURE);
-   }
-
-   chars=0;
-   for (i=0 ; name[i] ; i++) {
-      if (i>=sizeof(w0)) {
-         debuga(_("directory name too long: %s\n"),name);
-         exit(EXIT_FAILURE);
-      }
-      if (chars>0 && name[i] == '/') {
-         w0[i] = '\0';
-         if(access(w0, R_OK) != 0) {
-            if(mkdir(w0,0755)) {
-               debuga(_("mkdir %s %s\n"),w0,strerror(errno));
-               debuga(_("process aborted.\n"));
-               exit(EXIT_FAILURE);
-            }
-         }
-      }
-      if (name[i] != '/') chars++;
-      w0[i] = name[i];
-   }
-
-   if(access(name, R_OK) != 0) {
-      if(mkdir(name,0755)) {
-         debuga(_("mkdir %s %s\n"),name,strerror(errno));
-         debuga(_("process aborted.\n"));
-         exit(EXIT_FAILURE);
-      }
-   }
+       char w0[MAXLEN];
+       int i;
+       int chars;
+
+       if(!is_absolute(name)) {
+               debuga(_("Invalid path (%s). Please, use absolute paths only.\n"),name);
+               debuga(_("process aborted.\n"));
+               exit(EXIT_FAILURE);
+       }
+
+       chars=0;
+       for (i=0 ; name[i] ; i++) {
+               if (i>=sizeof(w0)) {
+                       debuga(_("directory name too long: %s\n"),name);
+                       exit(EXIT_FAILURE);
+               }
+               if (chars>0 && name[i] == '/') {
+                       w0[i] = '\0';
+                       if(access(w0, R_OK) != 0) {
+                               if(mkdir(w0,0755)) {
+                                       debuga(_("mkdir %s %s\n"),w0,strerror(errno));
+                                       debuga(_("process aborted.\n"));
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+               }
+               if (name[i] != '/') chars++;
+               w0[i] = name[i];
+       }
+
+       if(access(name, R_OK) != 0) {
+               if(mkdir(name,0755)) {
+                       debuga(_("mkdir %s %s\n"),name,strerror(errno));
+                       debuga(_("process aborted.\n"));
+                       exit(EXIT_FAILURE);
+               }
+       }
 }
 
 
 void my_lltoa(unsigned long long int n, char *s, int ssize, int len)
 {
-   int i;
-   int slen = 0;
-   int j;
-   char c;
-
-   ssize--;
-   if (len>ssize) {
-      debuga(_("The requested number of digits passed to my_lltoa (%d) is bigger than the output buffer size (%d)\n"),len,ssize);
-      abort();
-   }
-
-   do {
-      s[slen++] = (n % 10) + '0';
-   } while ((n /= 10) > 0 && slen<ssize);
-   s[slen] = '\0';
-
-   for (i = 0, j = slen-1; i<j; i++, j--) {
-      c = s[i];
-      s[i] = s[j];
-      s[j] = c;
-   }
-
-   if(len>slen) {
-      i=len-slen;
-      for(j=slen; j>=0; j--)
-         s[j+i]=s[j];
-      for(j=0 ; j<i ; j++)
-         s[j]='0';
-   }
+       int i;
+       int slen = 0;
+       int j;
+       char c;
+
+       ssize--;
+       if (len>ssize) {
+               debuga(_("The requested number of digits passed to my_lltoa (%d) is bigger than the output buffer size (%d)\n"),len,ssize);
+               abort();
+       }
+
+       do {
+               s[slen++] = (n % 10) + '0';
+       } while ((n /= 10) > 0 && slen<ssize);
+       s[slen] = '\0';
+
+       for (i = 0, j = slen-1; i<j; i++, j--) {
+               c = s[i];
+               s[i] = s[j];
+               s[j] = c;
+       }
+
+       if(len>slen) {
+               i=len-slen;
+               for(j=slen; j>=0; j--)
+                       s[j+i]=s[j];
+               for(j=0 ; j<i ; j++)
+                       s[j]='0';
+       }
 }
 
 int month2num(const char *month)
 {
-   int m;
+       int m;
 
-   for(m=0 ; m<12 && strcmp(mtab1[m],month) != 0; m++);
-   return(m);
+       for(m=0 ; m<12 && strcmp(mtab1[m],month) != 0; m++);
+       return(m);
 }
 
 int builddia(int day, int month, int year)
 {
-   return(year*10000+month*100+day);
+       return(year*10000+month*100+day);
 }
 
 
 void buildymd(const char *dia, const char *mes, const char *ano, char *wdata)
 {
-   int nmes;
+       int nmes;
 
-   nmes=month2num(mes);
-   sprintf(wdata,"%04d%02d%02d",atoi(ano),nmes+1,atoi(dia));
+       nmes=month2num(mes);
+       sprintf(wdata,"%04d%02d%02d",atoi(ano),nmes+1,atoi(dia));
 }
 
 
 int conv_month(const char *month)
 {
-   int  x;
+       int  x;
 
-   for(x=0; x<12 && strncmp(mtab1[x],month,3)!=0; x++);
-   return(x+1);
+       for(x=0; x<12 && strncmp(mtab1[x],month,3)!=0; x++);
+       return(x+1);
 }
 
 
 const char *conv_month_name(int month)
 {
-   static char str[4];
+       static char str[4];
 
-   if (month<1 || month>12) {
-      snprintf(str,sizeof(str),"%03d",month);
-      return(str);
-   }
-   return(mtab1[month-1]);
+       if (month<1 || month>12) {
+               snprintf(str,sizeof(str),"%03d",month);
+               return(str);
+       }
+       return(mtab1[month-1]);
 }
 
 
 void name_month(char *month,int month_len)
 {
-   int  x, z=atoi(month)-1;
-   char m[255];
-   char w[20];
-   struct getwordstruct gwarea;
+       int  x, z=atoi(month)-1;
+       char m[255];
+       char w[20];
+       struct getwordstruct gwarea;
 
-   strcpy(m,_("January,February,March,April,May,June,July,August,September,October,November,December"));
-   getword_start(&gwarea,m);
+       strcpy(m,_("January,February,March,April,May,June,July,August,September,October,November,December"));
+       getword_start(&gwarea,m);
 
-   for(x=0; x<z; x++)
-      if (getword_multisep(w,sizeof(w),&gwarea,',')<0) {
-         printf("SARG: Maybe you have a broken record or garbage in the names of the months.\n");
-         exit(EXIT_FAILURE);
-      }
-   if (getword_multisep(month,month_len,&gwarea,',')<0) {
-      printf("SARG: Maybe you have a broken record or garbage in the name of the months.\n");
-      exit(EXIT_FAILURE);
-   }
+       for(x=0; x<z; x++)
+               if (getword_multisep(w,sizeof(w),&gwarea,',')<0) {
+                       printf("SARG: Maybe you have a broken record or garbage in the names of the months.\n");
+                       exit(EXIT_FAILURE);
+               }
+       if (getword_multisep(month,month_len,&gwarea,',')<0) {
+               printf("SARG: Maybe you have a broken record or garbage in the name of the months.\n");
+               exit(EXIT_FAILURE);
+       }
 }
 
 
 void debuga(const char *msg,...)
 {
-   va_list ap;
+       va_list ap;
 
-   fputs(_("SARG: "),stderr);
-   va_start(ap,msg);
-   vfprintf(stderr,msg,ap);
-   va_end(ap);
+       fputs(_("SARG: "),stderr);
+       va_start(ap,msg);
+       vfprintf(stderr,msg,ap);
+       va_end(ap);
 }
 
 
 void debugaz(const char *head, const char *msg)
 {
-  fprintf(stderr, "SARG: (util) %s=%s\n",head, msg);
-
+       fprintf(stderr, "SARG: (util) %s=%s\n",head, msg);
 }
 
 
 char *fixnum(long long int value, int n)
 {
 #define MAXLEN_FIXNUM 256
-   char num[MAXLEN_FIXNUM]="";
-   char buf[MAXLEN_FIXNUM * 2];
-   char *pbuf;
-   static char ret[MAXLEN_FIXNUM * 2];
-   char *pret;
-   register int i, j, k;
-   int numlen;
-   static char abbrev[30];
-
-   my_lltoa(value, num, sizeof(num), 0);
-
-   if(DisplayedValues==DISPLAY_ABBREV) {
-      numlen = strlen(num);
-      if(numlen <= 3)
-         sprintf(abbrev,"%s",num);
-      if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) {
-         snprintf(abbrev,2,"%s",num);
-         strncat(abbrev,".",1);
-         strncat(abbrev,num+1,2);
-         if(!n) return(abbrev);
-         if(numlen == 4)
-            strncat(abbrev,"K",1);
-         else if(numlen == 7)
-            strncat(abbrev,"M",1);
-         else if(numlen == 10)
-            strncat(abbrev,"G",1);
-         else if(numlen == 13)
-            strncat(abbrev,"T",1);
-      }
-      if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) {
-         snprintf(abbrev,3,"%s",num);
-         strncat(abbrev,".",1);
-         strncat(abbrev,num+2,2);
-         if(!n) return(abbrev);
-         if(numlen == 5)
-            strncat(abbrev,"K",1);
-         else if(numlen == 8)
-            strncat(abbrev,"M",1);
-         else if(numlen == 11)
-            strncat(abbrev,"G",1);
-         else if(numlen == 14)
-            strncat(abbrev,"T",1);
-      }
-      if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) {
-         snprintf(abbrev,4,"%s",num);
-         strncat(abbrev,".",1);
-         strncat(abbrev,num+3,2);
-         if(!n) return(abbrev);
-         if(numlen == 6)
-            strncat(abbrev,"K",1);
-         else if(numlen == 9)
-            strncat(abbrev,"M",1);
-         else if(numlen == 12)
-            strncat(abbrev,"G",1);
-         else if(numlen == 15)
-            strncat(abbrev,"T",1);
-      }
-
-      return(abbrev);
-   }
-
-   bzero(buf, MAXLEN_FIXNUM*2);
-
-   pbuf = buf;
-   pret = ret;
-   k = 0;
-
-   for ( i = strlen(num) - 1, j = 0 ; i > -1; i--) {
-      if ( k == 2 && i != 0 )  {
-         k = 0;
-         pbuf[j++] = num[i];
-         pbuf[j++] = (UseComma) ? ',' : '.';
-         continue;
-      }
-      pbuf[j] = num[i];
-      j++;
-      k++;
-   }
-
-   pret[0]='\0';
-
-   for ( i = strlen(pbuf) - 1, j = 0 ; i > -1; i--, j++)
-      pret[j] = pbuf[i];
-
-   pret[j] = '\0';
-
-   return pret;
+       char num[MAXLEN_FIXNUM]="";
+       char buf[MAXLEN_FIXNUM * 2];
+       char *pbuf;
+       static char ret[MAXLEN_FIXNUM * 2];
+       char *pret;
+       register int i, j, k;
+       int numlen;
+       static char abbrev[30];
+
+       my_lltoa(value, num, sizeof(num), 0);
+
+       if(DisplayedValues==DISPLAY_ABBREV) {
+               numlen = strlen(num);
+               if(numlen <= 3)
+                       sprintf(abbrev,"%s",num);
+               if(numlen == 4 || numlen == 7 || numlen == 10 || numlen == 13) {
+                       snprintf(abbrev,2,"%s",num);
+                       strncat(abbrev,".",1);
+                       strncat(abbrev,num+1,2);
+                       if(!n) return(abbrev);
+                       if(numlen == 4)
+                               strncat(abbrev,"K",1);
+                       else if(numlen == 7)
+                               strncat(abbrev,"M",1);
+                       else if(numlen == 10)
+                               strncat(abbrev,"G",1);
+                       else if(numlen == 13)
+                               strncat(abbrev,"T",1);
+               }
+               if(numlen == 5 || numlen == 8 || numlen == 11 || numlen == 14) {
+                       snprintf(abbrev,3,"%s",num);
+                       strncat(abbrev,".",1);
+                       strncat(abbrev,num+2,2);
+                       if(!n) return(abbrev);
+                       if(numlen == 5)
+                               strncat(abbrev,"K",1);
+                       else if(numlen == 8)
+                               strncat(abbrev,"M",1);
+                       else if(numlen == 11)
+                               strncat(abbrev,"G",1);
+                       else if(numlen == 14)
+                               strncat(abbrev,"T",1);
+               }
+               if(numlen == 6 || numlen == 9 || numlen == 12 || numlen == 15) {
+                       snprintf(abbrev,4,"%s",num);
+                       strncat(abbrev,".",1);
+                       strncat(abbrev,num+3,2);
+                       if(!n) return(abbrev);
+                       if(numlen == 6)
+                               strncat(abbrev,"K",1);
+                       else if(numlen == 9)
+                               strncat(abbrev,"M",1);
+                       else if(numlen == 12)
+                               strncat(abbrev,"G",1);
+                       else if(numlen == 15)
+                               strncat(abbrev,"T",1);
+               }
+
+               return(abbrev);
+       }
+
+       bzero(buf, MAXLEN_FIXNUM*2);
+
+       pbuf = buf;
+       pret = ret;
+       k = 0;
+
+       for ( i = strlen(num) - 1, j = 0 ; i > -1; i--) {
+               if ( k == 2 && i != 0 )  {
+                       k = 0;
+                       pbuf[j++] = num[i];
+                       pbuf[j++] = (UseComma) ? ',' : '.';
+                       continue;
+               }
+               pbuf[j] = num[i];
+               j++;
+               k++;
+       }
+
+       pret[0]='\0';
+
+       for ( i = strlen(pbuf) - 1, j = 0 ; i > -1; i--, j++)
+               pret[j] = pbuf[i];
+
+       pret[j] = '\0';
+
+       return pret;
 }
 
 
 char *fixnum2(long long int value, int n)
 {
 #define MAXLEN_FIXNUM2 1024
-   char num[MAXLEN_FIXNUM2];
-   char buf[MAXLEN_FIXNUM2 * 2];
-   char *pbuf;
-   static char ret[MAXLEN_FIXNUM2 * 2];
-   char *pret;
-   register int i, j, k;
+       char num[MAXLEN_FIXNUM2];
+       char buf[MAXLEN_FIXNUM2 * 2];
+       char *pbuf;
+       static char ret[MAXLEN_FIXNUM2 * 2];
+       char *pret;
+       register int i, j, k;
 
-   my_lltoa(value, num, sizeof(num), 0);
-   bzero(buf, MAXLEN_FIXNUM2*2);
+       my_lltoa(value, num, sizeof(num), 0);
+       bzero(buf, MAXLEN_FIXNUM2*2);
 
-   pbuf = buf;
-   pret = ret;
-   k = 0;
+       pbuf = buf;
+       pret = ret;
+       k = 0;
 
-   for ( i = strlen(num) - 1, j = 0 ; i > -1; i--) {
-      if ( k == 2 && i != 0 )  {
-         k = 0;
-         pbuf[j++] = num[i];
-         pbuf[j++] = (UseComma) ? ',' : '.';
-         continue;
-      }
-      pbuf[j] = num[i];
-      j++;
-      k++;
-   }
+       for ( i = strlen(num) - 1, j = 0 ; i > -1; i--) {
+               if ( k == 2 && i != 0 )  {
+                       k = 0;
+                       pbuf[j++] = num[i];
+                       pbuf[j++] = (UseComma) ? ',' : '.';
+                       continue;
+               }
+               pbuf[j] = num[i];
+               j++;
+               k++;
+       }
 
-   pret[0]='\0';
+       pret[0]='\0';
 
-   for ( i = strlen(pbuf) - 1, j = 0 ; i > -1; i--, j++)
-      pret[j] = pbuf[i];
+       for ( i = strlen(pbuf) - 1, j = 0 ; i > -1; i--, j++)
+               pret[j] = pbuf[i];
 
-   pret[j] = '\0';
+       pret[j] = '\0';
 
-   return pret;
+       return pret;
 }
 
 
 char *buildtime(long long int elap)
 {
+       int num = elap / 1000;
+       int hor = 0;
+       int min = 0;
+       int sec = 0;
+       static char buf[12];
 
-   int num = elap / 1000;
-   int hor = 0;
-   int min = 0;
-   int sec = 0;
-   static char buf[12];
-
-   buf[0]='\0';
+       buf[0]='\0';
 
-   hor=num / 3600;
-   min=(num % 3600) / 60;
-   sec=num % 60;
-   sprintf(buf,"%02d:%02d:%02d",hor,min,sec);
-
-   return(buf);
+       hor=num / 3600;
+       min=(num % 3600) / 60;
+       sec=num % 60;
+       sprintf(buf,"%02d:%02d:%02d",hor,min,sec);
 
+       return(buf);
 }
 
 
 void obtdate(const char *dirname, const char *name, char *data)
 {
+       FILE *fp_in;
+       char wdir[MAXLEN];
 
-   FILE *fp_in;
-   char wdir[MAXLEN];
-
-   sprintf(wdir,"%s%s/sarg-date",dirname,name);
-   if ((fp_in = fopen(wdir, "rt")) == 0) {
-      sprintf(wdir,"%s%s/date",dirname,name);
-      if ((fp_in = fopen(wdir, "rt")) == 0) {
-         data[0]='\0';
-         return;
-      }
-   }
+       sprintf(wdir,"%s%s/sarg-date",dirname,name);
+       if ((fp_in = fopen(wdir, "rt")) == 0) {
+               sprintf(wdir,"%s%s/date",dirname,name);
+               if ((fp_in = fopen(wdir, "rt")) == 0) {
+                       data[0]='\0';
+                       return;
+               }
+       }
 
-   if (!fgets(data,80,fp_in)) {
-      debuga(_("Failed to read the date in %s\n"),wdir);
-      exit(EXIT_FAILURE);
-   }
-   fclose(fp_in);
-   fixendofline(data);
-
-   return;
+       if (!fgets(data,80,fp_in)) {
+               debuga(_("Failed to read the date in %s\n"),wdir);
+               exit(EXIT_FAILURE);
+       }
+       fclose(fp_in);
+       fixendofline(data);
 
+       return;
 }
 
 
 void formatdate(char *date,int date_size,int year,int month,int day,int hour,int minute,int second,int dst)
 {
-   struct tm ltm;
-   time_t unixtime;
-   struct tm *fulltm;
+       struct tm ltm;
+       time_t unixtime;
+       struct tm *fulltm;
 
-   memset(&ltm,0,sizeof(ltm));
-   if (year>=1900) ltm.tm_year=year-1900;
-   if (month>=1 && month<=12) ltm.tm_mon=month-1;
-   if (day>=1 && day<=31) ltm.tm_mday=day;
-   if (hour>=0 && hour<24) ltm.tm_hour=hour;
-   if (minute>=0 && minute<60) ltm.tm_min=minute;
-   if (second>=0 && second<60) ltm.tm_sec=second;
-   ltm.tm_isdst=dst;
-   unixtime=mktime(&ltm); //fill the missing entries
-   fulltm=localtime(&unixtime);
-   //strftime(date,date_size,"%a %b %d %H:%M:%S %Z %Y",fulltm);
-   strftime(date,date_size,"%c",fulltm);
+       memset(&ltm,0,sizeof(ltm));
+       if (year>=1900) ltm.tm_year=year-1900;
+       if (month>=1 && month<=12) ltm.tm_mon=month-1;
+       if (day>=1 && day<=31) ltm.tm_mday=day;
+       if (hour>=0 && hour<24) ltm.tm_hour=hour;
+       if (minute>=0 && minute<60) ltm.tm_min=minute;
+       if (second>=0 && second<60) ltm.tm_sec=second;
+       ltm.tm_isdst=dst;
+       unixtime=mktime(&ltm); //fill the missing entries
+       fulltm=localtime(&unixtime);
+       //strftime(date,date_size,"%a %b %d %H:%M:%S %Z %Y",fulltm);
+       strftime(date,date_size,"%c",fulltm);
 }
 
 
 void computedate(int year,int month,int day,struct tm *t)
 {
-   memset(t,0,sizeof(*t));
-   t->tm_year=year-1900;
-   t->tm_mon=month-1;
-   t->tm_mday=day;
+       memset(t,0,sizeof(*t));
+       t->tm_year=year-1900;
+       t->tm_mon=month-1;
+       t->tm_mday=day;
 }
 
 
 int obtuser(const char *dirname, const char *name)
 {
+       FILE *fp_in;
+       char wdir[MAXLEN];
+       char tuser[20];
+       int nuser;
 
-   FILE *fp_in;
-   char wdir[MAXLEN];
-   char tuser[20];
-   int nuser;
-
-   sprintf(wdir,"%s%s/sarg-users",dirname,name);
-   if((fp_in=fopen(wdir,"r"))==NULL) {
-      sprintf(wdir,"%s%s/users",dirname,name);
-      if((fp_in=fopen(wdir,"r"))==NULL) {
-         return(0);
-      }
-   }
+       sprintf(wdir,"%s%s/sarg-users",dirname,name);
+       if((fp_in=fopen(wdir,"r"))==NULL) {
+               sprintf(wdir,"%s%s/users",dirname,name);
+               if((fp_in=fopen(wdir,"r"))==NULL) {
+                       return(0);
+               }
+       }
 
-   if (!fgets(tuser,sizeof(tuser),fp_in)) {
-      debuga(_("Failed to read the number of users in %s\n"),wdir);
-      exit(EXIT_FAILURE);
-   }
-   fclose(fp_in);
-   nuser=atoi(tuser);
+       if (!fgets(tuser,sizeof(tuser),fp_in)) {
+               debuga(_("Failed to read the number of users in %s\n"),wdir);
+               exit(EXIT_FAILURE);
+       }
+       fclose(fp_in);
+       nuser=atoi(tuser);
 
-   return(nuser);
+       return(nuser);
 }
 
 
 void obttotal(const char *dirname, const char *name, int nuser, long long int *tbytes, long long int *media)
 {
-   FILE *fp_in;
-   char *buf;
-   char wdir[MAXLEN];
-   char user[MAX_USER_LEN];
-   char sep;
-   struct getwordstruct gwarea;
-   longline line;
-
-   *tbytes=0;
-   *media=0;
-
-   sprintf(wdir,"%s%s/sarg-general",dirname,name);
-   if ((fp_in = fopen(wdir, "r")) == 0) {
-      sprintf(wdir,"%s%s/general",dirname,name);
-      if ((fp_in = fopen(wdir, "r")) == 0) {
-         return;
-      }
-   }
-
-   if ((line=longline_create())==NULL) {
-      debuga(_("Not enough memory to read the file %s\n"),wdir);
-      exit(EXIT_FAILURE);
-   }
-
-   while((buf=longline_read(fp_in,line))!=NULL) {
-      if (strncmp(buf,"TOTAL\t",6) == 0)
-         sep='\t'; //new file
-      else if (strncmp(buf,"TOTAL ",6) == 0)
-         sep=' '; //old file
-      else
-         continue;
-      getword_start(&gwarea,buf);
-      if (getword(user,sizeof(user),&gwarea,sep)<0) {
-         debuga(_("There is a invalid user in file %s\n"),wdir);
-         exit(EXIT_FAILURE);
-      }
-      if(strcmp(user,"TOTAL") != 0)
-         continue;
-      if (getword_skip(MAXLEN,&gwarea,sep)<0) {
-         debuga(_("There a broken total number of access in file %s\n"),wdir);
-         exit(EXIT_FAILURE);
-      }
-      if (getword_atoll(tbytes,&gwarea,sep)<0) {
-         debuga(_("There is a broken number of bytes in file %s\n"),wdir);
-         exit(EXIT_FAILURE);
-      }
-      break;
-   }
-   fclose(fp_in);
-   longline_destroy(&line);
-
-   if (nuser <= 0)
-      return;
-
-   *media=*tbytes / nuser;
-   return;
+       FILE *fp_in;
+       char *buf;
+       char wdir[MAXLEN];
+       char user[MAX_USER_LEN];
+       char sep;
+       struct getwordstruct gwarea;
+       longline line;
+
+       *tbytes=0;
+       *media=0;
+
+       sprintf(wdir,"%s%s/sarg-general",dirname,name);
+       if ((fp_in = fopen(wdir, "r")) == 0) {
+               sprintf(wdir,"%s%s/general",dirname,name);
+               if ((fp_in = fopen(wdir, "r")) == 0) {
+                       return;
+               }
+       }
+
+       if ((line=longline_create())==NULL) {
+               debuga(_("Not enough memory to read the file %s\n"),wdir);
+               exit(EXIT_FAILURE);
+       }
+
+       while((buf=longline_read(fp_in,line))!=NULL) {
+               if (strncmp(buf,"TOTAL\t",6) == 0)
+                       sep='\t'; //new file
+               else if (strncmp(buf,"TOTAL ",6) == 0)
+                       sep=' '; //old file
+               else
+                       continue;
+               getword_start(&gwarea,buf);
+               if (getword(user,sizeof(user),&gwarea,sep)<0) {
+                       debuga(_("There is a invalid user in file %s\n"),wdir);
+                       exit(EXIT_FAILURE);
+               }
+               if(strcmp(user,"TOTAL") != 0)
+                       continue;
+               if (getword_skip(MAXLEN,&gwarea,sep)<0) {
+                       debuga(_("There a broken total number of access in file %s\n"),wdir);
+                       exit(EXIT_FAILURE);
+               }
+               if (getword_atoll(tbytes,&gwarea,sep)<0) {
+                       debuga(_("There is a broken number of bytes in file %s\n"),wdir);
+                       exit(EXIT_FAILURE);
+               }
+               break;
+       }
+       fclose(fp_in);
+       longline_destroy(&line);
+
+       if (nuser <= 0)
+               return;
+
+       *media=*tbytes / nuser;
+       return;
 }
 
 int getperiod_fromsarglog(const char *arqtt,struct periodstruct *period)
 {
-   const char *str;
-   int day0, month0, year0, hour0, minute0;
-   int day1, month1, year1, hour1, minute1;
-   char month[4];
-   int i;
-
-   memset(period,0,sizeof(*period));
-
-   str=arqtt;
-   while((str=strstr(str,"sarg-"))!=NULL) {
-      str+=5;
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      day0=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-      strncpy(month,str,3);
-      month[3]=0;
-      month0=month2num(month);
-      if (month0>=12) continue;
-      str+=3;
-      year0=0;
-      for (i=0 ; isdigit(str[i]) && i<4 ; i++) year0=year0*10+(str[i]-'0');
-      if (i!=4) continue;
-      str+=4;
-      if (str[0]!='_') continue;
-      str++;
-
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      hour0=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      minute0=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-
-      if (*str != '-') continue;
-      str++;
-
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      day1=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-      strncpy(month,str,3);
-      month[3]=0;
-      month1=month2num(month);
-      if (month1>=12) continue;
-      str+=3;
-      year1=0;
-      for (i=0 ; isdigit(str[i]) && i<4 ; i++) year1=year1*10+(str[i]-'0');
-      if (i!=4) continue;
-      str+=4;
-
-      if (str[0]!='_') continue;
-      str++;
-
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      hour1=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-      if (!isdigit(str[0]) || !isdigit(str[1])) continue;
-      minute1=(str[0]-'0')*10+(str[1]-'0');
-      str+=2;
-
-      period->start.tm_mday=day0;
-      period->start.tm_mon=month0;
-      period->start.tm_year=year0-1900;
-      period->start.tm_hour=hour0;
-      period->start.tm_min=minute0;
-      period->end.tm_mday=day1;
-      period->end.tm_mon=month1;
-      period->end.tm_year=year1-1900;
-      period->end.tm_hour=hour1;
-      period->end.tm_min=minute1;
-      return(0);
-   }
-   return(-1);
+       const char *str;
+       int day0, month0, year0, hour0, minute0;
+       int day1, month1, year1, hour1, minute1;
+       char month[4];
+       int i;
+
+       memset(period,0,sizeof(*period));
+
+       str=arqtt;
+       while((str=strstr(str,"sarg-"))!=NULL) {
+               str+=5;
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               day0=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+               strncpy(month,str,3);
+               month[3]=0;
+               month0=month2num(month);
+               if (month0>=12) continue;
+               str+=3;
+               year0=0;
+               for (i=0 ; isdigit(str[i]) && i<4 ; i++) year0=year0*10+(str[i]-'0');
+               if (i!=4) continue;
+               str+=4;
+               if (str[0]!='_') continue;
+               str++;
+
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               hour0=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               minute0=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+
+               if (*str != '-') continue;
+               str++;
+
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               day1=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+               strncpy(month,str,3);
+               month[3]=0;
+               month1=month2num(month);
+               if (month1>=12) continue;
+               str+=3;
+               year1=0;
+               for (i=0 ; isdigit(str[i]) && i<4 ; i++) year1=year1*10+(str[i]-'0');
+               if (i!=4) continue;
+               str+=4;
+
+               if (str[0]!='_') continue;
+               str++;
+
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               hour1=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+               if (!isdigit(str[0]) || !isdigit(str[1])) continue;
+               minute1=(str[0]-'0')*10+(str[1]-'0');
+               str+=2;
+
+               period->start.tm_mday=day0;
+               period->start.tm_mon=month0;
+               period->start.tm_year=year0-1900;
+               period->start.tm_hour=hour0;
+               period->start.tm_min=minute0;
+               period->end.tm_mday=day1;
+               period->end.tm_mon=month1;
+               period->end.tm_year=year1-1900;
+               period->end.tm_hour=hour1;
+               period->end.tm_min=minute1;
+               return(0);
+       }
+       return(-1);
 }
 
 void getperiod_fromrange(struct periodstruct *period,int dfrom,int duntil)
 {
-   memset(&period->start,0,sizeof(period->start));
-   period->start.tm_mday=dfrom%100;
-   period->start.tm_mon=(dfrom/100)%100-1;
-   period->start.tm_year=(dfrom/10000)-1900;
+       memset(&period->start,0,sizeof(period->start));
+       period->start.tm_mday=dfrom%100;
+       period->start.tm_mon=(dfrom/100)%100-1;
+       period->start.tm_year=(dfrom/10000)-1900;
 
-   memset(&period->end,0,sizeof(period->end));
-   period->end.tm_mday=duntil%100;
-   period->end.tm_mon=(duntil/100)%100-1;
-   period->end.tm_year=(duntil/10000)-1900;
+       memset(&period->end,0,sizeof(period->end));
+       period->end.tm_mday=duntil%100;
+       period->end.tm_mon=(duntil/100)%100-1;
+       period->end.tm_year=(duntil/10000)-1900;
 }
 
 int getperiod_buildtext(struct periodstruct *period)
 {
-   int i;
-   int range;
-   char text1[40], text2[40];
-
-   if(df[0]=='u') {
-      i=strftime(text1, sizeof(text1), "%Y %b %d", &period->start);
-   }else if(df[0]=='e') {
-      i=strftime(text1, sizeof(text1), "%d %b %Y", &period->start);
-   } else /*if(df[0]=='w')*/ {
-      IndexTree=INDEX_TREE_FILE;
-      i=strftime(text1, sizeof(text1), "%Y.%U", &period->start);
-   }
-   if (i == 0) return(-1);
-
-   range=(period->start.tm_year!=period->end.tm_year ||
-       period->start.tm_mon!=period->end.tm_mon ||
-       period->start.tm_mday!=period->end.tm_mday);
-   if (range) {
-      if(df[0]=='u') {
-         i=strftime(text2, sizeof(text2)-i, "%Y %b %d", &period->end);
-      } else if(df[0]=='e') {
-         i=strftime(text2, sizeof(text2)-i, "%d %b %Y", &period->end);
-      } else {
-         i=strftime(text2, sizeof(text2)-i, "%Y.%U", &period->end);
-      }
-      if (i == 0) return(-1);
-   }
-
-   if (range) {
-      snprintf(period->text,sizeof(period->text),"%s-%s",text1,text2);
-      snprintf(period->html,sizeof(period->html),"%s&mdash;%s",text1,text2);
-   } else {
-      strncpy(period->text,text1,sizeof(period->text)-1);
-      period->text[sizeof(period->text)-1]='\0';
-      strncpy(period->html,text1,sizeof(period->html)-1);
-      period->html[sizeof(period->html)-1]='\0';
-   }
-   return(0);
+       int i;
+       int range;
+       char text1[40], text2[40];
+
+       if(df[0]=='u') {
+               i=strftime(text1, sizeof(text1), "%Y %b %d", &period->start);
+       }else if(df[0]=='e') {
+               i=strftime(text1, sizeof(text1), "%d %b %Y", &period->start);
+       } else /*if(df[0]=='w')*/ {
+               IndexTree=INDEX_TREE_FILE;
+               i=strftime(text1, sizeof(text1), "%Y.%U", &period->start);
+       }
+       if (i == 0) return(-1);
+
+       range=(period->start.tm_year!=period->end.tm_year ||
+               period->start.tm_mon!=period->end.tm_mon ||
+               period->start.tm_mday!=period->end.tm_mday);
+       if (range) {
+               if(df[0]=='u') {
+                       i=strftime(text2, sizeof(text2)-i, "%Y %b %d", &period->end);
+               } else if(df[0]=='e') {
+                       i=strftime(text2, sizeof(text2)-i, "%d %b %Y", &period->end);
+               } else {
+                       i=strftime(text2, sizeof(text2)-i, "%Y.%U", &period->end);
+               }
+               if (i == 0) return(-1);
+       }
+
+       if (range) {
+               snprintf(period->text,sizeof(period->text),"%s-%s",text1,text2);
+               snprintf(period->html,sizeof(period->html),"%s&mdash;%s",text1,text2);
+       } else {
+               strncpy(period->text,text1,sizeof(period->text)-1);
+               period->text[sizeof(period->text)-1]='\0';
+               strncpy(period->html,text1,sizeof(period->html)-1);
+               period->html[sizeof(period->html)-1]='\0';
+       }
+       return(0);
 }
 
 static void copy_images(void)
 {
-   FILE *img_in, *img_ou;
-   char images[512];
-   char imgdir[MAXLEN];
-   char srcfile[MAXLEN];
-   char dstfile[MAXLEN];
-   DIR *dirp;
-   struct dirent *direntp;
-   char buffer[MAXLEN];
-   size_t nread;
-   struct stat info;
-
-   if (snprintf(images,sizeof(images),"%simages",outdir)>=sizeof(images)) {
-      debuga(_("Cannot copy images to target directory %simages\n"),outdir);
-      exit(EXIT_FAILURE);
-   }
-   if (access(images,R_OK)!=0) {
-      mkdir(images,0755);
-   }
-
-   strcpy(imgdir,IMAGEDIR);
-   dirp = opendir(imgdir);
-   if(dirp==NULL) {
-      debuga(_("(util) Can't open directory %s: %s\n"),imgdir,strerror(errno));
-      return;
-   }
-   while ((direntp = readdir( dirp )) != NULL ){
-      if(direntp->d_name[0]=='.')
-         continue;
-      sprintf(srcfile,"%s/%s",imgdir,direntp->d_name);
-      if (stat(srcfile,&info)) {
-         debuga(_("Cannot stat \"%s\" - %s\n"),srcfile,strerror(errno));
-         continue;
-      }
-      if (S_ISREG(info.st_mode)) {
-         sprintf(dstfile,"%s/%s",images,direntp->d_name);
-         img_in = fopen(srcfile, "rb");
-         if(img_in!=NULL) {
-            img_ou = fopen(dstfile, "wb");
-            if(img_ou!=NULL) {
-               while ((nread = fread(buffer,1,sizeof(buffer),img_in))>0) {
-                  if (fwrite(buffer,1,nread,img_ou)!=nread) {
-                     debuga(_("Failed to copy image %s to %s\n"),srcfile,dstfile);
-                     break;
-                  }
-               }
-               fclose(img_ou);
-            } else
-               fprintf(stderr,"SARG: (util): %s %s: %s\n", _("Cannot open file")?_("Cannot open file"):"Can't open/create file", dstfile, strerror(errno));
-            fclose(img_in);
-         } else
-            fprintf(stderr,"SARG: (util): %s %s: %s\n", _("Cannot open file")?_("Cannot open file"):"Can't open file", srcfile, strerror(errno));
-      }
-   }
-   (void) closedir(dirp);
-
-   return;
+       FILE *img_in, *img_ou;
+       char images[512];
+       char imgdir[MAXLEN];
+       char srcfile[MAXLEN];
+       char dstfile[MAXLEN];
+       DIR *dirp;
+       struct dirent *direntp;
+       char buffer[MAXLEN];
+       size_t nread;
+       struct stat info;
+
+       if (snprintf(images,sizeof(images),"%simages",outdir)>=sizeof(images)) {
+               debuga(_("Cannot copy images to target directory %simages\n"),outdir);
+               exit(EXIT_FAILURE);
+       }
+       if (access(images,R_OK)!=0) {
+               mkdir(images,0755);
+       }
+
+       strcpy(imgdir,IMAGEDIR);
+       dirp = opendir(imgdir);
+       if(dirp==NULL) {
+               debuga(_("(util) Can't open directory %s: %s\n"),imgdir,strerror(errno));
+               return;
+       }
+       while ((direntp = readdir( dirp )) != NULL ){
+               if(direntp->d_name[0]=='.')
+                       continue;
+               sprintf(srcfile,"%s/%s",imgdir,direntp->d_name);
+               if (stat(srcfile,&info)) {
+                       debuga(_("Cannot stat \"%s\" - %s\n"),srcfile,strerror(errno));
+                       continue;
+               }
+               if (S_ISREG(info.st_mode)) {
+                       sprintf(dstfile,"%s/%s",images,direntp->d_name);
+                       img_in = fopen(srcfile, "rb");
+                       if(img_in!=NULL) {
+                               img_ou = fopen(dstfile, "wb");
+                               if(img_ou!=NULL) {
+                                       while ((nread = fread(buffer,1,sizeof(buffer),img_in))>0) {
+                                               if (fwrite(buffer,1,nread,img_ou)!=nread) {
+                                                       debuga(_("Failed to copy image %s to %s\n"),srcfile,dstfile);
+                                                       break;
+                                               }
+                                       }
+                                       fclose(img_ou);
+                               } else
+                                       fprintf(stderr,"SARG: (util): %s %s: %s\n", _("Cannot open file")?_("Cannot open file"):"Can't open/create file", dstfile, strerror(errno));
+                               fclose(img_in);
+                       } else
+                               fprintf(stderr,"SARG: (util): %s %s: %s\n", _("Cannot open file")?_("Cannot open file"):"Can't open file", srcfile, strerror(errno));
+               }
+       }
+       (void) closedir(dirp);
+
+       return;
 }
 
 int vrfydir(const struct periodstruct *per1, const char *addr, const char *site, const char *us, const char *form)
 {
-   FILE *fp_ou;
-   int  num=1, count=0;
-   char wdir[MAXLEN];
-   char dirname2[MAXLEN];
-   int y1, y2;
-   int m1, m2;
-   int d1, d2;
-   int wlen, wlen2;
-   time_t curtime;
-   struct tm *loctm;
-
-   strcpy(wdir,outdir);
-   wlen=strlen(wdir);
-   y1=per1->start.tm_year+1900;
-   y2=per1->end.tm_year+1900;
-   m1=per1->start.tm_mon+1;
-   m2=per1->end.tm_mon+1;
-   d1=per1->start.tm_mday;
-   d2=per1->end.tm_mday;
-   if(IndexTree == INDEX_TREE_DATE) {
-      wlen+=sprintf(wdir+wlen,"%04d",y1);
-      if(y1!=y2) wlen+=sprintf(wdir+wlen,"-%04d",y2);
-      if(access(wdir, R_OK) != 0)
-         my_mkdir(wdir);
-
-      wlen+=sprintf(wdir+wlen,"/%02d",m1);
-      if(m1 != m2) wlen+=sprintf(wdir+wlen,"-%02d",m2);
-      if(access(wdir, R_OK) != 0)
-         my_mkdir(wdir);
-
-      wlen+=sprintf(wdir+wlen,"/%02d",d1);
-      if(d1!=d2) wlen+=sprintf(wdir+wlen,"-%02d",d2);
-   } else {
-      if(df[0] == 'u') {
-         wlen=snprintf(wdir+wlen,sizeof(wdir)-wlen,"%04d%s%02d-%04d%s%02d",y1,
-                       conv_month_name(m1),d1,y2,conv_month_name(m2),d2);
-      } else if(df[0] == 'e') {
-         wlen=snprintf(wdir+wlen,sizeof(wdir)-wlen,"%02d%s%04d-%02d%s%04d",d1,
-                       conv_month_name(m1),y1,d2,conv_month_name(m2),y2);
-      } else if(df[0] == 'w') {
-         wlen2=strftime(wdir+wlen, sizeof(wdir)-wlen, "%Y.%U", &per1->start);
-         if (wlen2==0) return(-1);
-         wlen+=wlen2;
-      }
-   }
-
-   if(us[0] != '\0') {
-      struct userinfostruct *uinfo=userinfo_find_from_id(us);
-      if (uinfo) {
-         strcat(wdir,"-");
-         strcat(wdir,uinfo->filename);
-      }
-   }
-   if(addr[0] != '\0') {
-      strcat(wdir,"-");
-      strcat(wdir,addr);
-   }
-   if(site[0] != '\0') {
-      strcat(wdir,"-");
-      strcat(wdir,site);
-   }
-
-   strcpy(outdirname,wdir);
-
-   if(IndexTree != INDEX_TREE_DATE) {
-      if(!OverwriteReport) {
-         while(num) {
-            if(access(wdir,R_OK) == 0) {
-               sprintf(wdir,"%s.%d",outdirname,num);
-               num++;
-               count++;
-            } else
-               break;
-         }
-
-         if(count > 0) {
-            if(debug)
-               debuga(_("File %s already exists, moved to %s\n"),outdirname,wdir);
-            rename(outdirname,wdir);
-         }
-      } else {
-         if(access(outdirname,R_OK) == 0) {
-            unlinkdir(outdirname,1);
-         }
-      }
-      my_mkdir(outdirname);
-   } else {
-      strcpy(dirname2,wdir);
-      if(!OverwriteReport) {
-         while(num) {
-            if(access(wdir,R_OK) == 0) {
-               sprintf(wdir,"%s.%d",dirname2,num);
-               num++;
-               count++;
-            } else
-               break;
-         }
-
-         if(count > 0) {
-            if(debug)
-               debuga(_("File %s already exists, moved to %s\n"),dirname2,wdir);
-            rename(dirname2,wdir);
-            strcpy(dirname2,wdir);
-         }
-      } else {
-         if(access(wdir,R_OK) == 0) {
-            unlinkdir(wdir,1);
-         }
-      }
-
-      if(access(wdir, R_OK) != 0)
-         my_mkdir(wdir);
-   }
-
-   strcpy(dirname2,wdir);
-
-   sprintf(wdir,"%s/sarg-date",outdirname);
-   if ((fp_ou = fopen(wdir, "wt")) == 0) {
-      debuga(_("cannot open %s for writing\n"),wdir);
-      perror("SARG:");
-      exit(EXIT_FAILURE);
-   }
-   time(&curtime);
-   //strftime(wdir,sizeof(wdir),"%a %b %d %H:%M:%S %Z %Y",localtime(&curtime));
-   loctm=localtime(&curtime);
-   strftime(wdir,sizeof(wdir),"%Y-%m-%d %H:%M:%S",loctm);
-   if (fprintf(fp_ou,"%s %d\n",wdir,loctm->tm_isdst)<0) {
-      debuga(_("Failed to write the date in %s\n"),wdir);
-      perror("SARG:");
-      exit(EXIT_FAILURE);
-   }
-   if (fclose(fp_ou)==EOF) {
-      debuga(_("Failed to write the date in %s\n"),wdir);
-      perror("SARG:");
-      exit(EXIT_FAILURE);
-   }
-
-   copy_images();
-   return(0);
+       FILE *fp_ou;
+       int  num=1, count=0;
+       char wdir[MAXLEN];
+       char dirname2[MAXLEN];
+       int y1, y2;
+       int m1, m2;
+       int d1, d2;
+       int wlen, wlen2;
+       time_t curtime;
+       struct tm *loctm;
+
+       strcpy(wdir,outdir);
+       wlen=strlen(wdir);
+       y1=per1->start.tm_year+1900;
+       y2=per1->end.tm_year+1900;
+       m1=per1->start.tm_mon+1;
+       m2=per1->end.tm_mon+1;
+       d1=per1->start.tm_mday;
+       d2=per1->end.tm_mday;
+       if(IndexTree == INDEX_TREE_DATE) {
+               wlen+=sprintf(wdir+wlen,"%04d",y1);
+               if(y1!=y2) wlen+=sprintf(wdir+wlen,"-%04d",y2);
+               if(access(wdir, R_OK) != 0)
+                       my_mkdir(wdir);
+
+               wlen+=sprintf(wdir+wlen,"/%02d",m1);
+               if(m1 != m2) wlen+=sprintf(wdir+wlen,"-%02d",m2);
+               if(access(wdir, R_OK) != 0)
+                       my_mkdir(wdir);
+
+               wlen+=sprintf(wdir+wlen,"/%02d",d1);
+               if(d1!=d2) wlen+=sprintf(wdir+wlen,"-%02d",d2);
+       } else {
+               if(df[0] == 'u') {
+                       wlen=snprintf(wdir+wlen,sizeof(wdir)-wlen,"%04d%s%02d-%04d%s%02d",y1,
+                                                       conv_month_name(m1),d1,y2,conv_month_name(m2),d2);
+               } else if(df[0] == 'e') {
+                       wlen=snprintf(wdir+wlen,sizeof(wdir)-wlen,"%02d%s%04d-%02d%s%04d",d1,
+                                                       conv_month_name(m1),y1,d2,conv_month_name(m2),y2);
+               } else if(df[0] == 'w') {
+                       wlen2=strftime(wdir+wlen, sizeof(wdir)-wlen, "%Y.%U", &per1->start);
+                       if (wlen2==0) return(-1);
+                       wlen+=wlen2;
+               }
+       }
+
+       if(us[0] != '\0') {
+               struct userinfostruct *uinfo=userinfo_find_from_id(us);
+               if (uinfo) {
+                       strcat(wdir,"-");
+                       strcat(wdir,uinfo->filename);
+               }
+       }
+       if(addr[0] != '\0') {
+               strcat(wdir,"-");
+               strcat(wdir,addr);
+       }
+       if(site[0] != '\0') {
+               strcat(wdir,"-");
+               strcat(wdir,site);
+       }
+
+       strcpy(outdirname,wdir);
+
+       if(IndexTree != INDEX_TREE_DATE) {
+               if(!OverwriteReport) {
+                       while(num) {
+                               if(access(wdir,R_OK) == 0) {
+                                       sprintf(wdir,"%s.%d",outdirname,num);
+                                       num++;
+                                       count++;
+                               } else
+                                       break;
+                       }
+
+                       if(count > 0) {
+                               if(debug)
+                                       debuga(_("File %s already exists, moved to %s\n"),outdirname,wdir);
+                               rename(outdirname,wdir);
+                       }
+               } else {
+                       if(access(outdirname,R_OK) == 0) {
+                               unlinkdir(outdirname,1);
+                       }
+               }
+               my_mkdir(outdirname);
+       } else {
+               strcpy(dirname2,wdir);
+               if(!OverwriteReport) {
+                       while(num) {
+                               if(access(wdir,R_OK) == 0) {
+                                       sprintf(wdir,"%s.%d",dirname2,num);
+                                       num++;
+                                       count++;
+                               } else
+                                       break;
+                       }
+
+                       if(count > 0) {
+                               if(debug)
+                                       debuga(_("File %s already exists, moved to %s\n"),dirname2,wdir);
+                               rename(dirname2,wdir);
+                               strcpy(dirname2,wdir);
+                       }
+               } else {
+                       if(access(wdir,R_OK) == 0) {
+                               unlinkdir(wdir,1);
+                       }
+               }
+
+               if(access(wdir, R_OK) != 0)
+                       my_mkdir(wdir);
+       }
+
+       strcpy(dirname2,wdir);
+
+       sprintf(wdir,"%s/sarg-date",outdirname);
+       if ((fp_ou = fopen(wdir, "wt")) == 0) {
+               debuga(_("cannot open %s for writing\n"),wdir);
+               perror("SARG:");
+               exit(EXIT_FAILURE);
+       }
+       time(&curtime);
+       //strftime(wdir,sizeof(wdir),"%a %b %d %H:%M:%S %Z %Y",localtime(&curtime));
+       loctm=localtime(&curtime);
+       strftime(wdir,sizeof(wdir),"%Y-%m-%d %H:%M:%S",loctm);
+       if (fprintf(fp_ou,"%s %d\n",wdir,loctm->tm_isdst)<0) {
+               debuga(_("Failed to write the date in %s\n"),wdir);
+               perror("SARG:");
+               exit(EXIT_FAILURE);
+       }
+       if (fclose(fp_ou)==EOF) {
+               debuga(_("Failed to write the date in %s\n"),wdir);
+               perror("SARG:");
+               exit(EXIT_FAILURE);
+       }
+
+       copy_images();
+       return(0);
 }
 
 void strip_latin(char *line)
 {
-   int i,j;
-   int skip;
-
-   j=0;
-   skip=0;
-   for (i=0;line[i];i++){
-      if (skip){
-         if (line[i]==';') skip=0;
-      } else {
-         if (line[i]=='&')
-            skip=1;
-         else
-            line[j++]=line[i];
-      }
-   }
-   line[j]='\0';
-   return;
-
+       int i,j;
+       int skip;
+
+       j=0;
+       skip=0;
+       for (i=0;line[i];i++){
+               if (skip){
+                       if (line[i]==';') skip=0;
+               } else {
+                       if (line[i]=='&')
+                               skip=1;
+                       else
+                               line[j++]=line[i];
+               }
+       }
+       line[j]='\0';
+       return;
 }
 
 void zdate(char *ftime,int ftimesize, const char *DateFormat)
 {
+       time_t t;
+       struct tm *local;
 
-   time_t t;
-   struct tm *local;
-
-   t = time(NULL);
-   local = localtime(&t);
-   if(strcmp(DateFormat,"u") == 0)
-      strftime(ftime, ftimesize, "%b/%d/%Y %H:%M", local);
-   if(strcmp(DateFormat,"e") == 0)
-      strftime(ftime, ftimesize, "%d/%b/%Y-%H:%M", local);
-   if(strcmp(DateFormat,"w") == 0)
-      strftime(ftime, ftimesize, "%W-%H-%M", local);
-   return;
+       t = time(NULL);
+       local = localtime(&t);
+       if(strcmp(DateFormat,"u") == 0)
+               strftime(ftime, ftimesize, "%b/%d/%Y %H:%M", local);
+       if(strcmp(DateFormat,"e") == 0)
+               strftime(ftime, ftimesize, "%d/%b/%Y-%H:%M", local);
+       if(strcmp(DateFormat,"w") == 0)
+               strftime(ftime, ftimesize, "%W-%H-%M", local);
+       return;
 }
 
 
 char *fixtime(long long int elap)
 {
-   int num = elap / 1000;
-   int hor = 0;
-   int min = 0;
-   int sec = 0;
-   static char buf[12];
+       int num = elap / 1000;
+       int hor = 0;
+       int min = 0;
+       int sec = 0;
+       static char buf[12];
 
-   hor=num / 3600;
-   min=(num % 3600) / 60;
-   sec=num % 60;
+       hor=num / 3600;
+       min=(num % 3600) / 60;
+       sec=num % 60;
 
-   if(hor==0 && min==0 && sec==0)
-      strcpy(buf,"0");
-   else
-      sprintf(buf,"%d:%02d:%02d",hor,min,sec);
+       if(hor==0 && min==0 && sec==0)
+               strcpy(buf,"0");
+       else
+               sprintf(buf,"%d:%02d:%02d",hor,min,sec);
 
-   return buf;
+       return buf;
 }
 
 
 void date_from(char *date, int *dfrom, int *duntil)
 {
-   int d0=0;
-   int m0=0;
-   int y0=0;
-   int d1=0;
-   int m1=0;
-   int y1=0;
-
-   if (isdigit(date[0])) {
-      int next=-1;
-
-      if (sscanf(date,"%d/%d/%d%n",&d0,&m0,&y0,&next)!=3 || y0<100 || m0<1 || m0>12 || d0<1 || d0>31 || next<0) {
-         debuga(_("The date passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
-         exit(EXIT_FAILURE);
-      }
-      if (date[next]=='-') {
-         if (sscanf(date+next+1,"%d/%d/%d",&d1,&m1,&y1)!=3 || y1<100 || m1<1 || m1>12 || d1<1 || d1>31) {
-            debuga(_("The date range passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
-            exit(EXIT_FAILURE);
-         }
-      } else if (date[next]!='\0') {
-         debuga(_("The date range passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
-         exit(EXIT_FAILURE);
-      } else {
-         d1=d0;
-         m1=m0;
-         y1=y0;
-      }
-   } else {
-      int i;
-      time_t Today,t1;
-      struct tm *Date0,Date1;
-
-      if (time(&Today)==(time_t)-1) {
-         debuga(_("Failed to get the current time\n"));
-         exit(EXIT_FAILURE);
-      }
-      if (sscanf(date,"day-%d",&i)==1) {
-         if (i<0) {
-            debuga(_("Invalid number of days in -d parameter\n"));
-            exit(EXIT_FAILURE);
-         }
-         Today-=i*24*60*60;
-         Date0=localtime(&Today);
-         if (Date0==NULL) {
-            debuga(_("Cannot convert local time: %s\n"),strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         y0=y1=Date0->tm_year+1900;
-         m0=m1=Date0->tm_mon+1;
-         d0=d1=Date0->tm_mday;
-      } else if (sscanf(date,"week-%d",&i)==1) {
-         /*
-         There is no portable way to find the first day of the week even though the
-         information is available in the locale. nl_langinfo has the unofficial
-         parameters _NL_TIME_FIRST_WEEKDAY and _NL_TIME_WEEK_1STDAY but they are
-         undocumented as is their return value and it is discouraged to use them.
-         Beside, nl_langinfo isn't available on windows and the first day of the
-         week isn't available at all on that system.
-         */
-         const int FirstWeekDay=1;
-         time_t WeekBegin;
-
-         if (i<0) {
-            debuga(_("Invalid number of weeks in -d parameter\n"));
-            exit(EXIT_FAILURE);
-         }
-         Date0=localtime(&Today);
-         if (Date0==NULL) {
-            debuga(_("Cannot convert local time: %s\n"),strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         WeekBegin=Today-((Date0->tm_wday-FirstWeekDay+7)%7)*24*60*60;
-         WeekBegin-=i*7*24*60*60;
-         Date0=localtime(&WeekBegin);
-         if (Date0==NULL) {
-            debuga(_("Cannot convert local time: %s\n"),strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         y0=Date0->tm_year+1900;
-         m0=Date0->tm_mon+1;
-         d0=Date0->tm_mday;
-         WeekBegin+=6*24*60*60;
-         Date0=localtime(&WeekBegin);
-         if (Date0==NULL) {
-            debuga(_("Cannot convert local time: %s\n"),strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         y1=Date0->tm_year+1900;
-         m1=Date0->tm_mon+1;
-         d1=Date0->tm_mday;
-      } else if (sscanf(date,"month-%d",&i)==1) {
-         if (i<0) {
-            debuga(_("Invalid number of months in -d parameter\n"));
-            exit(EXIT_FAILURE);
-         }
-         Date0=localtime(&Today);
-         if (Date0==NULL) {
-            debuga(_("Cannot convert local time: %s\n"),strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-         if (Date0->tm_mon<i%12) {
-            y0=Date0->tm_year+1900-i/12-1;
-            m0=(Date0->tm_mon+12-i%12)%12+1;
-            d0=1;
-         } else {
-            y0=Date0->tm_year+1900-i/12;
-            m0=Date0->tm_mon-i%12+1;
-            d0=1;
-         }
-         memcpy(&Date1,Date0,sizeof(struct tm));
-         Date1.tm_isdst=-1;
-         Date1.tm_mday=1;
-         if (m0<12) {
-            Date1.tm_mon=m0;
-            Date1.tm_year=y0-1900;
-         } else {
-            Date1.tm_mon=0;
-            Date1.tm_year=y0-1900+1;
-         }
-         t1=mktime(&Date1);
-         t1-=24*60*60;
-         Date0=localtime(&t1);
-         y1=Date0->tm_year+1900;
-         m1=Date0->tm_mon+1;
-         d1=Date0->tm_mday;
-      } else {
-         debuga(_("Invalid date range passed on command line\n"));
-         exit(EXIT_FAILURE);
-      }
-   }
-
-   *dfrom=y0*10000+m0*100+d0;
-   *duntil=y1*10000+m1*100+d1;
-   sprintf(date,"%02d/%02d/%04d-%02d/%02d/%04d",d0,m0,y0,d1,m1,y1);
-   return;
+       int d0=0;
+       int m0=0;
+       int y0=0;
+       int d1=0;
+       int m1=0;
+       int y1=0;
+
+       if (isdigit(date[0])) {
+               int next=-1;
+
+               if (sscanf(date,"%d/%d/%d%n",&d0,&m0,&y0,&next)!=3 || y0<100 || m0<1 || m0>12 || d0<1 || d0>31 || next<0) {
+                       debuga(_("The date passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
+                       exit(EXIT_FAILURE);
+               }
+               if (date[next]=='-') {
+                       if (sscanf(date+next+1,"%d/%d/%d",&d1,&m1,&y1)!=3 || y1<100 || m1<1 || m1>12 || d1<1 || d1>31) {
+                               debuga(_("The date range passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
+                               exit(EXIT_FAILURE);
+                       }
+               } else if (date[next]!='\0') {
+                       debuga(_("The date range passed as argument is not formated as dd/mm/yyyy or dd/mm/yyyy-dd/mm/yyyy\n"));
+                       exit(EXIT_FAILURE);
+               } else {
+                       d1=d0;
+                       m1=m0;
+                       y1=y0;
+               }
+       } else {
+               int i;
+               time_t Today,t1;
+               struct tm *Date0,Date1;
+
+               if (time(&Today)==(time_t)-1) {
+                       debuga(_("Failed to get the current time\n"));
+                       exit(EXIT_FAILURE);
+               }
+               if (sscanf(date,"day-%d",&i)==1) {
+                       if (i<0) {
+                               debuga(_("Invalid number of days in -d parameter\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       Today-=i*24*60*60;
+                       Date0=localtime(&Today);
+                       if (Date0==NULL) {
+                               debuga(_("Cannot convert local time: %s\n"),strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       y0=y1=Date0->tm_year+1900;
+                       m0=m1=Date0->tm_mon+1;
+                       d0=d1=Date0->tm_mday;
+               } else if (sscanf(date,"week-%d",&i)==1) {
+                       /*
+                       There is no portable way to find the first day of the week even though the
+                       information is available in the locale. nl_langinfo has the unofficial
+                       parameters _NL_TIME_FIRST_WEEKDAY and _NL_TIME_WEEK_1STDAY but they are
+                       undocumented as is their return value and it is discouraged to use them.
+                       Beside, nl_langinfo isn't available on windows and the first day of the
+                       week isn't available at all on that system.
+                       */
+                       const int FirstWeekDay=1;
+                       time_t WeekBegin;
+
+                       if (i<0) {
+                               debuga(_("Invalid number of weeks in -d parameter\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       Date0=localtime(&Today);
+                       if (Date0==NULL) {
+                               debuga(_("Cannot convert local time: %s\n"),strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       WeekBegin=Today-((Date0->tm_wday-FirstWeekDay+7)%7)*24*60*60;
+                       WeekBegin-=i*7*24*60*60;
+                       Date0=localtime(&WeekBegin);
+                       if (Date0==NULL) {
+                               debuga(_("Cannot convert local time: %s\n"),strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       y0=Date0->tm_year+1900;
+                       m0=Date0->tm_mon+1;
+                       d0=Date0->tm_mday;
+                       WeekBegin+=6*24*60*60;
+                       Date0=localtime(&WeekBegin);
+                       if (Date0==NULL) {
+                               debuga(_("Cannot convert local time: %s\n"),strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       y1=Date0->tm_year+1900;
+                       m1=Date0->tm_mon+1;
+                       d1=Date0->tm_mday;
+               } else if (sscanf(date,"month-%d",&i)==1) {
+                       if (i<0) {
+                               debuga(_("Invalid number of months in -d parameter\n"));
+                               exit(EXIT_FAILURE);
+                       }
+                       Date0=localtime(&Today);
+                       if (Date0==NULL) {
+                               debuga(_("Cannot convert local time: %s\n"),strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+                       if (Date0->tm_mon<i%12) {
+                               y0=Date0->tm_year+1900-i/12-1;
+                               m0=(Date0->tm_mon+12-i%12)%12+1;
+                               d0=1;
+                       } else {
+                               y0=Date0->tm_year+1900-i/12;
+                               m0=Date0->tm_mon-i%12+1;
+                               d0=1;
+                       }
+                       memcpy(&Date1,Date0,sizeof(struct tm));
+                       Date1.tm_isdst=-1;
+                       Date1.tm_mday=1;
+                       if (m0<12) {
+                               Date1.tm_mon=m0;
+                               Date1.tm_year=y0-1900;
+                       } else {
+                               Date1.tm_mon=0;
+                               Date1.tm_year=y0-1900+1;
+                       }
+                       t1=mktime(&Date1);
+                       t1-=24*60*60;
+                       Date0=localtime(&t1);
+                       y1=Date0->tm_year+1900;
+                       m1=Date0->tm_mon+1;
+                       d1=Date0->tm_mday;
+               } else {
+                       debuga(_("Invalid date range passed on command line\n"));
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       *dfrom=y0*10000+m0*100+d0;
+       *duntil=y1*10000+m1*100+d1;
+       sprintf(date,"%02d/%02d/%04d-%02d/%02d/%04d",d0,m0,y0,d1,m1,y1);
+       return;
 }
 
 
 char *strlow(char *string)
 {
-   char *s;
+       char *s;
 
-   if (string)
-   {
-      for (s = string; *s; ++s)
-         *s = tolower(*s);
-   }
+       if (string)
+       {
+               for (s = string; *s; ++s)
+                       *s = tolower(*s);
+       }
 
-   return string;
+       return string;
 }
 
 
@@ -1294,507 +1286,505 @@ char *strlow(char *string)
 
 char *strup(char *string)
 {
-   char *s;
+       char *s;
 
-   if (string)
-   {
-      for (s = string; *s; ++s)
-         *s = toupper(*s);
-   }
+       if (string)
+       {
+               for (s = string; *s; ++s)
+                       *s = toupper(*s);
+       }
 
-   return string;
+       return string;
 }
 
 
 void removetmp(const char *outdir)
 {
-   FILE *fp_in;
-   char warea[256];
-   char buf[MAXLEN];
-   long pos;
-
-   if(!RemoveTempFiles)
-      return;
-
-   if(debug) {
-      debuga(_("Purging temporary file sarg-general\n"));
-   }
-   if (snprintf(warea,sizeof(warea),"%s/sarg-general",outdir)>=sizeof(warea)) {
-      debuga(_("(removetmp) directory too long to remove %s/sarg-period\n"),outdir);
-      exit(EXIT_FAILURE);
-   }
-   if((fp_in=fopen(warea,"r+"))==NULL){
-      debuga(_("(removetmp) Cannot open file %s\n"),warea);
-      exit(EXIT_FAILURE);
-   }
-   while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      if(strncmp(buf,"TOTAL",5) == 0 && (buf[6]=='\t' || buf[6]==' '))
-         break;
-   }
-   if (fseek(fp_in,0,SEEK_SET)==-1) {
-      debuga(_("Failed to rewind to the beginning of the file %s: %s\n"),warea,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   if (fputs(buf,fp_in)==EOF) {
-      debuga(_("Failed to write the total line in %s - %s\n"),warea,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   pos=ftell(fp_in);
-   if (pos>0 && ftruncate(fileno(fp_in),pos)==-1) {
-      debuga(_("Failed to truncate %s: %s\n"),warea,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   if (fclose(fp_in)==EOF) {
-      debuga(_("Failed to close %s after writing the total line - %s\n"),warea,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   return;
+       FILE *fp_in;
+       char warea[256];
+       char buf[MAXLEN];
+       long pos;
+
+       if(!RemoveTempFiles)
+               return;
+
+       if(debug) {
+               debuga(_("Purging temporary file sarg-general\n"));
+       }
+       if (snprintf(warea,sizeof(warea),"%s/sarg-general",outdir)>=sizeof(warea)) {
+               debuga(_("(removetmp) directory too long to remove %s/sarg-period\n"),outdir);
+               exit(EXIT_FAILURE);
+       }
+       if((fp_in=fopen(warea,"r+"))==NULL){
+               debuga(_("(removetmp) Cannot open file %s\n"),warea);
+               exit(EXIT_FAILURE);
+       }
+       while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+               if(strncmp(buf,"TOTAL",5) == 0 && (buf[6]=='\t' || buf[6]==' '))
+                       break;
+       }
+       if (fseek(fp_in,0,SEEK_SET)==-1) {
+               debuga(_("Failed to rewind to the beginning of the file %s: %s\n"),warea,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (fputs(buf,fp_in)==EOF) {
+               debuga(_("Failed to write the total line in %s - %s\n"),warea,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       pos=ftell(fp_in);
+       if (pos>0 && ftruncate(fileno(fp_in),pos)==-1) {
+               debuga(_("Failed to truncate %s: %s\n"),warea,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       if (fclose(fp_in)==EOF) {
+               debuga(_("Failed to close %s after writing the total line - %s\n"),warea,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       return;
 }
 
 void load_excludecodes(const char *ExcludeCodes)
 {
-
-   FILE *fp_in;
-   char data[80];
-   int i;
-   int Stored;
-   long int MemSize;
-
-   if(ExcludeCodes[0] == '\0')
-      return;
-
-   if((fp_in=fopen(ExcludeCodes,"r"))==NULL) {
-      debuga(_("(util) Cannot open file %s (exclude_codes)\n"),ExcludeCodes);
-      exit(EXIT_FAILURE);
-   }
-
-   if (fseek(fp_in, 0, SEEK_END)==-1) {
-      debuga(_("Failed to move till the end of the excluded codes file %s: %s\n"),ExcludeCodes,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-   MemSize = ftell(fp_in);
-   if (MemSize<0) {
-      debuga(_("Cannot get the size of file %s\n"),ExcludeCodes);
-      exit(EXIT_FAILURE);
-   }
-   if (fseek(fp_in, 0, SEEK_SET)==-1) {
-      debuga(_("Failed to rewind the excluded codes file %s: %s\n"),ExcludeCodes,strerror(errno));
-      exit(EXIT_FAILURE);
-   }
-
-   MemSize+=1;
-   if((excludecode=(char *) malloc(MemSize))==NULL) {
-      debuga(_("malloc error (%ld)\n"),MemSize);
-      exit(EXIT_FAILURE);
-   }
-   memset(excludecode,0,MemSize);
-
-   Stored=0;
-   while(fgets(data,sizeof(data),fp_in)!=NULL) {
-      if (data[0]=='#') continue;
-      for (i=strlen(data)-1 ; i>=0 && (unsigned char)data[i]<=' ' ; i--) data[i]='\0';
-      if (i<0) continue;
-      if (Stored+i+2>=MemSize) {
-         debuga(_("Too many codes to exclude in file %s\n"),ExcludeCodes);
-         break;
-      }
-      strcat(excludecode,data);
-      strcat(excludecode,";");
-      Stored+=i+1;
-   }
-
-   fclose(fp_in);
-   return;
+       FILE *fp_in;
+       char data[80];
+       int i;
+       int Stored;
+       long int MemSize;
+
+       if(ExcludeCodes[0] == '\0')
+               return;
+
+       if((fp_in=fopen(ExcludeCodes,"r"))==NULL) {
+               debuga(_("(util) Cannot open file %s (exclude_codes)\n"),ExcludeCodes);
+               exit(EXIT_FAILURE);
+       }
+
+       if (fseek(fp_in, 0, SEEK_END)==-1) {
+               debuga(_("Failed to move till the end of the excluded codes file %s: %s\n"),ExcludeCodes,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       MemSize = ftell(fp_in);
+       if (MemSize<0) {
+               debuga(_("Cannot get the size of file %s\n"),ExcludeCodes);
+               exit(EXIT_FAILURE);
+       }
+       if (fseek(fp_in, 0, SEEK_SET)==-1) {
+               debuga(_("Failed to rewind the excluded codes file %s: %s\n"),ExcludeCodes,strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       MemSize+=1;
+       if((excludecode=(char *) malloc(MemSize))==NULL) {
+               debuga(_("malloc error (%ld)\n"),MemSize);
+               exit(EXIT_FAILURE);
+       }
+       memset(excludecode,0,MemSize);
+
+       Stored=0;
+       while(fgets(data,sizeof(data),fp_in)!=NULL) {
+               if (data[0]=='#') continue;
+               for (i=strlen(data)-1 ; i>=0 && (unsigned char)data[i]<=' ' ; i--) data[i]='\0';
+               if (i<0) continue;
+               if (Stored+i+2>=MemSize) {
+                       debuga(_("Too many codes to exclude in file %s\n"),ExcludeCodes);
+                       break;
+               }
+               strcat(excludecode,data);
+               strcat(excludecode,";");
+               Stored+=i+1;
+       }
+
+       fclose(fp_in);
+       return;
 }
 
 void free_excludecodes(void)
 {
-   if (excludecode) {
-      free(excludecode);
-      excludecode=NULL;
-   }
+       if (excludecode) {
+               free(excludecode);
+               excludecode=NULL;
+       }
 }
 
 int vercode(const char *code)
 {
-   char *cod;
-   int clen;
+       char *cod;
+       int clen;
 
-   if (excludecode && excludecode[0]!='\0') {
-      clen=strlen(code);
-      cod=excludecode;
-      while (cod) {
-         if (strncmp(code,cod,clen)==0 && cod[clen]==';')
-            return 1;
-         cod=strchr(cod,';');
-         if (cod) cod++;
-      }
-   }
-   return 0;
+       if (excludecode && excludecode[0]!='\0') {
+               clen=strlen(code);
+               cod=excludecode;
+               while (cod) {
+                       if (strncmp(code,cod,clen)==0 && cod[clen]==';')
+                               return 1;
+                       cod=strchr(cod,';');
+                       if (cod) cod++;
+               }
+       }
+       return 0;
 }
 
 void fixnone(char *str)
 {
-   int i;
+       int i;
 
-   for (i=strlen(str)-1 ; i>=0 && (unsigned char)str[i]<=' ' ; i--);
-   if(i==3 && strncmp(str,"none",4) == 0)
-      str[0]='\0';
+       for (i=strlen(str)-1 ; i>=0 && (unsigned char)str[i]<=' ' ; i--);
+       if(i==3 && strncmp(str,"none",4) == 0)
+               str[0]='\0';
 
-   return;
+       return;
 }
 
 void fixendofline(char *str)
 {
-   int i;
+       int i;
 
-   for (i=strlen(str)-1 ; i>=0 && (unsigned char)str[i]<=' ' ; i--) str[i]=0;
+       for (i=strlen(str)-1 ; i>=0 && (unsigned char)str[i]<=' ' ; i--) str[i]=0;
 }
 
 #ifdef LEGACY_TESTVALIDUSERCHAR
 int testvaliduserchar(const char *user)
 {
+       int x=0;
+       int y=0;
 
-   int x=0;
-   int y=0;
-
-   for (y=0; y<strlen(UserInvalidChar); y++) {
-      for (x=0; x<strlen(user); x++) {
-         if(user[x] == UserInvalidChar[y])
-            return 1;
-      }
-   }
-   return 0;
+       for (y=0; y<strlen(UserInvalidChar); y++) {
+               for (x=0; x<strlen(user); x++) {
+                       if(user[x] == UserInvalidChar[y])
+                               return 1;
+               }
+       }
+       return 0;
 }
 #else
 int testvaliduserchar(const char *user)
 {
+       char * p_UserInvalidChar = UserInvalidChar ;
+       const char * p_user ;
 
-   char * p_UserInvalidChar = UserInvalidChar ;
-   const char * p_user ;
-
-   while( *p_UserInvalidChar ) {
-      p_user = user ;
-      while ( *p_user ) {
-         if( *p_UserInvalidChar == *p_user )
-            return 1;
-         p_user++ ;
-      }
-      p_UserInvalidChar++ ;
-   }
-   return 0;
+       while( *p_UserInvalidChar ) {
+               p_user = user ;
+               while ( *p_user ) {
+                       if( *p_UserInvalidChar == *p_user )
+                               return 1;
+                       p_user++ ;
+               }
+               p_UserInvalidChar++ ;
+       }
+       return 0;
 }
 #endif
 
 int compar( const void *a, const void *b )
-{ if( *(int *)a > *(int *)b ) return 1;
-  if( *(int *)a < *(int *)b ) return -1;
-  return 0;
+{
+       if( *(int *)a > *(int *)b ) return 1;
+       if( *(int *)a < *(int *)b ) return -1;
+       return 0;
 }
 
 int getnumlist( char *buf, numlist *list, const int len, const int maxvalue )
 {
-   int i, j, d, flag, r1, r2;
-   char *pbuf, **bp, *strbufs[ 24 ];
-
-   bp = strbufs;
-   strtok( buf, " \t" );
-   for( *bp = strtok( NULL, "," ), list->len = 0; *bp; *bp = strtok( NULL, "," ) ) {
-      if( ++bp >= &strbufs[ 24 ] )
-         break;
-      list->len++;
-   }
-   if( ! list->len )
-      return -1;
-   d = 0;
-   for( i = 0; i < list->len; i++ ) {
-      if( strchr( strbufs[ i ], '-' ) != 0 ) {
-         pbuf = strbufs[ i ];
-         strtok( pbuf, "-" );
-         pbuf = strtok( NULL, "\0" );
-         r1 = atoi( strbufs[ i ] );
-         if( ( r2 = atoi( pbuf ) ) >= maxvalue || r1 >= r2 )
-            return -1;
-         if( i + d + ( r2 - r1 ) + 1 <= len ) {
-            for( j = r1; j <= r2; j++ )
-               list->list[ i + d++ ] = j;
-            d--;
-         }
-      }
-      else
-         if( ( list->list[ i + d ] = atoi( strbufs[ i ] ) ) >= maxvalue )
-            return 1;
-   }
-   list->len += d;
-   qsort( list->list, list->len, sizeof( int ), compar );
-   do {
-      flag = 0;
-      for( i = 0; i < list->len - 1; i++ )
-         if( list->list[ i ] == list->list[ i + 1 ] ) {
-            for( j = i + 1; j < list->len; j++ )
-               list->list[ j - 1 ] = list->list[ j ];
-            list->len--;
-            flag = 1;
-            break;
-         }
-   } while( flag );
-   return 0;
+       int i, j, d, flag, r1, r2;
+       char *pbuf, **bp, *strbufs[ 24 ];
+
+       bp = strbufs;
+       strtok( buf, " \t" );
+       for( *bp = strtok( NULL, "," ), list->len = 0; *bp; *bp = strtok( NULL, "," ) ) {
+               if( ++bp >= &strbufs[ 24 ] )
+                       break;
+               list->len++;
+       }
+       if( ! list->len )
+               return -1;
+       d = 0;
+       for( i = 0; i < list->len; i++ ) {
+               if( strchr( strbufs[ i ], '-' ) != 0 ) {
+                       pbuf = strbufs[ i ];
+                       strtok( pbuf, "-" );
+                       pbuf = strtok( NULL, "\0" );
+                       r1 = atoi( strbufs[ i ] );
+                       if( ( r2 = atoi( pbuf ) ) >= maxvalue || r1 >= r2 )
+                               return -1;
+                       if( i + d + ( r2 - r1 ) + 1 <= len ) {
+                               for( j = r1; j <= r2; j++ )
+                                       list->list[ i + d++ ] = j;
+                               d--;
+                       }
+               }
+               else
+                       if( ( list->list[ i + d ] = atoi( strbufs[ i ] ) ) >= maxvalue )
+                               return 1;
+       }
+       list->len += d;
+       qsort( list->list, list->len, sizeof( int ), compar );
+       do {
+               flag = 0;
+               for( i = 0; i < list->len - 1; i++ )
+                       if( list->list[ i ] == list->list[ i + 1 ] ) {
+                               for( j = i + 1; j < list->len; j++ )
+                                       list->list[ j - 1 ] = list->list[ j ];
+                               list->len--;
+                               flag = 1;
+                               break;
+                       }
+       } while( flag );
+       return 0;
 }
 
 
 char *get_size(const char *path, const char *file)
 {
-   FILE *fp;
-   static char response[255];
-   char cmd[255];
-   char *ptr;
-
-   if (snprintf(cmd,sizeof(cmd),"du -skh %s%s",path,file)>=sizeof(cmd)) {
-      debuga(_("Cannot get disk space because the path %s%s is too long\n"),path,file);
-      exit(EXIT_FAILURE);
-   }
-   if ((fp = popen(cmd, "r")) == NULL) {
-      debuga(_("Cannot get disk space with command %s\n"),cmd);
-      exit(EXIT_FAILURE);
-   }
-   if (!fgets(response, sizeof(response), fp)) {
-      debuga(_("Cannot get disk size with command %s\n"),cmd);
-      exit(EXIT_FAILURE);
-   }
-   ptr=strchr(response,'\t');
-   if (ptr==NULL) {
-      debuga(_("The command %s failed\n"),cmd);
-      exit(EXIT_FAILURE);
-   }
-   pclose(fp);
-   *ptr='\0';
-
-   return (response);
+       FILE *fp;
+       static char response[255];
+       char cmd[255];
+       char *ptr;
+
+       if (snprintf(cmd,sizeof(cmd),"du -skh %s%s",path,file)>=sizeof(cmd)) {
+               debuga(_("Cannot get disk space because the path %s%s is too long\n"),path,file);
+               exit(EXIT_FAILURE);
+       }
+       if ((fp = popen(cmd, "r")) == NULL) {
+               debuga(_("Cannot get disk space with command %s\n"),cmd);
+               exit(EXIT_FAILURE);
+       }
+       if (!fgets(response, sizeof(response), fp)) {
+               debuga(_("Cannot get disk size with command %s\n"),cmd);
+               exit(EXIT_FAILURE);
+       }
+       ptr=strchr(response,'\t');
+       if (ptr==NULL) {
+               debuga(_("The command %s failed\n"),cmd);
+               exit(EXIT_FAILURE);
+       }
+       pclose(fp);
+       *ptr='\0';
+
+       return (response);
 }
 
 void show_info(FILE *fp_ou)
 {
-   char ftime[127];
+       char ftime[127];
 
-   if(!ShowSargInfo) return;
-   zdate(ftime, sizeof(ftime), DateFormat);
-   fprintf(fp_ou,"<div class=\"info\">%s <a href='%s'>%s-%s</a> %s %s</div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
+       if(!ShowSargInfo) return;
+       zdate(ftime, sizeof(ftime), DateFormat);
+       fprintf(fp_ou,"<div class=\"info\">%s <a href='%s'>%s-%s</a> %s %s</div>\n",_("Generated by"),URL,PGM,VERSION,_("on"),ftime);
 }
 
 void show_sarg(FILE *fp_ou, int depth)
 {
-   int i;
+       int i;
 
-   if(!ShowSargLogo) return;
-   fputs("<div class=\"logo\"><a href=\"http://sarg.sourceforge.net\"><img src=\"",fp_ou);
-   for (i=0 ; i<depth ; i++)
-      fputs("../",fp_ou);
-   fputs("images/sarg.png\" title=\"SARG, Squid Analysis Report Generator. Logo by Osamu Matsuzaki\" alt=\"Sarg\"></a>&nbsp;Squid Analysis Report Generator</div>\n",fp_ou);
+       if(!ShowSargLogo) return;
+       fputs("<div class=\"logo\"><a href=\"http://sarg.sourceforge.net\"><img src=\"",fp_ou);
+       for (i=0 ; i<depth ; i++)
+               fputs("../",fp_ou);
+       fputs("images/sarg.png\" title=\"SARG, Squid Analysis Report Generator. Logo by Osamu Matsuzaki\" alt=\"Sarg\"></a>&nbsp;Squid Analysis Report Generator</div>\n",fp_ou);
 }
 
 void write_logo_image(FILE *fp_ou)
 {
-   if(LogoImage[0]!='\0')
-      fprintf(fp_ou, "<div class=\"logo\"><img src=\"%s\" width=\"%s\" height=\"%s\" alt=\"Logo\">&nbsp;%s</div>\n",LogoImage,Width,Height,LogoText);
+       if(LogoImage[0]!='\0')
+               fprintf(fp_ou, "<div class=\"logo\"><img src=\"%s\" width=\"%s\" height=\"%s\" alt=\"Logo\">&nbsp;%s</div>\n",LogoImage,Width,Height,LogoText);
 }
 
 void write_html_head(FILE *fp_ou, int depth, const char *page_title,int javascript)
 {
-   int i;
+       int i;
 
-   fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n",fp_ou);
-   fprintf(fp_ou, "<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-   if (page_title) fprintf(fp_ou,"<title>%s</title>\n",page_title);
-   css(fp_ou);
-   if ((javascript & HTML_JS_SORTTABLE)!=0 && SortTableJs[0]) {
-      fputs("<script type=\"text/javascript\" src=\"",fp_ou);
-      if (strncmp(SortTableJs,"../",3)==0) {
-         for (i=0 ; i<depth ; i++) fputs("../",fp_ou);
-      }
-      fputs(SortTableJs,fp_ou);
-      fputs("\"></script>\n",fp_ou);
-   }
-   fputs("</head>\n<body>\n",fp_ou);
+       fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n",fp_ou);
+       fprintf(fp_ou, "<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
+       if (page_title) fprintf(fp_ou,"<title>%s</title>\n",page_title);
+       css(fp_ou);
+       if ((javascript & HTML_JS_SORTTABLE)!=0 && SortTableJs[0]) {
+               fputs("<script type=\"text/javascript\" src=\"",fp_ou);
+               if (strncmp(SortTableJs,"../",3)==0) {
+                       for (i=0 ; i<depth ; i++) fputs("../",fp_ou);
+               }
+               fputs(SortTableJs,fp_ou);
+               fputs("\"></script>\n",fp_ou);
+       }
+       fputs("</head>\n<body>\n",fp_ou);
 }
 
 void write_html_header(FILE *fp_ou, int depth, const char *page_title,int javascript)
 {
-   write_html_head(fp_ou,depth,page_title,javascript);
-   write_logo_image(fp_ou);
-   show_sarg(fp_ou, depth);
-   fprintf(fp_ou,"<div class=\"title\"><table cellpadding=\"0\" cellspacing=\"0\">\n<tr><th class=\"title_c\">%s</th></tr>\n",Title);
+       write_html_head(fp_ou,depth,page_title,javascript);
+       write_logo_image(fp_ou);
+       show_sarg(fp_ou, depth);
+       fprintf(fp_ou,"<div class=\"title\"><table cellpadding=\"0\" cellspacing=\"0\">\n<tr><th class=\"title_c\">%s</th></tr>\n",Title);
 }
 
 void close_html_header(FILE *fp_ou)
 {
-   fputs("</table></div>\n",fp_ou);
+       fputs("</table></div>\n",fp_ou);
 }
 
 int write_html_trailer(FILE *fp_ou)
 {
-   show_info(fp_ou);
-   if (fputs("</body>\n</html>\n",fp_ou)==EOF) return(-1);
-   return(0);
+       show_info(fp_ou);
+       if (fputs("</body>\n</html>\n",fp_ou)==EOF) return(-1);
+       return(0);
 }
 
 void output_html_string(FILE *fp_ou,const char *str,int maxlen)
 {
-   int i=0;
-
-   while (*str && (maxlen<=0 || i<maxlen)) {
-      switch (*str) {
-         case '&':
-            fputs("&amp;",fp_ou);
-            break;
-         case '<':
-            fputs("&lt;",fp_ou);
-            break;
-         case '>':
-            fputs("&gt;",fp_ou);
-            break;
-         case '"':
-            fputs("&quot;",fp_ou);
-            break;
-         case '\'':
-            fputs("&#39;",fp_ou);
-            break;
-         default:
-            fputc(*str,fp_ou);
-      }
-      str++;
-      i++;
-   }
-   if (maxlen>0 && i>=maxlen)
-      fputs("&hellip;",fp_ou);
+       int i=0;
+
+       while (*str && (maxlen<=0 || i<maxlen)) {
+               switch (*str) {
+                       case '&':
+                               fputs("&amp;",fp_ou);
+                               break;
+                       case '<':
+                               fputs("&lt;",fp_ou);
+                               break;
+                       case '>':
+                               fputs("&gt;",fp_ou);
+                               break;
+                       case '"':
+                               fputs("&quot;",fp_ou);
+                               break;
+                       case '\'':
+                               fputs("&#39;",fp_ou);
+                               break;
+                       default:
+                               fputc(*str,fp_ou);
+               }
+               str++;
+               i++;
+       }
+       if (maxlen>0 && i>=maxlen)
+               fputs("&hellip;",fp_ou);
 }
 
 void output_html_url(FILE *fp_ou,const char *url)
 {
-   while (*url) {
-      if (*url=='&')
-         fputs("&amp;",fp_ou);
-      else
-         fputc(*url,fp_ou);
-      url++;
-   }
+       while (*url) {
+               if (*url=='&')
+                       fputs("&amp;",fp_ou);
+               else
+                       fputc(*url,fp_ou);
+               url++;
+       }
 }
 
 void url_hostname(const char *url,char *hostname,int hostsize)
 {
-   int i;
+       int i;
 
-   hostsize--;
-   for (i=0 ; i<hostsize && url[i] && url[i]!='/' ; i++)
-      hostname[i]=url[i];
-   hostname[i]='\0';
+       hostsize--;
+       for (i=0 ; i<hostsize && url[i] && url[i]!='/' ; i++)
+               hostname[i]=url[i];
+       hostname[i]='\0';
 }
 
 void url_module(const char *url, char *w2)
 {
-   int x, y;
-   char w[255];
+       int x, y;
+       char w[255];
 
-   y=0;
-   for(x=strlen(url)-1; x>=0; x--) {
-      if(url[x] == '/' || y>=sizeof(w)-1) break;
-      w[y++]=url[x];
-   }
-   if (x<0) {
-      w2[0]='\0';
-      return;
-   }
+       y=0;
+       for(x=strlen(url)-1; x>=0; x--) {
+               if(url[x] == '/' || y>=sizeof(w)-1) break;
+               w[y++]=url[x];
+       }
+       if (x<0) {
+               w2[0]='\0';
+               return;
+       }
 
-   x=0;
-   for(y=y-1; y>=0; y--) {
-      w2[x++]=w[y];
-   }
-   w2[x]='\0';
+       x=0;
+       for(y=y-1; y>=0; y--) {
+               w2[x++]=w[y];
+       }
+       w2[x]='\0';
 }
 
 void url_to_file(const char *url,char *file,int filesize)
 {
-   int i,skip;
+       int i,skip;
 
-   filesize--;
-   skip=0;
-   for(i=0; i<filesize && *url; url++) {
-      if(isalnum(*url) || *url=='-' || *url=='_' || *url=='.' || *url=='%') {
-         file[i++]=*url;
-         skip=0;
-      } else {
-         if (!skip) file[i++]='_';
-         skip=1;
-      }
-   }
-   file[i]='\0';
+       filesize--;
+       skip=0;
+       for(i=0; i<filesize && *url; url++) {
+               if(isalnum(*url) || *url=='-' || *url=='_' || *url=='.' || *url=='%') {
+                       file[i++]=*url;
+                       skip=0;
+               } else {
+                       if (!skip) file[i++]='_';
+                       skip=1;
+               }
+       }
+       file[i]='\0';
 }
 
 void version(void)
 {
-   printf(_("SARG Version: %s\n"),VERSION);
-   exit(EXIT_SUCCESS);
+       printf(_("SARG Version: %s\n"),VERSION);
+       exit(EXIT_SUCCESS);
 }
 
 char *get_param_value(const char *param,char *line)
 {
-   int plen;
+       int plen;
 
-   while (*line==' ' || *line=='\t') line++;
-   plen=strlen(param);
-   if (strncasecmp(line,param,plen)) return(NULL);
-   if (line[plen]!=' ' && line[plen]!='\t') return(NULL);
-   line+=plen;
-   while (*line==' ' || *line=='\t') line++;
-   return(line);
+       while (*line==' ' || *line=='\t') line++;
+       plen=strlen(param);
+       if (strncasecmp(line,param,plen)) return(NULL);
+       if (line[plen]!=' ' && line[plen]!='\t') return(NULL);
+       line+=plen;
+       while (*line==' ' || *line=='\t') line++;
+       return(line);
 }
 
 void unlinkdir(const char *dir,int contentonly)
 {
-   struct stat st;
-   DIR *dirp;
-   struct dirent *direntp;
-   char dname[MAXLEN];
-   int err;
-
-   dirp=opendir(dir);
-   if (!dirp) return;
-   while ((direntp = readdir(dirp)) != NULL) {
-      if (direntp->d_name[0] == '.' && (direntp->d_name[1] == '\0' ||
-          (direntp->d_name[1] == '.' && direntp->d_name[2] == '\0')))
-         continue;
-      if (snprintf(dname,sizeof(dname),"%s/%s",dir,direntp->d_name)>=sizeof(dname)) {
-         debuga(_("directory name to delete too long: %s/%s\n"),dir,direntp->d_name);
-         exit(EXIT_FAILURE);
-      }
+       struct stat st;
+       DIR *dirp;
+       struct dirent *direntp;
+       char dname[MAXLEN];
+       int err;
+
+       dirp=opendir(dir);
+       if (!dirp) return;
+       while ((direntp = readdir(dirp)) != NULL) {
+               if (direntp->d_name[0] == '.' && (direntp->d_name[1] == '\0' ||
+                       (direntp->d_name[1] == '.' && direntp->d_name[2] == '\0')))
+                       continue;
+               if (snprintf(dname,sizeof(dname),"%s/%s",dir,direntp->d_name)>=sizeof(dname)) {
+                       debuga(_("directory name to delete too long: %s/%s\n"),dir,direntp->d_name);
+                       exit(EXIT_FAILURE);
+               }
 #ifdef HAVE_LSTAT
-      err=lstat(dname,&st);
+               err=lstat(dname,&st);
 #else
-      err=stat(dname,&st);
+               err=stat(dname,&st);
 #endif
-      if (err) {
-         debuga(_("cannot stat %s\n"),dname);
-         exit(EXIT_FAILURE);
-      }
-      if (S_ISREG(st.st_mode)) {
-         if (unlink(dname)) {
-            debuga(_("cannot delete %s - %s\n"),dname,strerror(errno));
-            exit(EXIT_FAILURE);
-         }
-      } else if (S_ISDIR(st.st_mode)) {
-         unlinkdir(dname,0);
-      } else {
-         debuga(_("unknown path type %s\n"),dname);
-      }
-   }
-   closedir(dirp);
-
-   if (!contentonly) {
-      if (rmdir(dir)) {
-         debuga(_("cannot delete %s - %s\n"),dir,strerror(errno));
-         exit(EXIT_FAILURE);
-      }
-   }
+               if (err) {
+                       debuga(_("cannot stat %s\n"),dname);
+                       exit(EXIT_FAILURE);
+               }
+               if (S_ISREG(st.st_mode)) {
+                       if (unlink(dname)) {
+                               debuga(_("cannot delete %s - %s\n"),dname,strerror(errno));
+                               exit(EXIT_FAILURE);
+                       }
+               } else if (S_ISDIR(st.st_mode)) {
+                       unlinkdir(dname,0);
+               } else {
+                       debuga(_("unknown path type %s\n"),dname);
+               }
+       }
+       closedir(dirp);
+
+       if (!contentonly) {
+               if (rmdir(dir)) {
+                       debuga(_("cannot delete %s - %s\n"),dir,strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
+       }
 }