]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - url.c
Rename configure.in as configure.ac
[thirdparty/sarg.git] / url.c
diff --git a/url.c b/url.c
index 1a43ec3cb277d6c66acf08cdfa4321b88fde388f..8c55610c57fb574762b15007b5ae5bd80f42ca2b 100644 (file)
--- a/url.c
+++ b/url.c
@@ -1,6 +1,6 @@
 /*
  * SARG Squid Analysis Report Generator      http://sarg.sourceforge.net
- *                                                            1998, 2012
+ *                                                            1998, 2015
  *
  * SARG donations:
  *      please look at http://sarg.sourceforge.net/donations.php
@@ -29,8 +29,6 @@
 #ifdef HAVE_PCRE_H
 #include <pcre.h>
 #define USE_PCRE
-#else
-#error "PCRE not compiled in"
 #endif
 
 /*!
@@ -149,14 +147,14 @@ static int Alias_StoreName(const char *name,const char *next)
                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 {
@@ -183,7 +181,7 @@ static int Alias_StoreName(const char *name,const char *next)
                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);
@@ -195,14 +193,14 @@ static int Alias_StoreName(const char *name,const char *next)
                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) {
@@ -219,7 +217,7 @@ static int Alias_StoreName(const char *name,const char *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;
@@ -243,7 +241,7 @@ static int Alias_StoreName(const char *name,const char *next)
                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;
@@ -253,7 +251,7 @@ static int Alias_StoreName(const char *name,const char *next)
        } 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;
@@ -264,7 +262,7 @@ static int Alias_StoreName(const char *name,const char *next)
                }
                new_alias->Alias=tmp;
        }
-               
+
        new_alias->Next=NULL;
        if (prev_alias)
                prev_alias->Next=new_alias;
@@ -319,7 +317,7 @@ static int Alias_StoreIpv4(unsigned char *ipv4,int nbits,const char *next)
        // 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);
@@ -328,7 +326,7 @@ static int Alias_StoreIpv4(unsigned char *ipv4,int nbits,const char *next)
                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;
@@ -338,13 +336,13 @@ static int Alias_StoreIpv4(unsigned char *ipv4,int nbits,const char *next)
        } 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;
@@ -401,7 +399,7 @@ static int Alias_StoreIpv6(unsigned short *ipv6,int nbits,const char *next)
        // 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));
@@ -410,7 +408,7 @@ static int Alias_StoreIpv6(unsigned short *ipv6,int nbits,const char *next)
                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;
@@ -420,13 +418,13 @@ static int Alias_StoreIpv6(unsigned short *ipv6,int nbits,const char *next)
        } 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;
@@ -458,46 +456,46 @@ static int Alias_StoreRegexp(char *buf)
        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);
        }
@@ -505,7 +503,7 @@ static int Alias_StoreRegexp(char *buf)
        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
@@ -513,13 +511,13 @@ static int Alias_StoreRegexp(char *buf)
                        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
@@ -531,6 +529,7 @@ Store an alias in the corresponding list.
 
 \retval 0 No error.
 \retval -1 Error in file.
+\retval -2 Unknown string type to store.
 */
 static int Alias_Store(char *buf)
 {
@@ -540,15 +539,15 @@ 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
        }
@@ -579,47 +578,50 @@ void read_hostalias(const char *Filename)
        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);
                }
        }
@@ -633,7 +635,7 @@ void free_hostalias(void)
        {
                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);
@@ -646,7 +648,7 @@ void free_hostalias(void)
        {
                struct hostalias_ipv4 *alias4;
                struct hostalias_ipv4 *next4;
-               
+
                for (alias4=FirstAliasIpv4 ; alias4 ; alias4=next4) {
                        next4=alias4->Next;
                        free((void *)alias4->Alias);
@@ -657,7 +659,7 @@ void free_hostalias(void)
        {
                struct hostalias_ipv6 *alias6;
                struct hostalias_ipv6 *next6;
-               
+
                for (alias6=FirstAliasIpv6 ; alias6 ; alias6=next6) {
                        next6=alias6->Next;
                        free((void *)alias6->Alias);
@@ -669,7 +671,7 @@ void free_hostalias(void)
        {
                struct hostalias_regex *alias;
                struct hostalias_regex *next;
-               
+
                for (alias=FirstAliasRe ; alias ; alias=next) {
                        next=alias->Next;
                        pcre_free(alias->Re);
@@ -728,7 +730,7 @@ static const char *alias_url_ipv4(const char *url,unsigned char *ipv4)
        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);
                }
@@ -837,7 +839,7 @@ Find the beginning of the URL beyond the scheme://
 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://.