]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - html.c
Use internal user list instead of scanning the directory for users
[thirdparty/sarg.git] / html.c
diff --git a/html.c b/html.c
index 5e8839e11aa17d151fa16c4807f9b1358b1e9377..907f1652ef191be488a941ddfb293e46a7355cb8 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;
@@ -42,10 +40,8 @@ void htmlrel(void)
        char *buf;
        char arqin[MAXLEN], arqou[MAXLEN], arqper[MAXLEN], arqip[MAXLEN];
        char *url, tmsg[50], csort[MAXLEN];
-       char user[MAXLEN], duser[MAXLEN];
+       char 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];
@@ -54,15 +50,16 @@ void htmlrel(void)
        double perc=0, perc2=0, ouperc=0, inperc=0;
        int count;
        int cstatus;
-       const char txtext[]=".txt";
+       int have_denied_report;
        const char *sort_field;
        const char *sort_order;
-       int dlen;
+       const char *user;
        char siteind[MAX_TRUNCATED_URL];
        struct getwordstruct gwarea;
        longline line,line1;
        struct generalitemstruct item;
        const struct userinfostruct *uinfo;
+       userscan uscan;
 
        if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
 
@@ -112,35 +109,13 @@ void htmlrel(void)
 
        sort_labels(&sort_field,&sort_order);
 
-       if ((dirp = opendir(tmp)) == NULL) {
-               debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno));
+       uscan=userinfo_startscan();
+       if (uscan == NULL) {
+               debuga(_("Cannot enumerate the user list\n"));
                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);
+       while ( (uinfo = userinfo_advancescan(uscan)) != NULL ) {
+               user=uinfo->filename;
 
                if (snprintf(warea,sizeof(warea),"%s/%s",outdirname,user)>=sizeof(warea)) {
                        debuga(_("Destination directory too long: %s/%s\n"),outdirname,user);
@@ -151,25 +126,28 @@ void htmlrel(void)
                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);
+               if (snprintf(arqin,sizeof(arqin),"%s/%s.txt",tmp,uinfo->filename)>=sizeof(arqin)) {
+                       debuga(_("Input file name too long: %s/%s.txt\n"),tmp,uinfo->filename);
+                       exit(EXIT_FAILURE);
+               }
+               if ((fp_in = fopen(arqin, "r")) == 0){
+                       if (uinfo->no_report) continue;
+                       debuga(_("(html3) Cannot open file %s\n"),arqin);
                        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);
+               if (snprintf(duser,sizeof(duser),"%s/%s/denied_%s.html",tmp,uinfo->filename,uinfo->filename)>=sizeof(duser)) {
+                       debuga(_("File name too long: %s/%s/denied_%s.html\n"),tmp,uinfo->filename,uinfo->filename);
                        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);
-               }
+                       have_denied_report=0;
+               else
+                       have_denied_report=1;
 
                if ((line=longline_create())==NULL) {
                        debuga(_("Not enough memory to read file %s\n"),arqin);
@@ -241,8 +219,8 @@ void htmlrel(void)
                /*! \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"));
+               if(have_denied_report) {
+                       fprintf(fp_ou,"<tr><td class=\"header_l\" colspan=\"11\"><a href=\"denied_%s.html\">%s</a> %s</td></tr>\n",uinfo->filename,_("SmartFilter"),_("Report"));
                }
 
                fputs("<thead><tr><th class=\"sorttable_nosort\"></th><th class=\"header_l",fp_ou);
@@ -624,7 +602,7 @@ void htmlrel(void)
                htaccess(uinfo);
        }
 
-       (void)closedir(dirp);
+       userinfo_stopscan(uscan);
        greport_cleanup();
 
        return;