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

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

?? block-qcow.c

?? xen虛擬機源代碼安裝包
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* block-qcow.c * * Asynchronous Qemu copy-on-write disk implementation. * Code based on the Qemu implementation * (see copyright notice below) * * (c) 2006 Andrew Warfield and Julian Chesterfield * *//* * Block driver for the QCOW format *  * Copyright (c) 2004 Fabrice Bellard *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files(the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: */#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/statvfs.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <string.h>#include <zlib.h>#include <inttypes.h>#include <libaio.h>#include "bswap.h"#include "aes.h"#include "tapdisk.h"#include "tapaio.h"#include "blk.h"/* *BSD has no O_LARGEFILE */#ifndef O_LARGEFILE#define O_LARGEFILE	0#endif#if 1#define ASSERT(_p) \    if ( !(_p) ) { DPRINTF("Assertion '%s' failed, line %d, file %s", #_p , \    __LINE__, __FILE__); *(int*)0=0; }#else#define ASSERT(_p) ((void)0)#endif#define ROUNDUP(l, s) \({ \    (uint64_t)( \        (l + (s - 1)) - ((l + (s - 1)) % s)); \})#undef IOCB_IDX#define IOCB_IDX(_s, _io) ((_io) - (_s)->iocb_list)#define ZERO_TEST(_b) (_b | 0x00)/**************************************************************//* QEMU COW block driver with compression and encryption support */#define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)#define XEN_MAGIC  (('X' << 24) | ('E' << 16) | ('N' << 8) | 0xfb)#define QCOW_VERSION 1#define QCOW_CRYPT_NONE 0x00#define QCOW_CRYPT_AES  0x01#define QCOW_OFLAG_COMPRESSED (1LL << 63)#define SPARSE_FILE 0x01#define EXTHDR_L1_BIG_ENDIAN 0x02#ifndef O_BINARY#define O_BINARY 0#endiftypedef struct QCowHeader {	uint32_t magic;	uint32_t version;	uint64_t backing_file_offset;	uint32_t backing_file_size;	uint32_t mtime;	uint64_t size; /* in bytes */	uint8_t cluster_bits;	uint8_t l2_bits;	uint32_t crypt_method;	uint64_t l1_table_offset;} QCowHeader;/*Extended header for Xen enhancements*/typedef struct QCowHeader_ext {        uint32_t xmagic;        uint32_t cksum;        uint32_t min_cluster_alloc;        uint32_t flags;} QCowHeader_ext;#define L2_CACHE_SIZE 16  /*Fixed allocation in Qemu*/struct tdqcow_state {        int fd;                        /*Main Qcow file descriptor */	uint64_t fd_end;               /*Store a local record of file length */	char *name;                    /*Record of the filename*/	uint32_t backing_file_size;	uint64_t backing_file_offset;	int encrypted;                 /*File contents are encrypted or plain*/	int cluster_bits;              /*Determines length of cluster as 					*indicated by file hdr*/	int cluster_size;              /*Length of cluster*/	int cluster_sectors;           /*Number of sectors per cluster*/	int cluster_alloc;             /*Blktap fix for allocating full 					*extents*/	int min_cluster_alloc;         /*Blktap historical extent alloc*/	int sparse;                    /*Indicates whether to preserve sparseness*/	int l2_bits;                   /*Size of L2 table entry*/	int l2_size;                   /*Full table size*/	int l1_size;                   /*L1 table size*/	uint64_t cluster_offset_mask;    	uint64_t l1_table_offset;      /*L1 table offset from beginning of 					*file*/	uint64_t *l1_table;            /*L1 table entries*/	uint64_t *l2_cache;            /*We maintain a cache of size 					*L2_CACHE_SIZE of most read entries*/	uint64_t l2_cache_offsets[L2_CACHE_SIZE];     /*L2 cache entries*/	uint32_t l2_cache_counts[L2_CACHE_SIZE];      /*Cache access record*/	uint8_t *cluster_cache;          	uint8_t *cluster_data;	uint64_t cluster_cache_offset; /**/	uint32_t crypt_method;         /*current crypt method, 0 if no 					*key yet */	uint32_t crypt_method_header;  /**/	AES_KEY aes_encrypt_key;       /*AES key*/	AES_KEY aes_decrypt_key;       /*AES key*/        	/* libaio state */	tap_aio_context_t	aio;};static int decompress_cluster(struct tdqcow_state *s, uint64_t cluster_offset);#ifdef USE_GCRYPT#include <gcrypt.h>static uint32_t gen_cksum(char *ptr, int len){	int i;	uint32_t md[4];	/* Convert L1 table to big endian */	for(i = 0; i < len / sizeof(uint64_t); i++) {		cpu_to_be64s(&((uint64_t*) ptr)[i]);	}	/* Generate checksum */	gcry_md_hash_buffer(GCRY_MD_MD5, md, ptr, len);	/* Convert L1 table back to native endianess */	for(i = 0; i < len / sizeof(uint64_t); i++) {		be64_to_cpus(&((uint64_t*) ptr)[i]);	}	return md[0];}#else /* use libcrypto */#include <openssl/md5.h>static uint32_t gen_cksum(char *ptr, int len){	int i;	unsigned char *md;	uint32_t ret;	md = malloc(MD5_DIGEST_LENGTH);	if(!md) return 0;	/* Convert L1 table to big endian */	for(i = 0; i < len / sizeof(uint64_t); i++) {		cpu_to_be64s(&((uint64_t*) ptr)[i]);	}	/* Generate checksum */	if (MD5((unsigned char *)ptr, len, md) != md)		ret = 0;	else		memcpy(&ret, md, sizeof(uint32_t));	/* Convert L1 table back to native endianess */	for(i = 0; i < len / sizeof(uint64_t); i++) {		be64_to_cpus(&((uint64_t*) ptr)[i]);	}	free(md);	return ret;}#endifstatic int get_filesize(char *filename, uint64_t *size, struct stat *st){	int fd;	QCowHeader header;	/*Set to the backing file size*/	fd = open(filename, O_RDONLY);	if (fd < 0)		return -1;	if (read(fd, &header, sizeof(header)) < sizeof(header)) {		close(fd);		return -1;	}	close(fd);		be32_to_cpus(&header.magic);	be64_to_cpus(&header.size);	if (header.magic == QCOW_MAGIC) {		*size = header.size >> SECTOR_SHIFT;		return 0;	}	if(S_ISBLK(st->st_mode)) {		fd = open(filename, O_RDONLY);		if (fd < 0)			return -1;		if (blk_getimagesize(fd, size) != 0) {			close(fd);			return -1;		}		close(fd);	} else *size = (st->st_size >> SECTOR_SHIFT);		return 0;}static int qcow_set_key(struct tdqcow_state *s, const char *key){	uint8_t keybuf[16];	int len, i;		memset(keybuf, 0, 16);	len = strlen(key);	if (len > 16)		len = 16;	/* XXX: we could compress the chars to 7 bits to increase	   entropy */	for (i = 0; i < len; i++) {		keybuf[i] = key[i];	}	s->crypt_method = s->crypt_method_header;		if (AES_set_encrypt_key(keybuf, 128, &s->aes_encrypt_key) != 0)		return -1;	if (AES_set_decrypt_key(keybuf, 128, &s->aes_decrypt_key) != 0)		return -1;#if 0	/* test */	{		uint8_t in[16];		uint8_t out[16];		uint8_t tmp[16];		for (i=0; i<16; i++)			in[i] = i;		AES_encrypt(in, tmp, &s->aes_encrypt_key);		AES_decrypt(tmp, out, &s->aes_decrypt_key);		for (i = 0; i < 16; i++)			DPRINTF(" %02x", tmp[i]);		DPRINTF("\n");		for (i = 0; i < 16; i++)			DPRINTF(" %02x", out[i]);		DPRINTF("\n");	}#endif	return 0;}/*  * The crypt function is compatible with the linux cryptoloop * algorithm for < 4 GB images. NOTE: out_buf == in_buf is * supported . */static void encrypt_sectors(struct tdqcow_state *s, int64_t sector_num,                            uint8_t *out_buf, const uint8_t *in_buf,                            int nb_sectors, int enc,                            const AES_KEY *key){	union {		uint64_t ll[2];		uint8_t b[16];	} ivec;	int i;		for (i = 0; i < nb_sectors; i++) {		ivec.ll[0] = cpu_to_le64(sector_num);		ivec.ll[1] = 0;		AES_cbc_encrypt(in_buf, out_buf, 512, key, 				ivec.b, enc);		sector_num++;		in_buf += 512;		out_buf += 512;	}}static int qtruncate(int fd, off_t length, int sparse){	int ret, i; 	int current = 0, rem = 0;	uint64_t sectors;	struct stat st;	char *buf;	/* If length is greater than the current file len	 * we synchronously write zeroes to the end of the 	 * file, otherwise we truncate the length down	 */	ret = fstat(fd, &st);	if (ret == -1) 		return -1;	if (S_ISBLK(st.st_mode))		return 0;	sectors = (length + DEFAULT_SECTOR_SIZE - 1)/DEFAULT_SECTOR_SIZE;	current = (st.st_size + DEFAULT_SECTOR_SIZE - 1)/DEFAULT_SECTOR_SIZE;	rem     = st.st_size % DEFAULT_SECTOR_SIZE;	/* If we are extending this file, we write zeros to the end --	 * this tries to ensure that the extents allocated wind up being	 * contiguous on disk.	 */	if(st.st_size < sectors * DEFAULT_SECTOR_SIZE) {		/*We are extending the file*/		if ((ret = posix_memalign((void **)&buf, 					  512, DEFAULT_SECTOR_SIZE))) {			DPRINTF("posix_memalign failed: %d\n", ret);			return -1;		}		memset(buf, 0x00, DEFAULT_SECTOR_SIZE);		if (lseek(fd, 0, SEEK_END)==-1) {			DPRINTF("Lseek EOF failed (%d), internal error\n",				errno);			free(buf);			return -1;		}		if (rem) {			ret = write(fd, buf, rem);			if (ret != rem) {				DPRINTF("write failed: ret = %d, err = %s\n",					ret, strerror(errno));				free(buf);				return -1;			}		}		for (i = current; i < sectors; i++ ) {			ret = write(fd, buf, DEFAULT_SECTOR_SIZE);			if (ret != DEFAULT_SECTOR_SIZE) {				DPRINTF("write failed: ret = %d, err = %s\n",					ret, strerror(errno));				free(buf);				return -1;			}		}		free(buf);	} else if(sparse && (st.st_size > sectors * DEFAULT_SECTOR_SIZE))		if (ftruncate(fd, (off_t)sectors * DEFAULT_SECTOR_SIZE)==-1) {			DPRINTF("Ftruncate failed (%s)\n", strerror(errno));			return -1;		}	return 0;}/* 'allocate' is: * * 0 to not allocate. * * 1 to allocate a normal cluster (for sector indexes 'n_start' to * 'n_end') * * 2 to allocate a compressed cluster of size * 'compressed_size'. 'compressed_size' must be > 0 and < * cluster_size  * * return 0 if not allocated. */static uint64_t get_cluster_offset(struct tdqcow_state *s,                                   uint64_t offset, int allocate,                                   int compressed_size,                                   int n_start, int n_end){	int min_index, i, j, l1_index, l2_index, l2_sector, l1_sector;	char *tmp_ptr2, *l2_ptr, *l1_ptr;	uint64_t *tmp_ptr;	uint64_t l2_offset, *l2_table, cluster_offset, tmp;	uint32_t min_count;	int new_l2_table;	/*Check L1 table for the extent offset*/	l1_index = offset >> (s->l2_bits + s->cluster_bits);	l2_offset = s->l1_table[l1_index];	new_l2_table = 0;	if (!l2_offset) {		if (!allocate)			return 0;		/* 		 * allocating a new l2 entry + extent 		 * at the end of the file, we must also		 * update the L1 entry safely.		 */		l2_offset = s->fd_end;		/* round to cluster size */		l2_offset = (l2_offset + s->cluster_size - 1) 			& ~(s->cluster_size - 1);		/* update the L1 entry */		s->l1_table[l1_index] = l2_offset;		tmp = cpu_to_be64(l2_offset);				/*Truncate file for L2 table 		 *(initialised to zero in case we crash)*/		if (qtruncate(s->fd, 			      l2_offset + (s->l2_size * sizeof(uint64_t)),			      s->sparse) != 0) {			DPRINTF("ERROR truncating file\n");			return 0;		}		s->fd_end = l2_offset + (s->l2_size * sizeof(uint64_t));		/*Update the L1 table entry on disk                 * (for O_DIRECT we write 4KByte blocks)*/		l1_sector = (l1_index * sizeof(uint64_t)) >> 12;		l1_ptr = (char *)s->l1_table + (l1_sector << 12);		if (posix_memalign((void **)&tmp_ptr, 4096, 4096) != 0) {			DPRINTF("ERROR allocating memory for L1 table\n");		}		memcpy(tmp_ptr, l1_ptr, 4096);		/* Convert block to write to big endian */		for(i = 0; i < 4096 / sizeof(uint64_t); i++) {			cpu_to_be64s(&tmp_ptr[i]);		}		/*		 * Issue non-asynchronous L1 write.		 * For safety, we must ensure that		 * entry is written before blocks.		 */		lseek(s->fd, s->l1_table_offset + (l1_sector << 12), SEEK_SET);		if (write(s->fd, tmp_ptr, 4096) != 4096) {			free(tmp_ptr);		 	return 0;		}		free(tmp_ptr);		new_l2_table = 1;		goto cache_miss;	} else if (s->min_cluster_alloc == s->l2_size) {		/*Fast-track the request*/		cluster_offset = l2_offset + (s->l2_size * sizeof(uint64_t));		l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);		return cluster_offset + (l2_index * s->cluster_size);	}	/*Check to see if L2 entry is already cached*/	for (i = 0; i < L2_CACHE_SIZE; i++) {		if (l2_offset == s->l2_cache_offsets[i]) {			/* increment the hit count */			if (++s->l2_cache_counts[i] == 0xffffffff) {				for (j = 0; j < L2_CACHE_SIZE; j++) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九精品视频在线看| 蜜臀av一级做a爰片久久| 91久久国产综合久久| 亚洲成人在线网站| 久久久精品免费观看| 色哟哟一区二区三区| 国产精品国产精品国产专区不片| 色哟哟国产精品| 天堂在线一区二区| 久久噜噜亚洲综合| 欧美午夜影院一区| 国产精品一区免费视频| 亚洲国产视频一区二区| 久久精品一区八戒影视| 欧美日韩一区二区三区视频| 国产大陆亚洲精品国产| 亚洲国产精品久久不卡毛片| 国产亚洲精品aa| 欧美日韩精品一区二区三区四区| 国产成人免费av在线| 天堂va蜜桃一区二区三区| 自拍偷拍亚洲综合| 欧美成人一区二区三区片免费| 一本一道久久a久久精品| 狠狠色丁香久久婷婷综合_中| 亚洲精品国产品国语在线app| 欧美v日韩v国产v| 欧美亚洲自拍偷拍| 成人中文字幕在线| 九色综合狠狠综合久久| 国产精品免费丝袜| 精品av综合导航| 欧美日本韩国一区二区三区视频| 成人一区二区在线观看| 久久精品国产亚洲5555| 亚洲国产一区二区三区青草影视| 久久久99免费| 日韩亚洲欧美中文三级| 欧美精品在线一区二区| 91国偷自产一区二区开放时间| 国产成人av资源| 久久99精品久久久久久久久久久久| 一区二区三区精品视频在线| 国产精品丝袜久久久久久app| 精品少妇一区二区三区视频免付费 | 精品国产精品网麻豆系列| 免费在线一区观看| 亚洲国产精品嫩草影院| 麻豆91免费看| 国产在线播放一区| 亚洲一区二区三区爽爽爽爽爽| 精品国产免费人成在线观看| 4hu四虎永久在线影院成人| 精品视频在线免费观看| 欧美中文字幕一区二区三区| 日本精品免费观看高清观看| 91影视在线播放| 日本道在线观看一区二区| 色综合中文字幕国产| 国产乱码精品一品二品| 国产精品1区2区3区在线观看| 久久国产尿小便嘘嘘| 久久精品国产久精国产| 男女男精品视频网| 麻豆国产91在线播放| 日韩精品视频网站| 亚洲超碰精品一区二区| 视频一区二区三区中文字幕| 亚洲愉拍自拍另类高清精品| 国产精品人妖ts系列视频| 国产一区二区三区黄视频| 国产iv一区二区三区| av电影在线观看不卡| 97久久精品人人爽人人爽蜜臀 | 日韩 欧美一区二区三区| 日韩不卡免费视频| 精品一区精品二区高清| 午夜精品久久久久久久99水蜜桃| 日产精品久久久久久久性色| 久久国产精品区| 国产剧情av麻豆香蕉精品| 91亚洲国产成人精品一区二区三| 色婷婷亚洲一区二区三区| 欧美精选午夜久久久乱码6080| 成人午夜碰碰视频| 91在线观看一区二区| 色婷婷综合激情| 一区视频在线播放| 欧美人与性动xxxx| 日韩视频一区在线观看| 欧美三级电影网| 成人毛片在线观看| 国产在线视频精品一区| 国产美女精品人人做人人爽 | 99re8在线精品视频免费播放| 国产一区二区剧情av在线| 蜜桃视频免费观看一区| 国产一区二区毛片| 欧美在线免费观看亚洲| 国产亚洲污的网站| 一级日本不卡的影视| 黄网站免费久久| 欧美三级电影一区| 国产女同互慰高潮91漫画| 一片黄亚洲嫩模| 成人午夜看片网址| 这里只有精品免费| 国产精品乱码一区二三区小蝌蚪| 久久精品国产澳门| 91国偷自产一区二区三区成为亚洲经典 | 国产精品久久久久久久第一福利 | av在线这里只有精品| 欧美一级高清片| 亚洲精品中文在线影院| 国产综合色在线| 欧美日韩国产小视频在线观看| 国产夜色精品一区二区av| 中文字幕亚洲成人| 福利一区福利二区| 日韩欧美中文一区| 日韩一区精品字幕| 色吊一区二区三区| 国产片一区二区三区| 日韩精品1区2区3区| 91成人免费电影| 国产精品国产自产拍在线| 奇米影视一区二区三区| 欧美精品99久久久**| 亚洲免费色视频| 福利电影一区二区三区| 国产视频一区二区三区在线观看| 日韩电影一二三区| 欧美怡红院视频| 亚洲人成精品久久久久| 成人精品鲁一区一区二区| 精品国免费一区二区三区| 亚洲成a人v欧美综合天堂| 欧美午夜精品免费| 一区二区三区在线高清| 99久久精品国产导航| 精品美女一区二区三区| 2023国产精品视频| 久久99国产精品久久99果冻传媒| 欧美老女人第四色| 免费高清在线视频一区·| 精品日韩一区二区| 国产精品影视天天线| 国产精品每日更新在线播放网址 | 男女激情视频一区| 久久影视一区二区| 高清不卡一区二区| 日本色综合中文字幕| 日韩丝袜情趣美女图片| 国产一区二区三区| 国产精品久久久久久久久久久免费看 | 欧美激情一区二区三区蜜桃视频| 国产成人免费视频| 亚洲人成网站精品片在线观看| 在线日韩国产精品| 日韩福利视频网| 久久久国产午夜精品| jlzzjlzz国产精品久久| 亚洲图片自拍偷拍| 精品区一区二区| bt7086福利一区国产| 亚洲国产va精品久久久不卡综合| 欧美一区二区三区系列电影| 国产一级精品在线| 亚洲欧美一区二区久久| 在线不卡中文字幕播放| 国产成人午夜99999| 亚洲自拍偷拍欧美| 精品久久人人做人人爱| 91丨porny丨蝌蚪视频| 天天综合色天天综合| 国产香蕉久久精品综合网| 91精品办公室少妇高潮对白| 蜜桃视频在线一区| 国产精品免费人成网站| 欧美色图激情小说| 国产成a人亚洲精品| 亚洲国产精品影院| 国产偷国产偷亚洲高清人白洁| 在线观看亚洲专区| 国产成人在线看| 午夜欧美视频在线观看| 国产精品热久久久久夜色精品三区 | 成人av免费网站| 免费在线观看视频一区| 日韩毛片精品高清免费| 欧美一区二区视频在线观看| 成人短视频下载| 久久se这里有精品| 一区二区三区在线高清| 欧美激情艳妇裸体舞| 日韩欧美一级二级三级久久久| 色噜噜狠狠成人网p站| 国产成人啪免费观看软件| 日本亚洲三级在线| 亚洲夂夂婷婷色拍ww47|