]> git.ipfire.org Git - thirdparty/sarg.git/blob - datafile.c
Indent the configure script for more readability.
[thirdparty/sarg.git] / datafile.c
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 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);
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 ipantes[0]='\0';
67 nameantes[0]='\0';
68
69 oldurl=NULL;
70 ourl_size=0;
71
72 uscan=userinfo_startscan();
73 if (uscan == NULL) {
74 debuga(__FILE__,__LINE__,_("Cannot enumerate the user list\n"));
75 exit(EXIT_FAILURE);
76 }
77 while ( (uinfo = userinfo_advancescan(uscan)) != NULL ) {
78 strcpy(u2,uinfo->id);
79 if(Ip2Name && uinfo->id_is_ip) {
80 strcpy(ipantes,u2);
81 ip2name(u2,sizeof(u2));
82 strcpy(nameantes,u2);
83 }
84 user_find(userlabel,MAX_USER_LEN, u2);
85 userinfo_label(uinfo,userlabel);
86 if(debug) debuga(__FILE__,__LINE__,_("Reading user file \"%s/%s\"\n"),tmp,uinfo->filename);
87
88 sort_users_log(tmp,debug,uinfo);
89 if (snprintf(tmp3,sizeof(tmp3),"%s/%s.user_log",tmp,uinfo->filename)>=sizeof(tmp3)) {
90 debuga(__FILE__,__LINE__,_("Path too long: "));
91 debuga_more("%s/%s.user_log\n",tmp,uinfo->filename);
92 exit(EXIT_FAILURE);
93 }
94
95 if((fp_in=FileObject_Open(tmp3))==NULL){
96 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,FileObject_GetLastOpenError());
97 exit(EXIT_FAILURE);
98 }
99
100 if ((line=longline_create())==NULL) {
101 debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),tmp3);
102 exit(EXIT_FAILURE);
103 }
104
105 ttopen=0;
106 new_user=1;
107 while((buf=longline_read(fp_in,line))!=NULL) {
108 getword_start(&gwarea,buf);
109 if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
110 getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
111 getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
112 getword(acccode,sizeof(acccode),&gwarea,'\t')<0 || getword_atoll(&accelap,&gwarea,'\t')<0) {
113 debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),tmp3);
114 exit(EXIT_FAILURE);
115 }
116 if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
117 debuga(__FILE__,__LINE__,_("Invalid smart info in file \"%s\"\n"),tmp3);
118 exit(EXIT_FAILURE);
119 }
120
121 if(Ip2Name) {
122 if(strcmp(accip,ipantes) != 0) {
123 strcpy(ipantes,accip);
124 ip2name(accip,sizeof(accip));
125 strcpy(nameantes,accip);
126 }
127 else strcpy(accip,nameantes);
128 }
129
130 if(!rtotal){
131 url_len=strlen(accurl);
132 if (!oldurl || url_len>=ourl_size) {
133 ourl_size=url_len+1;
134 oldurl=realloc(oldurl,ourl_size);
135 if (!oldurl) {
136 debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
137 exit(EXIT_FAILURE);
138 }
139 }
140 strcpy(oldurl,accurl);
141 strcpy(oldacccode,acccode);
142 strcpy(oldaccip,accip);
143 strcpy(oldaccdia,accdia);
144 strcpy(oldacchora,acchora);
145 new_user=0;
146 rtotal++;
147 }
148 same_url=(strcmp(oldurl,accurl) == 0);
149
150 if(!same_url || new_user){
151 if(!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
152 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),DataFile,strerror(errno));
153 exit(EXIT_FAILURE);
154 }
155 saverecs(fp_ou,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
156 nacc=0;
157 nbytes=0;
158 nelap=0;
159 incache=0;
160 oucache=0;
161 new_user=0;
162 }
163
164 nacc++;
165 nbytes+=accbytes;
166 nelap+=accelap;
167
168 strcpy(crc2,acccode);
169 str=strchr(crc2,'/');
170 if (str) *str='\0';
171
172 if(strstr(crc2,"MISS") != 0) oucache+=accbytes;
173 else incache+=accbytes;
174
175 if (!same_url) {
176 url_len=strlen(accurl);
177 if (url_len>=ourl_size) {
178 ourl_size=url_len+1;
179 oldurl=realloc(oldurl,ourl_size);
180 if (!oldurl) {
181 debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
182 exit(EXIT_FAILURE);
183 }
184 }
185 strcpy(oldurl,accurl);
186 }
187 new_user=0;
188 strcpy(oldacccode,acccode);
189 strcpy(oldaccip,accip);
190 strcpy(oldaccdia,accdia);
191 strcpy(oldacchora,acchora);
192 }
193
194 if (FileObject_Close(fp_in)) {
195 debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,FileObject_GetLastCloseError());
196 exit(EXIT_FAILURE);
197 }
198 longline_destroy(&line);
199 }
200 userinfo_stopscan(uscan);
201 if (oldurl) free(oldurl);
202 if (fp_ou && fclose(fp_ou)==EOF) {
203 debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),DataFile,strerror(errno));
204 exit(EXIT_FAILURE);
205 }
206
207 if(debug)
208 debuga(__FILE__,__LINE__,_("Datafile %s written successfully\n"),DataFile);
209 }
210
211 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)
212 {
213 char val[20];
214 char name[512];
215
216 if((DataFileFields & DATA_FIELD_USER) != 0) {
217 fputs(uinfo->label,fp_ou);
218 fputc(DataFileDelimiter[0],fp_ou);
219 }
220 if((DataFileFields & DATA_FIELD_DATE) != 0) {
221 fputs(dia,fp_ou);
222 fputc(DataFileDelimiter[0],fp_ou);
223 }
224 if((DataFileFields & DATA_FIELD_TIME) != 0) {
225 fputs(hora,fp_ou);
226 fputc(DataFileDelimiter[0],fp_ou);
227 }
228 if((DataFileFields & DATA_FIELD_URL) != 0) {
229 url_hostname(url,name,sizeof(name));
230 if (DataFileUrl == DATAFILEURL_IP) name2ip(name,sizeof(name));
231 fputs(name,fp_ou);
232 fputc(DataFileDelimiter[0],fp_ou);
233 }
234 if((DataFileFields & DATA_FIELD_CONNECT) != 0) {
235 my_lltoa(nacc,val,sizeof(val),0);
236 fputs(val,fp_ou);
237 fputc(DataFileDelimiter[0],fp_ou);
238 }
239 if((DataFileFields & DATA_FIELD_BYTES) != 0) {
240 my_lltoa(nbytes,val,sizeof(val),0);
241 fputs(val,fp_ou);
242 fputc(DataFileDelimiter[0],fp_ou);
243 }
244 if((DataFileFields & DATA_FIELD_IN_CACHE) != 0) {
245 my_lltoa(incache,val,sizeof(val),0);
246 fputs(val,fp_ou);
247 fputc(DataFileDelimiter[0],fp_ou);
248 }
249 if((DataFileFields & DATA_FIELD_OUT_CACHE) != 0) {
250 my_lltoa(oucache,val,sizeof(val),0);
251 fputs(val,fp_ou);
252 fputc(DataFileDelimiter[0],fp_ou);
253 }
254 if((DataFileFields & DATA_FIELD_ELAPSED) != 0) {
255 my_lltoa(nelap,val,sizeof(val),0);
256 fputs(val,fp_ou);
257 fputc(DataFileDelimiter[0],fp_ou);
258 }
259
260 fputc('\n',fp_ou);
261 }