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

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

?? ipcsocket.c

?? linux集群服務器軟件代碼包
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* $Id: ipcsocket.c,v 1.123 2005/02/11 21:39:35 alan Exp $ *//* * ipcsocket unix domain socket implementation of IPC abstraction. * * Copyright (c) 2002 Xiaoxiang Liu <xiliu@ncsa.uiuc.edu> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include <portability.h>#include <clplumbing/ipc.h>#include <clplumbing/cl_log.h>#include <clplumbing/realtime.h>#include <clplumbing/cl_poll.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <syslog.h>#include <sched.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/param.h>#include <sys/uio.h>#ifdef HAVE_SYS_FILIO_H#	include <sys/filio.h>#endif#ifdef HAVE_SYS_SYSLIMITS_H#	include <sys/syslimits.h>#endif#ifdef HAVE_SYS_CRED_H#	include <sys/cred.h>#endif#ifdef HAVE_SYS_UCRED_H#	include <sys/ucred.h>#endif#include <sys/socket.h>#include <sys/poll.h>#include <netinet/in.h>#include <sys/un.h>#include <sys/ioctl.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#ifndef UNIX_PATH_MAX#	define UNIX_PATH_MAX 108#endif#define MAX_LISTEN_NUM 10#ifndef SUN_LEN#    define SUN_LEN(ptr) ((size_t) (offsetof (sockaddr_un, sun_path) + strlen ((ptr)->sun_path))#endif#ifndef MSG_NOSIGNAL#define		MSG_NOSIGNAL	0#endif#ifndef AF_LOCAL#define         AF_LOCAL AF_UNIX#endif/*********************************************************************** * * Determine the IPC authentication scheme...  More machine dependent than * we'd like, but don't know any better way... * ***********************************************************************/#ifdef SO_PEERCRED#	define	USE_SO_PEERCRED#elif HAVE_GETPEEREID#	define USE_GETPEEREID#elif ON_DARWIN/* Darwin has SCM_CREDS but it has been crippled by Apple *  - force USE_BINDSTAT_CREDS instead */#	define	USE_BINDSTAT_CREDS#elif defined(SCM_CREDS)#	define	USE_SCM_CREDS#else#	define	USE_DUMMY_CREDS/* This will make it compile, but attempts to authenticate * will fail.  This is a stopgap measure ;-) */#endif/* wait connection private data. */struct SOCKET_WAIT_CONN_PRIVATE{  /* the path name wich the connection will be built on. */  char path_name[UNIX_PATH_MAX];  /* the domain socket. */  int s;};/* channel private data. */struct SOCKET_CH_PRIVATE{  /* the path name wich the connection will be built on. */  char path_name[UNIX_PATH_MAX];  /* the domain socket. */  int s;  /* the size of expecting data for below buffered message buf_msg */  int remaining_data;  /* The address of our peer - used by USE_BINDSTAT_CREDS version of   *   socket_verify_auth()   */  struct sockaddr_un *peer_addr;		  /* the buf used to save unfinished message */  struct IPC_MESSAGE *buf_msg;};struct IPC_Stats {	long	nsent;	long	noutqueued;	long	send_count;	long	nreceived;	long	ninqueued;	long	recv_count;	int	last_recv_errno;	int	last_recv_rc;	int	last_send_errno;	int	last_send_rc;};struct IPC_Stats	SocketIPCStats = {0,0,0,0};/* unix domain socket implementations of IPC functions. */static void socket_destroy_wait_conn(struct IPC_WAIT_CONNECTION * wait_conn);static int socket_wait_selectfd(struct IPC_WAIT_CONNECTION *wait_conn);static struct IPC_CHANNEL * socket_accept_connection(struct IPC_WAIT_CONNECTION * wait_conn, struct IPC_AUTH *auth_info);static void socket_destroy_channel(struct IPC_CHANNEL * ch);static int socket_initiate_connection(struct IPC_CHANNEL * ch);static int socket_send(struct IPC_CHANNEL * ch, struct IPC_MESSAGE* message);static int socket_recv(struct IPC_CHANNEL * ch, struct IPC_MESSAGE** message);static int socket_resume_io(struct IPC_CHANNEL *ch);static gboolean socket_is_message_pending(struct IPC_CHANNEL *ch);static gboolean socket_is_output_pending(struct IPC_CHANNEL *ch);static int socket_assert_auth(struct IPC_CHANNEL *ch, GHashTable *auth);static int socket_verify_auth(struct IPC_CHANNEL*ch, struct IPC_AUTH*auth_info);/* for domain socket, reve_fd = send_fd. */static int socket_get_recv_fd(struct IPC_CHANNEL *ch);static int socket_get_send_fd(struct IPC_CHANNEL *ch);static int socket_set_send_qlen (struct IPC_CHANNEL* ch, int q_len);static int socket_set_recv_qlen (struct IPC_CHANNEL* ch, int q_len);/* helper functions. */static int socket_disconnect(struct IPC_CHANNEL* ch);static struct IPC_QUEUE* socket_queue_new(void);static void socket_destroy_queue(struct IPC_QUEUE * q);static struct IPC_MESSAGE* socket_message_new(struct IPC_CHANNEL*ch,	int msg_len);void socket_free_message(struct IPC_MESSAGE * msg);struct IPC_WAIT_CONNECTION *socket_wait_conn_new(GHashTable* ch_attrs);struct IPC_CHANNEL* socket_client_channel_new(GHashTable *attrs);struct IPC_CHANNEL* socket_server_channel_new(int sockfd);pid_t socket_get_farside_pid(int sockfd);extern int (*ipc_pollfunc_ptr)(struct pollfd *, nfds_t, int);static int socket_waitin(struct IPC_CHANNEL * ch);static int socket_waitout(struct IPC_CHANNEL * ch);static int socket_resume_io_read(struct IPC_CHANNEL *ch, int*, gboolean read1anyway);static void socket_set_high_flow_callback(IPC_Channel* ch,					  flow_callback_t callback,					  void* userdata);static void socket_set_low_flow_callback(IPC_Channel* ch,					 flow_callback_t callback,					 void* userdata);static IPC_Message* socket_new_ipcmsg(IPC_Channel* ch, 				      const void* data,				      int len,				      void* private);/* socket object of the function table */static struct IPC_OPS socket_ops = {  socket_destroy_channel,  socket_initiate_connection,  socket_verify_auth,  socket_assert_auth,  socket_send,  socket_recv,  socket_waitin,  socket_waitout,  socket_is_message_pending,  socket_is_output_pending,  socket_resume_io,  socket_get_send_fd,  socket_get_recv_fd,  socket_set_send_qlen,  socket_set_recv_qlen,  socket_set_high_flow_callback,  socket_set_low_flow_callback,  socket_new_ipcmsg,};void dump_ipc_info(const IPC_Channel* chan);#undef AUDIT_CHANNELS#ifndef AUDIT_CHANNELS#	define	CHANAUDIT(ch)	/*NOTHING */#else#	define CHANAUDIT(ch)	socket_chan_audit(ch)#	define MAXPID	65535static voidsocket_chan_audit(const struct IPC_CHANNEL* ch){	int	badch = FALSE;  	struct SOCKET_CH_PRIVATE *chp;	struct stat		b;		if ((chp = ch->ch_private) == NULL) {		cl_log(LOG_CRIT, "Bad ch_private");		badch = TRUE;	}	if (ch->ops != &socket_ops) {		cl_log(LOG_CRIT, "Bad socket_ops");		badch = TRUE;	}	if (ch->ch_status == IPC_DISCONNECT) {		return;	}	if (!IPC_ISRCONN(ch)) {		cl_log(LOG_CRIT, "Bad ch_status [%d]", ch->ch_status);		badch = TRUE;	}	if (ch->farside_pid < 0 || ch->farside_pid > MAXPID) {		cl_log(LOG_CRIT, "Bad farside_pid");		badch = TRUE;	}	if (fstat(chp->s, &b) < 0) {		badch = TRUE;	}else if ((b.st_mode & S_IFMT) != S_IFSOCK) {		cl_log(LOG_CRIT, "channel @ 0x%lx: not a socket"		,	(unsigned long)ch);		badch = TRUE;	}	if (chp->remaining_data < 0) {		cl_log(LOG_CRIT, "Negative remaining_data");		badch = TRUE;	}	if (chp->remaining_data < 0 || chp->remaining_data > MAXDATASIZE) {		cl_log(LOG_CRIT, "Excessive/bad remaining_data");		badch = TRUE;	}	if (chp->remaining_data && chp->buf_msg == NULL) {		cl_log(LOG_CRIT		,	"inconsistent remaining_data [%ld]/buf_msg[0x%lx]"		,	(long)chp->remaining_data, (unsigned long)chp->buf_msg);		badch = TRUE;	}	if (chp->remaining_data == 0 && chp->buf_msg != NULL) {		cl_log(LOG_CRIT		,	"inconsistent remaining_data [%ld]/buf_msg[0x%lx] (2)"		,	(long)chp->remaining_data, (unsigned long)chp->buf_msg);		badch = TRUE;	}	if (ch->send_queue == NULL || ch->recv_queue == NULL) {		cl_log(LOG_CRIT, "bad send/recv queue");		badch = TRUE;	}	if (ch->recv_queue->current_qlen < 0	||	ch->recv_queue->current_qlen > ch->recv_queue->max_qlen) {		cl_log(LOG_CRIT, "bad recv queue");		badch = TRUE;	}	if (ch->send_queue->current_qlen < 0	||	ch->send_queue->current_qlen > ch->send_queue->max_qlen) {		cl_log(LOG_CRIT, "bad send_queue");		badch = TRUE;	}	if (badch) {		cl_log(LOG_CRIT, "Bad channel @ 0x%lx", (unsigned long)ch);		dump_ipc_info(ch);		abort();	}}#endif#ifdef CHEAT_CHECKSlong	SeqNums[32];static longcheat_get_sequence(IPC_Message* msg){	const char header [] = "String-";	size_t header_len = sizeof(header)-1;	char *	body;	if (msg == NULL || msg->msg_len < sizeof(header)	||	msg->msg_len > sizeof(header) + 10	||	strncmp(msg->msg_body, header, header_len) != 0) {		return -1L;	}	body = msg->msg_body;	return atol(body+header_len);}static char SavedReadBody[32];static char SavedReceivedBody[32];static char SavedQueuedBody[32];static char SavedSentBody[32];#ifndef MIN#	define MIN(a,b)	(a < b ? a : b)#endifstatic voidsave_body(struct IPC_MESSAGE *msg, char * savearea, size_t length){	int mlen = strnlen(msg->msg_body, MIN(length, msg->msg_len));	memcpy(savearea, msg->msg_body, mlen);	savearea[mlen] = EOS;}static voidaudit_readmsgq_msg(gpointer msg, gpointer user_data){	long	cheatseq = cheat_get_sequence(msg);	if (cheatseq < SeqNums[1] || cheatseq > SeqNums[2]) {		cl_log(LOG_ERR		,	"Read Q Message %ld not in range [%ld:%ld]"		,	cheatseq, SeqNums[1], SeqNums[2]);	}}static void saveandcheck(struct IPC_CHANNEL * ch, struct IPC_MESSAGE* msg, char * savearea,	size_t savesize, long* lastseq, const char * text){	long	cheatseq = cheat_get_sequence(msg);	save_body(msg, savearea, savesize);	if (*lastseq != 0 ) {		if (cheatseq != *lastseq +1) {			int	j;			cl_log(LOG_ERR			,	"%s packets out of sequence! %ld versus %ld [pid %d]"			,	text, cheatseq, *lastseq, (int)getpid());			dump_ipc_info(ch);			for (j=0; j < 4; ++j) {				cl_log(LOG_DEBUG				,	"SeqNums[%d] = %ld"				,	j, SeqNums[j]);			}			cl_log(LOG_ERR			,	"SocketIPCStats.nsent = %ld"			,	SocketIPCStats.nsent);			cl_log(LOG_ERR			,	"SocketIPCStats.noutqueued = %ld"			,	SocketIPCStats.noutqueued);			cl_log(LOG_ERR			,	"SocketIPCStats.nreceived = %ld"			,	SocketIPCStats.nreceived);			cl_log(LOG_ERR			,	"SocketIPCStats.ninqueued = %ld"			,	SocketIPCStats.ninqueued);		}			}	g_list_foreach(ch->recv_queue->queue, audit_readmsgq_msg, NULL);	if (cheatseq > 0) {		*lastseq = cheatseq;	}}#	define	CHECKFOO(which, ch, msg, area, text)	{			\		saveandcheck(ch,msg,area,sizeof(area),SeqNums+which,text);	\	}#else#	define	CHECKFOO(which, ch, msg, area, text)	/* Nothing */#endifstatic voiddump_msg(struct IPC_MESSAGE *msg, const char * label){#ifdef CHEAT_CHECKS	cl_log(LOG_DEBUG, "%s packet (length %d) [%s] %ld pid %d"	,	label,	(int)msg->msg_len, (char*)msg->msg_body	,	cheat_get_sequence(msg), (int)getpid());#else	cl_log(LOG_DEBUG, "%s length %d [%s] pid %d"	,	label,	(int)msg->msg_len, (char*)msg->msg_body	,	(int)getpid());#endif}static voiddump_msgq_msg(gpointer data, gpointer user_data){	dump_msg(data, user_data);}voiddump_ipc_info(const IPC_Channel* chan){	char squeue[] = "Send queue";	char rqueue[] = "Receive queue";#ifdef CHEAT_CHECKS	cl_log(LOG_DEBUG, "Saved Last Body read[%s]", SavedReadBody);	cl_log(LOG_DEBUG, "Saved Last Body received[%s]", SavedReceivedBody);	cl_log(LOG_DEBUG, "Saved Last Body Queued[%s]", SavedQueuedBody);	cl_log(LOG_DEBUG, "Saved Last Body Sent[%s]", SavedSentBody);#endif	g_list_foreach(chan->send_queue->queue, dump_msgq_msg, squeue);	g_list_foreach(chan->recv_queue->queue, dump_msgq_msg, rqueue);	CHANAUDIT(chan);}/* destroy socket wait channel */ static void socket_destroy_wait_conn(struct IPC_WAIT_CONNECTION * wait_conn){	struct SOCKET_WAIT_CONN_PRIVATE * wc = wait_conn->ch_private;	if (wc != NULL) {		close(wc->s);		cl_poll_ignore(wc->s);		unlink(wc->path_name);		g_free(wc);	}	g_free((void*) wait_conn);}/* return a fd which can be listened on for new connections. */static int socket_wait_selectfd(struct IPC_WAIT_CONNECTION *wait_conn){	struct SOCKET_WAIT_CONN_PRIVATE * wc = wait_conn->ch_private;	return (wc == NULL ? -1 : wc->s);}/* socket accept connection. */static struct IPC_CHANNEL* socket_accept_connection(struct IPC_WAIT_CONNECTION * wait_conn,	struct IPC_AUTH *auth_info){	/* make peer_addr a pointer so it can be used by the	 *   USE_BINDSTAT_CREDS implementation of socket_verify_auth()	 */	struct sockaddr_un *			peer_addr;	struct IPC_CHANNEL *			ch = NULL;	int					sin_size;	int					s;	int					new_sock;	struct SOCKET_WAIT_CONN_PRIVATE*	conn_private;	struct SOCKET_CH_PRIVATE *		ch_private ;	int auth_result = IPC_FAIL;	gboolean was_error = FALSE;		peer_addr = g_new(struct sockaddr_un, 1);	/* get select fd */	s = wait_conn->ops->get_select_fd(wait_conn); 	if (s < 0) {		cl_log(LOG_ERR, "get_select_fd: invalid fd");		g_free(peer_addr);		peer_addr = NULL;		return NULL;	}	/* Get client connection. */	sin_size = sizeof(struct sockaddr_un);	if ((new_sock = accept(s, (struct sockaddr *)peer_addr, &sin_size)) == -1){		if (errno != EAGAIN && errno != EWOULDBLOCK) {			cl_perror("socket_accept_connection: accept");		}		was_error = TRUE;			}else{		if ((ch = socket_server_channel_new(new_sock)) == NULL) {			cl_log(LOG_ERR			,	"socket_accept_connection:"			        " Can't create new channel");			was_error = TRUE;		}else{			conn_private=(struct SOCKET_WAIT_CONN_PRIVATE*)			(	wait_conn->ch_private);			ch_private = (struct SOCKET_CH_PRIVATE *)(ch->ch_private);			strncpy(ch_private->path_name,conn_private->path_name			,		sizeof(conn_private->path_name));			ch_private->peer_addr = peer_addr;		}	}	/* Verify the client authorization information. */	if(was_error == FALSE) {		auth_result = ch->ops->verify_auth(ch, auth_info);		if (auth_result == IPC_OK) {			ch->ch_status = IPC_CONNECT;			ch->farside_pid = socket_get_farside_pid(new_sock);			return ch;		}	}  	g_free(peer_addr);	peer_addr = NULL;	return NULL;}static voidsocket_destroy_channel(struct IPC_CHANNEL * ch){	while (ch->ch_status == IPC_CONNECT

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久线在线观看| 日本亚洲一区二区| 日韩国产精品久久久| 国产福利精品一区| 制服丝袜av成人在线看| 中文字幕在线视频一区| 日本成人在线网站| 欧美撒尿777hd撒尿| 国产精品美女视频| 精品一区二区三区不卡 | 亚洲国产精品久久久久秋霞影院| 蜜桃视频一区二区三区| 欧美视频三区在线播放| 亚洲欧美怡红院| 成人a级免费电影| 精品国产免费一区二区三区四区| 一卡二卡三卡日韩欧美| 99精品国产热久久91蜜凸| 国产亚洲欧美一区在线观看| 精品一区二区久久久| 欧美一级日韩不卡播放免费| 亚洲电影你懂得| 欧美午夜寂寞影院| 一区二区三区视频在线看| 99久精品国产| 亚洲日本在线天堂| av电影一区二区| 国产精品久久久一区麻豆最新章节| 狠狠色狠狠色综合| 久久久久亚洲蜜桃| 国产成人精品三级麻豆| 中文文精品字幕一区二区| 国产999精品久久久久久绿帽| 国产亚洲1区2区3区| 国产91精品精华液一区二区三区| 国产片一区二区三区| gogogo免费视频观看亚洲一| 亚洲婷婷综合久久一本伊一区| 成人激情午夜影院| 亚洲卡通动漫在线| 欧美精品电影在线播放| 免费观看91视频大全| 亚洲精品在线观看视频| 丁香一区二区三区| 亚洲女性喷水在线观看一区| 欧美怡红院视频| 久久精品72免费观看| 久久蜜桃香蕉精品一区二区三区| 国产风韵犹存在线视精品| √…a在线天堂一区| 欧美日韩在线一区二区| 成人福利在线看| 亚洲最快最全在线视频| 91精品国产手机| 国产在线精品视频| 亚洲三级久久久| 欧美一区二区成人6969| 国产suv精品一区二区三区| 亚洲人xxxx| 精品久久久久99| 91免费小视频| 另类中文字幕网| 中文字幕中文字幕在线一区| 欧美日韩久久不卡| 风间由美一区二区三区在线观看| 亚洲三级久久久| 精品国产一区二区三区忘忧草 | 高清在线不卡av| 一区二区三区**美女毛片| 精品久久一二三区| 色婷婷久久99综合精品jk白丝| 免费看日韩a级影片| 亚洲视频资源在线| 2024国产精品视频| 欧美在线一区二区三区| 国产成人av电影在线观看| 亚洲国产精品一区二区尤物区| 久久久.com| 欧美一区二区三区电影| 97精品国产97久久久久久久久久久久| 免费看欧美女人艹b| 亚洲欧美日本在线| 久久精品人人做人人爽人人| 精品视频1区2区| 色婷婷综合久久久久中文一区二区| 久久精品国产成人一区二区三区| 亚洲精品中文在线影院| 国产欧美va欧美不卡在线| 欧美一区二区三区四区五区| 欧美在线影院一区二区| 91在线精品一区二区| 国产成人一区在线| 精品一区二区综合| 天天操天天干天天综合网| 亚洲欧美一区二区三区孕妇| 国产午夜精品在线观看| 精品国产凹凸成av人导航| 欧美男男青年gay1069videost| av电影在线观看完整版一区二区| 国产精品一区免费视频| 麻豆极品一区二区三区| 日本中文字幕一区二区有限公司| 一区二区欧美国产| 亚洲自拍偷拍麻豆| 亚洲精品日日夜夜| 亚洲另类一区二区| 亚洲欧美日韩国产综合在线| 综合欧美一区二区三区| 中文字幕一区二区三中文字幕| 国产欧美日韩三级| 中文字幕欧美国产| 国产精品不卡视频| 成人免费在线观看入口| 18欧美亚洲精品| 一区二区三区四区不卡在线| 一区二区三区精密机械公司| 亚洲欧美国产三级| 亚洲图片有声小说| 91视频观看视频| 在线观看视频91| 欧美剧情片在线观看| 欧美一级欧美三级在线观看| 日韩美女主播在线视频一区二区三区| 欧美一区二区三区四区高清| 精品剧情v国产在线观看在线| 精品乱人伦一区二区三区| 国产日韩欧美激情| 亚洲欧洲性图库| 亚洲一区二区三区四区在线观看| 日韩在线一区二区三区| 久久综合av免费| 日韩一区二区中文字幕| 26uuu亚洲| 国产精品久久久久精k8| |精品福利一区二区三区| 亚洲综合免费观看高清完整版| 亚洲成人免费视频| 免播放器亚洲一区| 国产a区久久久| 欧美系列一区二区| 精品精品欲导航| 亚洲人成网站在线| 日韩精品色哟哟| 国产成人精品一区二区三区四区 | 国产欧美日韩麻豆91| 一区二区三区高清不卡| 秋霞影院一区二区| www.成人在线| 日韩欧美专区在线| 亚洲三级在线观看| 精品一区二区三区免费毛片爱| 国产福利精品一区二区| 欧美另类久久久品| 中文字幕免费不卡| 亚洲日本在线视频观看| 国产精品电影一区二区三区| 亚洲天堂久久久久久久| 不卡的电影网站| 欧美日韩一区不卡| 欧美国产乱子伦| 日本中文字幕不卡| 99热这里都是精品| 日韩精品资源二区在线| 亚洲精品中文字幕在线观看| 国产一区二区剧情av在线| 在线观看成人小视频| 久久免费视频色| 青青草原综合久久大伊人精品 | 日韩女优制服丝袜电影| 亚洲欧美日本韩国| 国产精品1区2区| 91精品久久久久久久99蜜桃 | 国产精品入口麻豆原神| 免费看日韩a级影片| 欧美日韩国产小视频| 欧美国产一区二区在线观看 | 亚洲另类一区二区| 国产做a爰片久久毛片| 91精品国产欧美日韩| 亚洲欧洲另类国产综合| 国产乱人伦偷精品视频不卡| 日韩一级大片在线观看| 99精品欧美一区二区蜜桃免费| 26uuu国产电影一区二区| 日本欧美一区二区三区| 欧美色图一区二区三区| 亚洲免费观看高清完整版在线| 国产成人av自拍| 久久女同精品一区二区| 精品亚洲国内自在自线福利| 欧美日韩国产精品自在自线| 亚洲色图在线看| 91欧美激情一区二区三区成人| 国产日韩精品一区二区三区在线| 狠狠色丁香久久婷婷综合丁香| 欧美一级二级在线观看| 免费成人性网站| 欧美成人三级在线| 麻豆国产欧美日韩综合精品二区 | 国产精品午夜在线|