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

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

?? libvhd-journal.c

?? xen source 推出最新的VHD操作工具VHD-UTIL 實現源碼,超強
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Copyright (c) 2008, XenSource Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of XenSource Inc. nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT OWNER
 * 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.
*/
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include "atomicio.h"
#include "libvhd-journal.h"

#define VHD_JOURNAL_ENTRY_TYPE_FOOTER_P  1
#define VHD_JOURNAL_ENTRY_TYPE_FOOTER_C  2
#define VHD_JOURNAL_ENTRY_TYPE_HEADER    3
#define VHD_JOURNAL_ENTRY_TYPE_LOCATOR   4
#define VHD_JOURNAL_ENTRY_TYPE_BAT       5
#define VHD_JOURNAL_ENTRY_TYPE_BATMAP_H  6
#define VHD_JOURNAL_ENTRY_TYPE_BATMAP_M  7
#define VHD_JOURNAL_ENTRY_TYPE_DATA      8

typedef struct vhd_journal_entry {
	uint64_t                         cookie;
	uint32_t                         type;
	uint32_t                         size;
	uint64_t                         offset;
	uint32_t                         checksum;
} vhd_journal_entry_t;

static inline int
vhd_journal_seek(vhd_journal_t *j, off64_t offset, int whence)
{
	off64_t off;

	off = lseek64(j->jfd, offset, whence);
	if (off == (off64_t)-1)
		return -errno;

	return 0;
}

static inline off64_t
vhd_journal_position(vhd_journal_t *j)
{
	return lseek64(j->jfd, 0, SEEK_CUR);
}

static inline int
vhd_journal_read(vhd_journal_t *j, void *buf, size_t size)
{
	ssize_t ret;

	errno = 0;

	ret = atomicio(read, j->jfd, buf, size);
	if (ret != size)
		return (errno ? -errno : -EIO);

	return 0;
}

static inline int
vhd_journal_write(vhd_journal_t *j, void *buf, size_t size)
{
	ssize_t ret;

	errno = 0;

	ret = atomicio(vwrite, j->jfd, buf, size);
	if (ret != size)
		return (errno ? -errno : -EIO);

	return 0;
}

static inline int
vhd_journal_truncate(vhd_journal_t *j, off64_t length)
{
	int err;

	err = ftruncate(j->jfd, length);
	if (err == -1)
		return -errno;

	return 0;
}

static inline int
vhd_journal_sync(vhd_journal_t *j)
{
	int err;

	err = fdatasync(j->jfd);
	if (err)
		return -errno;

	return 0;
}

static inline void
vhd_journal_header_in(vhd_journal_header_t *header)
{
	BE64_IN(&header->vhd_footer_offset);
	BE32_IN(&header->journal_data_entries);
	BE32_IN(&header->journal_metadata_entries);
	BE64_IN(&header->journal_data_offset);
	BE64_IN(&header->journal_metadata_offset);
}

static inline void
vhd_journal_header_out(vhd_journal_header_t *header)
{
	BE64_OUT(&header->vhd_footer_offset);
	BE32_OUT(&header->journal_data_entries);
	BE32_OUT(&header->journal_metadata_entries);
	BE64_OUT(&header->journal_data_offset);
	BE64_OUT(&header->journal_metadata_offset);
}

static int
vhd_journal_validate_header(vhd_journal_t *j, vhd_journal_header_t *header)
{
	int err;
	off64_t eof;

	if (memcmp(header->cookie,
		   VHD_JOURNAL_HEADER_COOKIE, sizeof(header->cookie)))
		return -EINVAL;

	err = vhd_journal_seek(j, j->header.journal_eof, SEEK_SET);
	if (err)
		return err;

	eof = vhd_journal_position(j);
	if (eof == (off64_t)-1)
		return -errno;

	if (j->header.journal_data_offset > j->header.journal_eof)
		return -EINVAL;

	if (j->header.journal_metadata_offset > j->header.journal_eof)
		return -EINVAL;

	return 0;
}

static int
vhd_journal_read_journal_header(vhd_journal_t *j, vhd_journal_header_t *header)
{
	int err;
	size_t size;

	size = sizeof(vhd_journal_header_t);
	err  = vhd_journal_seek(j, 0, SEEK_SET);
	if (err)
		return err;

	err  = vhd_journal_read(j, header, size);
	if (err)
		return err;

	vhd_journal_header_in(header);

	return vhd_journal_validate_header(j, header);
}

static int
vhd_journal_write_header(vhd_journal_t *j, vhd_journal_header_t *header)
{
	int err;
	size_t size;
	vhd_journal_header_t h;

	memcpy(&h, header, sizeof(vhd_journal_header_t));

	err = vhd_journal_validate_header(j, &h);
	if (err)
		return err;

	vhd_journal_header_out(&h);
	size = sizeof(vhd_journal_header_t);

	err  = vhd_journal_seek(j, 0, SEEK_SET);
	if (err)
		return err;

	err = vhd_journal_write(j, &h, size);
	if (err)
		return err;

	return 0;
}

static int
vhd_journal_add_journal_header(vhd_journal_t *j)
{
	int err;
	off64_t off;
	vhd_context_t *vhd;

	vhd = &j->vhd;
	memset(&j->header, 0, sizeof(vhd_journal_header_t));

	err = vhd_seek(vhd, 0, SEEK_END);
	if (err)
		return err;

	off = vhd_position(vhd);
	if (off == (off64_t)-1)
		return -errno;

	err = vhd_get_footer(vhd);
	if (err)
		return err;

	uuid_copy(j->header.uuid, vhd->footer.uuid);
	memcpy(j->header.cookie,
	       VHD_JOURNAL_HEADER_COOKIE, sizeof(j->header.cookie));
	j->header.vhd_footer_offset = off - sizeof(vhd_footer_t);
	j->header.journal_eof = sizeof(vhd_journal_header_t);

	return vhd_journal_write_header(j, &j->header);
}

static void
vhd_journal_entry_in(vhd_journal_entry_t *entry)
{
	BE32_IN(&entry->type);
	BE32_IN(&entry->size);
	BE64_IN(&entry->offset);
	BE64_IN(&entry->cookie);
	BE32_IN(&entry->checksum);
}

static void
vhd_journal_entry_out(vhd_journal_entry_t *entry)
{
	BE32_OUT(&entry->type);
	BE32_OUT(&entry->size);
	BE64_OUT(&entry->offset);
	BE64_OUT(&entry->cookie);
	BE32_OUT(&entry->checksum);
}

static uint32_t
vhd_journal_checksum_entry(vhd_journal_entry_t *entry, char *buf, size_t size)
{
	int i;
	unsigned char *blob;
	uint32_t checksum, tmp;

	checksum        = 0;
	tmp             = entry->checksum;
	entry->checksum = 0;

	blob = (unsigned char *)entry;
	for (i = 0; i < sizeof(vhd_journal_entry_t); i++)
		checksum += blob[i];

	blob = (unsigned char *)buf;
	for (i = 0; i < size; i++)
		checksum += blob[i];

	entry->checksum = tmp;
	return ~checksum;
}

static int
vhd_journal_validate_entry(vhd_journal_entry_t *entry)
{
	if (entry->size == 0)
		return -EINVAL;

	if (entry->size & (VHD_SECTOR_SIZE - 1))
		return -EINVAL;

	if (entry->cookie != VHD_JOURNAL_ENTRY_COOKIE)
		return -EINVAL;

	return 0;
}

static int
vhd_journal_read_entry(vhd_journal_t *j, vhd_journal_entry_t *entry)
{
	int err;

	err = vhd_journal_read(j, entry, sizeof(vhd_journal_entry_t));
	if (err)
		return err;

	vhd_journal_entry_in(entry);
	return vhd_journal_validate_entry(entry);
}

static int
vhd_journal_write_entry(vhd_journal_t *j, vhd_journal_entry_t *entry)
{
	int err;
	vhd_journal_entry_t e;

	err = vhd_journal_validate_entry(entry);
	if (err)
		return err;

	memcpy(&e, entry, sizeof(vhd_journal_entry_t));
	vhd_journal_entry_out(&e);

	err = vhd_journal_write(j, &e, sizeof(vhd_journal_entry_t));
	if (err)
		err;

	return 0;
}

static int
vhd_journal_validate_entry_data(vhd_journal_entry_t *entry, char *buf)
{
	int err;
	uint32_t checksum;

	err      = 0;
	checksum = vhd_journal_checksum_entry(entry, buf, entry->size);

	if (checksum != entry->checksum)
		return -EINVAL;

	return err;
}

static int
vhd_journal_update(vhd_journal_t *j, off64_t offset,
		   char *buf, size_t size, uint32_t type)
{
	int err;
	off64_t eof;
	uint64_t *off, off_bak;
	uint32_t *entries;
	vhd_journal_entry_t entry;

	entry.type     = type;
	entry.size     = size;
	entry.offset   = offset;
	entry.cookie   = VHD_JOURNAL_ENTRY_COOKIE;
	entry.checksum = vhd_journal_checksum_entry(&entry, buf, size);

	err = vhd_journal_seek(j, j->header.journal_eof, SEEK_SET);
	if (err)
		return err;

	err = vhd_journal_write_entry(j, &entry);
	if (err)
		goto fail;

	err = vhd_journal_write(j, buf, size);
	if (err)
		goto fail;

	if (type == VHD_JOURNAL_ENTRY_TYPE_DATA) {
		off     = &j->header.journal_data_offset;
		entries = &j->header.journal_data_entries;
	} else {
		off     = &j->header.journal_metadata_offset;
		entries = &j->header.journal_metadata_entries;
	}

	off_bak = *off;
	if (!(*entries)++)
		*off = j->header.journal_eof;
	j->header.journal_eof += (size + sizeof(vhd_journal_entry_t));

	err = vhd_journal_write_header(j, &j->header);
	if (err) {
		if (!--(*entries))
			*off = off_bak;
		j->header.journal_eof -= (size + sizeof(vhd_journal_entry_t));
		goto fail;
	}

	return 0;

fail:
	if (!j->is_block)
		vhd_journal_truncate(j, j->header.journal_eof);
	return err;
}

static int
vhd_journal_add_footer(vhd_journal_t *j)
{
	int err;
	off64_t off;
	vhd_context_t *vhd;
	vhd_footer_t footer;

	vhd = &j->vhd;

	err = vhd_seek(vhd, 0, SEEK_END);
	if (err)
		return err;

	off = vhd_position(vhd);
	if (off == (off64_t)-1)
		return -errno;

	err = vhd_read_footer_at(vhd, &footer, off - sizeof(vhd_footer_t));
	if (err)
		return err;

	vhd_footer_out(&footer);
	err = vhd_journal_update(j, off - sizeof(vhd_footer_t),
				 (char *)&footer,
				 sizeof(vhd_footer_t),
				 VHD_JOURNAL_ENTRY_TYPE_FOOTER_P);
	if (err)
		return err;

	if (!vhd_type_dynamic(vhd))
		return 0;

	err = vhd_read_footer_at(vhd, &footer, 0);
	if (err)
		return err;

	vhd_footer_out(&footer);
	err = vhd_journal_update(j, 0,
				 (char *)&footer,
				 sizeof(vhd_footer_t),
				 VHD_JOURNAL_ENTRY_TYPE_FOOTER_C);

	return err;
}

static int
vhd_journal_add_header(vhd_journal_t *j)
{
	int err;
	off64_t off;
	vhd_context_t *vhd;
	vhd_header_t header;

	vhd = &j->vhd;

	err = vhd_read_header(vhd, &header);
	if (err)
		return err;

	off = vhd->footer.data_offset;

	vhd_header_out(&header);
	err = vhd_journal_update(j, off,
				 (char *)&header,
				 sizeof(vhd_header_t),
				 VHD_JOURNAL_ENTRY_TYPE_HEADER);

	return err;
}

static int
vhd_journal_add_locators(vhd_journal_t *j)
{
	int i, n, err;
	vhd_context_t *vhd;

	vhd = &j->vhd;

	err = vhd_get_header(vhd);
	if (err)
		return err;

	n = sizeof(vhd->header.loc) / sizeof(vhd_parent_locator_t);
	for (i = 0; i < n; i++) {
		char *buf;
		off64_t off;
		size_t size;
		vhd_parent_locator_t *loc;

		loc  = vhd->header.loc + i;
		err  = vhd_validate_platform_code(loc->code);
		if (err)
			return err;

		if (loc->code == PLAT_CODE_NONE)
			continue;

		off  = loc->data_offset;
		size = vhd_parent_locator_size(loc);

		err  = posix_memalign((void **)&buf, VHD_SECTOR_SIZE, size);
		if (err)
			return -err;

		err  = vhd_seek(vhd, off, SEEK_SET);
		if (err)
			goto end;

		err  = vhd_read(vhd, buf, size);
		if (err)
			goto end;

		err  = vhd_journal_update(j, off, buf, size,
					  VHD_JOURNAL_ENTRY_TYPE_LOCATOR);
		if (err)
			goto end;

		err = 0;

	end:
		free(buf);
		if (err)
			break;
	}

	return err;
}

static int
vhd_journal_add_bat(vhd_journal_t *j)
{
	int err;
	off64_t off;
	size_t size;
	vhd_bat_t bat;
	vhd_context_t *vhd;

	vhd  = &j->vhd;

	err  = vhd_get_header(vhd);
	if (err)
		return err;

	err  = vhd_read_bat(vhd, &bat);
	if (err)
		return err;

	off  = vhd->header.table_offset;
	size = vhd_bytes_padded(bat.entries * sizeof(uint32_t));

	vhd_bat_out(&bat);
	err  = vhd_journal_update(j, off, (char *)bat.bat, size,
				  VHD_JOURNAL_ENTRY_TYPE_BAT);

	free(bat.bat);
	return err;
}

static int
vhd_journal_add_batmap(vhd_journal_t *j)
{
	int err;
	off64_t off;
	size_t size;
	vhd_context_t *vhd;
	vhd_batmap_t batmap;

	vhd  = &j->vhd;

	err  = vhd_batmap_header_offset(vhd, &off);
	if (err)
		return err;

	err  = vhd_read_batmap(vhd, &batmap);
	if (err)
		return err;

	size = vhd_bytes_padded(sizeof(struct dd_batmap_hdr));

	vhd_batmap_header_out(&batmap);
	err  = vhd_journal_update(j, off, (char *)&batmap.header, size,
				  VHD_JOURNAL_ENTRY_TYPE_BATMAP_H);
	if (err)
		goto out;

	vhd_batmap_header_in(&batmap);
	off  = batmap.header.batmap_offset;
	size = vhd_sectors_to_bytes(batmap.header.batmap_size);

	err  = vhd_journal_update(j, off, batmap.map, size,
				  VHD_JOURNAL_ENTRY_TYPE_BATMAP_M);

out:
	free(batmap.map);
	return err;
}

static int
vhd_journal_add_metadata(vhd_journal_t *j)
{
	int err;
	off64_t eof;
	vhd_context_t *vhd;

	vhd = &j->vhd;

	err = vhd_journal_add_footer(j);
	if (err)
		return err;

	if (!vhd_type_dynamic(vhd))
		return 0;

	err = vhd_journal_add_header(j);
	if (err)
		return err;

	err = vhd_journal_add_locators(j);
	if (err)
		return err;

	err = vhd_journal_add_bat(j);
	if (err)
		return err;

	if (vhd_has_batmap(vhd)) {
		err = vhd_journal_add_batmap(j);
		if (err)
			return err;
	}

	j->header.journal_data_offset = j->header.journal_eof;
	return vhd_journal_write_header(j, &j->header);
}

static int
__vhd_journal_read_footer(vhd_journal_t *j,
			  vhd_footer_t *footer, uint32_t type)
{
	int err;
	vhd_journal_entry_t entry;

	err = vhd_journal_read_entry(j, &entry);
	if (err)
		return err;

	if (entry.type != type)
		return -EINVAL;

	if (entry.size != sizeof(vhd_footer_t))
		return -EINVAL;

	err = vhd_journal_read(j, footer, entry.size);
	if (err)
		return err;

	vhd_footer_in(footer);
	return vhd_validate_footer(footer);
}

static int
vhd_journal_read_footer(vhd_journal_t *j, vhd_footer_t *footer)
{
	return __vhd_journal_read_footer(j, footer,
					 VHD_JOURNAL_ENTRY_TYPE_FOOTER_P);
}

static int
vhd_journal_read_footer_copy(vhd_journal_t *j, vhd_footer_t *footer)
{
	return __vhd_journal_read_footer(j, footer,
					 VHD_JOURNAL_ENTRY_TYPE_FOOTER_C);
}

static int
vhd_journal_read_header(vhd_journal_t *j, vhd_header_t *header)
{
	int err;
	vhd_journal_entry_t entry;

	err = vhd_journal_read_entry(j, &entry);
	if (err)
		return err;

	if (entry.type != VHD_JOURNAL_ENTRY_TYPE_HEADER)
		return -EINVAL;

	if (entry.size != sizeof(vhd_header_t))
		return -EINVAL;

	err = vhd_journal_read(j, header, entry.size);
	if (err)
		return err;

	vhd_header_in(header);
	return vhd_validate_header(header);
}

static int
vhd_journal_read_locators(vhd_journal_t *j, char ***locators, int *locs)
{
	int err, n, _locs;
	char **_locators, *buf;
	off_t pos;
	vhd_journal_entry_t entry;

	_locs     = 0;
	*locs     = 0;
	*locators = NULL;

	n = sizeof(j->vhd.header.loc) / sizeof(vhd_parent_locator_t);
	_locators = calloc(n, sizeof(char *));
	if (!_locators)
		return -ENOMEM;

	for (;;) {
		buf = NULL;

		pos = vhd_journal_position(j);
		err = vhd_journal_read_entry(j, &entry);
		if (err)
			goto fail;

		if (entry.type != VHD_JOURNAL_ENTRY_TYPE_LOCATOR) {
			err = vhd_journal_seek(j, pos, SEEK_SET);
			if (err)
				goto fail;
			break;
		}

		if (_locs >= n) {
			err = -EINVAL;
			goto fail;
		}

		err = posix_memalign((void **)&buf,
				     VHD_SECTOR_SIZE, entry.size);
		if (err) {
			err = -err;
			buf = NULL;
			goto fail;
		}

		err = vhd_journal_read(j, buf, entry.size);
		if (err)
			goto fail;

		_locators[_locs++] = buf;
		err                = 0;
	}


	*locs     = _locs;
	*locators = _locators;

	return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产成人在线免费| 国产成+人+日韩+欧美+亚洲| 亚洲人123区| 成人欧美一区二区三区小说| 欧美va天堂va视频va在线| 日韩免费一区二区| 国产婷婷色一区二区三区四区| 国产清纯白嫩初高生在线观看91| 国产欧美视频在线观看| 国产精品看片你懂得| 一卡二卡三卡日韩欧美| 亚洲一区二区三区视频在线| 青青草原综合久久大伊人精品优势| 日韩中文字幕一区二区三区| 奇米四色…亚洲| av在线播放不卡| 91精品国产综合久久精品| 91麻豆.com| 99久久99精品久久久久久| 欧美电影在哪看比较好| 国产亚洲精品7777| 亚洲成人精品一区| 国产成人免费xxxxxxxx| 欧美在线免费观看视频| 欧美经典一区二区三区| 日韩av电影免费观看高清完整版 | 精品在线免费视频| 91一区二区三区在线观看| 精品国产不卡一区二区三区| 亚洲专区一二三| 色悠久久久久综合欧美99| 久久久午夜精品理论片中文字幕| 亚洲老妇xxxxxx| 成人性视频网站| 国产亚洲一区字幕| 国产乱码一区二区三区| 日韩美女在线视频| 日本vs亚洲vs韩国一区三区二区| 91美女在线观看| 国产精品女主播av| 国产一区欧美二区| 精品国一区二区三区| 免费在线成人网| 日韩一区二区三区在线观看| 性做久久久久久久免费看| 欧美性欧美巨大黑白大战| 伊人色综合久久天天人手人婷| 九九国产精品视频| 国产精品人成在线观看免费 | 精品日韩在线观看| 国产麻豆视频精品| 中文字幕av一区二区三区| 国产精品一卡二| 亚洲精品日产精品乱码不卡| 日本二三区不卡| 三级成人在线视频| 日韩欧美亚洲国产另类| 国产成a人无v码亚洲福利| 色婷婷av一区二区三区软件| 国产精品国产精品国产专区不蜜| 国产精品一区二区三区99| 国产精品久久久久久久久果冻传媒 | 精品免费国产二区三区| 国产在线精品不卡| 亚洲精品视频免费看| 欧美二区三区的天堂| 不卡的av在线播放| 免费成人美女在线观看| 最新热久久免费视频| 日韩三级在线观看| 国产精品资源在线看| 亚洲视频免费在线观看| 日韩免费高清av| 91麻豆精品国产91久久久资源速度| 国产精品一区三区| 日韩vs国产vs欧美| 一区二区三区四区不卡视频| 欧美国产亚洲另类动漫| 精品对白一区国产伦| 日韩视频不卡中文| 欧美一级生活片| 欧美日韩精品一区二区三区四区| 久久精品国产77777蜜臀| 亚洲欧美色一区| 一卡二卡三卡日韩欧美| 亚洲天堂成人网| 国产精品国产精品国产专区不蜜| 久久影院电视剧免费观看| 久久品道一品道久久精品| 久久亚洲综合色| 精品久久久久久无| 精品国产亚洲在线| 久久久亚洲精华液精华液精华液| 日韩欧美区一区二| 久久毛片高清国产| 亚洲少妇30p| 亚洲国产va精品久久久不卡综合| 亚洲一区二区三区四区在线观看| 亚洲一区二区三区爽爽爽爽爽| 国产精品入口麻豆九色| 亚洲精品国产一区二区三区四区在线| 日韩一区中文字幕| 亚洲国产精品人人做人人爽| 亚洲不卡av一区二区三区| 精品在线免费观看| 91啪在线观看| 精品国产成人系列| 成人欧美一区二区三区视频网页| 亚洲成人动漫一区| 国产一区高清在线| 欧美日本乱大交xxxxx| 久久精品免费在线观看| 亚洲一区免费在线观看| 国产91清纯白嫩初高中在线观看| 99久久精品国产网站| 欧美肥妇bbw| 久久精品亚洲国产奇米99| 亚洲成av人在线观看| 粉嫩av亚洲一区二区图片| 日韩一区二区三区免费看 | 91亚洲永久精品| 久久综合99re88久久爱| 天堂影院一区二区| 欧洲色大大久久| 一区二区在线看| 国产精品一区二区久久精品爱涩| 国产成人综合在线| 欧美一区2区视频在线观看| 欧美mv和日韩mv的网站| 亚洲观看高清完整版在线观看| 风间由美一区二区av101| 精品国产乱码久久久久久夜甘婷婷| 性欧美大战久久久久久久久| 色综合久久66| 亚洲成人资源在线| 69久久99精品久久久久婷婷 | 丁香婷婷综合色啪| 国产欧美精品一区| 成人av免费网站| 亚洲日本韩国一区| 欧美电影一区二区三区| 免费观看一级欧美片| 欧美国产精品中文字幕| 97超碰欧美中文字幕| 亚洲成人一区二区| 久久影院视频免费| 成人午夜激情影院| 国产精品日日摸夜夜摸av| 91蜜桃传媒精品久久久一区二区| 亚洲一区二区在线免费看| 精品日韩成人av| 欧亚洲嫩模精品一区三区| 六月丁香综合在线视频| 国产精品美女久久久久久久网站| 99精品视频一区二区| 亚洲综合丝袜美腿| 久久久久综合网| 欧美午夜精品电影| 大白屁股一区二区视频| 青青草国产精品亚洲专区无| 综合激情成人伊人| 亚洲精品在线观看网站| 91女人视频在线观看| 精品一区二区三区久久| 一区二区三区高清不卡| 国产精品福利一区二区| wwwwxxxxx欧美| 6080yy午夜一二三区久久| 一本色道综合亚洲| 盗摄精品av一区二区三区| 久久电影网站中文字幕| 蜜桃视频在线观看一区| 亚洲成人av一区二区三区| 亚洲一区二区三区四区在线免费观看 | 精品国产不卡一区二区三区| 欧美日韩国产免费一区二区 | 亚洲成a人片综合在线| 亚洲激情校园春色| 欧美激情综合网| 国产精品免费观看视频| 国产精品私人影院| 亚洲素人一区二区| 亚洲一区免费观看| 久国产精品韩国三级视频| 另类小说综合欧美亚洲| 国产真实精品久久二三区| 国产在线播精品第三| 成人av影视在线观看| 在线免费亚洲电影| 欧美精品电影在线播放| 精品久久久网站| 中文字幕一区三区| 婷婷丁香久久五月婷婷| 国产一区二区三区电影在线观看| 成人av资源在线观看| 欧美日韩卡一卡二| 中文字幕欧美国产| 午夜精品一区二区三区三上悠亚| 青青草国产精品97视觉盛宴| 国产宾馆实践打屁股91|