亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cgic.c

?? 使用cgi實現文件的上傳
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* cgicTempDir is the only setting you are likely to need	to change in this file. *//* Used only in Unix environments, in conjunction with mkstemp(). 	Elsewhere (Windows), temporary files go where the tmpnam() 	function suggests. If this behavior does not work for you, 	modify the getTempFileName() function to suit your needs. */#define cgicTempDir "/tmp"#if CGICDEBUG#define CGICDEBUGSTART \	{ \		FILE *dout; \		dout = fopen("/home/boutell/public_html/debug", "a"); \	#define CGICDEBUGEND \		fclose(dout); \	}#else /* CGICDEBUG */#define CGICDEBUGSTART#define CGICDEBUGEND#endif /* CGICDEBUG */#include <stdio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>#ifdef WIN32#include <io.h>/* cgic 2.01 */#include <fcntl.h>#else#include <unistd.h>#endif /* WIN32 */#include "cgic.h"#define cgiStrEq(a, b) (!strcmp((a), (b)))char *cgiServerSoftware;char *cgiServerName;char *cgiGatewayInterface;char *cgiServerProtocol;char *cgiServerPort;char *cgiRequestMethod;char *cgiPathInfo;char *cgiPathTranslated;char *cgiScriptName;char *cgiQueryString;char *cgiRemoteHost;char *cgiRemoteAddr;char *cgiAuthType;char *cgiRemoteUser;char *cgiRemoteIdent;char cgiContentTypeData[1024];char *cgiContentType = cgiContentTypeData;char *cgiMultipartBoundary;char *cgiCookie;int cgiContentLength;char *cgiAccept;char *cgiUserAgent;char *cgiReferrer;FILE *cgiIn;FILE *cgiOut;/* True if CGI environment was restored from a file. */static int cgiRestored = 0;static void cgiGetenv(char **s, char *var);typedef enum {	cgiParseSuccess,	cgiParseMemory,	cgiParseIO} cgiParseResultType;/* One form entry, consisting of an attribute-value pair,	and an optional filename and content type. All of	these are guaranteed to be valid null-terminated strings,	which will be of length zero in the event that the	field is not present, with the exception of tfileName	which will be null when 'in' is null. DO NOT MODIFY THESE 	VALUES. Make local copies if modifications are desired. */typedef struct cgiFormEntryStruct {        char *attr;	/* value is populated for regular form fields only.		For file uploads, it points to an empty string, and file		upload data should be read from the file tfileName. */ 	char *value;	/* When fileName is not an empty string, tfileName is not null,		and 'value' points to an empty string. */	/* Valid for both files and regular fields; does not include		terminating null of regular fields. */	int valueLength;	char *fileName;		char *contentType;	/* Temporary file name for working storage of file uploads. */	char *tfileName;        struct cgiFormEntryStruct *next;} cgiFormEntry;/* The first form entry. */static cgiFormEntry *cgiFormEntryFirst;static cgiParseResultType cgiParseGetFormInput();static cgiParseResultType cgiParsePostFormInput();static cgiParseResultType cgiParsePostMultipartInput();static cgiParseResultType cgiParseFormInput(char *data, int length);static void cgiSetupConstants();static void cgiFreeResources();static int cgiStrEqNc(char *s1, char *s2);static int cgiStrBeginsNc(char *s1, char *s2);int main(int argc, char *argv[]) {	int result;	char *cgiContentLengthString;	char *e;	cgiSetupConstants();	cgiGetenv(&cgiServerSoftware, "SERVER_SOFTWARE");	cgiGetenv(&cgiServerName, "SERVER_NAME");	cgiGetenv(&cgiGatewayInterface, "GATEWAY_INTERFACE");	cgiGetenv(&cgiServerProtocol, "SERVER_PROTOCOL");	cgiGetenv(&cgiServerPort, "SERVER_PORT");	cgiGetenv(&cgiRequestMethod, "REQUEST_METHOD");	cgiGetenv(&cgiPathInfo, "PATH_INFO");	cgiGetenv(&cgiPathTranslated, "PATH_TRANSLATED");	cgiGetenv(&cgiScriptName, "SCRIPT_NAME");	cgiGetenv(&cgiQueryString, "QUERY_STRING");	cgiGetenv(&cgiRemoteHost, "REMOTE_HOST");	cgiGetenv(&cgiRemoteAddr, "REMOTE_ADDR");	cgiGetenv(&cgiAuthType, "AUTH_TYPE");	cgiGetenv(&cgiRemoteUser, "REMOTE_USER");	cgiGetenv(&cgiRemoteIdent, "REMOTE_IDENT");	/* 2.0: the content type string needs to be parsed and modified, so		copy it to a buffer. */	e = getenv("CONTENT_TYPE");	if (e) {		if (strlen(e) < sizeof(cgiContentTypeData)) {			strcpy(cgiContentType, e);		} else {			/* Truncate safely in the event of what is almost certainly				a hack attempt */			strncpy(cgiContentType, e, sizeof(cgiContentTypeData));			cgiContentType[sizeof(cgiContentTypeData) - 1] = '\0';		}	} else {		cgiContentType[0] = '\0';	}	/* Never null */	cgiMultipartBoundary = "";	/* 2.0: parse semicolon-separated additional parameters of the		content type. The one we're interested in is 'boundary'.		We discard the rest to make cgiContentType more useful		to the typical programmer. */	if (strchr(cgiContentType, ';')) {		char *sat = strchr(cgiContentType, ';');		while (sat) {			*sat = '\0';			sat++;			while (isspace(*sat)) {				sat++;			}				if (cgiStrBeginsNc(sat, "boundary=")) {				char *s;				cgiMultipartBoundary = sat + strlen("boundary=");				s = cgiMultipartBoundary;				while ((*s) && (!isspace(*s))) {					s++;				}				*s = '\0';				break;			} else {				sat = strchr(sat, ';');			} 			}	}	cgiGetenv(&cgiContentLengthString, "CONTENT_LENGTH");	cgiContentLength = atoi(cgiContentLengthString);		cgiGetenv(&cgiAccept, "HTTP_ACCEPT");	cgiGetenv(&cgiUserAgent, "HTTP_USER_AGENT");	cgiGetenv(&cgiReferrer, "HTTP_REFERER");	cgiGetenv(&cgiCookie, "HTTP_COOKIE");#ifdef CGICDEBUG	CGICDEBUGSTART	fprintf(dout, "%d\n", cgiContentLength);	fprintf(dout, "%s\n", cgiRequestMethod);	fprintf(dout, "%s\n", cgiContentType);	CGICDEBUGEND	#endif /* CGICDEBUG */#ifdef WIN32	/* 1.07: Must set stdin and stdout to binary mode */	/* 2.0: this is particularly crucial now and must not be removed */	_setmode( _fileno( stdin ), _O_BINARY );	_setmode( _fileno( stdout ), _O_BINARY );#endif /* WIN32 */	cgiFormEntryFirst = 0;	cgiIn = stdin;	cgiOut = stdout;	cgiRestored = 0;	/* These five lines keep compilers from		producing warnings that argc and argv		are unused. They have no actual function. */	if (argc) {		if (argv[0]) {			cgiRestored = 0;		}	}		if (cgiStrEqNc(cgiRequestMethod, "post")) {#ifdef CGICDEBUG		CGICDEBUGSTART		fprintf(dout, "POST recognized\n");		CGICDEBUGEND#endif /* CGICDEBUG */		if (cgiStrEqNc(cgiContentType, "application/x-www-form-urlencoded")) {	#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "Calling PostFormInput\n");			CGICDEBUGEND	#endif /* CGICDEBUG */			if (cgiParsePostFormInput() != cgiParseSuccess) {#ifdef CGICDEBUG				CGICDEBUGSTART				fprintf(dout, "PostFormInput failed\n");				CGICDEBUGEND	#endif /* CGICDEBUG */				cgiFreeResources();				return -1;			}	#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "PostFormInput succeeded\n");			CGICDEBUGEND	#endif /* CGICDEBUG */		} else if (cgiStrEqNc(cgiContentType, "multipart/form-data")) {#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "Calling PostMultipartInput\n");			CGICDEBUGEND	#endif /* CGICDEBUG */			if (cgiParsePostMultipartInput() != cgiParseSuccess) {#ifdef CGICDEBUG				CGICDEBUGSTART				fprintf(dout, "PostMultipartInput failed\n");				CGICDEBUGEND	#endif /* CGICDEBUG */				cgiFreeResources();				return -1;			}	#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "PostMultipartInput succeeded\n");			CGICDEBUGEND	#endif /* CGICDEBUG */		}	} else if (cgiStrEqNc(cgiRequestMethod, "get")) {			/* The spec says this should be taken care of by			the server, but... it isn't */		cgiContentLength = strlen(cgiQueryString);		if (cgiParseGetFormInput() != cgiParseSuccess) {#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "GetFormInput failed\n");			CGICDEBUGEND	#endif /* CGICDEBUG */			cgiFreeResources();			return -1;		} else {	#ifdef CGICDEBUG			CGICDEBUGSTART			fprintf(dout, "GetFormInput succeeded\n");			CGICDEBUGEND	#endif /* CGICDEBUG */		}	}	result = cgiMain();	cgiFreeResources();	return result;}static void cgiGetenv(char **s, char *var){	*s = getenv(var);	if (!(*s)) {		*s = "";	}}static cgiParseResultType cgiParsePostFormInput() {	char *input;	cgiParseResultType result;	if (!cgiContentLength) {		return cgiParseSuccess;	}	input = (char *) malloc(cgiContentLength);	if (!input) {		return cgiParseMemory;		}	if (((int) fread(input, 1, cgiContentLength, cgiIn)) 		!= cgiContentLength) 	{		return cgiParseIO;	}		result = cgiParseFormInput(input, cgiContentLength);	free(input);	return result;}/* 2.0: A virtual datastream supporting putback of 	enough characters to handle multipart boundaries easily.	A simple memset(&mp, 0, sizeof(mp)) is suitable initialization. */typedef struct {	/* Buffer for putting characters back */	char putback[1024];		/* Position in putback from which next character will be read.		If readPos == writePos, then next character should		come from cgiIn. */	int readPos;	/* Position in putback to which next character will be put back.		If writePos catches up to readPos, as opposed to the other		way around, the stream no longer functions properly.		Calling code must guarantee that no more than 		sizeof(putback) bytes are put back at any given time. */	int writePos;	/* Offset in the virtual datastream; can be compared		to cgiContentLength */	int offset;} mpStream, *mpStreamPtr;int mpRead(mpStreamPtr mpp, char *buffer, int len){	int ilen = len;	int got = 0;	while (len) {		if (mpp->readPos != mpp->writePos) {			*buffer++ = mpp->putback[mpp->readPos++];			mpp->readPos %= sizeof(mpp->putback);			got++;			len--;		} else {			break;		}		}	/* Refuse to read past the declared length in order to		avoid deadlock */	if (len > (cgiContentLength - mpp->offset)) {		len = cgiContentLength - mpp->offset;	}	if (len) {		int fgot = fread(buffer, 1, len, cgiIn);		if (fgot >= 0) {			mpp->offset += (got + fgot);			return got + fgot;		} else if (got > 0) {			mpp->offset += got;			return got;		} else {			/* EOF or error */			return fgot;		}	} else if (got) {		return got;	} else if (ilen) {			return EOF;	} else {		/* 2.01 */		return 0;	}}void mpPutBack(mpStreamPtr mpp, char *data, int len){	mpp->offset -= len;	while (len) {		mpp->putback[mpp->writePos++] = *data++;		mpp->writePos %= sizeof(mpp->putback);		len--;	}}/* This function copies the body to outf if it is not null, otherwise to	a newly allocated character buffer at *outP, which will be null	terminated; if both outf and outP are null the body is not stored.	If bodyLengthP is not null, the size of the body in bytes is stored	to *bodyLengthP, not including any terminating null added to *outP. 	If 'first' is nonzero, a preceding newline is not expected before	the boundary. If 'first' is zero, a preceding newline is expected.	Upon return mpp is positioned after the boundary and its trailing 	newline, if any; if the boundary is followed by -- the next two 	characters read after this function returns will be --. Upon error, 	if outP is not null, *outP is a null pointer; *bodyLengthP 	is set to zero. Returns cgiParseSuccess, cgiParseMemory 	or cgiParseIO. */static cgiParseResultType afterNextBoundary(mpStreamPtr mpp,	FILE *outf,	char **outP,	int *bodyLengthP,	int first	);static int readHeaderLine(	mpStreamPtr mpp,		char *attr,	int attrSpace,	char *value,	int valueSpace);static void decomposeValue(char *value,	char *mvalue, int mvalueSpace,	char **argNames,	char **argValues,	int argValueSpace);/* tfileName must be 1024 bytes to ensure adequacy on	win32 (1024 exceeds the maximum path length and	certainly exceeds observed behavior of _tmpnam).	May as well also be 1024 bytes on Unix, although actual	length is strlen(cgiTempDir) + a short unique pattern. */	static cgiParseResultType getTempFileName(char *tfileName);static cgiParseResultType cgiParsePostMultipartInput() {	cgiParseResultType result;	cgiFormEntry *n = 0, *l = 0;	int got;	FILE *outf = 0;	char *out = 0;	char tfileName[1024];	mpStream mp;	mpStreamPtr mpp = &mp;	memset(&mp, 0, sizeof(mp));	if (!cgiContentLength) {		return cgiParseSuccess;	}	/* Read first boundary, including trailing newline */	result = afterNextBoundary(mpp, 0, 0, 0, 1);	if (result == cgiParseIO) {			/* An empty submission is not necessarily an error */		return cgiParseSuccess;	} else if (result != cgiParseSuccess) {		return result;	}	while (1) {		char d[1024];		char fvalue[1024];		char fname[1024];		int bodyLength = 0;		char ffileName[1024];		char fcontentType[1024];		char attr[1024];		char value[1024];		fvalue[0] = 0;		fname[0] = 0;		ffileName[0] = 0;		fcontentType[0] = 0;		out = 0;		outf = 0;		/* Check for EOF */		got = mpRead(mpp, d, 2);		if (got < 2) {			/* Crude EOF */			break;		}		if ((d[0] == '-') && (d[1] == '-')) {			/* Graceful EOF */			break;		}		mpPutBack(mpp, d, 2);		/* Read header lines until end of header */		while (readHeaderLine(				mpp, attr, sizeof(attr), value, sizeof(value))) 		{			char *argNames[3];			char *argValues[2];			/* Content-Disposition: form-data; 				name="test"; filename="googley.gif" */			if (cgiStrEqNc(attr, "Content-Disposition")) {				argNames[0] = "name";				argNames[1] = "filename";				argNames[2] = 0;				argValues[0] = fname;				argValues[1] = ffileName;				decomposeValue(value, 					fvalue, sizeof(fvalue),					argNames,					argValues,					1024);				} else if (cgiStrEqNc(attr, "Content-Type")) {				argNames[0] = 0;				decomposeValue(value, 					fcontentType, sizeof(fcontentType),					argNames,					0,					0);			}		}		if (!cgiStrEqNc(fvalue, "form-data")) {			/* Not form data */				continue;		}		/* Body is everything from here until the next 			boundary. So, set it aside and move past boundary. 			If a filename was submitted as part of the			disposition header, store to a temporary file.			Otherwise, store to a memory buffer (it is			presumably a regular form field). */		if (strlen(ffileName)) {			if (getTempFileName(tfileName) != cgiParseSuccess) {				return cgiParseIO;			}				outf = fopen(tfileName, "w+b");		} else {			outf = 0;			tfileName[0] = '\0';		}			result = afterNextBoundary(mpp, outf, &out, &bodyLength, 0);		if (result != cgiParseSuccess) {			/* Lack of a boundary here is an error. */			if (outf) {				fclose(outf);				unlink(tfileName);			}			if (out) {				free(out);			}			return result;		}		/* OK, we have a new pair, add it to the list. */		n = (cgiFormEntry *) malloc(sizeof(cgiFormEntry));			if (!n) {			goto outOfMemory;		}		memset(n, 0, sizeof(cgiFormEntry));		/* 2.01: one of numerous new casts required			to please C++ compilers */		n->attr = (char *) malloc(strlen(fname) + 1);		if (!n->attr) {			goto outOfMemory;		}		strcpy(n->attr, fname);		if (out) {			n->value = out;			out = 0;		} else if (outf) {			n->value = (char *) malloc(1);			if (!n->value) {				goto outOfMemory;			}			n->value[0] = '\0';			fclose(outf);		}		n->valueLength = bodyLength;		n->next = 0;		if (!l) {			cgiFormEntryFirst = n;		} else {			l->next = n;		}		n->fileName = (char *) malloc(strlen(ffileName) + 1);		if (!n->fileName) {			goto outOfMemory;		}		strcpy(n->fileName, ffileName);		n->contentType = (char *) malloc(strlen(fcontentType) + 1);		if (!n->contentType) {			goto outOfMemory;		}		strcpy(n->contentType, fcontentType);		n->tfileName = (char *) malloc(strlen(tfileName) + 1);		if (!n->tfileName) {			goto outOfMemory;		}		strcpy(n->tfileName, tfileName);		l = n;				}		return cgiParseSuccess;outOfMemory:	if (n) {		if (n->attr) {			free(n->attr);		}		if (n->value) {			free(n->value);		}		if (n->fileName) {			free(n->fileName);		}		if (n->tfileName) {			free(n->tfileName);		}		if (n->contentType) {			free(n->contentType);		}		free(n);	}	if (out) {		free(out);	}	if (outf) {		fclose(outf);		unlink(tfileName);	}	return cgiParseMemory;}static cgiParseResultType getTempFileName(char *tfileName){#ifndef WIN32	/* Unix. Use the robust 'mkstemp' function to create		a temporary file that is truly unique, with		permissions that are truly safe. The 		fopen-for-write destroys any bogus information		written by potential hackers during the brief		window between the file's creation and the		chmod call (glibc 2.0.6 and lower might		otherwise have allowed this). */	int outfd; 	strcpy(tfileName, cgicTempDir "/cgicXXXXXX");	outfd = mkstemp(tfileName);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产99国产精品| 亚洲天堂成人网| 久久精品亚洲国产奇米99| 亚洲欧美偷拍三级| 26uuu亚洲婷婷狠狠天堂| 17c精品麻豆一区二区免费| 国产精品久久久久一区| 日本不卡123| 91国产免费观看| 久久久av毛片精品| 蜜桃在线一区二区三区| 欧美影院一区二区三区| 亚洲日本欧美天堂| 成人在线视频一区二区| 日韩欧美123| 日本伊人色综合网| 欧美偷拍一区二区| 亚洲欧美在线视频观看| 国产精品中文字幕欧美| 精品国内片67194| 蜜臀av性久久久久蜜臀av麻豆| 欧美羞羞免费网站| 亚洲亚洲人成综合网络| 97国产精品videossex| 国产精品久久午夜夜伦鲁鲁| 国产一区二区在线影院| 精品少妇一区二区三区免费观看| 亚洲1区2区3区视频| 欧美日韩一区中文字幕| 亚洲夂夂婷婷色拍ww47 | 久久电影网站中文字幕| 在线播放中文字幕一区| 午夜激情综合网| 欧美日韩成人在线| 日韩综合小视频| 欧美一区二区三区系列电影| 亚洲成年人网站在线观看| 欧美日韩成人综合天天影院| 午夜久久久久久| 91精品国产综合久久蜜臀| 亚洲成人免费在线观看| 91.com在线观看| 美女国产一区二区三区| 久久久久九九视频| 不卡视频一二三| 亚洲一区二区三区美女| 欧美精品久久一区| 精品亚洲成a人| 欧美激情综合五月色丁香小说| 国产一区二区毛片| 国产精品的网站| 91黄色激情网站| 日产国产欧美视频一区精品| 日韩精品一区二区三区视频在线观看 | 久久一区二区视频| 国产成人精品www牛牛影视| 国产精品乱码一区二区三区软件| 成人激情免费电影网址| 亚洲国产日韩精品| 精品国产凹凸成av人导航| 国产91丝袜在线18| 亚洲高清视频在线| 精品国产99国产精品| www.亚洲色图| 欧美a级理论片| 国产精品久久久久9999吃药| 欧美性一二三区| 韩国女主播成人在线观看| 亚洲色图视频网站| 日韩欧美国产高清| 91美女蜜桃在线| 日本不卡一区二区三区| 国产精品福利av| 日韩午夜精品电影| 色婷婷av久久久久久久| 激情综合五月天| 亚洲国产人成综合网站| 2017欧美狠狠色| 欧美日韩精品专区| 成人午夜伦理影院| 国内外成人在线视频| 一区二区三区在线免费视频| 亚洲精品在线免费观看视频| 91国在线观看| 大胆亚洲人体视频| 久久精品久久99精品久久| 亚洲欧美视频在线观看| 欧美精品一区二区三区高清aⅴ | 亚洲综合视频在线观看| 久久亚区不卡日本| 91精品欧美一区二区三区综合在| 不卡一卡二卡三乱码免费网站| 91麻豆国产福利精品| 色欧美片视频在线观看| 精品综合免费视频观看| 亚洲电影第三页| 国产精品国产三级国产aⅴ中文| 日韩美女一区二区三区| 在线不卡中文字幕播放| 欧美日韩国产精选| 不卡的av中国片| 粉嫩av一区二区三区在线播放| 久久99日本精品| 喷白浆一区二区| 日韩av一级片| 日韩精品高清不卡| 日韩国产欧美一区二区三区| 一区二区三区在线观看网站| 国产精品蜜臀在线观看| 中文一区一区三区高中清不卡| 久久久青草青青国产亚洲免观| 日韩欧美二区三区| 91精品国产麻豆国产自产在线 | 亚洲国产精品ⅴa在线观看| 欧美www视频| 2023国产一二三区日本精品2022| 日韩午夜在线播放| 欧美mv和日韩mv国产网站| 欧美成人一区二区| 久久久亚洲精品石原莉奈| 久久久久九九视频| 国产精品人成在线观看免费| 国产精品剧情在线亚洲| 亚洲欧美怡红院| 亚洲最色的网站| 午夜精品国产更新| 久久99在线观看| 国产成人免费在线观看| 成人av手机在线观看| 91久久人澡人人添人人爽欧美| 在线看一区二区| 欧美一区二区三区视频| 精品国产91洋老外米糕| 国产精品卡一卡二卡三| 亚洲综合另类小说| 奇米色一区二区三区四区| 国产在线精品不卡| 91丨porny丨蝌蚪视频| 欧美日韩精品高清| 久久婷婷成人综合色| 国产精品福利一区二区| 亚洲va欧美va国产va天堂影院| 美女免费视频一区| 成人激情免费电影网址| 欧美日韩免费在线视频| 日本不卡视频在线| 天天av天天翘天天综合网色鬼国产| 喷白浆一区二区| 成人av在线一区二区| 欧美日韩一区二区三区免费看| 欧美成人性战久久| 亚洲色图欧美偷拍| 久久国产剧场电影| 99久久99久久精品免费看蜜桃| 欧美日韩一区二区三区四区| 久久久久久久网| 亚洲成人久久影院| 国产高清精品网站| 欧美久久久久久蜜桃| 欧美国产激情二区三区| 婷婷丁香久久五月婷婷| 成人免费看片app下载| 9191精品国产综合久久久久久 | 亚洲天堂免费在线观看视频| 日韩和欧美一区二区| 99天天综合性| 久久久美女艺术照精彩视频福利播放| 一区二区三区在线免费视频| 韩国v欧美v亚洲v日本v| 欧美日韩国产一区| 国产精品美女久久久久高潮| 日本成人在线网站| 欧美中文字幕一二三区视频| 国产欧美日韩在线| 精品亚洲欧美一区| 777精品伊人久久久久大香线蕉| 中文字幕一区视频| 国产乱码精品一区二区三区忘忧草 | 成人免费一区二区三区视频| 欧美三级蜜桃2在线观看| 国产麻豆视频精品| 欧美视频在线不卡| 国产精品麻豆久久久| 六月丁香综合在线视频| 欧美无人高清视频在线观看| 国产精品色一区二区三区| 狠狠色丁香久久婷婷综合_中| 欧美区在线观看| 亚洲一区二区三区四区的| 成人av网站在线| 国产精品欧美极品| 成人一区二区视频| 久久精品亚洲一区二区三区浴池| 免费人成在线不卡| 国产婷婷色一区二区三区在线| 麻豆国产欧美日韩综合精品二区| 欧美夫妻性生活| 视频一区欧美精品| 欧美一区二区三区免费在线看| 五月婷婷综合网|