]>
git.ipfire.org Git - thirdparty/sarg.git/blob - exclude.c
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
6 * please look at http://sarg.sourceforge.net/donations.php
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
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.
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.
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.
27 #include "include/conf.h"
28 #include "include/defs.h"
33 unsigned long int address
;
34 //! The mask to match the address of the URL.
35 unsigned long int mask
;
41 unsigned short int address
[8];
42 //! The number of bits in the prefix.
48 //! The URL to match without any leading wildcard.
50 //! The number of dots in the url if a wildcard is present or -1 if the address is complete (no wildcard)
54 static struct hostip4struct
*exclude_ip4
=NULL
;
55 static int num_exclude_ip4
=0;
56 static struct hostip6struct
*exclude_ip6
=NULL
;
57 static int num_exclude_ip6
=0;
58 static struct hostnamestruct
*exclude_name
=NULL
;
59 static int num_exclude_name
=0;
60 static int ip4allocated
=0;
61 static int ip6allocated
=0;
62 static int nameallocated
=0;
64 static char *excludeuser
=NULL
;
67 Store a IPv4 address to exclude from the reported URL.
69 \param addr The 4 char of the address.
70 \param nbits The number of bits to keep in the prefix.
72 static void store_exclude_ip4(unsigned char *addr
,int nbits
)
76 if (num_exclude_ip4
>=ip4allocated
) {
77 struct hostip4struct
*temp
;
80 temp
=realloc(exclude_ip4
,ip4allocated
*sizeof(*temp
));
82 debuga(__FILE__
,__LINE__
,_("Not enough memory to store the exlcluded IP addresses\n"));
87 exclude_ip4
[num_exclude_ip4
].address
=0UL;
89 exclude_ip4
[num_exclude_ip4
].address
=(exclude_ip4
[num_exclude_ip4
].address
<<8) | (unsigned char)(addr
[i
] & 0xFFU
);
90 exclude_ip4
[num_exclude_ip4
].mask
=(0xFFFFFFFFUL
<< (32-nbits
));
95 Store a IPv6 address to exclude from the reported URL.
97 \param addr The 8 short int of the address.
98 \param nbits The number of bits to keep in the prefix.
100 static void store_exclude_ip6(unsigned short *addr
,int nbits
)
104 if (num_exclude_ip6
>=ip6allocated
) {
105 struct hostip6struct
*temp
;
108 temp
=realloc(exclude_ip6
,ip6allocated
*sizeof(*temp
));
110 debuga(__FILE__
,__LINE__
,_("Not enough memory to store the exlcluded IP addresses\n"));
115 for (i
=0 ; i
<8 ; i
++)
116 exclude_ip6
[num_exclude_ip6
].address
[i
]=addr
[i
];
117 exclude_ip6
[num_exclude_ip6
].nbits
=nbits
;
122 Store a host name to exclude from the report.
124 \param url The host name to exclude.
126 static void store_exclude_url(const char *url
,const char *next
)
132 struct hostnamestruct
*item
;
138 for (i
=0 ; i
<length
; i
++)
141 } else if (url
[i
]=='.') {
149 if (start
>=length
|| firstdot
) return;
155 if (num_exclude_name
>=nameallocated
) {
156 struct hostnamestruct
*temp
;
159 temp
=realloc(exclude_name
,nameallocated
*sizeof(*temp
));
161 debuga(__FILE__
,__LINE__
,_("Not enough memory to store the excluded URLs\n"));
167 item
=exclude_name
+num_exclude_name
;
169 item
->url
=malloc(length
+1);
171 debuga(__FILE__
,__LINE__
,_("Not enough memory to store the excluded URLs\n"));
174 safe_strcpy(item
->url
,url
,length
+1);
175 item
->ndots
=(ndots
>0) ? ndots
: -1;
179 Read the file listing the host to exclude from the report.
181 \param hexfile The name of the file.
182 \param debug \c True to print debug information.
184 void gethexclude(const char *hexfile
, int debug
)
190 unsigned char ipv4
[4];
191 unsigned short int ipv6
[8];
195 if(access(hexfile
, R_OK
) != 0) {
196 debuga(__FILE__
,__LINE__
,_("Cannot open file \"%s\": %s\n"),hexfile
,strerror(errno
));
200 debuga(__FILE__
,__LINE__
,_("Loading exclude host file from \"%s\"\n"),hexfile
);
202 if ((fp_ex
= fopen(hexfile
, "r")) == NULL
) {
203 debuga(__FILE__
,__LINE__
,_("Cannot open file \"%s\": %s\n"),hexfile
,strerror(errno
));
207 while(fgets(buf
,sizeof(buf
),fp_ex
)!=NULL
){
212 type
=extract_address_mask(buf
,&name
,ipv4
,ipv6
,&nbits
,&next
);
214 debuga(__FILE__
,__LINE__
,_("While reading \"%s\"\n"),hexfile
);
219 store_exclude_url(name
,next
);
220 } else if (type
==2) {
221 store_exclude_ip4(ipv4
,nbits
);
222 } else if (type
==3) {
223 store_exclude_ip6(ipv6
,nbits
);
227 if (fclose(fp_ex
)==EOF
) {
228 debuga(__FILE__
,__LINE__
,_("Read error in \"%s\": %s\n"),hexfile
,strerror(errno
));
235 Check if the URL is excluded as per the host exclusion list.
237 \param url The URL to check.
239 \retval 1 Keep the URL.
240 \retval 0 Exclude the URL.
242 int vhexclude(const char *url
)
248 unsigned char ipv4
[4];
249 unsigned short int ipv6
[8];
250 unsigned long int addr4
;
254 type
=extract_address_mask(url
,&name
,ipv4
,ipv6
,NULL
,NULL
);
256 if (exclude_name
== NULL
) return(1);
258 for (length
=0 ; (unsigned char)name
[length
]>' ' && name
[length
]!=':' && name
[length
]!='/' && name
[length
]!='?' ; length
++)
259 if (name
[length
]=='.') {
261 We store the position of each dots of the URL to match it against any
262 wildcard in the excluded list. The size of dotpos is big enough for the most
263 ambitious URL but we have a safety mechanism that shift the positions should there be too
264 many dots in the URL.
266 if (ndots
<sizeof(dotpos
)/sizeof(dotpos
[0]))
267 dotpos
[ndots
++]=length
+1;
269 for (j
=1 ; j
<ndots
; j
++) dotpos
[j
-1]=dotpos
[j
];
270 dotpos
[ndots
-1]=length
+1;
274 for (i
=0 ; i
<num_exclude_name
; i
++) {
275 if (exclude_name
[i
].ndots
>0) {
276 const char *wurl
=name
;
278 if (exclude_name
[i
].ndots
<=ndots
) {
279 wurl
+=dotpos
[ndots
-exclude_name
[i
].ndots
];
280 len
-=dotpos
[ndots
-exclude_name
[i
].ndots
];
282 if (strncmp(exclude_name
[i
].url
,wurl
,len
)==0 && exclude_name
[i
].url
[len
]=='\0') return(0);
284 if (strncmp(exclude_name
[i
].url
,url
,length
)==0 && exclude_name
[i
].url
[length
]=='\0') return(0);
288 } else if (type
==2) {
289 if (exclude_ip4
== NULL
) return(1);
291 for (i
=0 ; i
<4 ; i
++) addr4
=(addr4
<< 8) | ipv4
[i
];
292 for (i
=0 ; i
<num_exclude_ip4
; i
++) {
293 if (((exclude_ip4
[i
].address
^ addr4
) & exclude_ip4
[i
].mask
)==0) return(0);
295 } else if (type
==3) {
296 if (exclude_ip6
== NULL
) return(1);
297 for (i
=0 ; i
<num_exclude_ip6
; i
++) {
298 length
=exclude_ip6
[i
].nbits
;
299 for (j
=length
/16-1 ; j
>=0 && ipv6
[j
]==exclude_ip6
[i
].address
[j
] ; j
--);
302 if (j
>=8 || length
%16==0 || ((ipv6
[j
] ^ exclude_ip6
[i
].address
[j
]) & (0xFFFF<<(length
-j
*16)))==0)
310 void getuexclude(const char *uexfile
, int debug
)
317 debuga(__FILE__
,__LINE__
,_("Loading exclude file from \"%s\"\n"),uexfile
);
319 if ((fp_ex
= fopen(uexfile
, "r")) == NULL
) {
320 debuga(__FILE__
,__LINE__
,_("Cannot open file \"%s\": %s\n"),uexfile
,strerror(errno
));
324 if (fseek(fp_ex
, 0, SEEK_END
)==-1) {
325 debuga(__FILE__
,__LINE__
,_("Failed to move till the end of file \"%s\": %s\n"),uexfile
,strerror(errno
));
330 debuga(__FILE__
,__LINE__
,_("Cannot get the size of file \"%s\"\n"),uexfile
);
334 if (fseek(fp_ex
, 0, SEEK_SET
)==-1) {
335 debuga(__FILE__
,__LINE__
,_("Failed to rewind file \"%s\": %s\n"),uexfile
,strerror(errno
));
339 if((excludeuser
=(char *) malloc(nreg
))==NULL
){
340 debuga(__FILE__
,__LINE__
,_("malloc error (%ld bytes required)\n"),nreg
);
344 memset(excludeuser
,0,nreg
);
346 while(fgets(buf
,sizeof(buf
),fp_ex
)!=NULL
){
347 if(strchr(buf
,'#') != NULL
)
350 strcat(excludeuser
,buf
);
351 strcat(excludeuser
," ");
354 strcat(excludeuser
,"*END* ");
356 if (fclose(fp_ex
)==EOF
) {
357 debuga(__FILE__
,__LINE__
,_("Read error in \"%s\": %s\n"),uexfile
,strerror(errno
));
364 int vuexclude(const char *user
)
372 while ((wuser
=strstr(wuser
,user
))!=NULL
) {
373 if (wuser
[len
]==' ') return(0);
381 bool is_indexonly(void)
383 if (excludeuser
==NULL
) return(false);
384 return(strstr(excludeuser
,"indexonly") != NULL
);
387 void free_exclude(void)
397 for (i
=0 ; i
<num_exclude_name
; i
++)
398 if (exclude_name
[i
].url
) free(exclude_name
[i
].url
);