]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - datafile.c
Fix the creation of the datafile
[thirdparty/sarg.git] / datafile.c
index 317c183570977d3c4dae56ae697b29702d9b9d93..9b2992d0a1b7264855d702aa669fe75bf7331e82 100644 (file)
 #include "include/conf.h"
 #include "include/defs.h"
 
-void saverecs(char *dirname, 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);
+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);
 
 void data_file(char *tmp)
 {
 
-   FILE *fp_in;
+   FILE *fp_in, *fp_ou=NULL;
 
-   char accdia[11], acchora[9], accip[MAXLEN], accurl[MAXLEN];
+   char *buf;
+   char accdia[11], acchora[9], accip[MAXLEN], *accurl;
    char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
-   char dirname[MAXLEN], wdirname[MAXLEN], oldurl[MAXLEN];
+   char *oldurl;
    char olduser[MAXLEN], oldmsg[50], acccode[50], oldacccode[50];
    char ipantes[MAXLEN], nameantes[MAXLEN];
    char accsmart[MAXLEN];
@@ -50,15 +51,19 @@ void data_file(char *tmp)
    long long int nbytes=0;
    long long int nelap=0;
    long long int nacc=0;
-   long long int rtotal=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;
+   struct longlinestruct line;
    const char logext[]=".log";
 
    ipantes[0]='\0';
@@ -66,6 +71,8 @@ void data_file(char *tmp)
 
    olduser[0]='\0';
    strcat(tmp,"/sarg");
+   oldurl=NULL;
+   ourl_size=0;
 
    dirp = opendir(tmp);
    while ( (direntp = readdir( dirp )) != NULL ) {
@@ -84,33 +91,45 @@ void data_file(char *tmp)
 
       uinfo=userinfo_find_from_file(user);
       if (!uinfo) {
-         debuga(_("Ignoring unknown user file %s"),user);
+         debuga(_("Ignoring unknown user file %s\n"),user);
          continue;
       }
       strcpy(u2,uinfo->id);
-      if(Ip2Name && uinfo->id_is_ip) ip2name(u2,sizeof(u2));
+      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"),tmp,direntp->d_name);
+         debuga(_("(datafile) directory path too long: %s/%s\n"),tmp,direntp->d_name);
          exit(1);
       }
 
       if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
-         fprintf(stderr, "SARG: (datafile) %s: %s\n",_("Cannot open file"),tmp);
+         debuga(_("(datafile) Cannot open file: %s\n"),tmp3);
+         exit(1);
+      }
+
+      if (longline_prepare(&line)<0) {
+         debuga(_("Not enough memory to read the downloaded files."));
          exit(1);
       }
 
       ttopen=0;
       new_user=1;
-      while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
+      while((buf=longline_read(fp_in,&line))!=NULL) {
          getword_start(&gwarea,buf);
-         if (getword(accdia,sizeof(accdia),&gwarea,' ')<0 || getword(acchora,sizeof(acchora),&gwarea,' ')<0 ||
-             getword(accip,sizeof(accip),&gwarea,' ')<0 ||
-             getword(accurl,sizeof(accurl),&gwarea,' ')<0 || getword_atoll(&accbytes,&gwarea,' ')<0 ||
-             getword(acccode,sizeof(acccode),&gwarea,' ')<0 || getword_atoll(&accelap,&gwarea,' ')<0 ||
-             getword_skip(20000,&gwarea,' ')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
-            debuga(_("There is a broken record or garbage in file %s"),tmp3);
+         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(1);
+         }
+         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(1);
          }
 
@@ -124,25 +143,41 @@ void data_file(char *tmp)
          }
 
          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(1);
+               }
+            }
             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(strcmp(oldurl,accurl) != 0 || new_user){
-            strcpy(oldmsg,"OK");
-            if(strstr(oldacccode,"DENIED") != 0) strcpy(oldmsg,_("DENIED"));
-            gravatmp(uinfo,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
-            strcpy(wdirname,dirname);
-            saverecs(wdirname,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
+         if(!same_url || new_user){
+            if(strstr(oldacccode,"DENIED") != 0)
+               strcpy(oldmsg,_("DENIED"));
+            else
+               strcpy(oldmsg,"OK");
+            if(!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
+               debuga(_("(datafile) Cannot open file: %s\n"),DataFile);
+               exit(1);
+            }
+            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++;
@@ -156,7 +191,18 @@ void data_file(char *tmp)
          if(strstr(crc2,"MISS") != 0) oucache+=accbytes;
          else incache+=accbytes;
 
-         strcpy(oldurl,accurl);
+         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(1);
+               }
+            }
+            strcpy(oldurl,accurl);
+         }
          new_user=0;
          strcpy(oldacccode,acccode);
          strcpy(oldaccip,accip);
@@ -165,22 +211,20 @@ void data_file(char *tmp)
       }
 
       fclose(fp_in);
+      longline_free(&line);
    }
-
    (void)closedir( dirp );
+   if (oldurl) free(oldurl);
+   if (fp_ou) fclose(fp_ou);
+
    if(debug)
-      debuga("Datafile %s successfully",DataFile);
+      debuga("Datafile %s written successfully\n",DataFile);
 }
 
-void saverecs(char *dirname, 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)
+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)
 {
-   FILE *fp_ou;
    char val[20];
-
-   if((fp_ou=MY_FOPEN(DataFile,"a"))==NULL){
-      fprintf(stderr, "SARG: (datafile) %s: %s\n",_("Cannot open file"),DataFile);
-      exit(1);
-   }
+   char name[512];
 
    if((DataFileFields & DATA_FIELD_USER) != 0) {
       fputs(uinfo->label,fp_ou);
@@ -195,8 +239,8 @@ void saverecs(char *dirname, const struct userinfostruct *uinfo, long long int n
       fputc(DataFileDelimiter[0],fp_ou);
    }
    if((DataFileFields & DATA_FIELD_URL) != 0) {
-      strcpy(name,url);
-      if (strcmp(DataFileUrl,"ip") == 0) name2ip(name);
+      url_hostname(url,name,sizeof(name));
+      if (DataFileUrl == DATAFILEURL_IP) name2ip(name);
       fputs(name,fp_ou);
       fputc(DataFileDelimiter[0],fp_ou);
    }
@@ -227,6 +271,4 @@ void saverecs(char *dirname, const struct userinfostruct *uinfo, long long int n
    }
 
    fputc('\n',fp_ou);
-
-   fclose(fp_ou);
 }