nlanr/logparse.cc

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include <sys/types.h>
00005 #include <sys/socket.h>
00006 #include <netinet/in.h>
00007 #include <arpa/inet.h>
00008 #include "logparse.h"
00009 
00010 // Read next line into file
00011 int lf_get_next_entry(FILE *fp, lf_entry &ne)
00012 {
00013     char buf[MAXBUF]; // must be large enough for a cache log
00014 
00015     if ((fgets(buf, MAXBUF, fp) == NULL) || feof(fp) || ferror(fp)) {
00016         return 1;
00017     }
00018 
00019     // Parse a line and fill an lf_entry
00020     char *p = buf, *q, *tmp1, *tmp2, *ret_code;
00021     u_int32_t lapse;
00022 
00023     // first two entries: <TimeStamp> and <Elapsed Time>
00024     q = strtok(p, " ");
00025     ne.rt = strtod(q, NULL);
00026     q = strtok(NULL, " ");
00027     lapse = strtoul(q, NULL, 10);
00028     ne.rt -= (double)lapse/1000.0;
00029 
00030     // Client address
00031     q = strtok(NULL, " ");
00032     ne.cid = (u_int32_t)inet_addr(q);
00033 
00034     // Log tags, do not store them but use it to filter entries
00035     ret_code = strtok(NULL, " ");
00036     if (ret_code == NULL) { abort(); } 
00037     // XXX Have to handle this return code in the end because we are using
00038     // strtok() and it cannot interleave two strings :( STUPID!!
00039 
00040     // Page size
00041     q = strtok(NULL, " "); 
00042     ne.size = strtoul(q, NULL, 10);
00043 
00044     // Request method, GET only
00045     q = strtok(NULL, " ");
00046     if (strcmp(q, "GET") != 0) 
00047         return -1;
00048 
00049     // URL
00050     q = strtok(NULL, " ");
00051     if (q == NULL) abort(); 
00052     if (strchr(q, '?') != NULL) 
00053         // Do not accept any URL containing '?'
00054         return -1;
00055     ne.url = new char[strlen(q) + 1];
00056     strcpy(ne.url, q);
00057     // Try to locate server name from the URL
00058     // XXX no more parsing from the original string!!!!
00059     tmp1 = strtok(q, "/");
00060     if (strcmp(tmp1, "http:") != 0) {
00061         // How come this isn't a http request???
00062         delete []ne.url;
00063         return -1;
00064     }
00065     tmp1 = strtok(NULL, "/"); 
00066     if (tmp1 == NULL) abort();
00067     ne.sid = new char[strlen(tmp1) + 1];
00068     strcpy(ne.sid, tmp1);
00069 
00070     // Now check return codes
00071     if (ret_code == NULL) abort();
00072     tmp1 = new char[strlen(ret_code)+1];
00073     strcpy(tmp1, ret_code);
00074     tmp2 = strtok(tmp1, "/");
00075     tmp2 += 4; // Ignore the first 4 char "TCP_"
00076     if ((strcmp(tmp2, "MISS") == 0) || 
00077         (strcmp(tmp2, "CLIENT_REFRESH_MISS") == 0) || 
00078         (strcmp(tmp2, "IMS_MISS") == 0) || 
00079         (strcmp(tmp2, "DENIED") == 0)) {
00080         delete []ne.url;
00081         delete []ne.sid;
00082         delete []tmp1;
00083         return -1;  // Return negative to discard this entry
00084     }
00085     delete []tmp1;
00086 
00087     // All the rest are useless, do not parse them
00088     return 0;
00089 }
00090 
00091 
00092 

Generated on Tue Mar 6 16:47:46 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6