X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=url.c;h=8c55610c57fb574762b15007b5ae5bd80f42ca2b;hb=ffc9b006b8358644c054c5e4c2929791efec7475;hp=1a43ec3cb277d6c66acf08cdfa4321b88fde388f;hpb=e2379f0549388edd94e3cf713819530a909bc845;p=thirdparty%2Fsarg.git diff --git a/url.c b/url.c index 1a43ec3..8c55610 100644 --- 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 #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' ') { 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://.