"Fossies" - the Fresh Open Source Software Archive

Member "sarg-2.4.0/datafile.c" (24 Dec 2019, 7989 Bytes) of package /linux/privat/sarg-2.4.0.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "datafile.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 2.3.11_vs_2.4.0.

    1 /*
    2  * SARG Squid Analysis Report Generator      http://sarg.sourceforge.net
    3  *                                                            1998, 2015
    4  *
    5  * SARG donations:
    6  *      please look at http://sarg.sourceforge.net/donations.php
    7  * Support:
    8  *     http://sourceforge.net/projects/sarg/forums/forum/363374
    9  * ---------------------------------------------------------------------
   10  *
   11  *  This program is free software; you can redistribute it and/or modify
   12  *  it under the terms of the GNU General Public License as published by
   13  *  the Free Software Foundation; either version 2 of the License, or
   14  *  (at your option) any later version.
   15  *
   16  *  This program is distributed in the hope that it will be useful,
   17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   19  *  GNU General Public License for more details.
   20  *
   21  *  You should have received a copy of the GNU General Public License
   22  *  along with this program; if not, write to the Free Software
   23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
   24  *
   25  */
   26 
   27 #include "include/conf.h"
   28 #include "include/defs.h"
   29 
   30 static void saverecs(FILE *fp_ou, 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);
   31 
   32 void data_file(char *tmp)
   33 {
   34     FileObject *fp_in;
   35     FILE *fp_ou=NULL;
   36 
   37     char *buf;
   38     char accdia[11], acchora[9], accip[MAXLEN], *accurl;
   39     char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
   40     char *oldurl;
   41     char acccode[50], oldacccode[50];
   42     char ipantes[MAXLEN], nameantes[MAXLEN];
   43     char accsmart[MAXLEN];
   44     char crc2[50];
   45     char *str;
   46     char tmp3[MAXLEN];
   47     char u2[MAX_USER_LEN];
   48     char userlabel[MAX_USER_LEN];
   49     userscan uscan;
   50     long long int nbytes=0;
   51     long long int nelap=0;
   52     long long int nacc=0;
   53     int rtotal=0;
   54     long long int incache=0;
   55     long long int oucache=0;
   56     long long int accbytes;
   57     long long int accelap;
   58     int new_user;
   59     int same_url;
   60     int url_len;
   61     int ourl_size;
   62     struct getwordstruct gwarea;
   63     struct userinfostruct *uinfo;
   64     longline line;
   65 
   66     init_usertab(UserTabFile);
   67 
   68     ipantes[0]='\0';
   69     nameantes[0]='\0';
   70 
   71     oldurl=NULL;
   72     ourl_size=0;
   73 
   74     uscan=userinfo_startscan();
   75     if (uscan == NULL) {
   76         debuga(__FILE__,__LINE__,_("Cannot enumerate the user list\n"));
   77         exit(EXIT_FAILURE);
   78     }
   79     while ( (uinfo = userinfo_advancescan(uscan)) != NULL ) {
   80         strcpy(u2,uinfo->id);
   81         if (Ip2Name && uinfo->id_is_ip) {
   82             strcpy(ipantes,u2);
   83             ip2name(u2,sizeof(u2));
   84             strcpy(nameantes,u2);
   85         }
   86         user_find(userlabel,MAX_USER_LEN, u2);
   87         userinfo_label(uinfo,userlabel);
   88         if (debug) debuga(__FILE__,__LINE__,_("Reading user file \"%s/%s\"\n"),tmp,uinfo->filename);
   89 
   90         sort_users_log(tmp,debug,uinfo);
   91         if (snprintf(tmp3,sizeof(tmp3),"%s/%s.user_log",tmp,uinfo->filename)>=sizeof(tmp3)) {
   92             debuga(__FILE__,__LINE__,_("Path too long: "));
   93             debuga_more("%s/%s.user_log\n",tmp,uinfo->filename);
   94             exit(EXIT_FAILURE);
   95         }
   96 
   97         if ((fp_in=FileObject_Open(tmp3))==NULL){
   98             debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,FileObject_GetLastOpenError());
   99             exit(EXIT_FAILURE);
  100         }
  101 
  102         if ((line=longline_create())==NULL) {
  103             debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),tmp3);
  104             exit(EXIT_FAILURE);
  105         }
  106 
  107         ttopen=0;
  108         new_user=1;
  109         while((buf=longline_read(fp_in,line))!=NULL) {
  110             getword_start(&gwarea,buf);
  111             if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
  112                 getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
  113                 getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
  114                 getword(acccode,sizeof(acccode),&gwarea,'\t')<0 || getword_atoll(&accelap,&gwarea,'\t')<0) {
  115                 debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),tmp3);
  116                 exit(EXIT_FAILURE);
  117             }
  118             if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
  119                 debuga(__FILE__,__LINE__,_("Invalid smart info in file \"%s\"\n"),tmp3);
  120                 exit(EXIT_FAILURE);
  121             }
  122 
  123             if (Ip2Name) {
  124                 if (strcmp(accip,ipantes) != 0) {
  125                     strcpy(ipantes,accip);
  126                     ip2name(accip,sizeof(accip));
  127                     strcpy(nameantes,accip);
  128                 }
  129                 else strcpy(accip,nameantes);
  130             }
  131 
  132             if (!rtotal){
  133                 url_len=strlen(accurl);
  134                 if (!oldurl || url_len>=ourl_size) {
  135                     ourl_size=url_len+1;
  136                     oldurl=realloc(oldurl,ourl_size);
  137                     if (!oldurl) {
  138                         debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
  139                         exit(EXIT_FAILURE);
  140                     }
  141                 }
  142                 strcpy(oldurl,accurl);
  143                 strcpy(oldacccode,acccode);
  144                 strcpy(oldaccip,accip);
  145                 strcpy(oldaccdia,accdia);
  146                 strcpy(oldacchora,acchora);
  147                 new_user=0;
  148                 rtotal++;
  149             }
  150             same_url=(strcmp(oldurl,accurl) == 0);
  151 
  152             if (!same_url || new_user){
  153                 if (!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
  154                     debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),DataFile,strerror(errno));
  155                     exit(EXIT_FAILURE);
  156                 }
  157                 saverecs(fp_ou,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
  158                 nacc=0;
  159                 nbytes=0;
  160                 nelap=0;
  161                 incache=0;
  162                 oucache=0;
  163                 new_user=0;
  164             }
  165 
  166             nacc++;
  167             nbytes+=accbytes;
  168             nelap+=accelap;
  169 
  170             strcpy(crc2,acccode);
  171             str=strchr(crc2,'/');
  172             if (str) *str='\0';
  173 
  174             if (strstr(crc2,"MISS") != 0) oucache+=accbytes;
  175             else incache+=accbytes;
  176 
  177             if (!same_url) {
  178                 url_len=strlen(accurl);
  179                 if (url_len>=ourl_size) {
  180                     ourl_size=url_len+1;
  181                     oldurl=realloc(oldurl,ourl_size);
  182                     if (!oldurl) {
  183                         debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
  184                         exit(EXIT_FAILURE);
  185                     }
  186                 }
  187                 strcpy(oldurl,accurl);
  188             }
  189             new_user=0;
  190             strcpy(oldacccode,acccode);
  191             strcpy(oldaccip,accip);
  192             strcpy(oldaccdia,accdia);
  193             strcpy(oldacchora,acchora);
  194         }
  195 
  196         if (FileObject_Close(fp_in)) {
  197             debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,FileObject_GetLastCloseError());
  198             exit(EXIT_FAILURE);
  199         }
  200         longline_destroy(&line);
  201     }
  202     userinfo_stopscan(uscan);
  203     if (oldurl) free(oldurl);
  204     if (fp_ou && fclose(fp_ou)==EOF) {
  205         debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),DataFile,strerror(errno));
  206         exit(EXIT_FAILURE);
  207     }
  208 
  209     if (debug)
  210         debuga(__FILE__,__LINE__,_("Datafile \"%s\" written successfully\n"),DataFile);
  211 }
  212 
  213 static void saverecs(FILE *fp_ou, 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)
  214 {
  215     char val[20];
  216     char name[512];
  217 
  218     if ((DataFileFields & DATA_FIELD_USER) != 0) {
  219         fputs(uinfo->label,fp_ou);
  220         fputc(DataFileDelimiter[0],fp_ou);
  221     }
  222     if ((DataFileFields & DATA_FIELD_DATE) != 0) {
  223         fputs(dia,fp_ou);
  224         fputc(DataFileDelimiter[0],fp_ou);
  225     }
  226     if ((DataFileFields & DATA_FIELD_TIME) != 0) {
  227         fputs(hora,fp_ou);
  228         fputc(DataFileDelimiter[0],fp_ou);
  229     }
  230     if ((DataFileFields & DATA_FIELD_URL) != 0) {
  231         url_hostname(url,name,sizeof(name));
  232         if (DataFileUrl == DATAFILEURL_IP && name[0]!=ALIAS_PREFIX) name2ip(name,sizeof(name));
  233         fputs(name,fp_ou);
  234         fputc(DataFileDelimiter[0],fp_ou);
  235     }
  236     if ((DataFileFields & DATA_FIELD_CONNECT) != 0) {
  237         my_lltoa(nacc,val,sizeof(val),0);
  238         fputs(val,fp_ou);
  239         fputc(DataFileDelimiter[0],fp_ou);
  240     }
  241     if ((DataFileFields & DATA_FIELD_BYTES) != 0) {
  242         my_lltoa(nbytes,val,sizeof(val),0);
  243         fputs(val,fp_ou);
  244         fputc(DataFileDelimiter[0],fp_ou);
  245     }
  246     if ((DataFileFields & DATA_FIELD_IN_CACHE) != 0) {
  247         my_lltoa(incache,val,sizeof(val),0);
  248         fputs(val,fp_ou);
  249         fputc(DataFileDelimiter[0],fp_ou);
  250     }
  251     if ((DataFileFields & DATA_FIELD_OUT_CACHE) != 0) {
  252         my_lltoa(oucache,val,sizeof(val),0);
  253         fputs(val,fp_ou);
  254         fputc(DataFileDelimiter[0],fp_ou);
  255     }
  256     if ((DataFileFields & DATA_FIELD_ELAPSED) != 0) {
  257         my_lltoa(nelap,val,sizeof(val),0);
  258         fputs(val,fp_ou);
  259         fputc(DataFileDelimiter[0],fp_ou);
  260     }
  261 
  262     fputc('\n',fp_ou);
  263 }