/*
* SARG Squid Analysis Report Generator http://sarg.sourceforge.net
- * 1998, 2012
+ * 1998, 2015
*
* SARG donations:
* please look at http://sarg.sourceforge.net/donations.php
#ifdef HAVE_PCRE_H
#include <pcre.h>
#define USE_PCRE
-#else
-#error "PCRE not compiled in"
#endif
/*!
NameEnd=++str;
while (str<next && (unsigned char)*str>' ') {
if (*str=='*') {
- debuga(_("Host name alias \"%s*%s\" contains too many wildcards (*)\n"),NameBegin,NameEnd);
+ debuga(__FILE__,__LINE__,_("Host name alias \"%s*%s\" contains too many wildcards (*)\n"),NameBegin,NameEnd);
return(-1);
}
str++;
}
NameEndE=str;
if (NameEnd==NameEndE) {
- debuga(_("Host name alias \"%*s\" must not end with a wildcard\n"),(int)(next-name),name);
+ debuga(__FILE__,__LINE__,_("Host name alias \"%*s\" must not end with a wildcard\n"),(int)(next-name),name);
return(-1);
}
} else {
len=(int)(NameBeginE-NameBegin);
tmp=malloc(len+1);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
memcpy(tmp,NameBegin,len);
tmp=malloc(len+1);
if (!tmp) {
if (NameBegin) free((void*)NameBegin);
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
memcpy(tmp,NameEnd,len);
tmp[len]='\0';
NameEnd=tmp;
}
-
+
// ignore duplicates
prev_alias=NULL;
for (alias=FirstAliasName ; alias ; alias=alias->Next) {
if (!new_alias) {
if (NameBegin) free((void*)NameBegin);
if (NameEnd) free((void*)NameEnd);
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
new_alias->MinLen=0;
len=(int)(ReplaceE-Replace);
tmp=malloc(len+2);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
tmp[0]=ALIAS_PREFIX;
} else {
tmp=malloc(new_alias->MinLen+2);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
tmp[0]=ALIAS_PREFIX;
}
new_alias->Alias=tmp;
}
-
+
new_alias->Next=NULL;
if (prev_alias)
prev_alias->Next=new_alias;
// insert into the list
new_alias=malloc(sizeof(*new_alias));
if (!new_alias) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
memcpy(new_alias->Ip,ipv4,4);
len=(int)(ReplaceE-Replace);
tmp=malloc(len+2);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
tmp[0]=ALIAS_PREFIX;
} else {
tmp=malloc(5*4+1);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
sprintf(tmp,"%c%d.%d.%d.%d/%d",ALIAS_PREFIX,ipv4[0],ipv4[1],ipv4[2],ipv4[3],nbits);
new_alias->Alias=tmp;
}
-
+
if (prev_alias) {
new_alias->Next=prev_alias->Next;
prev_alias->Next=new_alias;
// insert into the list
new_alias=malloc(sizeof(*new_alias));
if (!new_alias) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
memcpy(new_alias->Ip,ipv6,8*sizeof(unsigned short int));
len=ReplaceE-Replace;
tmp=malloc(len+2);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
tmp[0]=ALIAS_PREFIX;
} else {
tmp=malloc(5*8+5);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
sprintf(tmp,"%c%x:%x:%x:%x:%x:%x:%x:%x/%d",ALIAS_PREFIX,ipv6[0],ipv6[1],ipv6[2],ipv6[3],ipv6[4],ipv6[5],ipv6[6],ipv6[7],nbits);
new_alias->Alias=tmp;
}
-
+
if (prev_alias) {
new_alias->Next=prev_alias->Next;
prev_alias->Next=new_alias;
int len;
char *tmp;
int i;
-
+
// find the pattern
Delimiter=*buf++;
for (End=buf ; *End && *End!=Delimiter ; End++) {
if (*End=='\\') {
if (End[1]=='\0') {
- debuga(_("Invalid NUL character found in regular expression\n"));
+ debuga(__FILE__,__LINE__,_("Invalid NUL character found in regular expression\n"));
return(-1);
}
End++; //ignore the escaped character
}
}
if (*End!=Delimiter) {
- debuga(_("Unterminated regular expression\n"));
+ debuga(__FILE__,__LINE__,_("Unterminated regular expression\n"));
return(-1);
}
*End++='\0';
-
+
// find the alias
for (Replace=End ; *Replace==' ' || *Replace=='\t' ; Replace++);
for (End=Replace ; *End && (unsigned char)*End>' ' ; End++);
*End='\0';
-
+
// store it
new_alias=malloc(sizeof(*new_alias));
if (!new_alias) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
return(-1);
}
new_alias->Next=NULL;
new_alias->Re=pcre_compile(buf,0,&PcreError,&ErrorOffset,NULL);
if (new_alias->Re==NULL) {
- debuga(_("Failed to compile the regular expression \"%s\": %s\n"),buf,PcreError);
+ debuga(__FILE__,__LINE__,_("Failed to compile the regular expression \"%s\": %s\n"),buf,PcreError);
free(new_alias);
return(-1);
}
len=strlen(Replace);
tmp=malloc(len+2);
if (!tmp) {
- debuga(_("Not enough memory to store the host name aliasing directives\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the host name aliasing directives\n"));
pcre_free(new_alias->Re);
return(-1);
}
memcpy(tmp+1,Replace,len);
tmp[len+1]='\0';
new_alias->Alias=tmp;
-
+
new_alias->SubPartern=false;
for (i=1 ; tmp[i] ; i++)
// both the sed \1 and the perl $1 replacement operators are accepted
new_alias->SubPartern=true;
break;
}
-
+
// chain it
prev_alias=&FirstAliasRe;
for (alias=FirstAliasRe ; alias ; alias=alias->Next)
prev_alias=&alias->Next;
*prev_alias=new_alias;
-
+
return(1);
}
#endif
\retval 0 No error.
\retval -1 Error in file.
+\retval -2 Unknown string type to store.
*/
static int Alias_Store(char *buf)
{
unsigned short int ipv6[8];
int nbits;
const char *next;
- int Error;
-
+ int Error=-2;
+
if (strncasecmp(buf,"re:",3)==0) {
#ifdef USE_PCRE
if (Alias_StoreRegexp(buf+3)<0)
return(-1);
return(0);
#else
- debuga(_("PCRE not compiled in therefore the regular expressions are not available in the host alias file\n"));
+ debuga(__FILE__,__LINE__,_("PCRE not compiled in therefore the regular expressions are not available in the host alias file\n"));
return(-1);
#endif
}
longline line;
char *buf;
- if (debug) debuga(_("Reading host alias file \"%s\"\n"),Filename);
+ if (debug) debuga(__FILE__,__LINE__,_("Reading host alias file \"%s\"\n"),Filename);
fi=fopen(Filename,"rt");
if (!fi) {
- debuga(_("Cannot read host name alias file \"%s\" - %s\n"),Filename,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot read host name alias file \"%s\": %s\n"),Filename,strerror(errno));
exit(EXIT_FAILURE);
}
-
+
if ((line=longline_create())==NULL) {
- debuga(_("Not enough memory to read the host name aliases\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),Filename);
exit(EXIT_FAILURE);
}
while ((buf=longline_read(fi,line)) != NULL) {
if (Alias_Store(buf)<0) {
- debuga(_("While reading \"%s\"\n"),Filename);
+ debuga(__FILE__,__LINE__,_("While reading \"%s\"\n"),Filename);
exit(EXIT_FAILURE);
}
}
-
+
longline_destroy(&line);
- fclose(fi);
-
+ if (fclose(fi)==EOF) {
+ debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),Filename,strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
if (debug) {
struct hostalias_name *alias1;
struct hostalias_ipv4 *alias4;
struct hostalias_ipv6 *alias6;
- debuga(_("List of host names to alias:\n"));
+ debuga(__FILE__,__LINE__,_("List of host names to alias:\n"));
for (alias1=FirstAliasName ; alias1 ; alias1=alias1->Next) {
if (alias1->HostName_Prefix && alias1->HostName_Suffix)
- debuga(_(" %s*%s => %s\n"),alias1->HostName_Prefix,alias1->HostName_Suffix,alias1->Alias);
+ debuga(__FILE__,__LINE__,_(" %s*%s => %s\n"),alias1->HostName_Prefix,alias1->HostName_Suffix,alias1->Alias);
else if (alias1->HostName_Prefix)
- debuga(_(" %s => %s\n"),alias1->HostName_Prefix,alias1->Alias);
+ debuga(__FILE__,__LINE__,_(" %s => %s\n"),alias1->HostName_Prefix,alias1->Alias);
else
- debuga(_(" *%s => %s\n"),alias1->HostName_Suffix,alias1->Alias);
+ debuga(__FILE__,__LINE__,_(" *%s => %s\n"),alias1->HostName_Suffix,alias1->Alias);
}
for (alias4=FirstAliasIpv4 ; alias4 ; alias4=alias4->Next) {
- debuga(_(" %d.%d.%d.%d/%d => %s\n"),alias4->Ip[0],alias4->Ip[1],alias4->Ip[2],alias4->Ip[3],alias4->NBits,alias4->Alias);
+ debuga(__FILE__,__LINE__,_(" %d.%d.%d.%d/%d => %s\n"),alias4->Ip[0],alias4->Ip[1],alias4->Ip[2],alias4->Ip[3],alias4->NBits,alias4->Alias);
}
for (alias6=FirstAliasIpv6 ; alias6 ; alias6=alias6->Next) {
- debuga(_(" %x:%x:%x:%x:%x:%x:%x:%x/%d => %s\n"),alias6->Ip[0],alias6->Ip[1],alias6->Ip[2],alias6->Ip[3],
+ debuga(__FILE__,__LINE__,_(" %x:%x:%x:%x:%x:%x:%x:%x/%d => %s\n"),alias6->Ip[0],alias6->Ip[1],alias6->Ip[2],alias6->Ip[3],
alias6->Ip[4],alias6->Ip[5],alias6->Ip[6],alias6->Ip[7],alias6->NBits,alias6->Alias);
}
}
{
struct hostalias_name *alias1;
struct hostalias_name *next1;
-
+
for (alias1=FirstAliasName ; alias1 ; alias1=next1) {
next1=alias1->Next;
if (alias1->HostName_Prefix) free((void *)alias1->HostName_Prefix);
{
struct hostalias_ipv4 *alias4;
struct hostalias_ipv4 *next4;
-
+
for (alias4=FirstAliasIpv4 ; alias4 ; alias4=next4) {
next4=alias4->Next;
free((void *)alias4->Alias);
{
struct hostalias_ipv6 *alias6;
struct hostalias_ipv6 *next6;
-
+
for (alias6=FirstAliasIpv6 ; alias6 ; alias6=next6) {
next6=alias6->Next;
free((void *)alias6->Alias);
{
struct hostalias_regex *alias;
struct hostalias_regex *next;
-
+
for (alias=FirstAliasRe ; alias ; alias=next) {
next=alias->Next;
pcre_free(alias->Re);
int len;
for (alias=FirstAliasIpv4 ; alias ; alias=alias->Next) {
- len=alias->NBits;
+ len=alias->NBits;
if ((len<8 || memcmp(ipv4,alias->Ip,len/8)==0) && ((len%8)==0 || (ipv4[len/8] ^ alias->Ip[len/8]) & (0xFFU<<(8-len%8)))==0) {
return(alias->Alias);
}
const char *skip_scheme(const char *url)
{
const char *str;
-
+
/*
Skip any scheme:// at the beginning of the URL (see rfc2396 section 3.1).
The underscore is not part of the standard but is found in the squid logs as cache_object://.