WEB开发网
开发学院网络安全黑客技术 如何阅读源代码(4) 阅读

如何阅读源代码(4)

 2006-07-04 20:27:38 来源:WEB开发网   
核心提示: 可以看到,log_rec是一个全局变量,如何阅读源代码(4)(2),该函数根据日志文件的类型,分别调用三种不同的分析函数,/* log record structure */struct log_struct { char hostname[MAXHOST]; /* hostname */

可以看到,log_rec是一个全局变量,该函数根据日志文件的类型,分别调用三种不同的分析函数。在webalizer.h中,找到该变量的定义,从结构定义中可以看到,结构定义了一个日志文件所可能包含的所有信息(参考CLF,FTP, SQUID日志文件的格式说明)。
/* log record structure */
struct log_struct { char hostname[MAXHOST]; /* hostname */
       char datetime[29]; /* raw timestamp */
       char url[MAXURL]; /* raw request field */
       int resp_code; /* response code */
       u_long xfer_size; /* xfer size in bytes */
#ifdef USE_DNS
       struct in_addr addr; /* IP address structure */
#endif /* USE_DNS */
       char refer[MAXREF]; /* referrer */
       char agent[MAXAGENT]; /* user agent (browser) */
       char srchstr[MAXSRCH]; /* search string */
       char ident[MAXIDENT]; }; /* ident string (user) */
extern struct log_struct log_rec;

先看一下一个parser.c用的内部函数,然后再来以parse_record_web()为例子看看这个函数是怎么工作的,parse_record_ftp, parse_record_squid留给读者自己分析作为练习。
/*********************************************/
/* FMT_LOGREC - terminate log fields w/zeros */
/*********************************************/
void fmt_logrec(char *buffer)
{
  char *cp=buffer;
  int q=0,b=0,p=0;
while (*cp != '')
  {
  /* break record up, terminate fields with '' */
  switch (*cp)
  {
   case ' ': if (b || q || p) break; *cp=''; break;
   case '"': q^=1; break;
   case '[': if (q) break; b++; break;
   case ']': if (q) break; if (b>0) b--; break;
   case '(': if (q) break; p++; break;
   case ')': if (q) break; if (p>0) p--; break;
  }
  cp++;
  }
}

上一页  1 2 3 4 5  下一页

Tags:如何 阅读 源代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接