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

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

?? efimisc.c

?? EFI(Extensible Firmware Interface)是下一代BIOS
?? C
字號:
/*
 * Copyright (c) 1999, 2000
 * Intel Corporation.
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 * 
 *    This product includes software developed by Intel Corporation and
 *    its contributors.
 * 
 * 4. Neither the name of Intel Corporation or its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

/*++

Copyright (c) 2000  Intel Corporation

Module Name:

    efimisc.c

Abstract:

		Stubs for missing Free BSD functions    



Revision History

--*/

#include <atk_libc.h>
#include <efilib.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/signal.h>
#include "histedit.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <glob.h>
#include "ftp_var.h"
#include "efimisc.h"
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>

/* #define FTP_DEBUG	 uncomment to enable debug messages on stderr */

__sighandler_t *signal (int sig, __sighandler_t * func)
{

#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: signal stubbed\n"));
#endif
	return 0; 
}


struct passwd	*getpwuid (uid_t uid)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: getpwuid stubbed\n"));
#endif
	return NULL;
}

struct passwd	*getpwnam (const char *login)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: getpwnam stubbed\n"));
#endif
	return NULL;
}

uid_t	 getuid (void)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: getuid stubbed\n"));
#endif
	return 0;
}

char	*getlogin (void)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: getlogin stubbed\n"));
#endif
	return NULL;
}


int	setitimer (int which, const struct itimerval *value, struct itimerval *ovalue)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: setitimer stubbed\n"));
#endif
	return 0;
}



char * getpass(const char *prompt)
{
	static char 		pwbuff[128] = {0} ;
    EFI_INPUT_KEY       key;
    EFI_STATUS          status;
    UINTN               len, index;
    EFI_SYSTEM_TABLE	*SysTbl = _LIBC_EFISystemTable;
    EFI_BOOT_SERVICES	*BootSvr = SysTbl->BootServices;


	printf("%s",prompt);
	fflush (stdout);

    len = 0;
    while (1)
    {
        status = BootSvr->WaitForEvent( 1, &SysTbl->ConIn->WaitForKey, &index);
        if ( status != EFI_SUCCESS )
        {
        	printf("EFI service error 0x%p\n", (void*)status);
        	pwbuff[0] = 0;
        	return pwbuff;
        }

        status = SysTbl->ConIn->ReadKeyStroke(SysTbl->ConIn, &key);
        if (EFI_ERROR(status)) 
            break;

        if (key.UnicodeChar == '\n' || key.UnicodeChar == '\r') 
		{
			printf("\n");
            break;
		}        
        if (key.UnicodeChar == '\b') 
        {
            if (len) 
                len -= 1;
            continue;
        }

        if (key.UnicodeChar >= ' ') 
        {
            pwbuff[len] = (char)key.UnicodeChar;
            pwbuff[len+1] = 0;
            len += 1;
        }

		if ( len >= ( sizeof(pwbuff) -1 ))	/* can't fit any more in buffer */
			break;
    }

    pwbuff[len] = 0;
	return (char *) &pwbuff;
}
 
int	chmod (const char *path, mode_t mode)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: chmod stubbed\n"));
#endif
	return 0;
}


int	 access (const char *path, int mode)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: access stubbed\n"));
#endif
	return 0;
}
 

History * history_init (void)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: history_init stubbed\n"));
#endif
	return  NULL;
}

const HistEvent * history (History *h, int op, ...)
{

#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: history stubbed\n"));
#endif
	return  NULL;
}


void history_end (History *h)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: history_end stubbed\n"));
#endif
	return;
}


const char *el_gets	(EditLine *e, int *count)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: history_end stubbed\n"));
#endif
	return NULL ;
}

void el_end	(EditLine *e)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_end stubbed\n"));
#endif
	return;
}

int el_source (EditLine *e, const char *file)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_source stubbed\n"));
#endif
	return 0;
}

EditLine *el_init (const char *prog, FILE *fin, FILE *fout)
{

#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_init stubbed\n"));
#endif
	return NULL ;
}

int el_set (EditLine *e, int opt, ...)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_set stubbed\n"));
#endif
	return 0;
}


int el_insertstr (EditLine *e, char *str)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_insewrtstr stubbed\n"));
#endif
	return 0 ;
}

const LineInfo *el_line	(EditLine *e)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: el_line stubbed -- expect crash to follow\n"));
#endif
	return NULL ;
}

FILE *popen (const char *cmd, const char *type)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: popen stubbed\n"));
#endif
	return NULL ;
}

int pclose (FILE *stream)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: pclose stubbed\n"));
#endif
	return -1 ;
}


int issetugid (void)
{
#ifdef FTP_DEBUG
	DEBUG((D_WARN,"ftp: issetugid stubbed\n"));
#endif
	return 0 ;	/* calling process is not "tainted" */
}

static char newpath[ MAXPATHLEN ];

void
do_ls( int argc, char *argv[] )
{
	char			*files;
	glob_t			gl;
	struct	stat	sb;
	int				flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_MARK;

	/*
	 *  If no files were specified, list all files in current directory
	 */
	if ( argc == 0 )
		files = "*";
	else
		files = *argv;

	/*
	 *  If they gave a directory name, list it's contents
	 */
	if ( stat( files, &sb ) == 0 ) {
		if ( sb.st_mode & S_IFDIR ) {
			strcpy( newpath, files );
			strcat( newpath, "/*" );
			files = newpath;
		}
	}

	if ( glob( files, flags, NULL, &gl ) == 0 ) {
		int		i, longest, cols, mod;

		/*
		 *  Find the longest name
		 */
		for ( i = longest = 0; i < gl.gl_matchc; i++ ) {
			int len;

			len = (int)strlen(gl.gl_pathv[i]);
			if ( len > longest )
				longest = len;
		}

		/*
		 *  We have the longest string, find out how many columns we have
		 */
		cols = ttywidth / (longest + 2);

		/*
		 * Now list the names
		 */
		for ( i = mod = 0; i < gl.gl_matchc; i++ ) {
			printf("% *s ", -longest, gl.gl_pathv[i]);
			mod++;
			if ((mod % cols) == 0)
				printf("\n");
		}

		if (mod % cols)
			printf("\n");
		globfree(&gl);
	}
}

void
do_dir( int argc, char *argv[] )
{
	char			*files;
	glob_t			gl;
	struct	stat	sb;
	int				flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE;

	/*
	 *  If no files were specified, list all files in current directory
	 */
	if ( argc == 0 )
		files = "*";
	else
		files = *argv;

	/*
	 *  If they gave a directory name, list it's contents
	 */
	if ( stat( files, &sb ) == 0 ) {
		if ( sb.st_mode & S_IFDIR ) {
			strcpy( newpath, files );
			strcat( newpath, "/*" );
			files = newpath;
		}
	}

	if ( glob( files, flags, NULL, &gl ) == 0 ) {
		int			i;
		struct tm	*tm;

		/*
		 *  Now list the names
		 */
		for ( i = 0; i < gl.gl_matchc; i++ ) {
			char	buf[ 32 ];

			if ( stat( gl.gl_pathv[i], &sb ) < 0 ) {
				printf("Can't get file info on %s\n", gl.gl_pathv[i]);
				continue;
			}

			tm = localtime( &sb.st_mtime );
			strftime( buf, sizeof(buf)-1, "%D  %I:%M", tm );

			printf("%s%c % -6s % 16d  %s\n",
					buf,
					tm->tm_hour < 12 ? 'a' : 'p',
					sb.st_mode & S_IFDIR ? "<DIR>" : " ",
					(unsigned int)sb.st_size,
					gl.gl_pathv[i]);
		}

		globfree(&gl);
	}
}

#define CP_BUFSIZE	0x10000
void
do_cp( int argc, char *argv[] )
{
	char		*src, *dst;
	int 		srcfd, dstfd;
	char		*buf;
	ssize_t		bytes;
	struct stat	sb;

	/*
	 *  Make sure two arguments were supplied
	 */
	if ( argc != 2 ) {
		printf("cp: must supply src and dst filenames\n");
		return; 
	}
	
	src = argv[0];
	dst = argv[1];

	/*
	 *  If the destination is a directory, copy it there.
	 */
	if ( stat( dst, &sb ) == 0 ) {
		if ( sb.st_mode & S_IFDIR ) {
			strcpy( newpath, dst );
			strcat( newpath, "/" );
			strcat( newpath, src );
			dst = newpath;
		}
	}

	/*
	 *  Open source
	 */
	if ((srcfd = open( src, O_RDONLY )) < 0) {
		printf("Error opening source file %s: %s\n", src, strerror(errno));
		return;
	}

	/*
	 *  Create destination
	 */
	if ((dstfd = open( dst, O_CREAT | O_WRONLY | O_TRUNC, 0777)) < 0) {
		printf("Error opening destination file %s: %s\n", dst, strerror(errno));
		close(srcfd);
		return;
	}

	/*
	 *  Copy the file
	 */
	buf = malloc( CP_BUFSIZE );
	if ( buf == NULL ) {
		printf("Could not allocate memory\n");
	} else {
		while ( (bytes = read( srcfd, buf, CP_BUFSIZE )) > 0 ) {
			if ( write( dstfd, buf, bytes ) < 0 ) {
				printf("Error writing file %s: %s\n", dst, strerror(errno));
			}
		}

		if ( bytes < 0 ) {
			printf("Error reading file %s: %s\n", dst, strerror(errno));
		}
	}

	free( buf );
	close( srcfd );
	close( dstfd );
}

void
do_mkdir( int argc, char *dirname[] )
{
	if (argc == 0) { 
		printf("mkdir: no directories specified\n");
		return;
	}

	for (; argc; argc--, dirname++) {
		if ( mkdir( *dirname, 0777 ) < 0 ) {
			printf("Error creating directory %s: %s\n", *dirname, strerror(errno));
		}
	}
}

void
do_rm( int argc, char *files[] )
{
	glob_t	gl;
	int		flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE;

	if (argc == 0) { 
		printf("rm: no files specified\n");
		return;
	}

	for (; argc; argc--, files++) {
		if ( glob( *files, flags, NULL, &gl ) == 0 ) {
			int			i;
			struct stat	sb;

			if ( gl.gl_matchc == 0 ) {
				printf("rm: File %s does not exist\n", *files);
				return;
			}

			/*
			 *  Process the returned list
			 */
			for ( i = 0; i < gl.gl_matchc; i++ ) {
				char	*file;

				file = gl.gl_pathv[i];

				if ( stat( file, &sb ) < 0 ) {
					printf("Can't get file info on %s\n", file);
					continue;
				}

				if ( sb.st_mode & S_IFDIR ) {
					printf("%s is a directory - skipping\n", file);
					continue;
				}
				if ( unlink( file) < 0 ) {
					printf("Error removing %s: %s\n", file, strerror(errno));
				} else {
					printf("%s removed\n", file);
				}
			}

			globfree(&gl);
		}
	}
}

void
do_rmdir( int argc, char *dirname[] )
{
	glob_t	gl;
	int		flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE;

	if (argc == 0) { 
		printf("rmdir: no directores specified\n");
		return;
	}

	for (; argc; argc--, dirname++) {
		if ( glob( *dirname, flags, NULL, &gl ) == 0 ) {
			int			i;
			struct stat	sb;

			if ( gl.gl_matchc == 0 ) {
				printf("rmdir: Directory %s does not exist\n", *dirname);
				return;
			}

			/*
			 *  Process the returned list
			 */
			for ( i = 0; i < gl.gl_matchc; i++ ) {
				char	*dir;

				dir = gl.gl_pathv[i];

				if ( stat( dir, &sb ) < 0 ) {
					printf("Can't get directory info on %s\n", dir);
					continue;
				}

				if ( (sb.st_mode & S_IFDIR) == 0 ) {
					printf("%s is a file - skipping\n", dir);
					continue;
				}
				if ( rmdir( dir) < 0 ) {
					printf("Error removing %s: %s\n", dir, strerror(errno));
				} else {
					printf("%s removed\n", dir);
				}
			}

			globfree(&gl);
		}
	}
}

struct cmd_tbl {
	char	*cmd;
	void	(*func)(int argc, char *argv[]);
	char	*help;
} shellcmds [] = {
	{ "ls",		do_ls,		"Simple column directory listing"	},
	{ "dir",	do_dir,		"Full directory listing"			},
	{ "cp",		do_cp,		"Copy a file"						},
	{ "rm",		do_rm,		"Remove one or more files"			},
	{ "mkdir",	do_mkdir,	"Create a directory"				},
	{ "rmdir",	do_rmdir,	"Remove an emtpy directory"			},
	{ NULL,		NULL,		NULL								},	
};


void
shellemulate( int argc, char *argv[] )
{
	struct cmd_tbl	*p;
	char			cmdline[  MAXPATHLEN ];
	size_t			cmdlen;

	/*
	 *  Regardless of wheter we are compiled for new or old shell, we still
	 *  emulate the more "populare" shell commands
	 */
	for ( p = shellcmds; p->cmd; p++ ) {
		if ( strcmp( p->cmd, *argv ) == 0 ) {
			p->func( --argc, ++argv );
			return;
		}
	}

#ifdef OLD_SHELL
	/*
	 *  Give them some help
	 */
	printf("Available emulated shell commands are:\n");
	for ( p = shellcmds; p->cmd; p++ ) {
		printf("% -10s %s\n", p->cmd, p->help ? p->help : "");
	}
#else
	/*
	 *  Not a built-in.  Let's do a system() call
	 */
	for ( cmdlen = 0, cmdline[0] = 0; argc && cmdlen < (sizeof(cmdline) - 1); argc--, argv++ ) {
		/*
		 *  Include space and null termination in size check
		 */
		if ( strlen(*argv) + 2 + cmdlen > sizeof(cmdline) )
			goto error;
		strcat( cmdline, " " );
		strcat( cmdline, *argv );
		cmdlen += strlen( cmdline );
	}

	(void)system( cmdline );
	return;

error:
	printf("Command line too long\n");
#endif
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线观看一区二区| 亚洲国产综合人成综合网站| 日韩欧美国产综合一区| 欧美图区在线视频| 91麻豆国产在线观看| 国产91露脸合集magnet| 不卡大黄网站免费看| 亚洲综合色在线| 成人国产亚洲欧美成人综合网| 欧美精品一区二区三区蜜臀 | 国产精品一区在线观看乱码| 视频在线观看91| www.日韩av| 成年人国产精品| 成人精品视频一区二区三区| 成a人片国产精品| 91香蕉视频污在线| 在线精品视频一区二区| 欧美在线色视频| 91精品国产综合久久精品性色| 欧美一区二区三区电影| 在线免费观看日本欧美| 99精品国产一区二区三区不卡| 亚洲人成网站影音先锋播放| 精品国产精品一区二区夜夜嗨| 在线视频亚洲一区| 成人av集中营| 国精品**一区二区三区在线蜜桃| 五月天欧美精品| 亚洲永久精品大片| 一区二区三区日韩精品视频| 中文一区一区三区高中清不卡| 久久色视频免费观看| 日韩免费在线观看| 欧美大片免费久久精品三p| 91.com在线观看| 精品久久99ma| 久久精品亚洲精品国产欧美| 欧美韩日一区二区三区四区| 国产欧美日韩麻豆91| 国产精品美女久久久久久久网站| 国产精品嫩草影院av蜜臀| 亚洲欧美aⅴ...| 美女久久久精品| 日本久久一区二区三区| 91麻豆精品秘密| 五月激情综合网| 69av一区二区三区| 国产精品欧美久久久久无广告| 日本系列欧美系列| 日韩久久精品一区| 国产一区二区毛片| 日韩三区在线观看| 制服丝袜国产精品| 日韩欧美国产精品| 亚洲少妇最新在线视频| 欧美在线观看你懂的| 国产mv日韩mv欧美| 日韩制服丝袜先锋影音| 国产91在线观看| 欧美日韩视频一区二区| 久久精品夜色噜噜亚洲aⅴ| 亚洲一区在线看| 国产成人在线看| 911精品产国品一二三产区| 中文字幕在线一区| 国产真实乱对白精彩久久| 欧美日韩一级二级三级| 亚洲国产精华液网站w | 成人免费黄色大片| 欧美日本在线视频| 一区精品在线播放| 久久99国产精品麻豆| 91丝袜美腿高跟国产极品老师| 这里只有精品电影| 亚洲另类在线一区| av日韩在线网站| 国产亚洲欧美色| 免播放器亚洲一区| 宅男在线国产精品| 天涯成人国产亚洲精品一区av| 99这里都是精品| 久久尤物电影视频在线观看| 美国十次了思思久久精品导航| 欧美在线视频全部完| 亚洲欧美日韩国产另类专区| eeuss鲁一区二区三区| 中文字幕第一区综合| 99久久精品99国产精品| 亚洲天天做日日做天天谢日日欢| 成人伦理片在线| 国产精品久久三| 成年人网站91| 中文字幕亚洲在| 色美美综合视频| 亚洲一区二区五区| 中文av字幕一区| 欧美在线制服丝袜| 国产美女在线观看一区| 亚洲动漫第一页| 亚洲国产精品久久人人爱| 亚洲国产美女搞黄色| 国产亚洲精品中文字幕| 精品无人区卡一卡二卡三乱码免费卡| 91日韩精品一区| 国产精品99久久久久久久vr| 高清不卡一区二区在线| 97se亚洲国产综合自在线观| 97久久久精品综合88久久| 中文字幕在线播放不卡一区| 99久久久精品免费观看国产蜜| 亚洲国产高清在线观看视频| 国产成人在线视频网址| 国产精品丝袜一区| av一区二区三区在线| 日韩美女精品在线| 欧美在线视频全部完| 午夜视黄欧洲亚洲| 91精品国产综合久久国产大片| 国产精品久久久久久久久果冻传媒 | 亚洲第一成人在线| 国产精品女主播av| 欧美一区二区精品久久911| 日本午夜精品一区二区三区电影 | 琪琪久久久久日韩精品| 久久国产乱子精品免费女| 精品久久久久香蕉网| 欧美三级欧美一级| 国产精品自拍三区| 午夜精品爽啪视频| 亚洲主播在线播放| 国产精品素人一区二区| 精品福利在线导航| 精品久久久久久久久久久院品网| caoporn国产精品| 国产iv一区二区三区| 久久国产综合精品| 天堂蜜桃91精品| 视频一区欧美精品| 亚洲第一电影网| 亚洲电影第三页| 午夜精品成人在线视频| 亚洲无线码一区二区三区| 亚洲女同女同女同女同女同69| 丝袜亚洲精品中文字幕一区| 亚洲精品乱码久久久久久黑人| 一区二区三区在线影院| 国产色婷婷亚洲99精品小说| 在线亚洲精品福利网址导航| 99久久99久久精品免费看蜜桃| av在线一区二区三区| 国产91综合一区在线观看| 中文字幕欧美国产| av在线这里只有精品| 亚洲免费在线观看| 国产精品99久久久久久久vr| 一区二区三区高清不卡| 久久久蜜桃精品| 在线观看一区日韩| 国产精品一二三四| 亚洲一区二区三区四区在线免费观看 | 久久综合色婷婷| 中文字幕免费一区| 亚洲一区二区黄色| 狠狠网亚洲精品| 在线看日韩精品电影| 欧美一区二区三区小说| 欧美国产精品中文字幕| 亚洲精品免费在线播放| 日韩国产欧美视频| 国产.欧美.日韩| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩成人高清| 日韩精品一区二区三区老鸭窝| 337p粉嫩大胆噜噜噜噜噜91av| 国产日韩欧美一区二区三区综合 | 精品美女在线播放| 亚洲女性喷水在线观看一区| 青青草原综合久久大伊人精品| 成人精品免费网站| 精品国产污网站| 性感美女久久精品| 99re热视频精品| 国产亚洲女人久久久久毛片| 亚洲国产视频网站| 99免费精品在线| 国产日产欧美一区| 精品一区二区三区免费视频| 欧美老人xxxx18| 久久99蜜桃精品| 欧美精品一区二区三区蜜桃视频| 国产精品夫妻自拍| 韩国av一区二区三区在线观看| 国产精品水嫩水嫩| 国产视频在线观看一区二区三区| 欧美三级电影一区| 在线播放中文字幕一区| 91黄视频在线观看| 色综合一区二区| 色系网站成人免费|