久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何更好阅读源代码 .

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何更好阅读源代码 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面的話:
   自從我在linuxaid.com.cn上發表一些文章開始,就不斷的有網友發來電子郵件,或者是就其中某些問題進行探討,或者是查詢其他文章的地址(往往這些網友看的是其他網站轉載的我的文章),我很高興自己寫出的文章有這么多人回應,因為這是對我最好的贊賞,也很高興有這么多人對我的文章感興趣。但是常常因為工作關系。有很多郵件是詢問我的其他文章在哪里能夠找到,我不一定能夠及時回復,也覺得回復同樣的問題比較麻煩,所以在這里重復一下,我為linuxaid.com.cn寫的文章都能在 www.linuxaid.com.cn的應用開發欄目中找到,我的一部分文章收集在bambi.may10.ca/~ariesram/articles下面(這是一個很簡陋的網頁,只有文本格式的文章,也歡迎有興趣的網友幫我設計一下網頁),我的郵件地址: ariesram@linuxaid.com.cn, 或者 ariesram@may10.ca。請轉載文章的網站保留這一說明,歡迎網友寫email給我探討問題,雖然我不能保證能及時回復。

正文:
????? 由于工作的關系,我常常需要讀一些源代碼,并在上面做一些修改并且拿來使用,或者是借鑒其中的某些部分。可以說,open source對于程序員來說,是很有意義的事情。根據我的經驗,讀源代碼,至少有3個好處。第一個好處是可以學習到很多編程的方法,看好的源代碼,對于提高自己的編程水平,比自己寫源代碼的幫助更大。當然不是說不用自己寫,而是說,自己寫代碼的同時,可以從別人寫的好的源代碼中間學習到更多的編程方法和技巧。第二個好處是,可以提高自己把握大規模源代碼的能力。一個比較大型的程序,往往都是經過了很多個版本很長的時間,有很多人參與開發,修正錯誤,添加功能而發展起來的。所以往往源代碼的規模都比較大,少則10-100多k, 多的有好幾十個MB. 在閱讀大量源代碼的時候,能夠提高自己對大的軟件的把握能力,快速了解脈絡,熟悉細節,不僅僅是編程技巧,還能在程序的架構,設計方面提高自己的能力。(這里說一句題外話,<<設計模式>>這本書相信很多人都看過,而且很多人對它推崇備至,奉為經典。現在也出了不少書,都是冠以"設計模式"這一名稱。在書中就提到,設計模式并不是一本教材,不是教你如何去編程序,而是把平時編程中一些固定的模式記錄下來,加以不斷的測試和改進,分發給廣大程序員的一些經驗之談。我在看這本書的時候,有一些地方一些設計方法往往讓我有似曾相識的感覺,另外一些則是我以前就常常用到的。而這些經驗的獲得,一部分得益于自己的編碼過程,另外一個很重要的來源就是閱讀別人寫的源代碼。)閱讀源代碼第三個好處,就是獲得一些好的思想。比如,有很多人在開始一個軟件項目之前都喜歡到sourceforge.net上去找一下,是否有人以前做過相同或者相似的軟件,如果有,則拿下來讀一讀,可以使自己對這個軟件項目有更多更深的認識。我以前曾經想找一本關于如何閱讀源代碼的書來看看,卻沒有找到。相反,倒是找到了不少分析源代碼的書,比如Linux kernel, Apache source, 等等。所以我想,為什么不自己來寫下一些經驗和大家交流呢?(當然不是寫書,沒有那個能力也沒有那個時間。)所以在這里我準備用一個例子來寫一下如何閱讀源代碼,分享一些經驗,算是拋磚引玉吧!

????? 我找的例子是一個統計日志的工具,webalizer. (這個工具我以前用過,似乎記得以前的版本是用perl寫的,不知道現在為什么作者把它完全修改成了C,可能是為了效率,也可能根本就是我記錯了。)之所以選擇這個軟件來作為例子,一方面是因為它是用C寫的,流程比較簡單,沒有C++的程序那么多的枝節,而且軟件功能不算復雜,代碼規模不大,能夠在一篇文章的篇幅里面講完; 另外一個方面是因為恰巧前段時間我因為工作的關系把它拿來修改了一下,剛看過,還沒有忘記。 :-)我采用的例子是webalizer2.01-09, 也可以到它的網站http://www.mrunix.net/webalizer/ 下載最新的版本。這是一個用C寫的,處理文本文件(簡單的說是這樣,實際上它支持三種日志文本格式:CLF, FTP, SQUID), 并且用html的方式輸出結果。讀者可以自己去下載它的源代碼包,并一邊讀文章,一邊看程序。解壓縮它的tar包(我download的是它的源代碼tar包),在文件目錄中看到這樣的結果:
$ ls
aclocal.m4 dns_resolv.c lang output.h webalizer.1
CHANGES dns_resolv.h lang.h parser.c webalizer.c
configure graphs.c linklist.c parser.h webalizer.h
configure.in graphs.h linklist.h preserve.c webalizer_lang.h
COPYING hashtab.c Makefile.in preserve.h webalizer.LSM
Copyright hashtab.h Makefile.std README webalizer.png
country-codes.txt INSTALL msfree.png README.FIRST
DNS.README install-sh output.c sample.conf
???? 首先,我閱讀了它的README(這是很重要的一個環節), 大體了解了軟件的功能,歷史狀況,修改日志,安裝方法等等。然后是安裝并且按照說明中的缺省方式來運行它,看看它的輸出結果。(安裝比較簡單,因為它帶了一個configure, 在沒有特殊情況出現的時候,簡單的./configure, make, make install就可以安裝好。)然后就是閱讀源代碼了。我從makefile開始入手(我覺得這是了解一個軟件的最好的方法)在makefile開頭,有這些內容:
prefix = /usr/local
exec_prefix = ${prefix}
???????????????
BINDIR = ${exec_prefix}/bin
MANDIR = ${prefix}/man/man1
ETCDIR = /etc
CC = gcc
CFLAGS = -Wall -O2
LIBS = -lgd -lpng -lz -lm
DEFS = -DETCDIR="/etc" -DHAVE_GETOPT_H=1 -DHAVE_MATH_H=1
LDFLAGS=
INSTALL= /usr/bin/install -c
INSTALL_PROGRAM=${INSTALL}
INSTALL_DATA=${INSTALL} -m 644

# where are the GD header files?
GDLIB=/usr/include
這些定義了安裝的路徑,執行程序的安裝路徑,編譯器,配置文件的安裝路徑,編譯的選項,安裝程序,安裝程序的選項等等。要注意的是,這些并不是軟件的作者寫的,而是./configure的輸出結果。呵呵. :-)下面才是主題內容,也是我們關心的。
# Shouldn't have to touch below here!

all: webalizer

webalizer: webalizer.o webalizer.h hashtab.o hashtab.h
??????????????? linklist.o linklist.h preserve.o preserve.h
??????????????? dns_resolv.o dns_resolv.h parser.o parser.h
??????????????? output.o output.h graphs.o graphs.h lang.h
??????????????? webalizer_lang.h
??????? $(CC) ${LDFLAGS} -o webalizer webalizer.o hashtab.o linklist.o preserv
e.o parser.o output.o dns_resolv.o graphs.o ${LIBS}
??????? rm -f webazolver
??????? ln -s webalizer webazolver

webalizer.o: webalizer.c webalizer.h parser.h output.h preserve.h
??????????????? graphs.h dns_resolv.h webalizer_lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c webalizer.c

parser.o: parser.c parser.h webalizer.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c parser.c

hashtab.o: hashtab.c hashtab.h dns_resolv.h webalizer.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c hashtab.c
linklist.o: linklist.c linklist.h webalizer.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c linklist.c

output.o: output.c output.h webalizer.h preserve.h
??????????????? hashtab.h graphs.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c output.c

preserve.o: preserve.c preserve.h webalizer.h parser.h
??????????????? hashtab.h graphs.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -c preserve.c

dns_resolv.o: dns_resolv.c dns_resolv.h lang.h webalizer.h
??????? $(CC) ${CFLAGS} ${DEFS} -c dns_resolv.c

graphs.o: graphs.c graphs.h webalizer.h lang.h
??????? $(CC) ${CFLAGS} ${DEFS} -I${GDLIB} -c graphs.c
???????
????? 好了,不用再往下看了,這些就已經足夠了。從這里我們可以看到這個軟件的幾個源代碼文件和他們的結構。webalizer.c是主程序所在的文件,其他的是一些輔助程序模塊。對比一下目錄里面的文件,
$ ls *.c *.h
dns_resolv.c graphs.h lang.h output.c parser.h webalizer.c
dns_resolv.h hashtab.c linklist.c output.h preserve.c webalizer.h
graphs.c hashtab.h linklist.h parser.c preserve.h webalizer_lang.h
??? 于是,讓我們從webalizer.c開始吧。
作為一個C程序,在頭文件里面,和C文件里面定義的extern變量,結構等等肯定不會少,但是,單獨看這些東西我們不可能對這個程序有什么認識。所以,從main函數入手,逐步分析,在需要的時候再回頭來看這些數據結構定義才是好的方法。(順便說一句,Visual C++, 等windows下的IDE工具提供了很方便的方法來獲取函數列表,C++的類列表以及資源文件,對于閱讀源代碼很有幫助。Unix/Linux也有這些工具,但是,我們在這里暫時不說,而只是通過最簡單的文本編輯器vi來講)。跳過webalizer.c開頭的版權說明部分(GPL的),和數據結構定義,全局變量聲明部分,直接進入main()函數。在函數開頭,我們看到:
?? /* initalize epoch */
?? epoch=jdate(1,1,1970); /* used for timestamp adj. */

?? /* add default index. alias */
?? add_nlist("index.",&index_alias);
這兩個函數暫時不用仔細看,后面會提到,略過。
?? sprintf(tmp_buf,"%s/webalizer.conf",ETCDIR);
?? /* check for default config file */
?? if (!access("webalizer.conf",F_OK))
????? get_config("webalizer.conf");
?? else if (!access(tmp_buf,F_OK))
????? get_config(tmp_buf);
???? 從注釋和程序本身可以看出,這是查找是否存在一個叫做webalizer.conf的配置文件,如果當前目錄下有,則用get_config來讀入其中內容,如果沒有,則查找ETCDIR/webalizer.conf是否存在。如果都沒有,則進入下一部分。(注意:ETCDIR = @ETCDIR@在makefile中有定義)
?? /* get command line options */
?? opterr = 0; /* disable parser errors */
?? while ((i=getopt(argc,argv,"a:A:c:C:dD:e:E:fF:g:GhHiI:l:Lm:M:n:N:o:pP:qQr:R:s:S:t:Tu:U:vVx:XY"))!=EOF)
?? {
????? switch (i)
????? {
??????? case 'a': add_nlist(optarg,&hidden_agents); break; /* Hide agents */
??????? case 'A': ntop_agents=atoi(optarg); break; /* Top agents */
??????? case 'c': get_config(optarg); break; /* Config file */
??????? case 'C': ntop_ctrys=atoi(optarg); break; /* Top countries */
??????? case 'd': debug_mode=1; break; /* Debug */
case 'D': dns_cache=optarg; break; /* DNS Cache filename */
??????? case 'e': ntop_entry=atoi(optarg); break; /* Top entry pages */
??????? case 'E': ntop_exit=atoi(optarg); break; /* Top exit pages */
??????? case 'f': fold_seq_err=1; break; /* Fold sequence errs */
??????? case 'F': log_type=(optarg[0]=='f')?
?????????????????? LOG_FTP:(optarg[0]=='s')?
?????????????????? LOG_SQUID:LOG_CLF; break; /* define log type */
case 'g': group_domains=atoi(optarg); break; /* GroupDomains (0=no) */
??????? case 'G': hourly_graph=0; break; /* no hourly graph */
??????? case 'h': print_opts(argv[0]); break; /* help */
??????? case 'H': hourly_stats=0; break; /* no hourly stats */
??????? case 'i': ignore_hist=1; break; /* Ignore history */
??????? case 'I': add_nlist(optarg,&index_alias); break; /* Index alias */
??????? case 'l': graph_lines=atoi(optarg); break; /* Graph Lines */
??????? case 'L': graph_legend=0; break; /* Graph Legends */
??????? case 'm': visit_timeout=atoi(optarg); break; /* Visit Timeout */
??????? case 'M': mangle_agent=atoi(optarg); break; /* mangle user agents */
??????? case 'n': hname=optarg; break; /* Hostname */
??????? case 'N': dns_children=atoi(optarg); break; /* # of DNS children */
??????? case 'o': out_dir=optarg; break; /* Output directory */
??????? case 'p': incremental=1; break; /* Incremental run */
??????? case 'P': add_nlist(optarg,&page_type); break; /* page view types */
??????? case 'q': verbose=1; break; /* Quiet (verbose=1) */
??????? case 'Q': verbose=0; break; /* Really Quiet */
??????? case 'r': add_nlist(optarg,&hidden_refs); break; /* Hide referrer */
??????? case 'R': ntop_refs=atoi(optarg); break; /* Top referrers */
??????? case 's': add_nlist(optarg,&hidden_sites); break; /* Hide site */
??????? case 'S': ntop_sites=atoi(optarg); break; /* Top sites */
??????? case 't': msg_title=optarg; break; /* Report title */
??????? case 'T': time_me=1; break; /* TimeMe */
??????? case 'u': add_nlist(optarg,&hidden_urls); break; /* hide URL???? */
??????? case 'U': ntop_urls=atoi(optarg); break; /* Top urls */
??????? case 'v':
??????? case 'V': print_version(); break; /* Version */
??????? case 'x': html_ext=optarg; break; /* HTML file extension */
??????? case 'X': hide_sites=1; break; /* Hide ind. sites */
??????? case 'Y': ctry_graph=0; break; /* Supress ctry graph */
????? }
?? }

?? if (argc - optind != 0) log_fname = argv[optind];
?? if ( log_fname && (log_fname[0]=='-')) log_fname=NULL; /* force STDIN? */

?? /* check for gzipped file - .gz */
?? if (log_fname) if (!strcmp((log_fname+strlen(log_fname)-3),".gz")) gz_log=1;
???? 這一段是分析命令行參數及開關。(getopt()的用法我在另外一篇文章中講過,這里就不再重復了。)可以看到,這個軟件雖然功能不太復雜,但是開關選項還是不少。大多數的unix/linux程序的開頭部分都是這個套路,初始化配置文件,并且讀入分析命令行。在這段程序中,我們需要注意一個函數:add_nlist(). print_opts(), get_config()等等一看就明白,就不用多講了。這里我們已經是第二次遇到add_nlist這個函數了,就仔細看看吧。
$ grep add_nlist *.h
linklist.h:extern int add_nlist(char *, NLISTPTR *); /* add list item */
可以發現它定義在linklist.h中。
在這個h文件中,當然會有一些數據結構的定義,比如:
struct nlist { char string[80]; /* list struct for HIDE items */
????????????? struct nlist *next; };
typedef struct nlist *NLISTPTR;

struct glist { char string[80]; /* list struct for GROUP items */
??????????????? char name[80];
????????????? struct glist *next; };
typedef struct glist *GLISTPTR;
???? 這是兩個鏈表結構。還有
extern GLISTPTR group_sites ; /* "group" lists */
extern GLISTPTR group_urls ;
extern GLISTPTR group_refs ;
???? 這些都是鏈表, 太多了,不用一一看得很仔細,因為目前也看不出來什么東西。當然要注意它們是extern的, 也就是說,可以在其他地方(文件)看到它們的數值(類似于C++中的public變量)。這里還定義了4個函數:
extern char *isinlist(NLISTPTR, char *); /* scan list for str */
extern char *isinglist(GLISTPTR, char *); /* scan glist for str */
extern int add_nlist(char *, NLISTPTR *); /* add list item */
extern int add_glist(char *, GLISTPTR *); /* add group list item */
注意,這些都是extern的,也就是說,可以在其他地方見到它們的調用(有點相當于C++中的public函數)。再來看看linklist.c,
NLISTPTR new_nlist(char *); /* new list node */
void del_nlist(NLISTPTR *); /* del list */

GLISTPTR new_glist(char *, char *); /* new group list node */
void del_glist(GLISTPTR *); /* del group list */

int isinstr(char *, char *);
???? 這5個函數是內部使用的(相當于C++中的private), 也就是說,這些函數只被isinlist(NLISTPTR, char *), isinglist(GLISTPTR, char *), add_nlist(char *, NLISTPTR *), add_glist(char *, GLISTPTR *)調用,而不會出現在其他地方。所以,我們先來看這幾個內部函數。舉例來說,
add_nlist(char *)
NLISTPTR new_nlist(char *str)
{
?? NLISTPTR newptr;

?? if (sizeof(newptr->string) < strlen(str))
?? {
????? if (verbose)
??? fprintf(stderr,"[new_nlist] %s ",msg_big_one);
?? }
?? if (( newptr = malloc(sizeof(struct nlist))) != NULL)
??? {strncpy(newptr->string, str, sizeof(newptr->string));newptr->next=NULL;}
?? return newptr;
}
???? 這個函數分配了一個struct nlist, 并且把其中的string賦值為str, next賦值為NULL.這實際上是創建了鏈表中的一個節點。verbose是一個全局變量,定義了輸出信息的類型,如果verbose為1,則輸出很詳細的信息,否則輸出簡略信息。這是為了調試或者使用者詳細了解程序情況來用的。不是重要內容,雖然我們常常可以在這個源程序的其他地方看到它。另外一個函數:
void del_nlist(NLISTPTR *list)
{
?? NLISTPTR cptr,nptr;

?? cptr=*list;
?? while (cptr!=NULL)
?? {
????? nptr=cptr->next;
????? free(cptr);
????? cptr=nptr;
?? }
}
??? 這個函數刪除了一個nlist(也可能是list所指向的那一個部分開始知道鏈表結尾),比較簡單。看完了這兩個內部函數,可以來看
/*********************************************/
/* ADD_NLIST - add item to FIFO linked list */
/*********************************************/

int add_nlist(char *str, NLISTPTR *list)
{
?? NLISTPTR newptr,cptr,pptr;

?? if ( (newptr = new_nlist(str)) != NULL)
?? {
????? if (*list==NULL) *list=newptr;
????? else
????? {
???????? cptr=pptr=*list;
???????? while(cptr!=NULL) { pptr=cptr; cptr=cptr->next; };
???????? pptr->next = newptr;
????? }
?? }
?? return newptr==NULL;
}
????? 這個函數是建立了一個新的節點,把參數str賦值給新節點的string, 并把它連接到list所指向鏈表的結尾。另外的三個函數:new_glist(), del_glist(), add_glist()完成的功能和上述三個差不多,所不同的只是它們所處理的數據結構不同。看完了這幾個函數,我們回到main程序。接下來是,
?? /* setup our internal variables */
?? init_counters(); /* initalize main counters */
我們所閱讀的這個軟件是用來分析日志并且做出統計的,那么這個函數的名字已經告訴了我們,這是一個初始化計數器的函數。簡略的看看吧!
$ grep init_counters *.h
webalizer.h:extern void init_counters();
在webalizer.c中找到:
void init_counters()
{
?? int i;
?? for (i=0;i<TOTAL_RC;i++) response[i].count = 0;
?? for (i=0;i<31;i++) /* monthly totals */
?? {
??? tm_xfer[i]=0.0;
??? tm_hit[i]=tm_file[i]=tm_site[i]=tm_page[i]=tm_visit[i]=0;
?? }
?? for (i=0;i<24;i++) /* hourly totals */
?? {
????? th_hit[i]=th_file[i]=th_page[i]=0;
????? th_xfer[i]=0.0;
?? }
?......
}略過去一大串代碼,不用看了,肯定是計數器清0。在主程序中,接下來是:
?? if (page_type==NULL) /* check if page types present */
?? {
????? if ((log_type == LOG_CLF) || (log_type == LOG_SQUID))
????? {
???????? add_nlist("htm*" ,&page_type); /* if no page types specified, we */
???????? add_nlist("cgi" ,&page_type); /* use the default ones here... */
???????? if (!isinlist(page_type,html_ext)) add_nlist(html_ext,&page_type);
????? }
????? else add_nlist("txt" ,&page_type); /* FTP logs default to .txt */
?? }
page_type這個變量在前面見過,
case 'P': add_nlist(optarg,&page_type); break; /* page view types
根據在最開始讀過的README文件,這個page_type是用來定義處理的頁面的類型的。在README文件中,
-P name Page type. This is the extension of files you consider to
????????? be pages for Pages calculations (sometimes called 'pageviews').
????????? The default is 'htm*' and 'cgi' (plus whatever HTMLExtension
????????? you specified if it is different). Don't use a period!
?????? 我們在程序中也可以看到,如果沒有在命令行中或者config文件中指定,則根據處理的日志文件的類型來添加缺省的文件類型。比如對于CLF文件(WWW日志),處理html, htm, cgi文件
?? if (log_type == LOG_FTP)
?? {
????? /* disable stuff for ftp logs */
????? ntop_entry=ntop_exit=0;
????? ntop_search=0;
?? }
?? else
?? .....
??
這一段是對于FTP的日志格式,設置搜索列表。
?? for (i=0;i<MAXHASH;i++)
?? {
????? sm_htab[i]=sd_htab[i]=NULL; /* initalize hash tables */
????? um_htab[i]=NULL;
????? rm_htab[i]=NULL;
????? am_htab[i]=NULL;
????? sr_htab[i]=NULL;
?? }
????? 清空哈西表,為下面即將進行的排序工作做好準備。關于哈西表,這是數據結構中常用的一種用來快速排序的結構,如果不清楚,可以參考相關書籍,比如清華的<<數據結構>>教材或者<<數據結構的C++實現>>等書。
?? if (verbose>1)
?? {
????? uname(&system_info);
????? printf("Webalizer V%s-%s (%s %s) %s ",
????????????? version,editlvl,system_info.sysname,
????????????? system_info.release,language);
?? }
這一段,是打印有關系統的信息和webalizer程序的信息(可以參考uname的函數說明)。
#ifndef USE_DNS
?? if (strstr(argv[0],"webazolver")!=0)
?? {
????? printf("DNS support not present, aborting... ");
????? exit(1);
?? }
#endif /* USE_DNS */
????? 這一段,回憶我們在看README文件的時候,曾經提到過可以在編譯的時候設置選項開關來設定DNS支持,在源代碼中可以看到多次這樣的代碼段出現,如果不指定DNS支持,這些代碼段則會出現(ifdef)或者不出現(ifndef).下面略過這些代碼段,不再重復。
?? /* open log file */
?? if (gz_log)
?? {
????? gzlog_fp = gzopen(log_fname,"rb");
????? if (gzlog_fp==Z_NULL)
????? {
???????? /* Error: Can't open log file ... */
???????? fprintf(stderr, "%s %s ",msg_log_err,log_fname);
???????? exit(1);
????? }
?? }
?? else
?? {
????? if (log_fname)
????? {
???????? log_fp = fopen(log_fname,"r");
???????? if (log_fp==NULL)
???????? {
??????????? /* Error: Can't open log file ... */
??????????? fprintf(stderr, "%s %s ",msg_log_err,log_fname);
??????????? exit(1);
???????? }
????? }
?? }
????? 這一段,回憶在README文件中曾經讀到過,如果log文件是gzip壓縮格式,則用gzopen函數打開(可以猜想gz***是一套針對gzip壓縮格式的實時解壓縮函數),如果不是,則用fopen打開。
?? /* switch directories if needed */
?? if (out_dir)
?? {
????? if (chdir(out_dir) != 0)
????? {
???????? /* Error: Can't change directory to ... */
???????? fprintf(stderr, "%s %s ",msg_dir_err,out_dir);
???????? exit(1);
????? }
?? }
???? 同樣,回憶在README文件中讀到過,如果參數行有-o out_dir, 則將輸出結果到該目錄,否則,則輸出到當前目錄。在這一段中,如果輸出目錄不存在(chdir(out_dir) != 0)則出錯。
#ifdef USE_DNS
?? if (strstr(argv[0],"webazolver")!=0)
?? {
????? if (!dns_children) dns_children=5; /* default dns children if needed */
????? if (!dns_cache)
????? {
???????? /* No cache file specified, aborting... */
???????? fprintf(stderr,"%s ",msg_dns_nocf); /* Must have a cache file */
???????? exit(1);
????? }
?? }
......
????? 在上面曾經提到過,這是DNS解析的代碼部分,可以略過不看,不會影響對整個程序的理解。
?? /* prep hostname */
?? if (!hname)
?? {
????? if (uname(&system_info)) hname="localhost";
????? else hname=system_info.nodename;
?? }
????? 這一段繼續處理參數做準備工作。如果在命令行中指定了hostname(機器名)則采用指定的名稱,否則調用uname查找機器名,如果沒有,則用localhost來作為機器名。(同樣在README中說得很詳細)
?? /* get past history */
?? if (ignore_hist) {if (verbose>1) printf("%s ",msg_ign_hist); }
?? else get_history();
????? 如果在命令行中指定了忽略歷史文件,則不讀取歷史文件,否則調用get_history()來讀取歷史數據。在這里,我們可以回想在README文件中同樣說過這一細節,在命令行或者配置文件中都能指定這一開關。需要說明的是,我們在這里并不一定需要去看get_history這一函數,因為從函數的名稱,README文件和程序注釋都能很清楚的得知這一函數的功能,不一定要去看代碼。而如果要猜想的話,也可以想到,history是webalizer在上次運行的時候記錄下來的一個文件,而這個文件則是去讀取它,并將它的數據包括到這次的分析中去。不信,我們可以來看看。
void get_history()
{
?? int i,numfields;
?? FILE *hist_fp;
?? char buffer[BUFSIZE];

?? /* first initalize internal array */
?? for (i=0;i<12;i++)
?? {
????? hist_month[i]=hist_year[i]=hist_fday[i]=hist_lday[i]=0;
????? hist_hit[i]=hist_files[i]=hist_site[i]=hist_page[i]=hist_visit[i]=0;
????? hist_xfer[i]=0.0;
?? }

?? hist_fp=fopen(hist_fname,"r");

?? if (hist_fp)
?? {
????? if (verbose>1) printf("%s %s ",msg_get_hist,hist_fname);
????? while ((fgets(buffer,BUFSIZE,hist_fp)) != NULL)
????? {
???????? i = atoi(buffer) -1;
???????? if (i>11)
???????? {
??????????? if (verbose)
?????????????? fprintf(stderr,"%s (mth=%d) ",msg_bad_hist,i+1);
??????????? continue;
???????? }

???????? /* month# year# requests files sites xfer firstday lastday */
???????? numfields = sscanf(buffer,"%d %d %lu %lu %lu %lf %d %d %lu %lu",
?????????????????????? &hist_month[i],
?????????????????????? &hist_year[i],
?????????????????????? &hist_hit[i],
?????????????????????? &hist_files[i],
?????????????????????? &hist_site[i],
?????????????????????? &hist_xfer[i],
?????????????????????? &hist_fday[i],
?????????????????????? &hist_lday[i],
?????????????????????? &hist_page[i],
?????????????????????? &hist_visit[i]);

???????? if (numfields==8) /* kludge for reading 1.20.xx history files */
???????? {
??????????? hist_page[i] = 0;
??????????? hist_visit[i] = 0;
???????? }
????? }
????? fclose(hist_fp);
?? }
?? else if (verbose>1) printf("%s ",msg_no_hist);
}
/*********************************************/
/* PUT_HISTORY - write out history file */
/*********************************************/

void put_history()
{
?? int i;
?? FILE *hist_fp;

?? hist_fp = fopen(hist_fname,"w");

?? if (hist_fp)
?? {
????? if (verbose>1) printf("%s ",msg_put_hist);
????? for (i=0;i<12;i++)
????? {
???????? if ((hist_month[i] != 0) && (hist_hit[i] != 0))
???????? {
??????????? fprintf(hist_fp,"%d %d %lu %lu %lu %.0f %d %d %lu %lu ",
??????????????????????????? hist_month[i],
??????????????????????????? hist_year[i],
??????????????????????????? hist_hit[i],
??????????????????????????? hist_files[i],
??????????????????????????? hist_site[i],
??????????????????????????? hist_xfer[i],
??????????????????????????? hist_fday[i],
??????????????????????????? hist_lday[i],
??????????????????????????? hist_page[i],
??????????????????????????? hist_visit[i]);
???????? }
????? }
????? fclose(hist_fp);
?? }
?? else
????? if (verbose)
????? fprintf(stderr,"%s %s ",msg_hist_err,hist_fname);
}
????? 在preserve.c中,這兩個函數是成對出現的。get_history()讀取文件中的數據,并將其記錄到hist_開頭的一些數組中去。而put_history()則是將一些數據記錄到同樣的數組中去。我們可以推測得知,hist_數組是全局變量(在函數中沒有定義),也可以查找源代碼驗證。同樣,我們可以找一找put_history()出現的地方,來驗證剛才的推測是否正確。在webalizer.c的1311行,出現:
???????? month_update_exit(rec_tstamp); /* calculate exit pages */
???????? write_month_html(); /* write monthly HTML file */
???????? write_main_index(); /* write main HTML file */
???????? put_history(); /* write history */
?? 可以知道,推測是正確的。再往下讀代碼,
?? if (incremental) /* incremental processing? */
?? {
????? if ((i=restore_state())) /* restore internal data structs */
????? {
???????? /* Error: Unable to restore run data (error num) */
???????? /* if (verbose) fprintf(stderr,"%s (%d) ",msg_bad_data,i); */
???????? fprintf(stderr,"%s (%d) ",msg_bad_data,i);
???????? exit(1);
????? }
??? ......
?? }
???? 同樣,這也是處理命令行和做數據準備,而且和get_history(), put_history()有些類似,讀者可以自己練習一下。下面,終于進入了程序的主體部分, 在做完了命令行分析,數據準備之后,開始從日志文件中讀取數據并做分析了。
?? /*********************************************/
?? /* MAIN PROCESS LOOP - read through log file */
?? /*********************************************/

?? while ( (gz_log)?(our_gzgets(gzlog_fp,buffer,BUFSIZE) != Z_NULL):
?????????? (fgets(buffer,BUFSIZE,log_fname?log_fp:stdin) != NULL))
???? 我看到這里的時候,頗有一些不同意作者的這種寫法。這一段while中的部分寫的比較復雜而且效率不高。因為從程序推斷和從他的代碼看來,作者是想根據日志文件的類型不同來采用不同的方法讀取文件,如果是gzip格式,則用our_gzgets來讀取其中一行,如果是普通的文本文件格式,則用fgets()來讀取。但是,這段代碼是寫在while循環中的,每次讀取一行就要重復判斷一次,明顯是多余的而且降低了程序的性能。可以在while循環之前做一次這樣的判斷,然后就不用重復了。
????? total_rec++;
????? if (strlen(buffer) == (BUFSIZE-1))
????? {
???????? if (verbose)
???????? {
??????????? fprintf(stderr,"%s",msg_big_rec);
??????????? if (debug_mode) fprintf(stderr,": %s",buffer);
??????????? else fprintf(stderr," ");
???????? }

???????? total_bad++; /* bump bad record counter */

???????? /* get the rest of the record */
???????? while ( (gz_log)?(our_gzgets(gzlog_fp,buffer,BUFSIZE)!=Z_NULL):
???????????????? (fgets(buffer,BUFSIZE,log_fname?log_fp:stdin)!=NULL))
???????? {
??????????? if (strlen(buffer) < BUFSIZE-1)
??????????? {
?????????????? if (debug_mode && verbose) fprintf(stderr,"%s ",buffer);
?????????????? break;
??????????? }
??????????? if (debug_mode && verbose) fprintf(stderr,"%s",buffer);
???????? }
???????? continue; /* go get next record if any */
????? }
???? 這一段代碼,讀入一行,如果這一行超過了程序允許的最大字符數(則是錯誤的日志數據紀錄),則跳過本行剩下的數據,忽略掉(continue進行下一次循環)。同時把total_bad增加一個。如果沒有超過程序允許的最大字符數(則是正確的日志數據紀錄),則
????? /* got a record... */
????? strcpy(tmp_buf, buffer); /* save buffer in case of error */
????? if (parse_record(buffer)) /* parse the record????? */
將該數據拷貝到一個緩沖區中,然后調用parse_record()進行處理。我們可以同樣的推測一下,get_record()是這個程序的一個主要處理部分,分析了日志數據。在parse_record.c中,有此函數,
/*********************************************/
/* PARSE_RECORD - uhhh, you know... */
/*********************************************/

int parse_record(char *buffer)
{
?? /* clear out structure */
?? memset(&log_rec,0,sizeof(struct log_struct));
/*
?? log_rec.hostname[0]=0;
?? log_rec.datetime[0]=0;
?? log_rec.url[0]=0;
?? log_rec.resp_code=0;
?? log_rec.xfer_size=0;
?? log_rec.refer[0]=0;
?? log_rec.agent[0]=0;
?? log_rec.srchstr[0]=0;
?? log_rec.ident[0]=0;
*/
#ifdef USE_DNS
?? memset(&log_rec.addr,0,sizeof(struct in_addr));
#endif

?? /* call appropriate handler */
?? switch (log_type)
?? {
????? default:
????? case LOG_CLF: return parse_record_web(buffer); break; /* clf */
????? case LOG_FTP: return parse_record_ftp(buffer); break; /* ftp */
????? case LOG_SQUID: return parse_record_squid(buffer); break; /* squid */
?? }
}

???? 可以看到,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++;
?? }
}
???? 從parser.h頭文件中就可以看到,這個函數是一個內部函數,這個函數把一行字符串中間的空格字符用''字符(結束字符)來代替,同時考慮了不替換在雙引號,方括號,圓括號中間的空格字符以免得將一行數據錯誤的分隔開了。(請參考WEB日志的文件格式,可以更清楚的理解這一函數)
int parse_record_web(char *buffer)
{
?? int size;
?? char *cp1, *cp2, *cpx, *eob, *eos;

?? size = strlen(buffer); /* get length of buffer */
?? eob = buffer+size; /* calculate end of buffer */
?? fmt_logrec(buffer); /* seperate fields with 's */

?? /* HOSTNAME */
?? cp1 = cpx = buffer; cp2=log_rec.hostname;
?? eos = (cp1+MAXHOST)-1;
?? if (eos >= eob) eos=eob-1;

?? while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
?? *cp2 = '';
?? if (*cp1 != '')
?? {
????? if (verbose)
????? {
???????? fprintf(stderr,"%s",msg_big_host);
???????? if (debug_mode) fprintf(stderr,": %s ",cpx);
???????? else fprintf(stderr," ");
????? }
????? while (*cp1 != '') cp1++;
?? }
?? if (cp1 < eob) cp1++;

?? /* skip next field (ident) */
?? while ( (*cp1 != '') && (cp1 < eob) ) cp1++;
?? if (cp1 < eob) cp1++;

?? /* IDENT (authuser) field */
?? cpx = cp1;
?? cp2 = log_rec.ident;
?? eos = (cp1+MAXIDENT-1);
?? if (eos >= eob) eos=eob-1;

?? while ( (*cp1 != '[') && (cp1 < eos) ) /* remove embeded spaces */
?? {
????? if (*cp1=='') *cp1=' ';
????? *cp2++=*cp1++;
?? }
?? *cp2--='';

?? if (cp1 >= eob) return 0;

?? /* check if oversized username */
?? if (*cp1 != '[')
?? {
????? if (verbose)
????? {
???????? fprintf(stderr,"%s",msg_big_user);
???????? if (debug_mode) fprintf(stderr,": %s ",cpx);
???????? else fprintf(stderr," ");
????? }
????? while ( (*cp1 != '[') && (cp1 < eob) ) cp1++;
?? }

?? /* strip trailing space(s) */
?? while (*cp2==' ') *cp2--='';

?? /* date/time string */
?? cpx = cp1;
?? cp2 = log_rec.datetime;
?? eos = (cp1+28);
?? if (eos >= eob) eos=eob-1;

?? while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
?? *cp2 = '';
?? if (*cp1 != '')
?? {
????? if (verbose)
????? {
???????? fprintf(stderr,"%s",msg_big_date);
???????? if (debug_mode) fprintf(stderr,": %s ",cpx);
???????? else fprintf(stderr," ");
????? }
????? while (*cp1 != '') cp1++;
?? }
?? if (cp1 < eob) cp1++;

?? /* minimal sanity check on timestamp */
?? if ( (log_rec.datetime[0] != '[') ||
??????? (log_rec.datetime[3] != '/') ||
??????? (cp1 >= eob)) return 0;

?? /* HTTP request */
?? cpx = cp1;
?? cp2 = log_rec.url;
?? eos = (cp1+MAXURL-1);
?? if (eos >= eob) eos = eob-1;

?? while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
?? *cp2 = '';
?? if (*cp1 != '')
?? {
????? if (verbose)
????? {
???????? fprintf(stderr,"%s",msg_big_req);
???????? if (debug_mode) fprintf(stderr,": %s ",cpx);
???????? else fprintf(stderr," ");
????? }
????? while (*cp1 != '') cp1++;
?? }
?? if (cp1 < eob) cp1++;

?? if ( (log_rec.url[0] != '"') ||
??????? (cp1 >= eob) ) return 0;

?? /* response code */
?? log_rec.resp_code = atoi(cp1);

?? /* xfer size */
?? while ( (*cp1 != '') && (cp1 < eob) ) cp1++;
?? if (cp1 < eob) cp1++;
?? if (*cp1<'0'||*cp1>'9') log_rec.xfer_size=0;
?? else log_rec.xfer_size = strtoul(cp1,NULL,10);

?? /* done with CLF record */
?? if (cp1>=eob) return 1;

?? while ( (*cp1 != '') && (*cp1 != ' ') && (cp1 < eob) ) cp1++;
?? if (cp1 < eob) cp1++;
?? /* get referrer if present */
?? cpx = cp1;
?? cp2 = log_rec.refer;
?? eos = (cp1+MAXREF-1);
?? if (eos >= eob) eos = eob-1;

?? while ( (*cp1 != '') && (*cp1 != ' ') && (cp1 != eos) ) *cp2++ = *cp1++;
?? *cp2 = '';
?? if (*cp1 != '')
?? {
????? if (verbose)
????? {
???????? fprintf(stderr,"%s",msg_big_ref);
???????? if (debug_mode) fprintf(stderr,": %s ",cpx);
???????? else fprintf(stderr," ");
????? }
????? while (*cp1 != '') cp1++;
?? }
?? if (cp1 < eob) cp1++;

?? cpx = cp1;
?? cp2 = log_rec.agent;
?? eos = cp1+(MAXAGENT-1);
?? if (eos >= eob) eos = eob-1;

?? while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
?? *cp2 = '';

?? return 1; /* maybe a valid record, return with TRUE */
}
???? 該函數,一次讀入一行(其實是一段日志數據中間的一個域,因為該行數據已經被fmt_logrec分開成多行數據了。根據CLF中的定義,檢查該數據并將其拷貝到log_rec結構中去,如果檢查該數據有效,則返回1。回到主程序,
???????? /* convert month name to lowercase */
???????? for (i=4;i<7;i++)
??????????? log_rec.datetime[i]=tolower(log_rec.datetime[i]);

???????? /* get year/month/day/hour/min/sec values */
???????? for (i=0;i<12;i++)
???????? {
??????????? if (strncmp(log_month[i],&log_rec.datetime[4],3)==0)
?????????????? { rec_month = i+1; break; }
???????? }

???????? rec_year=atoi(&log_rec.datetime[8]); /* get year number (int) */
???????? rec_day =atoi(&log_rec.datetime[1]); /* get day number */
???????? rec_hour=atoi(&log_rec.datetime[13]); /* get hour number */
???????? rec_min =atoi(&log_rec.datetime[16]); /* get minute number */
???????? rec_sec =atoi(&log_rec.datetime[19]); /* get second number */
....
在parse_record分析完數據之后,做日期的分析,把日志中的月份等數據轉換成機器可讀(可理解)的數據,并存入到log_rec中去。
???????? if ((i>=12)||(rec_min>59)||(rec_sec>59)||(rec_year<1990))
???????? {
??????????? total_bad++; /* if a bad date, bump counter */
??????????? if (verbose)
??????????? {
?????????????? fprintf(stderr,"%s: %s [%lu]",
???????????????? msg_bad_date,log_rec.datetime,total_rec);
? ......
? 如果日期,時間錯誤,則把total_bad計數器增加1,并且打印錯誤信息到標準錯誤輸出。
?????????? good_rec = 1;

???????? /* get current records timestamp (seconds since epoch) */
???????? req_tstamp=cur_tstamp;
???????? rec_tstamp=((jdate(rec_day,rec_month,rec_year)-epoch)*86400)+
???????????????????? (rec_hour*3600)+(rec_min*60)+rec_sec;

???????? /* Do we need to check for duplicate records? (incremental mode) */
???????? if (check_dup)
???????? {
??????????? /* check if less than/equal to last record processed */
??????????? if ( rec_tstamp <= cur_tstamp )
??????????? {
?????????????? /* if it is, assume we have already processed and ignore it */
?????????????? total_ignore++;
?????????????? continue;
??????????? }
??????????? else
??????????? {
?????????????? /* if it isn't.. disable any more checks this run */
?????????????? check_dup=0;
?????????????? /* now check if it's a new month */
?????????????? if (cur_month != rec_month)
?????????????? {
????????????????? clear_month();
????????????????? cur_sec = rec_sec; /* set current counters */
????????????????? cur_min = rec_min;
????????????????? cur_hour = rec_hour;
????????????????? cur_day = rec_day;
????????????????? cur_month = rec_month;
????????????????? cur_year = rec_year;
????????????????? cur_tstamp= rec_tstamp;
????????????????? f_day=l_day=rec_day; /* reset first and last day */
?????????????? }
??????????? }
???????? }

???????? /* check for out of sequence records */
???????? if (rec_tstamp/3600 < cur_tstamp/3600)
???????? {
??????????? if (!fold_seq_err && ((rec_tstamp+SLOP_VAL)/3600<cur_tstamp/3600) )
?????????????? { total_ignore++; continue; }
??????????? else
??????????? {
?????????????? rec_sec = cur_sec; /* if folding sequence */
?????????????? rec_min = cur_min; /* errors, just make it */
?????????????? rec_hour = cur_hour; /* look like the last */
?????????????? rec_day = cur_day; /* good records timestamp */
?????????????? rec_month = cur_month;
?????????????? rec_year = cur_year;
?????????????? rec_tstamp= cur_tstamp;
??????????? }
???????? }
???????? cur_tstamp=rec_tstamp; /* update current timestamp */
???? 如果該日期、時間沒有錯誤,則該數據是一個好的數據,將good_record計數器加1,并且檢查時間戳,和數據是否重復數據。這里有一個函數,jdate()在主程序一開頭我們就遇到了,當時跳了過去沒有深究,這里留給讀者做一個練習。(提示:該函數根據一個日期產生一個字符串,這個字符串是惟一的,可以檢查時間的重復性,是一個通用函數,可以在別的程序中拿來使用)
???????? /*********************************************/
???????? /* DO SOME PRE-PROCESS FORMATTING */
???????? /*********************************************/

???????? /* fix URL field */
???????? cp1 = cp2 = log_rec.url;
???????? /* handle null '-' case here... */
???????? if (*++cp1 == '-') { *cp2++ = '-'; *cp2 = ''; }
???????? else
???????? {
??????????? /* strip actual URL out of request */
??????????? while ( (*cp1 != ' ') && (*cp1 != '') ) cp1++;
??????????? if (*cp1 != '')
??????????? {
?????????????? /* scan to begin of actual URL field */
?????????????? while ((*cp1 == ' ') && (*cp1 != '')) cp1++;
?????????????? /* remove duplicate / if needed */
?????????????? if (( *cp1=='/') && (*(cp1+1)=='/')) cp1++;
?????????????? while ((*cp1 != ' ')&&(*cp1 != '"')&&(*cp1 != ''))
????????????????? *cp2++ = *cp1++;
?????????????? *cp2 = '';
??????????? }
???????? }

???????? /* un-escape URL */
???????? unescape(log_rec.url);

???????? /* check for service (ie: http://) and lowercase if found */
???????? if ( (cp2=strstr(log_rec.url,"://")) != NULL)
???????? {
??????????? cp1=log_rec.url;
??????????? while (cp1!=cp2)
??????????? {
?????????????? if ( (*cp1>='A') && (*cp1<='Z')) *cp1 += 'a'-'A';
?????????????? cp1++;
??????????? }
???????? }

???????? /* strip query portion of cgi scripts */
???????? cp1 = log_rec.url;
???????? while (*cp1 != '')
?????????? if (!isurlchar(*cp1)) { *cp1 = ''; break; }
?????????? else cp1++;
???????? if (log_rec.url[0]=='')
?????????? { log_rec.url[0]='/'; log_rec.url[1]=''; }

???????? /* strip off index.html (or any aliases) */
???????? lptr=index_alias;
???????? while (lptr!=NULL)
???????? {
??????????? if ((cp1=strstr(log_rec.url,lptr->string))!=NULL)
??????????? {
?????????????? if ((cp1==log_rec.url)||(*(cp1-1)=='/'))
?????????????? {
????????????????? *cp1='';
????????????????? if (log_rec.url[0]=='')
?????????????????? { log_rec.url[0]='/'; log_rec.url[1]=''; }
????????????????? break;
?????????????? }
??????????? }
??????????? lptr=lptr->next;
???????? }

???????? /* unescape referrer */
???????? unescape(log_rec.refer);
......
???? 這一段,做了一些URL字符串中的字符轉換工作,很長,我個人認為為了程序的模塊化,結構化和可復用性,應該將這一段代碼改為函數,避免主程序體太長,造成可讀性不強和沒有移植性,和不夠結構化。跳過這一段乏味的代碼,進入到下面一個部分---后處理。
? if (gz_log) gzclose(gzlog_fp);
?? else if (log_fname) fclose(log_fp);

?? if (good_rec) /* were any good records? */
?? {
????? tm_site[cur_day-1]=dt_site; /* If yes, clean up a bit */
????? tm_visit[cur_day-1]=tot_visit(sd_htab);
????? t_visit=tot_visit(sm_htab);
????? if (ht_hit > mh_hit) mh_hit = ht_hit;

????? if (total_rec > (total_ignore+total_bad)) /* did we process any? */
????? {
???????? if (incremental)
???????? {
??????????? if (save_state()) /* incremental stuff */
??????????? {
?????????????? /* Error: Unable to save current run data */
?????????????? if (verbose) fprintf(stderr,"%s ",msg_data_err);
?????????????? unlink(state_fname);
??????????? }
???????? }
???????? month_update_exit(rec_tstamp); /* calculate exit pages */
???????? write_month_html(); /* write monthly HTML file */
???????? write_main_index(); /* write main HTML file */
???????? put_history(); /* write history */
????? }

????? end_time = times(&mytms); /* display timing totals? */
????? if (time_me' '(verbose>1))
????? {
???????? printf("%lu %s ",total_rec, msg_records);
???????? if (total_ignore)
???????? {
??????????? printf("(%lu %s",total_ignore,msg_ignored);
??????????? if (total_bad) printf(", %lu %s) ",total_bad,msg_bad);
?????????????? else printf(") ");
???????? }
???????? else if (total_bad) printf("(%lu %s) ",total_bad,msg_bad);

???????? /* get processing time (end-start) */
???????? temp_time = (float)(end_time-start_time)/CLK_TCK;
???????? printf("%s %.2f %s", msg_in, temp_time, msg_seconds);

???????? /* calculate records per second */
???????? if (temp_time)
?????????? i=( (int)( (float)total_rec/temp_time ) );
???????? else i=0;

???????? if ( (i>0) && (i<=total_rec) ) printf(", %d/sec ", i);
??????????? else printf(" ");
????? }

這一段,做了一些后期的處理。接下來的部分,我想在本文中略過,留給感興趣的讀者自己去做分析。原因有兩點:
1、這個程序在前面結構化比較強,而到了結構上后面有些亂,雖然代碼效率還是比較高,但是可重用性不夠強, 限于篇幅,我就不再一一解釋了。
2、前面分析程序過程中,也對后面的代碼做了一些預測和估計,也略微涉及到了后面的代碼,而且讀者可以根據上面提到的原則來自己分析代碼,也作為一個實踐吧。

最后,對于在這篇文章中提到的分析源代碼程序的一些方法做一下小結,以作為本文的結束。
分析一個源代碼,一個有效的方法是:
1、閱讀源代碼的說明文檔,比如本例中的README, 作者寫的非常的詳細,仔細讀過之后,在閱讀程序的時候往往能夠從README文件中找到相應的說明,從而簡化了源程序的閱讀工作。
2、如果源代碼有文檔目錄,一般為doc或者docs, 最好也在閱讀源程序之前仔細閱讀,因為這些文檔同樣起了很好的說明注釋作用。
3、從makefile文件入手,分析源代碼的層次結構,找出哪個是主程序,哪些是函數包。這對于快速把握程序結構有很大幫助。
4、從main函數入手,一步一步往下閱讀,遇到可以猜測出意思來的簡單的函數,可以跳過。但是一定要注意程序中使用的全局變量(如果是C程序),可以把關鍵的數據結構說明拷貝到一個文本編輯器中以便隨時查找。
5、分析函數包(針對C程序),要注意哪些是全局函數,哪些是內部使用的函數,注意extern關鍵字。對于變量,也需要同樣注意。先分析清楚內部函數,再來分析外部函數,因為內部函數肯定是在外部函數中被調用的。
6、需要說明的是數據結構的重要性:對于一個C程序來說,所有的函數都是在操作同一些數據,而由于沒有較好的封裝性,這些數據可能出現在程序的任何地方,被任何函數修改,所以一定要注意這些數據的定義和意義,也要注意是哪些函數在對它們進行操作,做了哪些改變。
7、在閱讀程序的同時,最好能夠把程序存入到cvs之類的版本控制器中去,在需要的時候可以對源代碼做一些修改試驗,因為動手修改是比僅僅是閱讀要好得多的讀程序的方法。在你修改運行程序的時候,可以從cvs中把原來的代碼調出來與你改動的部分進行比較(diff命令), 可以看出一些源代碼的優缺點并且能夠實際的練習自己的編程技術。
8、閱讀程序的同時,要注意一些小工具的使用,能夠提高速度,比如vi中的查找功能,模式匹配查找,做標記,還有grep,find這兩個最強大最常用的文本搜索工具的使用。


對于一個Unix/Linux下面以命令行方式運行的程序,有這么一些套路,大家可以在閱讀程序的時候作為參考。
1、在程序開頭,往往都是分析命令行,根據命令行參數對一些變量或者數組,或者結構賦值,后面的程序就是根據這些變量來進行不同的操作。
2、分析命令行之后,進行數據準備,往往是計數器清空,結構清零等等。
3、在程序中間有一些預編譯選項,可以在makefile中找到相應部分。
4、注意程序中對于日志的處理,和調試選項打開的時候做的動作,這些對于調試程序有很大的幫助。
5、注意多線程對數據的操作。(這在本例中沒有涉及)

結束語:
   當然,在這篇文章中,并沒有闡述所有的閱讀源代碼的方法和技巧,也沒有涉及任何輔助工具(除了簡單的文本編輯器),也沒有涉及面向對象程序的閱讀方法。我想把這些留到以后再做討論。也請大家可以就這些話題展開討論。

總結

以上是生活随笔為你收集整理的如何更好阅读源代码 .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

а√资源新版在线天堂 | 露脸叫床粗话东北少妇 | 最近的中文字幕在线看视频 | 俄罗斯老熟妇色xxxx | 久久97精品久久久久久久不卡 | 日韩精品无码一区二区中文字幕 | 亚洲色偷偷偷综合网 | 日本在线高清不卡免费播放 | 久久99精品国产麻豆蜜芽 | 无码人妻丰满熟妇区毛片18 | 色婷婷av一区二区三区之红樱桃 | 少妇性荡欲午夜性开放视频剧场 | 国产亚洲精品久久久闺蜜 | 国产又粗又硬又大爽黄老大爷视 | 99视频精品全部免费免费观看 | 国产成人人人97超碰超爽8 | 亚洲欧美日韩成人高清在线一区 | 国内老熟妇对白xxxxhd | 国产精品久免费的黄网站 | 99久久精品国产一区二区蜜芽 | 国产一区二区三区日韩精品 | 超碰97人人做人人爱少妇 | 日韩成人一区二区三区在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲日韩一区二区三区 | 国产精品国产三级国产专播 | 波多野结衣aⅴ在线 | 久久亚洲a片com人成 | 中文字幕中文有码在线 | 国产亚洲美女精品久久久2020 | 熟妇人妻中文av无码 | 一本一道久久综合久久 | 久久久久se色偷偷亚洲精品av | 国产乡下妇女做爰 | 久久熟妇人妻午夜寂寞影院 | 亚洲欧洲日本无在线码 | 久久婷婷五月综合色国产香蕉 | 玩弄少妇高潮ⅹxxxyw | 亚洲の无码国产の无码步美 | 成人精品天堂一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 欧美刺激性大交 | 伊人色综合久久天天小片 | 午夜男女很黄的视频 | 久久天天躁夜夜躁狠狠 | 香港三级日本三级妇三级 | 国产网红无码精品视频 | 风流少妇按摩来高潮 | 久久久久人妻一区精品色欧美 | 亚洲一区二区三区香蕉 | 一本大道久久东京热无码av | 色老头在线一区二区三区 | √天堂资源地址中文在线 | 欧洲极品少妇 | 国产精品a成v人在线播放 | 日韩人妻无码一区二区三区久久99 | 人人爽人人澡人人人妻 | 樱花草在线播放免费中文 | 人人爽人人澡人人人妻 | 国产av一区二区三区最新精品 | 国产成人无码午夜视频在线观看 | 日欧一片内射va在线影院 | 天堂在线观看www | 波多野结衣av一区二区全免费观看 | 欧美丰满老熟妇xxxxx性 | 久久精品成人欧美大片 | 亚洲一区二区观看播放 | 撕开奶罩揉吮奶头视频 | 久久精品人妻少妇一区二区三区 | 亚洲国产av美女网站 | 欧美第一黄网免费网站 | 国产人妻精品一区二区三区不卡 | 亚洲精品久久久久中文第一幕 | 国产精品久久久一区二区三区 | 狂野欧美激情性xxxx | 国产精品爱久久久久久久 | 97人妻精品一区二区三区 | 天堂а√在线地址中文在线 | 色欲av亚洲一区无码少妇 | 国产熟女一区二区三区四区五区 | 国产成人综合美国十次 | 四虎国产精品一区二区 | 亚洲国产一区二区三区在线观看 | 东京无码熟妇人妻av在线网址 | 久久无码人妻影院 | 88国产精品欧美一区二区三区 | 人妻天天爽夜夜爽一区二区 | 欧美阿v高清资源不卡在线播放 | 久久精品女人的天堂av | 伊人久久大香线焦av综合影院 | 国产精品久免费的黄网站 | 国产乱人伦av在线无码 | 乱人伦中文视频在线观看 | 亚洲日韩av片在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品成a人在线观看 | а天堂中文在线官网 | 人人妻人人澡人人爽欧美一区九九 | 久久97精品久久久久久久不卡 | 国产在热线精品视频 | 天堂亚洲2017在线观看 | 综合网日日天干夜夜久久 | 亚洲一区二区三区含羞草 | 国产农村妇女高潮大叫 | 东京热一精品无码av | 久久无码人妻影院 | 亚洲中文字幕在线无码一区二区 | 中文字幕无码av激情不卡 | а√资源新版在线天堂 | 亚洲成在人网站无码天堂 | 图片小说视频一区二区 | 少妇一晚三次一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | 成人aaa片一区国产精品 | 久久精品成人欧美大片 | 在线精品国产一区二区三区 | 丰满人妻精品国产99aⅴ | 日本熟妇浓毛 | 99在线 | 亚洲 | 日韩在线不卡免费视频一区 | 国产成人一区二区三区在线观看 | 男人扒开女人内裤强吻桶进去 | 精品人妻人人做人人爽夜夜爽 | 日韩亚洲欧美精品综合 | 国产熟女一区二区三区四区五区 | 国产精品手机免费 | 超碰97人人做人人爱少妇 | 两性色午夜视频免费播放 | 中文字幕久久久久人妻 | 亚洲日韩精品欧美一区二区 | 久久久久99精品国产片 | 99麻豆久久久国产精品免费 | 国产超碰人人爽人人做人人添 | 在线天堂新版最新版在线8 | 日本高清一区免费中文视频 | 色婷婷综合中文久久一本 | 久久亚洲日韩精品一区二区三区 | 黑人巨大精品欧美黑寡妇 | 四十如虎的丰满熟妇啪啪 | 精品亚洲成av人在线观看 | 丰满人妻翻云覆雨呻吟视频 | 久久99精品久久久久久 | 亚洲色在线无码国产精品不卡 | 久久zyz资源站无码中文动漫 | 377p欧洲日本亚洲大胆 | 麻豆精产国品 | 97资源共享在线视频 | 亚洲热妇无码av在线播放 | 亚洲人交乣女bbw | 激情内射亚州一区二区三区爱妻 | 欧美日韩久久久精品a片 | 丰满少妇人妻久久久久久 | 国产精品久久久久久亚洲影视内衣 | 亚洲日韩精品欧美一区二区 | 久久久久久久人妻无码中文字幕爆 | 日本丰满护士爆乳xxxx | 亚洲va中文字幕无码久久不卡 | 老司机亚洲精品影院无码 | 天天摸天天碰天天添 | 强开小婷嫩苞又嫩又紧视频 | 午夜熟女插插xx免费视频 | 亚洲伊人久久精品影院 | 娇妻被黑人粗大高潮白浆 | 免费看少妇作爱视频 | 国产成人午夜福利在线播放 | 啦啦啦www在线观看免费视频 | 国产精品亚洲а∨无码播放麻豆 | 强伦人妻一区二区三区视频18 | 久久精品一区二区三区四区 | 欧美激情综合亚洲一二区 | 国产又爽又黄又刺激的视频 | 国产精品鲁鲁鲁 | 欧美刺激性大交 | 无码人中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲精品国产第一综合99久久 | 久久综合九色综合97网 | www一区二区www免费 | 国色天香社区在线视频 | 亚洲色大成网站www | 亚洲精品一区二区三区在线观看 | 亚洲一区二区三区偷拍女厕 | 最近中文2019字幕第二页 | 伊人久久婷婷五月综合97色 | 亚洲一区二区三区偷拍女厕 | 狠狠色丁香久久婷婷综合五月 | 色偷偷人人澡人人爽人人模 | 人妻人人添人妻人人爱 | 97久久超碰中文字幕 | 一本色道久久综合亚洲精品不卡 | 亚洲熟妇自偷自拍另类 | 成人免费视频视频在线观看 免费 | 久久亚洲中文字幕无码 | 天天综合网天天综合色 | 日日摸天天摸爽爽狠狠97 | 一本色道婷婷久久欧美 | 欧美日韩人成综合在线播放 | 亚洲 日韩 欧美 成人 在线观看 | 欧美日韩一区二区综合 | 欧美成人免费全部网站 | 欧美xxxx黑人又粗又长 | 午夜性刺激在线视频免费 | 一本色道婷婷久久欧美 | 亚洲啪av永久无码精品放毛片 | 99久久精品日本一区二区免费 | 国产精品视频免费播放 | 国产精品理论片在线观看 | 亚洲国产av精品一区二区蜜芽 | 水蜜桃av无码 | 又粗又大又硬毛片免费看 | 性色欲网站人妻丰满中文久久不卡 | 人妻与老人中文字幕 | 日韩欧美中文字幕在线三区 | aⅴ在线视频男人的天堂 | 国产乱码精品一品二品 | 午夜精品久久久久久久 | 中文精品无码中文字幕无码专区 | 久久无码人妻影院 | 日欧一片内射va在线影院 | 国产乱人偷精品人妻a片 | 99国产欧美久久久精品 | 欧美精品在线观看 | 欧美日韩精品 | 国产卡一卡二卡三 | 丰满岳乱妇在线观看中字无码 | 十八禁真人啪啪免费网站 | 国产另类ts人妖一区二区 | 乌克兰少妇xxxx做受 | 国产成人无码av在线影院 | 久久99国产综合精品 | 成 人 免费观看网站 | 色婷婷久久一区二区三区麻豆 | 三级4级全黄60分钟 | 欧美第一黄网免费网站 | 午夜丰满少妇性开放视频 | 又大又黄又粗又爽的免费视频 | 国产高潮视频在线观看 | 国产绳艺sm调教室论坛 | 国产亚洲tv在线观看 | 国产在线aaa片一区二区99 | 午夜精品一区二区三区在线观看 | 成人aaa片一区国产精品 | 天天躁夜夜躁狠狠是什么心态 | 欧美性黑人极品hd | 亚洲综合另类小说色区 | 1000部啪啪未满十八勿入下载 | 四虎国产精品免费久久 | 久久久久成人片免费观看蜜芽 | 四虎永久在线精品免费网址 | 内射巨臀欧美在线视频 | 51国偷自产一区二区三区 | 久久久久av无码免费网 | 无套内谢的新婚少妇国语播放 | 国产又粗又硬又大爽黄老大爷视 | 欧美 日韩 人妻 高清 中文 | 99riav国产精品视频 | 亚洲精品一区二区三区四区五区 | 无遮挡啪啪摇乳动态图 | 欧美大屁股xxxxhd黑色 | 国产小呦泬泬99精品 | 在线看片无码永久免费视频 | 九九久久精品国产免费看小说 | 麻豆av传媒蜜桃天美传媒 | 亚洲一区二区三区在线观看网站 | 麻花豆传媒剧国产免费mv在线 | 国产在线精品一区二区高清不卡 | 无套内谢老熟女 | 亚洲毛片av日韩av无码 | 熟女少妇在线视频播放 | 夜夜躁日日躁狠狠久久av | 亚洲欧美日韩成人高清在线一区 | 亚洲精品久久久久久一区二区 | 97se亚洲精品一区 | 久久99精品国产麻豆蜜芽 | 蜜桃臀无码内射一区二区三区 | 综合人妻久久一区二区精品 | 国内揄拍国内精品人妻 | 丝袜 中出 制服 人妻 美腿 | 永久免费观看美女裸体的网站 | 日韩av无码一区二区三区 | 老熟女重囗味hdxx69 | 少妇无码一区二区二三区 | 狠狠色欧美亚洲狠狠色www | 国产综合久久久久鬼色 | 国产精品久久久久久亚洲毛片 | 国产绳艺sm调教室论坛 | 亚洲人亚洲人成电影网站色 | 日本饥渴人妻欲求不满 | 永久免费观看美女裸体的网站 | 国产莉萝无码av在线播放 | 午夜福利一区二区三区在线观看 | 无码乱肉视频免费大全合集 | 国产精华av午夜在线观看 | 色综合视频一区二区三区 | 久久人妻内射无码一区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 1000部啪啪未满十八勿入下载 | 精品国产乱码久久久久乱码 | 荫蒂被男人添的好舒服爽免费视频 | 国内精品一区二区三区不卡 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 99精品无人区乱码1区2区3区 | 国产精品久久久午夜夜伦鲁鲁 | 国产手机在线αⅴ片无码观看 | 啦啦啦www在线观看免费视频 | 男女猛烈xx00免费视频试看 | 婷婷色婷婷开心五月四房播播 | 大地资源网第二页免费观看 | 免费国产成人高清在线观看网站 | 精品一区二区不卡无码av | 久久综合色之久久综合 | 久久成人a毛片免费观看网站 | 丝袜足控一区二区三区 | 老熟女乱子伦 | 久久午夜无码鲁丝片午夜精品 | 亚洲国产欧美在线成人 | 无码国产色欲xxxxx视频 | 国产精品爱久久久久久久 | 最近中文2019字幕第二页 | 露脸叫床粗话东北少妇 | 97资源共享在线视频 | 国产舌乚八伦偷品w中 | 亚洲中文字幕在线观看 | 大地资源中文第3页 | 欧美乱妇无乱码大黄a片 | 人妻插b视频一区二区三区 | 伊人久久婷婷五月综合97色 | 乱人伦人妻中文字幕无码 | 中文字幕精品av一区二区五区 | 国产香蕉尹人综合在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 一本大道久久东京热无码av | 熟妇人妻无乱码中文字幕 | 精品偷拍一区二区三区在线看 | 亚洲精品一区国产 | 极品尤物被啪到呻吟喷水 | 少妇被粗大的猛进出69影院 | 成人无码视频免费播放 | 黑森林福利视频导航 | 免费人成在线视频无码 | 日韩人妻无码中文字幕视频 | 国产香蕉尹人综合在线观看 | 日欧一片内射va在线影院 | 日韩精品无码免费一区二区三区 | 日韩精品久久久肉伦网站 | 蜜桃臀无码内射一区二区三区 | www国产精品内射老师 | 亚洲狠狠色丁香婷婷综合 | 99久久久无码国产aaa精品 | 亚洲欧美国产精品专区久久 | 初尝人妻少妇中文字幕 | 国产精品久久久久久无码 | 国产精品亚洲综合色区韩国 | 蜜桃视频韩日免费播放 | 性欧美熟妇videofreesex | 亚洲第一网站男人都懂 | 天堂无码人妻精品一区二区三区 | 无码人妻久久一区二区三区不卡 | 久久精品中文字幕大胸 | 麻豆国产丝袜白领秘书在线观看 | 丝袜美腿亚洲一区二区 | 人妻少妇精品无码专区二区 | 亚洲欧美日韩综合久久久 | 国产成人无码a区在线观看视频app | 日本精品高清一区二区 | 日本爽爽爽爽爽爽在线观看免 | 人人爽人人澡人人高潮 | 久久久国产精品无码免费专区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 无码乱肉视频免费大全合集 | 国产卡一卡二卡三 | 亚洲人成网站色7799 | 精品无码一区二区三区的天堂 | 国产亚洲欧美在线专区 | 丰满人妻被黑人猛烈进入 | 久久zyz资源站无码中文动漫 | 欧美性猛交内射兽交老熟妇 | 扒开双腿疯狂进出爽爽爽视频 | 久久久精品国产sm最大网站 | 男女性色大片免费网站 | 欧美日韩色另类综合 | 国产高清不卡无码视频 | 国内揄拍国内精品少妇国语 | 欧美国产日韩亚洲中文 | 一本色道久久综合亚洲精品不卡 | 亚洲人亚洲人成电影网站色 | 久久久久久亚洲精品a片成人 | 玩弄人妻少妇500系列视频 | 色综合久久久无码中文字幕 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美黑人巨大xxxxx | 国产精品久久久av久久久 | 亚洲 激情 小说 另类 欧美 | 亚洲欧美综合区丁香五月小说 | 久久久久久亚洲精品a片成人 | 日本xxxx色视频在线观看免费 | 久久精品无码一区二区三区 | 国产亚av手机在线观看 | 国产在线精品一区二区高清不卡 | 天天av天天av天天透 | 亚洲成a人一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 欧美freesex黑人又粗又大 | 中文字幕av伊人av无码av | 欧美日韩一区二区综合 | 帮老师解开蕾丝奶罩吸乳网站 | 纯爱无遮挡h肉动漫在线播放 | 亚洲国产av美女网站 | 2019午夜福利不卡片在线 | 国产香蕉尹人视频在线 | 精品一区二区三区无码免费视频 | 国产亚洲精品久久久久久国模美 | 日韩欧美成人免费观看 | 欧美怡红院免费全部视频 | 国产偷国产偷精品高清尤物 | 成人亚洲精品久久久久 | www国产精品内射老师 | 黄网在线观看免费网站 | 大乳丰满人妻中文字幕日本 | 免费无码的av片在线观看 | 无套内射视频囯产 | 综合激情五月综合激情五月激情1 | 久久久久亚洲精品男人的天堂 | 精品熟女少妇av免费观看 | 免费看少妇作爱视频 | 天天综合网天天综合色 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产免费久久精品国产传媒 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 大地资源网第二页免费观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 内射老妇bbwx0c0ck | 久久99精品国产麻豆 | 成人精品一区二区三区中文字幕 | 人妻与老人中文字幕 | 久久亚洲精品中文字幕无男同 | 国产午夜视频在线观看 | 日韩亚洲欧美精品综合 | 老熟妇乱子伦牲交视频 | 色老头在线一区二区三区 | 亚洲区欧美区综合区自拍区 | 精品国产麻豆免费人成网站 | 伊人久久大香线焦av综合影院 | 天天av天天av天天透 | 久久亚洲中文字幕精品一区 | 人人爽人人澡人人高潮 | 内射欧美老妇wbb | 日日干夜夜干 | aa片在线观看视频在线播放 | 国产亚av手机在线观看 | 精品欧洲av无码一区二区三区 | 三级4级全黄60分钟 | 粉嫩少妇内射浓精videos | 人人妻人人澡人人爽人人精品 | 日日麻批免费40分钟无码 | 久久精品成人欧美大片 | 无码av中文字幕免费放 | 欧美精品国产综合久久 | 亚洲色偷偷男人的天堂 | 欧美熟妇另类久久久久久多毛 | 亚洲国产精品毛片av不卡在线 | 亚洲精品一区二区三区大桥未久 | 国产成人无码区免费内射一片色欲 | 六月丁香婷婷色狠狠久久 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 久久久久国色av免费观看性色 | 国产九九九九九九九a片 | 香港三级日本三级妇三级 | 无码av最新清无码专区吞精 | 亚洲国产欧美日韩精品一区二区三区 | 中文字幕精品av一区二区五区 | 欧美老妇与禽交 | 激情爆乳一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 好爽又高潮了毛片免费下载 | 国产 精品 自在自线 | 兔费看少妇性l交大片免费 | 亚洲精品久久久久久久久久久 | 成人精品视频一区二区三区尤物 | 免费网站看v片在线18禁无码 | 又色又爽又黄的美女裸体网站 | 国产情侣作爱视频免费观看 | 国产亚洲精品久久久久久 | 亚洲国精产品一二二线 | 又大又硬又爽免费视频 | 亚洲va欧美va天堂v国产综合 | 国内综合精品午夜久久资源 | 国产激情艳情在线看视频 | 永久免费观看美女裸体的网站 | 76少妇精品导航 | 国产欧美亚洲精品a | 人妻少妇精品无码专区二区 | 亚欧洲精品在线视频免费观看 | 永久免费观看美女裸体的网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产激情综合五月久久 | ass日本丰满熟妇pics | 综合网日日天干夜夜久久 | 亚欧洲精品在线视频免费观看 | 亚洲综合无码一区二区三区 | 强辱丰满人妻hd中文字幕 | 人妻无码αv中文字幕久久琪琪布 | 人妻aⅴ无码一区二区三区 | 亚洲成av人片天堂网无码】 | 亚洲欧美日韩综合久久久 | 十八禁真人啪啪免费网站 | 熟女少妇在线视频播放 | 国内综合精品午夜久久资源 | 一本大道伊人av久久综合 | 亚洲国产精品无码久久久久高潮 | 亚洲自偷自拍另类第1页 | 中国女人内谢69xxxx | 亚洲中文无码av永久不收费 | 亚洲国产av美女网站 | 人人澡人摸人人添 | 九月婷婷人人澡人人添人人爽 | 亚洲精品欧美二区三区中文字幕 | 丰满妇女强制高潮18xxxx | 无码乱肉视频免费大全合集 | 美女扒开屁股让男人桶 | 高潮毛片无遮挡高清免费 | 一个人看的视频www在线 | 99久久人妻精品免费一区 | 久久精品中文字幕大胸 | 久久精品丝袜高跟鞋 | 久久久久成人片免费观看蜜芽 | 西西人体www44rt大胆高清 | av无码不卡在线观看免费 | 樱花草在线播放免费中文 | 97se亚洲精品一区 | av无码不卡在线观看免费 | 日本一区二区三区免费播放 | 国产人妻精品一区二区三区 | 人人爽人人澡人人人妻 | 亚洲国产精华液网站w | 婷婷五月综合激情中文字幕 | 人妻中文无码久热丝袜 | 久久亚洲a片com人成 | 女人色极品影院 | 国产精品久久精品三级 | 欧洲极品少妇 | 精品久久久久久人妻无码中文字幕 | 日本免费一区二区三区最新 | 日本肉体xxxx裸交 | 蜜臀av无码人妻精品 | www国产亚洲精品久久网站 | 亚洲中文字幕在线无码一区二区 | 国产无遮挡又黄又爽又色 | 久久亚洲日韩精品一区二区三区 | 精品久久久久香蕉网 | 真人与拘做受免费视频一 | 亚洲精品国偷拍自产在线观看蜜桃 | 人妻少妇精品无码专区动漫 | 无码av岛国片在线播放 | 亚洲啪av永久无码精品放毛片 | 亚洲va欧美va天堂v国产综合 | 国产一区二区三区日韩精品 | 六月丁香婷婷色狠狠久久 | 久久久亚洲欧洲日产国码αv | 熟女少妇在线视频播放 | 中文久久乱码一区二区 | 人人澡人人妻人人爽人人蜜桃 | 亚洲精品午夜国产va久久成人 | 国产无遮挡又黄又爽又色 | 日韩欧美群交p片內射中文 | 亚洲欧美日韩国产精品一区二区 | 1000部啪啪未满十八勿入下载 | 免费看少妇作爱视频 | 久久午夜无码鲁丝片 | 日韩视频 中文字幕 视频一区 | 99精品国产综合久久久久五月天 | 国产精品福利视频导航 | 国产精品高潮呻吟av久久4虎 | 亚洲欧美日韩综合久久久 | 亚洲欧洲日本综合aⅴ在线 | 亚洲狠狠色丁香婷婷综合 | 99国产欧美久久久精品 | 国产高潮视频在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产人妻精品一区二区三区 | 久久久久久国产精品无码下载 | av无码不卡在线观看免费 | 日日橹狠狠爱欧美视频 | 精品熟女少妇av免费观看 | 亚洲色无码一区二区三区 | 亚洲国产午夜精品理论片 | 粉嫩少妇内射浓精videos | 久久99精品国产.久久久久 | 精品久久久无码人妻字幂 | 丝袜 中出 制服 人妻 美腿 | 成人免费无码大片a毛片 | 国产深夜福利视频在线 | 国产精品丝袜黑色高跟鞋 | 国产精品亚洲一区二区三区喷水 | 99久久精品无码一区二区毛片 | 成人精品天堂一区二区三区 | 人人妻在人人 | 亚洲日韩一区二区 | 欧美老妇与禽交 | 精品无码一区二区三区爱欲 | aⅴ在线视频男人的天堂 | 欧美日本精品一区二区三区 | 欧美日韩在线亚洲综合国产人 | 亚洲综合无码一区二区三区 | 中文毛片无遮挡高清免费 | 精品久久8x国产免费观看 | 国产成人精品无码播放 | 久久天天躁狠狠躁夜夜免费观看 | 久久久久久久久蜜桃 | 无码乱肉视频免费大全合集 | 欧美喷潮久久久xxxxx | 日本又色又爽又黄的a片18禁 | 无遮挡国产高潮视频免费观看 | 国产精品国产自线拍免费软件 | 久久久精品成人免费观看 | 国产办公室秘书无码精品99 | 学生妹亚洲一区二区 | 国精产品一区二区三区 | 人人爽人人爽人人片av亚洲 | 亚洲精品久久久久久久久久久 | 香港三级日本三级妇三级 | 一本久道高清无码视频 | 日日夜夜撸啊撸 | 色诱久久久久综合网ywww | 国产精品资源一区二区 | 少妇人妻偷人精品无码视频 | 国产精品va在线播放 | 日本又色又爽又黄的a片18禁 | 中文无码伦av中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 国产尤物精品视频 | 熟妇人妻激情偷爽文 | 亚洲一区二区三区国产精华液 | 亚洲色欲色欲天天天www | 中文精品久久久久人妻不卡 | 初尝人妻少妇中文字幕 | 国产成人无码一二三区视频 | 乱人伦人妻中文字幕无码 | 亚洲日本va中文字幕 | 亚洲欧美色中文字幕在线 | 亚洲中文字幕久久无码 | 久久久久免费精品国产 | 激情五月综合色婷婷一区二区 | 男女猛烈xx00免费视频试看 | 九月婷婷人人澡人人添人人爽 | 牲欲强的熟妇农村老妇女 | 国产9 9在线 | 中文 | 亚洲日本一区二区三区在线 | 国内综合精品午夜久久资源 | 国产超碰人人爽人人做人人添 | 一本精品99久久精品77 | 日本一卡二卡不卡视频查询 | 国产激情无码一区二区app | 色诱久久久久综合网ywww | 2020久久香蕉国产线看观看 | 国产做国产爱免费视频 | 亚洲欧洲中文日韩av乱码 | 久久人妻内射无码一区三区 | 国产乱码精品一品二品 | 精品偷拍一区二区三区在线看 | 一本久道久久综合婷婷五月 | 无码福利日韩神码福利片 | 久久这里只有精品视频9 | 人妻天天爽夜夜爽一区二区 | 国产福利视频一区二区 | 久久无码中文字幕免费影院蜜桃 | 丝袜足控一区二区三区 | 正在播放东北夫妻内射 | 国产成人无码a区在线观看视频app | 欧美阿v高清资源不卡在线播放 | 97精品国产97久久久久久免费 | 成年女人永久免费看片 | 中国女人内谢69xxxx | 无码人妻精品一区二区三区不卡 | 日韩精品无码一本二本三本色 | 西西人体www44rt大胆高清 | 国产成人无码av在线影院 | 成年美女黄网站色大免费全看 | 精品一区二区三区无码免费视频 | 欧美日韩亚洲国产精品 | 一本久久伊人热热精品中文字幕 | 最近的中文字幕在线看视频 | 国产精品毛多多水多 | 狠狠亚洲超碰狼人久久 | 大胆欧美熟妇xx | 久久久久se色偷偷亚洲精品av | 麻豆果冻传媒2021精品传媒一区下载 | aⅴ在线视频男人的天堂 | 久久久久久a亚洲欧洲av冫 | 中文字幕av无码一区二区三区电影 | 午夜男女很黄的视频 | 无码人妻出轨黑人中文字幕 | 搡女人真爽免费视频大全 | 人人妻人人澡人人爽欧美一区九九 | 国产精品无码一区二区桃花视频 | 国产色在线 | 国产 | 亚洲人成网站免费播放 | 中文字幕无码av波多野吉衣 | 精品国产麻豆免费人成网站 | 老司机亚洲精品影院 | 精品偷拍一区二区三区在线看 | 亚洲天堂2017无码中文 | 国产亚洲视频中文字幕97精品 | 大胆欧美熟妇xx | аⅴ资源天堂资源库在线 | 午夜熟女插插xx免费视频 | 日韩亚洲欧美中文高清在线 | 久久久久久久女国产乱让韩 | 内射爽无广熟女亚洲 | 婷婷丁香六月激情综合啪 | 蜜臀aⅴ国产精品久久久国产老师 | 丝袜美腿亚洲一区二区 | 青青久在线视频免费观看 | 夜夜高潮次次欢爽av女 | 无码av中文字幕免费放 | 亚洲精品综合五月久久小说 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲经典千人经典日产 | 少妇被黑人到高潮喷出白浆 | 亚洲s码欧洲m码国产av | 亚洲成a人片在线观看日本 | 色综合久久久无码网中文 | 欧美日韩在线亚洲综合国产人 | 国产suv精品一区二区五 | 国产香蕉尹人视频在线 | 国产绳艺sm调教室论坛 | 欧美激情综合亚洲一二区 | 国产精品久久久午夜夜伦鲁鲁 | 成人动漫在线观看 | 日本熟妇乱子伦xxxx | 日日摸天天摸爽爽狠狠97 | 欧美丰满熟妇xxxx | 综合人妻久久一区二区精品 | 精品少妇爆乳无码av无码专区 | av人摸人人人澡人人超碰下载 | 久久99精品久久久久久动态图 | 欧美黑人性暴力猛交喷水 | 欧美成人午夜精品久久久 | 亚洲成熟女人毛毛耸耸多 | 中文字幕无码人妻少妇免费 | 国产在线精品一区二区高清不卡 | 性欧美大战久久久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产真人无遮挡作爱免费视频 | 色情久久久av熟女人妻网站 | 国产一区二区三区日韩精品 | 国产福利视频一区二区 | 麻豆国产人妻欲求不满谁演的 | 性欧美大战久久久久久久 | 捆绑白丝粉色jk震动捧喷白浆 | 久久99精品久久久久久动态图 | 国产精品99爱免费视频 | 67194成是人免费无码 | 沈阳熟女露脸对白视频 | 欧美熟妇另类久久久久久不卡 | 国产精品第一区揄拍无码 | 日日天干夜夜狠狠爱 | 久久精品国产精品国产精品污 | 亚洲无人区午夜福利码高清完整版 | 熟妇人妻中文av无码 | 亚洲色欲久久久综合网东京热 | 久久99精品国产麻豆蜜芽 | 日韩精品一区二区av在线 | 亚洲欧洲日本综合aⅴ在线 | 免费无码的av片在线观看 | 麻豆蜜桃av蜜臀av色欲av | 国产激情艳情在线看视频 | 亚洲另类伦春色综合小说 | 精品国产一区二区三区av 性色 | 蜜桃av抽搐高潮一区二区 | 国产av一区二区三区最新精品 | 欧美人妻一区二区三区 | 日本xxxx色视频在线观看免费 | 水蜜桃色314在线观看 | 性色欲网站人妻丰满中文久久不卡 | 成人av无码一区二区三区 | 日本大乳高潮视频在线观看 | 天天拍夜夜添久久精品 | 亚洲国产成人a精品不卡在线 | 四虎影视成人永久免费观看视频 | 国产亚洲精品久久久久久国模美 | 真人与拘做受免费视频一 | 久久久久亚洲精品中文字幕 | 天天摸天天透天天添 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲欧美精品伊人久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日本免费一区二区三区最新 | 精品久久久久久亚洲精品 | 久久熟妇人妻午夜寂寞影院 | 国产后入清纯学生妹 | 色欲av亚洲一区无码少妇 | 99国产精品白浆在线观看免费 | 高潮毛片无遮挡高清免费 | 曰本女人与公拘交酡免费视频 | 男女猛烈xx00免费视频试看 | 国产凸凹视频一区二区 | 麻豆人妻少妇精品无码专区 | 精品国产一区二区三区av 性色 | 少妇激情av一区二区 | 无码中文字幕色专区 | 久久久精品456亚洲影院 | 色综合久久久无码网中文 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 精品人妻中文字幕有码在线 | 色一情一乱一伦 | 波多野结衣高清一区二区三区 | 99久久久国产精品无码免费 | 性欧美疯狂xxxxbbbb | 亚洲成av人片在线观看无码不卡 | 国产成人av免费观看 | 搡女人真爽免费视频大全 | 国产欧美精品一区二区三区 | 国产卡一卡二卡三 | 国产av剧情md精品麻豆 | 麻豆精品国产精华精华液好用吗 | 精品 日韩 国产 欧美 视频 | 99在线 | 亚洲 | 永久黄网站色视频免费直播 | 黑人粗大猛烈进出高潮视频 | 一本久道高清无码视频 | 中文无码精品a∨在线观看不卡 | 国产综合久久久久鬼色 | 51国偷自产一区二区三区 | 成人精品视频一区二区三区尤物 | 亚洲s码欧洲m码国产av | 欧美高清在线精品一区 | 天天摸天天透天天添 | 国产精品福利视频导航 | 欧美高清在线精品一区 | 亚洲日本在线电影 | 女人高潮内射99精品 | 国产成人综合在线女婷五月99播放 | 亚洲国产av精品一区二区蜜芽 | 精品一二三区久久aaa片 | 天天做天天爱天天爽综合网 | 日韩少妇白浆无码系列 | 国产美女极度色诱视频www | 国产内射爽爽大片视频社区在线 | 久久婷婷五月综合色国产香蕉 | 四虎影视成人永久免费观看视频 | 久久国产自偷自偷免费一区调 | 欧美色就是色 | 国产97色在线 | 免 | 国产香蕉尹人综合在线观看 | aⅴ在线视频男人的天堂 | 久久午夜无码鲁丝片午夜精品 | 日本va欧美va欧美va精品 | 日本丰满熟妇videos | 啦啦啦www在线观看免费视频 | 国产亚洲精品久久久久久久 | 久久天天躁狠狠躁夜夜免费观看 | 国产69精品久久久久app下载 | 亚洲色偷偷偷综合网 | 亚洲天堂2017无码 | 国产无遮挡又黄又爽免费视频 | 小鲜肉自慰网站xnxx | 亚洲欧洲无卡二区视頻 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲爆乳精品无码一区二区三区 | 在线看片无码永久免费视频 | 久久www免费人成人片 | 天天av天天av天天透 | 国产无av码在线观看 | 国产两女互慰高潮视频在线观看 | 国产精品无码一区二区三区不卡 | 亚洲日本va中文字幕 | 久久99精品久久久久久 | 国产精品鲁鲁鲁 | 色诱久久久久综合网ywww | 无遮无挡爽爽免费视频 | 国产一区二区三区四区五区加勒比 | 永久免费精品精品永久-夜色 | 爽爽影院免费观看 | 无遮挡国产高潮视频免费观看 | 日韩少妇白浆无码系列 | 亚洲精品久久久久avwww潮水 | 18禁黄网站男男禁片免费观看 | 99精品视频在线观看免费 | 无码人妻精品一区二区三区不卡 | 国产精华av午夜在线观看 | 最近免费中文字幕中文高清百度 | 中文字幕无码热在线视频 | 亚洲第一网站男人都懂 | 欧洲熟妇色 欧美 | 欧美日韩久久久精品a片 | 久久久中文久久久无码 | 全球成人中文在线 | 国产成人久久精品流白浆 | 精品国产福利一区二区 | av香港经典三级级 在线 | 免费中文字幕日韩欧美 | 久久久久成人片免费观看蜜芽 | 午夜成人1000部免费视频 | 欧洲熟妇色 欧美 | 亚洲性无码av中文字幕 | 国产热a欧美热a在线视频 | 欧美一区二区三区 | 国产真人无遮挡作爱免费视频 | 免费无码一区二区三区蜜桃大 | 亚洲 另类 在线 欧美 制服 | 伊人久久大香线焦av综合影院 | 人人妻人人藻人人爽欧美一区 | 天天做天天爱天天爽综合网 | 天天躁夜夜躁狠狠是什么心态 | 亚洲a无码综合a国产av中文 | 免费国产黄网站在线观看 | 又粗又大又硬毛片免费看 | 国产又爽又黄又刺激的视频 | 亚洲中文字幕在线观看 | 国产av无码专区亚洲awww | 帮老师解开蕾丝奶罩吸乳网站 | 日韩亚洲欧美精品综合 | 久久国内精品自在自线 | 久久亚洲日韩精品一区二区三区 | 日韩精品a片一区二区三区妖精 | 国产精品99爱免费视频 | 亚洲爆乳无码专区 | 欧美日韩在线亚洲综合国产人 | 夜精品a片一区二区三区无码白浆 | 成人亚洲精品久久久久软件 | 天天躁日日躁狠狠躁免费麻豆 | 久久无码人妻影院 | 噜噜噜亚洲色成人网站 | 欧美freesex黑人又粗又大 | 久久久精品456亚洲影院 | 久久www免费人成人片 | 极品尤物被啪到呻吟喷水 | 欧美激情综合亚洲一二区 | 激情五月综合色婷婷一区二区 | 国产一区二区三区日韩精品 | 麻豆国产97在线 | 欧洲 | 久久精品国产99久久6动漫 | 久久99精品久久久久久 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲爆乳无码专区 | 成人无码影片精品久久久 | 中文字幕av日韩精品一区二区 | 在线观看国产午夜福利片 | 亚洲 a v无 码免 费 成 人 a v | 亚洲精品午夜无码电影网 | 熟女少妇人妻中文字幕 | 爽爽影院免费观看 | 国产艳妇av在线观看果冻传媒 | 亚洲中文字幕va福利 | 午夜精品久久久久久久 | 亚洲小说图区综合在线 | 亚洲国产成人a精品不卡在线 | 欧美性生交活xxxxxdddd | 亚洲 a v无 码免 费 成 人 a v | 宝宝好涨水快流出来免费视频 | 欧美人与禽猛交狂配 | 极品尤物被啪到呻吟喷水 | 无码av最新清无码专区吞精 | 波多野结衣一区二区三区av免费 | 在线观看欧美一区二区三区 | 日本大乳高潮视频在线观看 | 精品无码av一区二区三区 | 国内老熟妇对白xxxxhd | 精品久久8x国产免费观看 | 精品无人区无码乱码毛片国产 | 国产 精品 自在自线 | 久久久久国色av免费观看性色 | 无人区乱码一区二区三区 | 日韩精品一区二区av在线 | 亚洲熟妇色xxxxx欧美老妇 | 男女性色大片免费网站 | 乱人伦中文视频在线观看 | 激情综合激情五月俺也去 | 国产精品内射视频免费 | 国产三级久久久精品麻豆三级 | 国产在热线精品视频 | 国产成人人人97超碰超爽8 | 综合激情五月综合激情五月激情1 | 一本久久a久久精品亚洲 | 日韩人妻系列无码专区 | 久久国产精品_国产精品 | 国产口爆吞精在线视频 | 久久99精品久久久久久 | 久久人妻内射无码一区三区 | 精品国产乱码久久久久乱码 | 丰满妇女强制高潮18xxxx | 日本熟妇大屁股人妻 | 蜜桃视频韩日免费播放 | 亚洲精品无码国产 | 国语精品一区二区三区 | 中国女人内谢69xxxxxa片 | 熟妇激情内射com | 麻豆果冻传媒2021精品传媒一区下载 | 青青青手机频在线观看 | 在线播放亚洲第一字幕 | 久久久中文久久久无码 | 少妇人妻偷人精品无码视频 | 草草网站影院白丝内射 | 国精产品一品二品国精品69xx | 一本久道高清无码视频 | 久久99国产综合精品 | 亚洲热妇无码av在线播放 | 中文字幕色婷婷在线视频 | 老太婆性杂交欧美肥老太 | 欧美性生交活xxxxxdddd | 国产另类ts人妖一区二区 | 久久无码中文字幕免费影院蜜桃 | 国产综合久久久久鬼色 | 免费观看黄网站 | 日本一区二区三区免费高清 | 成人aaa片一区国产精品 | 最近的中文字幕在线看视频 | 少妇被粗大的猛进出69影院 | 国产97人人超碰caoprom | 伊人久久大香线蕉亚洲 | 国产精品久久精品三级 | 无人区乱码一区二区三区 | 宝宝好涨水快流出来免费视频 | 国产乱码精品一品二品 | 美女张开腿让人桶 | 人人澡人人妻人人爽人人蜜桃 | 精品久久久久久人妻无码中文字幕 | 亚洲国产精品毛片av不卡在线 | 2019午夜福利不卡片在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 思思久久99热只有频精品66 | 国产精品.xx视频.xxtv | 小泽玛莉亚一区二区视频在线 | 俄罗斯老熟妇色xxxx | 亚洲乱亚洲乱妇50p | 牲欲强的熟妇农村老妇女视频 | 乱码av麻豆丝袜熟女系列 | 欧洲熟妇色 欧美 | 一本久道高清无码视频 | 欧美精品一区二区精品久久 | 天干天干啦夜天干天2017 | 性欧美大战久久久久久久 | 5858s亚洲色大成网站www | 国产麻豆精品一区二区三区v视界 | 国产精品鲁鲁鲁 | 日本大香伊一区二区三区 | 99国产精品白浆在线观看免费 | 99久久久国产精品无码免费 | 日本高清一区免费中文视频 | 久久久久se色偷偷亚洲精品av | 日本精品人妻无码免费大全 | 欧美日韩在线亚洲综合国产人 | 国产精品人人妻人人爽 | 天天摸天天碰天天添 | 中文字幕久久久久人妻 | 中文字幕人妻无码一区二区三区 | 久久精品中文闷骚内射 | 亚洲区欧美区综合区自拍区 | 欧美日韩一区二区三区自拍 | aa片在线观看视频在线播放 | 中文精品无码中文字幕无码专区 | 3d动漫精品啪啪一区二区中 | 人人妻人人澡人人爽欧美一区九九 | 亚洲人成网站在线播放942 | 久久精品国产亚洲精品 | 国产精品无码成人午夜电影 | 亚洲人成网站色7799 | 色综合久久久久综合一本到桃花网 | 日本饥渴人妻欲求不满 | 国产午夜福利100集发布 | 久久久久久国产精品无码下载 | 无码乱肉视频免费大全合集 | 久久www免费人成人片 | 中文毛片无遮挡高清免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品无人区无码乱码毛片国产 | аⅴ资源天堂资源库在线 | 国产人妻久久精品二区三区老狼 | 狠狠色欧美亚洲狠狠色www | 欧美野外疯狂做受xxxx高潮 | 人妻少妇精品无码专区二区 | 波多野结衣乳巨码无在线观看 | 人妻与老人中文字幕 | 欧美日韩一区二区三区自拍 | 国产亚洲精品久久久久久国模美 | 永久免费精品精品永久-夜色 | 欧美性猛交内射兽交老熟妇 | 成人女人看片免费视频放人 | 欧美成人免费全部网站 | 日本va欧美va欧美va精品 | 亚洲高清偷拍一区二区三区 | 在线а√天堂中文官网 | 日韩人妻少妇一区二区三区 | 丰满岳乱妇在线观看中字无码 | 成 人 网 站国产免费观看 | 无码人妻精品一区二区三区下载 | 水蜜桃亚洲一二三四在线 | 永久免费精品精品永久-夜色 | 亚洲日韩精品欧美一区二区 | 97夜夜澡人人爽人人喊中国片 | 成人一在线视频日韩国产 | 国产偷抇久久精品a片69 | 精品国产成人一区二区三区 | 国产亚洲精品久久久久久久 | 久久伊人色av天堂九九小黄鸭 | 十八禁视频网站在线观看 | 无码人妻丰满熟妇区五十路百度 | 午夜丰满少妇性开放视频 | 欧美阿v高清资源不卡在线播放 | 亚洲人成网站在线播放942 | 久久久久久国产精品无码下载 | 日日摸天天摸爽爽狠狠97 | 无码人妻精品一区二区三区不卡 | 最新国产麻豆aⅴ精品无码 | 免费国产黄网站在线观看 | 国产成人一区二区三区在线观看 | 成人无码精品一区二区三区 | 强奷人妻日本中文字幕 | 无码一区二区三区在线 | 天干天干啦夜天干天2017 | 小泽玛莉亚一区二区视频在线 | 久热国产vs视频在线观看 | 中国女人内谢69xxxxxa片 | 国产激情无码一区二区app | 精品久久久久久人妻无码中文字幕 | 免费视频欧美无人区码 | 亚洲s码欧洲m码国产av | 内射老妇bbwx0c0ck | 精品亚洲成av人在线观看 | 亚洲精品一区国产 | 国产三级精品三级男人的天堂 | 国产 浪潮av性色四虎 | 人妻插b视频一区二区三区 | 成年女人永久免费看片 | 成人一在线视频日韩国产 | 激情内射日本一区二区三区 | 亚洲天堂2017无码 | 日本爽爽爽爽爽爽在线观看免 | 性色欲情网站iwww九文堂 | 国产乱人伦偷精品视频 | 中文字幕无码人妻少妇免费 | 色婷婷综合激情综在线播放 | 日本一本二本三区免费 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲无人区一区二区三区 | 好屌草这里只有精品 | 国产一区二区三区四区五区加勒比 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 97无码免费人妻超级碰碰夜夜 | 国产精品美女久久久网av | 成人精品视频一区二区三区尤物 | 国产成人久久精品流白浆 | 亚洲中文字幕在线观看 | 亚洲精品国偷拍自产在线麻豆 | 国产精品.xx视频.xxtv | 中文字幕中文有码在线 | 国产sm调教视频在线观看 | 国产97色在线 | 免 | 扒开双腿疯狂进出爽爽爽视频 | 无码国产乱人伦偷精品视频 | 久久久精品国产sm最大网站 | 亚洲日韩av一区二区三区四区 | 天下第一社区视频www日本 | 少妇性荡欲午夜性开放视频剧场 | 亚洲无人区一区二区三区 | 久久99精品国产.久久久久 | 国产精品沙发午睡系列 | 中文字幕人妻无码一区二区三区 | 久激情内射婷内射蜜桃人妖 | 天下第一社区视频www日本 | 国产成人无码区免费内射一片色欲 | 国内少妇偷人精品视频 | 婷婷六月久久综合丁香 | 99久久人妻精品免费一区 | 免费国产黄网站在线观看 | 国产真实伦对白全集 | 一二三四在线观看免费视频 | 人妻与老人中文字幕 | 无码一区二区三区在线 | 好男人www社区 | 亚洲va中文字幕无码久久不卡 | 国产亚洲精品久久久ai换 | 女人被男人爽到呻吟的视频 | 久久久av男人的天堂 | 爆乳一区二区三区无码 | 波多野结衣 黑人 | 国产色在线 | 国产 | 少妇人妻偷人精品无码视频 | 99久久人妻精品免费二区 | 18精品久久久无码午夜福利 | 日本护士xxxxhd少妇 | 亚洲国产精品一区二区美利坚 | 成人亚洲精品久久久久软件 | 亚洲熟妇色xxxxx欧美老妇y | 精品乱子伦一区二区三区 | 精品欧洲av无码一区二区三区 | 国产在线aaa片一区二区99 | 欧美日韩综合一区二区三区 | 亚洲午夜久久久影院 | 国产艳妇av在线观看果冻传媒 | 日产精品高潮呻吟av久久 | 国产成人无码av片在线观看不卡 | 国产精品第一区揄拍无码 | 精品一区二区三区无码免费视频 | 天天摸天天碰天天添 | 性做久久久久久久免费看 | 青青久在线视频免费观看 | 欧美性猛交xxxx富婆 | 无遮无挡爽爽免费视频 | 亚洲熟悉妇女xxx妇女av | 精品午夜福利在线观看 | 国产精品久久久久久久影院 | 在线欧美精品一区二区三区 | 国产乱人偷精品人妻a片 | 激情国产av做激情国产爱 | 欧美精品无码一区二区三区 | 国产精品久久久av久久久 | 免费无码的av片在线观看 | 丰腴饱满的极品熟妇 | 日欧一片内射va在线影院 | 国产精品久久久久久久9999 | 国产成人无码a区在线观看视频app | 亚洲国产成人a精品不卡在线 | 亚洲a无码综合a国产av中文 | 国产乱人无码伦av在线a | 人妻aⅴ无码一区二区三区 | 红桃av一区二区三区在线无码av | 中文字幕av无码一区二区三区电影 | 狠狠躁日日躁夜夜躁2020 | 国产乡下妇女做爰 | 国产精品18久久久久久麻辣 | 国产精品无套呻吟在线 | 国产 精品 自在自线 | 精品久久久久香蕉网 | 欧美成人午夜精品久久久 | 亚洲成a人一区二区三区 | 伊人色综合久久天天小片 | 国产成人精品优优av | 中文字幕+乱码+中文字幕一区 | 久久久久成人精品免费播放动漫 | 免费无码一区二区三区蜜桃大 | 97精品国产97久久久久久免费 | 久久无码中文字幕免费影院蜜桃 | 国产精品沙发午睡系列 | 日日噜噜噜噜夜夜爽亚洲精品 | 粗大的内捧猛烈进出视频 | 无码福利日韩神码福利片 | 欧美激情内射喷水高潮 | 国产做国产爱免费视频 | 国产成人无码av片在线观看不卡 | 国产福利视频一区二区 | 国产极品视觉盛宴 | 中文字幕亚洲情99在线 | 国产精品免费大片 | 麻豆国产人妻欲求不满谁演的 | 97夜夜澡人人爽人人喊中国片 | 久久人人爽人人爽人人片ⅴ | 久久国语露脸国产精品电影 | 日本va欧美va欧美va精品 | 久久久久久久久蜜桃 | 波多野42部无码喷潮在线 | √天堂资源地址中文在线 | 久久久婷婷五月亚洲97号色 | 激情内射日本一区二区三区 | 少妇太爽了在线观看 | 少妇无码av无码专区在线观看 | 丰满诱人的人妻3 | 蜜桃视频插满18在线观看 | 无遮无挡爽爽免费视频 | 日本精品少妇一区二区三区 | 亚洲国产日韩a在线播放 | 午夜福利一区二区三区在线观看 | 欧美日韩一区二区综合 | 精品久久久无码中文字幕 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美三级不卡在线观看 | 97精品人妻一区二区三区香蕉 | 又紧又大又爽精品一区二区 | 日韩人妻无码一区二区三区久久99 | 国产精品久久久久久久影院 | 国产成人精品优优av | 成人欧美一区二区三区 | 日韩 欧美 动漫 国产 制服 | 日产国产精品亚洲系列 | 日日橹狠狠爱欧美视频 | 娇妻被黑人粗大高潮白浆 | 国产三级久久久精品麻豆三级 | 无码av岛国片在线播放 | 国产成人av免费观看 | 国产一区二区不卡老阿姨 | 亚洲人亚洲人成电影网站色 | 国产精品无码久久av | 久久国产36精品色熟妇 | 蜜桃视频韩日免费播放 | 无码任你躁久久久久久久 | 国产精品多人p群无码 | 女人被爽到呻吟gif动态图视看 | 成人影院yy111111在线观看 | 中文字幕乱码中文乱码51精品 | 76少妇精品导航 | 国产在线aaa片一区二区99 | 97无码免费人妻超级碰碰夜夜 | 国产精品无码久久av | 在线天堂新版最新版在线8 | 国产农村妇女高潮大叫 | 成人精品天堂一区二区三区 | 丰满少妇人妻久久久久久 | 欧洲极品少妇 | 欧美性生交xxxxx久久久 | 麻豆人妻少妇精品无码专区 | 亚洲va欧美va天堂v国产综合 | 国产激情艳情在线看视频 | 国产人妻久久精品二区三区老狼 | 国产内射老熟女aaaa | 亚洲男人av香蕉爽爽爽爽 | 国产情侣作爱视频免费观看 | 免费人成网站视频在线观看 | 精品久久综合1区2区3区激情 | 国内老熟妇对白xxxxhd | 一二三四在线观看免费视频 | 人妻尝试又大又粗久久 | 男人的天堂2018无码 | 99久久精品日本一区二区免费 | 精品人妻人人做人人爽 | 亚洲日韩一区二区三区 | 亚洲精品国产品国语在线观看 | 国内揄拍国内精品少妇国语 | av在线亚洲欧洲日产一区二区 | 精品欧美一区二区三区久久久 | 无码福利日韩神码福利片 | 在线观看免费人成视频 | 色五月丁香五月综合五月 | 精品人妻中文字幕有码在线 | 国产精品亚洲综合色区韩国 | 国产精品久久久久无码av色戒 | 亚洲中文字幕无码一久久区 | 日本一区二区三区免费高清 | 国产人妻精品午夜福利免费 | 亚洲精品久久久久avwww潮水 | 亚洲男女内射在线播放 | 色窝窝无码一区二区三区色欲 | 色诱久久久久综合网ywww | 九九热爱视频精品 | 夜先锋av资源网站 | 亚洲国产午夜精品理论片 | 国产一区二区三区四区五区加勒比 | aa片在线观看视频在线播放 | 国产香蕉97碰碰久久人人 | 2020久久香蕉国产线看观看 | 亚洲日本一区二区三区在线 | 成人免费视频一区二区 | 亚洲成av人综合在线观看 | 日本熟妇人妻xxxxx人hd | 无码人妻av免费一区二区三区 | 亚洲一区av无码专区在线观看 | 黑人大群体交免费视频 | 一本色道婷婷久久欧美 | 亚洲人亚洲人成电影网站色 | 亚洲中文字幕无码中字 | 国产成人精品无码播放 | 国产成人无码一二三区视频 | 亚洲国产一区二区三区在线观看 | 风流少妇按摩来高潮 | 亚洲日韩av片在线观看 | 日本大香伊一区二区三区 | 日本精品人妻无码免费大全 | 国产高清av在线播放 | 波多野结衣一区二区三区av免费 | 欧美三级a做爰在线观看 | 牲欲强的熟妇农村老妇女 | 亚洲人成影院在线观看 | 18无码粉嫩小泬无套在线观看 | 国产人妻人伦精品1国产丝袜 | 男女性色大片免费网站 | 欧美老人巨大xxxx做受 | 内射后入在线观看一区 | 婷婷丁香六月激情综合啪 | 无码av最新清无码专区吞精 | 香蕉久久久久久av成人 | 51国偷自产一区二区三区 | 高清国产亚洲精品自在久久 | 亚洲国产午夜精品理论片 | 欧美大屁股xxxxhd黑色 | 国产精品.xx视频.xxtv | 亚洲欧美日韩成人高清在线一区 | 中文字幕无码av激情不卡 | 九一九色国产 | 中文字幕 亚洲精品 第1页 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美放荡的少妇 | 久久久久99精品成人片 | 成人试看120秒体验区 | 99riav国产精品视频 | 亚洲欧美日韩国产精品一区二区 | 高潮喷水的毛片 | 日韩精品a片一区二区三区妖精 | 欧美成人家庭影院 | 国产成人午夜福利在线播放 | 日本精品少妇一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 乱人伦人妻中文字幕无码久久网 | 久久精品人人做人人综合试看 | 色老头在线一区二区三区 | 国模大胆一区二区三区 | 在线亚洲高清揄拍自拍一品区 | 国产午夜亚洲精品不卡下载 | 亚洲毛片av日韩av无码 | 日韩av无码一区二区三区不卡 | 日本va欧美va欧美va精品 | 少女韩国电视剧在线观看完整 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产精品美女久久久 | 国产97人人超碰caoprom | 亚洲人成无码网www | 婷婷五月综合缴情在线视频 | 国产亲子乱弄免费视频 | 在线视频网站www色 | 亚洲爆乳大丰满无码专区 | 俄罗斯老熟妇色xxxx | 久久久精品456亚洲影院 | 狠狠色丁香久久婷婷综合五月 | 99久久久国产精品无码免费 | 人妻人人添人妻人人爱 | 日韩精品无码一区二区中文字幕 | 欧洲极品少妇 | 亚洲va欧美va天堂v国产综合 | 成在人线av无码免费 | 国产激情综合五月久久 | 无码帝国www无码专区色综合 | 国产精品无码mv在线观看 | 欧美午夜特黄aaaaaa片 | 99国产欧美久久久精品 | 性色欲情网站iwww九文堂 | 最新国产麻豆aⅴ精品无码 | а√资源新版在线天堂 | 亚洲欧美中文字幕5发布 | 欧美三级不卡在线观看 | 在线成人www免费观看视频 | 亚洲国产精品成人久久蜜臀 | 国内精品久久久久久中文字幕 | 日韩精品无码一本二本三本色 | 久久99精品国产麻豆蜜芽 | 欧美日韩视频无码一区二区三 | 亚洲一区二区观看播放 | 老熟妇乱子伦牲交视频 | 人妻人人添人妻人人爱 | 成人无码精品1区2区3区免费看 | 国产亚av手机在线观看 | 精品国产一区av天美传媒 | 色一情一乱一伦一视频免费看 | 麻豆国产97在线 | 欧洲 | 玩弄少妇高潮ⅹxxxyw | 亚洲精品欧美二区三区中文字幕 | 久久亚洲日韩精品一区二区三区 | 99riav国产精品视频 | 久久无码中文字幕免费影院蜜桃 | 国产特级毛片aaaaaaa高清 | 18黄暴禁片在线观看 | 午夜福利不卡在线视频 | 麻豆果冻传媒2021精品传媒一区下载 | 狂野欧美激情性xxxx | 成熟女人特级毛片www免费 | 99久久久无码国产精品免费 | 天天av天天av天天透 | 国产成人精品久久亚洲高清不卡 | 久热国产vs视频在线观看 | 四虎影视成人永久免费观看视频 | 日本一区二区更新不卡 | 国内精品九九久久久精品 | 88国产精品欧美一区二区三区 | 亚洲午夜福利在线观看 | 少妇激情av一区二区 | 久久久精品人妻久久影视 | 一区二区三区高清视频一 | 内射老妇bbwx0c0ck | 麻豆av传媒蜜桃天美传媒 | 无码人中文字幕 | 97精品国产97久久久久久免费 | 国产欧美熟妇另类久久久 | 国产在线精品一区二区三区直播 | 国产真人无遮挡作爱免费视频 | 久久久国产精品无码免费专区 | 亚洲精品综合一区二区三区在线 | 四虎4hu永久免费 | 亚洲爆乳无码专区 | 亚洲а∨天堂久久精品2021 | 中文字幕乱码中文乱码51精品 | 欧美国产日韩亚洲中文 | 国产精品自产拍在线观看 | 中文字幕乱码中文乱码51精品 | 一本色道久久综合亚洲精品不卡 | 国产av一区二区三区最新精品 | 熟妇人妻中文av无码 | 好男人www社区 | 成人无码精品1区2区3区免费看 | 免费人成在线观看网站 | 无套内射视频囯产 | 欧美人与善在线com | 成人欧美一区二区三区黑人免费 | 国产超碰人人爽人人做人人添 | 欧美大屁股xxxxhd黑色 | 强开小婷嫩苞又嫩又紧视频 | 中文字幕无码乱人伦 | 欧美放荡的少妇 | 国产精品成人av在线观看 | 激情亚洲一区国产精品 | 亚洲成色www久久网站 | 久久久www成人免费毛片 | 亚洲一区二区三区在线观看网站 | 激情爆乳一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 欧美 亚洲 国产 另类 | 亚洲 高清 成人 动漫 | 377p欧洲日本亚洲大胆 | 国产精品亚洲专区无码不卡 | 大屁股大乳丰满人妻 | 成人无码精品1区2区3区免费看 | 野外少妇愉情中文字幕 | 国产精品久久国产精品99 | 亚洲综合另类小说色区 | 99久久精品日本一区二区免费 | 欧美高清在线精品一区 | 人人妻人人澡人人爽精品欧美 | 国产精品毛片一区二区 | 鲁大师影院在线观看 | 日韩人妻无码一区二区三区久久99 | 久久zyz资源站无码中文动漫 | 美女张开腿让人桶 | 中文久久乱码一区二区 | 真人与拘做受免费视频一 | 88国产精品欧美一区二区三区 | 好屌草这里只有精品 | 国产精品高潮呻吟av久久 | 人妻插b视频一区二区三区 | 欧美人与善在线com | 无套内谢的新婚少妇国语播放 | 欧美亚洲国产一区二区三区 | 国产在线一区二区三区四区五区 | 成 人 网 站国产免费观看 | 天下第一社区视频www日本 | 国产又粗又硬又大爽黄老大爷视 | 无码国产乱人伦偷精品视频 | 亚洲成在人网站无码天堂 | 国产又粗又硬又大爽黄老大爷视 | 欧美日韩久久久精品a片 | 成人精品一区二区三区中文字幕 | 好爽又高潮了毛片免费下载 | 久久97精品久久久久久久不卡 | 久久精品中文字幕一区 | 性欧美熟妇videofreesex | 一区二区三区高清视频一 | 蜜桃无码一区二区三区 | аⅴ资源天堂资源库在线 | 人人爽人人爽人人片av亚洲 | 97无码免费人妻超级碰碰夜夜 | 亚洲欧美国产精品专区久久 | 亚洲s码欧洲m码国产av | 国产午夜手机精彩视频 | 免费人成在线观看网站 | 国产成人av免费观看 | 日韩人妻少妇一区二区三区 | 亚洲国产一区二区三区在线观看 | 在线播放亚洲第一字幕 | 日本一区二区三区免费播放 | 亚洲国产精品久久人人爱 | 少妇性l交大片欧洲热妇乱xxx | 亚洲天堂2017无码中文 | 美女扒开屁股让男人桶 | 夜先锋av资源网站 | 久久久av男人的天堂 | 日韩人妻无码中文字幕视频 | 国产精品香蕉在线观看 | 无码国产乱人伦偷精品视频 | 性生交大片免费看女人按摩摩 | 日韩成人一区二区三区在线观看 | 国产亚洲美女精品久久久2020 | 久久亚洲精品成人无码 | 亚洲精品成人av在线 | 97久久国产亚洲精品超碰热 | 精品无人区无码乱码毛片国产 | 奇米影视7777久久精品人人爽 | 精品久久久久久亚洲精品 | 成人亚洲精品久久久久 | 国内丰满熟女出轨videos | 成人动漫在线观看 | 日韩av无码一区二区三区 | 黑人巨大精品欧美黑寡妇 | 色婷婷久久一区二区三区麻豆 | 麻豆国产人妻欲求不满谁演的 | 国产精品对白交换视频 | 国产电影无码午夜在线播放 | 亚洲自偷自偷在线制服 | 国产精品永久免费视频 | 人人妻人人澡人人爽欧美一区 | 少妇被粗大的猛进出69影院 | 国产办公室秘书无码精品99 | 成人无码视频在线观看网站 | 欧美性黑人极品hd | 少妇无码av无码专区在线观看 | 丰满少妇熟乱xxxxx视频 | 男人和女人高潮免费网站 | 久久国产精品_国产精品 | 精品欧洲av无码一区二区三区 | 中文无码精品a∨在线观看不卡 | 内射巨臀欧美在线视频 | 波多野结衣高清一区二区三区 | 欧美老人巨大xxxx做受 | 国产sm调教视频在线观看 | 女人被男人爽到呻吟的视频 | 又粗又大又硬又长又爽 | 日日摸夜夜摸狠狠摸婷婷 | 成人免费无码大片a毛片 | 色欲综合久久中文字幕网 | 狠狠躁日日躁夜夜躁2020 | 亚洲国产av美女网站 | 九九综合va免费看 | 欧美阿v高清资源不卡在线播放 | 日韩精品a片一区二区三区妖精 | 久久久久久久人妻无码中文字幕爆 | 香港三级日本三级妇三级 | 色五月五月丁香亚洲综合网 | 天天爽夜夜爽夜夜爽 | 亚洲七七久久桃花影院 | 99精品国产综合久久久久五月天 | 呦交小u女精品视频 | 欧美野外疯狂做受xxxx高潮 | 欧美肥老太牲交大战 | 欧美成人免费全部网站 | 成人亚洲精品久久久久软件 | 无码中文字幕色专区 | 色婷婷久久一区二区三区麻豆 | 亚洲毛片av日韩av无码 | 奇米影视888欧美在线观看 | 久久精品人妻少妇一区二区三区 | 午夜精品一区二区三区在线观看 | 爽爽影院免费观看 | 国产色视频一区二区三区 | 久在线观看福利视频 | 婷婷色婷婷开心五月四房播播 | 成人性做爰aaa片免费看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 熟女少妇人妻中文字幕 | 国产熟女一区二区三区四区五区 | 成熟人妻av无码专区 | 国语自产偷拍精品视频偷 | 国产亚洲欧美日韩亚洲中文色 | 最新国产乱人伦偷精品免费网站 | 51国偷自产一区二区三区 | 久久人人爽人人爽人人片av高清 | 成年美女黄网站色大免费全看 | 亚洲日韩精品欧美一区二区 | 免费播放一区二区三区 | 妺妺窝人体色www在线小说 | 国产色xx群视频射精 | 精品熟女少妇av免费观看 | 精品一区二区不卡无码av | 婷婷五月综合激情中文字幕 | 青青青手机频在线观看 | 亚洲中文字幕av在天堂 | 又粗又大又硬又长又爽 | 精品成在人线av无码免费看 | 成年美女黄网站色大免费全看 | 亚洲精品美女久久久久久久 | 国内精品一区二区三区不卡 | 98国产精品综合一区二区三区 | 久久综合久久自在自线精品自 | 狠狠综合久久久久综合网 | 亚洲人成网站免费播放 | 国产一区二区三区四区五区加勒比 | 高潮喷水的毛片 | 色欲av亚洲一区无码少妇 | 97人妻精品一区二区三区 | 日韩av无码一区二区三区 | 久久国语露脸国产精品电影 | 日本护士xxxxhd少妇 | 激情爆乳一区二区三区 | 一本久道久久综合狠狠爱 | 18精品久久久无码午夜福利 | 亚洲性无码av中文字幕 | 小sao货水好多真紧h无码视频 | 欧美黑人性暴力猛交喷水 | 18黄暴禁片在线观看 | 撕开奶罩揉吮奶头视频 |