]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - readlog_squid.c
Make b-tree cache functions static.
[thirdparty/sarg.git] / readlog_squid.c
index 6264b1544f277299240ba03b065b7e232a471a20..529abc9a5290c20e69332c9137fea30d2b6b5bf0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * SARG Squid Analysis Report Generator      http://sarg.sourceforge.net
- *                                                            1998, 2013
+ *                                                            1998, 2015
  *
  * SARG donations:
  *      please look at http://sarg.sourceforge.net/donations.php
@@ -51,6 +51,7 @@ static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruc
        time_t log_time;
        int IpLen;
        int HttpCodeLen;
+       int HttpMethodLen;
        int UrlLen;
        int UserLen;
        struct tm *tt;
@@ -70,12 +71,27 @@ static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruc
 
        // skip spaces before the elapsed time.
        while (*Line==' ') Line++;
-       if (!isdigit(*Line)) return(RLRC_Unknown);
 
        // get the elapsed time.
        Begin=Line;
        Entry->ElapsedTime=0L;
-       while (isdigit(*Line)) Entry->ElapsedTime=Entry->ElapsedTime*10+(*Line++-'0');
+       if (*Line=='-')
+       {
+               /*
+                * Negative elapsed time happens in squid (see
+                * http://www.squid-cache.org/mail-archive/squid-users/200711/0192.html)
+                * but no answer were provided as to why it happens. Let's just
+                * assume a zero elapsed time and ignore every following digit.
+                */
+               Line++;
+               if (!isdigit(*Line)) return(RLRC_Unknown);
+               while (isdigit(*Line)) Line++;
+       }
+       else
+       {
+               if (!isdigit(*Line)) return(RLRC_Unknown);
+               while (isdigit(*Line)) Entry->ElapsedTime=Entry->ElapsedTime*10+(*Line++-'0');
+       }
        if (*Line!=' ' || Line==Begin) return(RLRC_Unknown);
 
        // get IP address. It can be a fqdn if that option is enabled in squid.
@@ -94,10 +110,10 @@ static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruc
        while (isdigit(*Line)) Entry->DataSize=Entry->DataSize*10+(*Line++-'0');
        if (*Line!=' ' || Begin==Line) return(RLRC_Unknown);
 
-       // skip the HTTP function
-       Begin=++Line;
-       while (*Line && *Line!=' ') Line++;
-       if (*Line!=' '|| Line==Begin) return(RLRC_Unknown);
+       // get the HTTP method
+       Entry->HttpMethod=++Line;
+       for (HttpMethodLen=0 ; *Line && *Line!=' ' ; HttpMethodLen++) Line++;
+       if (*Line!=' '|| HttpMethodLen==0) return(RLRC_Unknown);
 
        // the url
        Entry->Url=++Line;
@@ -112,7 +128,7 @@ static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruc
        // now, the format is known with a good confidence. If the time doesn't decode, it is an error.
        tt=localtime(&log_time);
        if (tt==NULL) {
-               debuga(_("Cannot convert the timestamp from the squid log file\n"));
+               debuga(__FILE__,__LINE__,_("Cannot convert the timestamp from the squid log file\n"));
                return(RLRC_InternalError);
        }
        memcpy(&Entry->EntryTime,tt,sizeof(struct tm));
@@ -120,6 +136,7 @@ static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruc
        // it is safe to alter the line buffer now that we are returning a valid entry
        Ip[IpLen]='\0';
        Entry->HttpCode[HttpCodeLen]='\0';
+       Entry->HttpMethod[HttpMethodLen]='\0';
        Entry->Url[UrlLen]='\0';
        User[UserLen]='\0';