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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? libvhd.c

?? xen source 推出最新的VHD操作工具VHD-UTIL 實(shí)現(xiàn)源碼,超強(qiáng)
?? C
?? 第 1 頁 / 共 5 頁
字號:
			return -errno;

		*end = max - sizeof(vhd_footer_t);
		return 0;
	}

	err = vhd_end_of_headers(ctx, &max);
	if (err)
		return err;

	err = vhd_get_bat(ctx);
	if (err)
		return err;

	max >>= VHD_SECTOR_SHIFT;

	for (i = 0; i < ctx->bat.entries; i++) {
		blk = ctx->bat.bat[i];

		if (blk != DD_BLK_UNUSED) {
			blk += ctx->spb + ctx->bm_secs;
			max  = MAX(blk, max);
		}
	}

	*end = vhd_sectors_to_bytes(max);
	return 0;
}

uint32_t
vhd_time(time_t time)
{
	struct tm tm;
	time_t micro_epoch;

	memset(&tm, 0, sizeof(struct tm));
	tm.tm_year   = 100;
	tm.tm_mon    = 0;
	tm.tm_mday   = 1;
	micro_epoch  = mktime(&tm);

	return (uint32_t)(time - micro_epoch);
}

/* 
 * Stringify the VHD timestamp for printing.
 * As with ctime_r, target must be >=26 bytes.
 */
size_t 
vhd_time_to_string(uint32_t timestamp, char *target)
{
	char *cr;
	struct tm tm;
	time_t t1, t2;

	memset(&tm, 0, sizeof(struct tm));

	/* VHD uses an epoch of 12:00AM, Jan 1, 2000.         */
	/* Need to adjust this to the expected epoch of 1970. */
	tm.tm_year  = 100;
	tm.tm_mon   = 0;
	tm.tm_mday  = 1;

	t1 = mktime(&tm);
	t2 = t1 + (time_t)timestamp;
	ctime_r(&t2, target);

	/* handle mad ctime_r newline appending. */
	if ((cr = strchr(target, '\n')) != NULL)
		*cr = '\0';

	return (strlen(target));
}

/*
 * nabbed from vhd specs.
 */
uint32_t
vhd_chs(uint64_t size)
{
	uint32_t secs, cylinders, heads, spt, cth;

	secs = secs_round_up_no_zero(size);

	if (secs > 65535 * 16 * 255)
		secs = 65535 * 16 * 255;

	if (secs >= 65535 * 16 * 63) {
		spt   = 255;
		cth   = secs / spt;
		heads = 16;
	} else {
		spt   = 17;
		cth   = secs / spt;
		heads = (cth + 1023) / 1024;

		if (heads < 4)
			heads = 4;

		if (cth >= (heads * 1024) || heads > 16) {
			spt   = 31;
			cth   = secs / spt;
			heads = 16;
		}

		if (cth >= heads * 1024) {
			spt   = 63;
			cth   = secs / spt;
			heads = 16;
		}
	}

	cylinders = cth / heads;

	return GEOM_ENCODE(cylinders, heads, spt);
}

int
vhd_get_footer(vhd_context_t *ctx)
{
	if (!vhd_validate_footer(&ctx->footer))
		return 0;

	return vhd_read_footer(ctx, &ctx->footer);
}

int
vhd_get_header(vhd_context_t *ctx)
{
	if (!vhd_type_dynamic(ctx))
		return -EINVAL;

	if (!vhd_validate_header(&ctx->header))
		return 0;

	return vhd_read_header(ctx, &ctx->header);
}

int
vhd_get_bat(vhd_context_t *ctx)
{
	if (!vhd_type_dynamic(ctx))
		return -EINVAL;

	if (!vhd_validate_bat(&ctx->bat))
		return 0;

	vhd_put_bat(ctx);
	return vhd_read_bat(ctx, &ctx->bat);
}

int
vhd_get_batmap(vhd_context_t *ctx)
{
	if (!vhd_has_batmap(ctx))
		return -EINVAL;

	if (!vhd_validate_batmap(&ctx->batmap))
		return 0;

	vhd_put_batmap(ctx);
	return vhd_read_batmap(ctx, &ctx->batmap);
}

void
vhd_put_footer(vhd_context_t *ctx)
{
	memset(&ctx->footer, 0, sizeof(vhd_footer_t));
}

void
vhd_put_header(vhd_context_t *ctx)
{
	memset(&ctx->header, 0, sizeof(vhd_header_t));
}

void
vhd_put_bat(vhd_context_t *ctx)
{
	if (!vhd_type_dynamic(ctx))
		return;

	free(ctx->bat.bat);
	memset(&ctx->bat, 0, sizeof(vhd_bat_t));
}

void
vhd_put_batmap(vhd_context_t *ctx)
{
	if (!vhd_type_dynamic(ctx))
		return;

	if (!vhd_has_batmap(ctx))
		return;

	free(ctx->batmap.map);
	memset(&ctx->batmap, 0, sizeof(vhd_batmap_t));
}

/*
 * look for 511 byte footer at end of file
 */
int
vhd_read_short_footer(vhd_context_t *ctx, vhd_footer_t *footer)
{
	int err;
	char *buf;
	off64_t eof;

	buf = NULL;

	err = vhd_seek(ctx, 0, SEEK_END);
	if (err)
		goto out;

	eof = vhd_position(ctx);
	if (eof == (off64_t)-1) {
		err = -errno;
		goto out;
	}

	err = vhd_seek(ctx, eof - 511, SEEK_SET);
	if (err)
		goto out;

	err = posix_memalign((void **)&buf,
			     VHD_SECTOR_SIZE, sizeof(vhd_footer_t));
	if (err) {
		buf = NULL;
		err = -err;
		goto out;
	}

	memset(buf, 0, sizeof(vhd_footer_t));

	/*
	 * expecting short read here
	 */
	vhd_read(ctx, buf, sizeof(vhd_footer_t));

	memcpy(footer, buf, sizeof(vhd_footer_t));

	vhd_footer_in(footer);
	err = vhd_validate_footer(footer);

out:
	if (err)
		VHDLOG("%s: failed reading short footer: %d\n",
		       ctx->file, err);
	free(buf);
	return err;
}

int
vhd_read_footer_at(vhd_context_t *ctx, vhd_footer_t *footer, off64_t off)
{
	int err;
	char *buf;

	buf = NULL;

	err = vhd_seek(ctx, off, SEEK_SET);
	if (err)
		goto out;

	err = posix_memalign((void **)&buf,
			     VHD_SECTOR_SIZE, sizeof(vhd_footer_t));
	if (err) {
		buf = NULL;
		err = -err;
		goto out;
	}

	err = vhd_read(ctx, buf, sizeof(vhd_footer_t));
	if (err)
		goto out;

	memcpy(footer, buf, sizeof(vhd_footer_t));

	vhd_footer_in(footer);
	err = vhd_validate_footer(footer);

out:
	if (err)
		VHDLOG("%s: reading footer at 0x%08"PRIx64" failed: %d\n",
		       ctx->file, off, err);
	free(buf);
	return err;
}

int
vhd_read_footer(vhd_context_t *ctx, vhd_footer_t *footer)
{
	int err;
	off64_t off;

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

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

	err = vhd_read_footer_at(ctx, footer, off - 512);
	if (err != -EINVAL)
		return err;

	err = vhd_read_short_footer(ctx, footer);
	if (err != -EINVAL)
		return err;

	if (ctx->oflags & VHD_OPEN_STRICT)
		return -EINVAL;

	return vhd_read_footer_at(ctx, footer, 0);
}

int
vhd_read_header_at(vhd_context_t *ctx, vhd_header_t *header, off64_t off)
{
	int err;
	char *buf;

	buf = NULL;

	if (!vhd_type_dynamic(ctx)) {
		err = -EINVAL;
		goto out;
	}

	err = vhd_seek(ctx, off, SEEK_SET);
	if (err)
		goto out;

	err = posix_memalign((void **)&buf,
			     VHD_SECTOR_SIZE, sizeof(vhd_header_t));
	if (err) {
		buf = NULL;
		err = -err;
		goto out;
	}

	err = vhd_read(ctx, buf, sizeof(vhd_header_t));
	if (err)
		goto out;

	memcpy(header, buf, sizeof(vhd_header_t));

	vhd_header_in(header);
	err = vhd_validate_header(header);

out:
	if (err)
		VHDLOG("%s: reading header at 0x%08"PRIx64" failed: %d\n",
		       ctx->file, off, err);
	free(buf);
	return err;
}

int
vhd_read_header(vhd_context_t *ctx, vhd_header_t *header)
{
	int err;
	off64_t off;

	if (!vhd_type_dynamic(ctx)) {
		VHDLOG("%s is not dynamic!\n", ctx->file);
		return -EINVAL;
	}

	off = ctx->footer.data_offset;
	return vhd_read_header_at(ctx, header, off);
}

int
vhd_read_bat(vhd_context_t *ctx, vhd_bat_t *bat)
{
	int err;
	char *buf;
	off64_t off;
	size_t size;

	buf  = NULL;

	if (!vhd_type_dynamic(ctx)) {
		err = -EINVAL;
		goto fail;
	}

	off  = ctx->header.table_offset;
	size = vhd_bytes_padded(ctx->header.max_bat_size * sizeof(uint32_t));

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

	err = vhd_seek(ctx, off, SEEK_SET);
	if (err)
		goto fail;

	err = vhd_read(ctx, buf, size);
	if (err)
		goto fail;

	bat->spb     = ctx->header.block_size >> VHD_SECTOR_SHIFT;
	bat->entries = ctx->header.max_bat_size;
	bat->bat     = (uint32_t *)buf;

	vhd_bat_in(bat);

	return 0;

fail:
	free(buf);
	memset(bat, 0, sizeof(vhd_bat_t));
	VHDLOG("%s: failed to read bat: %d\n", ctx->file, err);
	return err;
}

static int
vhd_read_batmap_header(vhd_context_t *ctx, vhd_batmap_t *batmap)
{
	int err;
	char *buf;
	off64_t off;
	size_t size;

	buf = NULL;

	err = vhd_batmap_header_offset(ctx, &off);
	if (err)
		goto fail;

	err = vhd_seek(ctx, off, SEEK_SET);
	if (err)
		goto fail;

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

	err = vhd_read(ctx, buf, size);
	if (err)
		goto fail;

	memcpy(&batmap->header, buf, sizeof(vhd_batmap_header_t));
	free(buf);
	buf = NULL;

	vhd_batmap_header_in(batmap);

	return 0;

fail:
	free(buf);
	memset(&batmap->header, 0, sizeof(vhd_batmap_header_t));
	VHDLOG("%s: failed to read batmap header: %d\n", ctx->file, err);
	return err;
}

static int
vhd_read_batmap_map(vhd_context_t *ctx, vhd_batmap_t *batmap)
{
	int err;
	char *buf;
	off64_t off;
	size_t map_size;

	map_size = vhd_sectors_to_bytes(batmap->header.batmap_size);

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

	off  = batmap->header.batmap_offset;
	err  = vhd_seek(ctx, off, SEEK_SET);
	if (err)
		goto fail;

	err  = vhd_read(ctx, buf, map_size);
	if (err)
		goto fail;

	batmap->map = buf;
	return 0;

fail:
	free(buf);
	batmap->map = NULL;
	VHDLOG("%s: failed to read batmap: %d\n", ctx->file, err);
	return err;
}

int
vhd_read_batmap(vhd_context_t *ctx, vhd_batmap_t *batmap)
{
	int err;

	if (!vhd_has_batmap(ctx))
		return -EINVAL;

	memset(batmap, 0, sizeof(vhd_batmap_t));

	err = vhd_read_batmap_header(ctx, batmap);
	if (err)
		return err;

	err = vhd_validate_batmap_header(batmap);
	if (err)
		return err;

	err = vhd_read_batmap_map(ctx, batmap);
	if (err)
		return err;

	err = vhd_validate_batmap(batmap);
	if (err)
		goto fail;

	return 0;

fail:
	free(batmap->map);
	memset(batmap, 0, sizeof(vhd_batmap_t));
	return err;
}

int
vhd_has_batmap(vhd_context_t *ctx)
{
	if (!vhd_type_dynamic(ctx))
		return 0;

	if (!vhd_creator_tapdisk(ctx))
		return 0;

	if (ctx->footer.crtr_ver <= VHD_VERSION(0, 1))
		return 0;

	if (ctx->footer.crtr_ver >= VHD_VERSION(1, 2))
		return 1;

	/*
	 * VHDs of version 1.1 probably have a batmap, but may not 
	 * if they were updated from version 0.1 via vhd-update.
	 */
	if (!vhd_validate_batmap_header(&ctx->batmap))
		return 1;

	if (vhd_read_batmap_header(ctx, &ctx->batmap))
		return 0;

	return (!vhd_validate_batmap_header(&ctx->batmap));
}

/* 
 * Is this a block device (with a fixed size)? This affects whether the file 
 * can be truncated and where the footer is written for VHDs.
 */
int
vhd_test_file_fixed(const char *file, int *is_block)
{
	int err;
	struct stat stats;

	err = stat(file, &stats);
	if (err == -1)
		return -errno;

	*is_block = !!(S_ISBLK(stats.st_mode));
	return err;
}

int
vhd_find_parent(vhd_context_t *ctx, const char *parent, char **_location)
{
	int err;
	char *location, *cpath, *cdir, *path;

	err        = 0;
	path       = NULL;
	cpath      = NULL;
	location   = NULL;
	*_location = NULL;

	if (!parent)
		return -EINVAL;

	if (parent[0] == '/') {
		if (!access(parent, R_OK)) {
			path = strdup(parent);
			if (!path)
				return -ENOMEM;
			*_location = path;
			return 0;
		}
	}

	/* check parent path relative to child's directory */
	cpath = realpath(ctx->file, NULL);
	if (!cpath) {
		err = -errno;
		goto out;
	}

	cdir = dirname(cpath);
	if (asprintf(&location, "%s/%s", cdir, parent) == -1) {
		err = -errno;
		location = NULL;
		goto out;
	}

	if (!access(location, R_OK)) {
		path = realpath(location, NULL);
		if (path) {
			*_location = path;
			return 0;
		}
	}
	err = -errno;

out:
	free(location);
	free(cpath);
	return err;
}

static int 
vhd_macx_encode_location(char *name, char **out, int *outlen)
{
	iconv_t cd;
	int len, err;
	size_t ibl, obl;
	char *uri, *urip, *uri_utf8, *uri_utf8p, *ret;

	err     = 0;
	ret     = NULL;
	*out    = NULL;
	*outlen = 0;
	len     = strlen(name) + strlen("file://");

	ibl     = len;
	obl     = len;

	uri = urip = malloc(ibl + 1);
	uri_utf8 = uri_utf8p = malloc(obl);

	if (!uri || !uri_utf8)
		return -ENOMEM;

	cd = iconv_open("UTF-8", "ASCII");
	if (cd == (iconv_t)-1) {
		err = -errno;
		goto out;
	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区在线看| 亚洲成人自拍偷拍| 久久精品一区二区三区四区| 欧美一区二区三区爱爱| 91精品国产综合久久福利| 在线播放中文字幕一区| 56国语精品自产拍在线观看| 欧美精品丝袜中出| 欧美日韩精品免费观看视频| 欧美日本在线看| 日韩一区国产二区欧美三区| 欧美一区二区播放| 欧美精品一区二区三区蜜桃| 国产片一区二区| 国产精品色噜噜| 亚洲日本在线观看| 亚洲国产一区视频| 日韩精品一二三| 国产一区在线精品| 国产成人综合在线观看| 国产福利视频一区二区三区| 99精品欧美一区二区蜜桃免费| 91美女片黄在线观看91美女| 91看片淫黄大片一级| 欧美在线观看你懂的| 91精品午夜视频| 久久一二三国产| 1区2区3区精品视频| 亚洲午夜精品网| 老司机精品视频线观看86| 国产精品亚洲一区二区三区妖精 | 三级成人在线视频| 免费一区二区视频| 精品视频色一区| 日韩欧美的一区二区| 国产欧美日韩精品一区| 一区二区三区电影在线播| 麻豆精品精品国产自在97香蕉 | 这里只有精品免费| 精品免费99久久| 亚洲同性gay激情无套| 日韩av不卡在线观看| 成人夜色视频网站在线观看| 欧美视频一区二区在线观看| 欧美精品一区二区三区一线天视频| 国产精品二区一区二区aⅴ污介绍| 亚洲一区视频在线| 国产酒店精品激情| 欧美日韩精品一区二区天天拍小说| 欧美岛国在线观看| 一区二区欧美国产| 国产裸体歌舞团一区二区| 日本乱人伦一区| 精品999在线播放| 亚洲小说春色综合另类电影| 国产精品一区二区视频| 欧美熟乱第一页| 日本一区二区三区四区在线视频| 亚洲高清免费在线| 99v久久综合狠狠综合久久| 精品裸体舞一区二区三区| 亚洲综合在线免费观看| 国产一区 二区 三区一级| 91超碰这里只有精品国产| 亚洲欧洲av在线| 国产一区二区三区| 日韩亚洲欧美成人一区| 夜夜揉揉日日人人青青一国产精品| 国产一区二区三区国产| 欧美一级一区二区| 亚洲国产欧美在线| 97精品久久久久中文字幕| 久久青草欧美一区二区三区| 青青草国产精品97视觉盛宴| 色狠狠一区二区三区香蕉| 亚洲国产高清aⅴ视频| 久久精品国产成人一区二区三区| 欧洲视频一区二区| 免费人成在线不卡| 69堂亚洲精品首页| 亚洲一区二区av电影| 色综合久久久久久久久| 欧美极品美女视频| 国产乱码精品一区二区三区忘忧草| 777午夜精品免费视频| 亚洲国产另类av| 91黄色激情网站| 亚洲精品成人悠悠色影视| 99精品桃花视频在线观看| 国产日韩视频一区二区三区| 国产最新精品精品你懂的| 日韩欧美一级二级三级| 奇米色一区二区| 91精品国产综合久久精品性色| 亚洲综合色噜噜狠狠| 色成人在线视频| 伊人性伊人情综合网| 色综合久久天天| 亚洲伦理在线免费看| 色综合久久中文字幕综合网| 亚洲欧美另类久久久精品2019| 成人av免费在线| 国产精品女同一区二区三区| 国产不卡高清在线观看视频| 国产欧美视频一区二区| 国产福利91精品一区| 国产视频一区二区三区在线观看| 国产精品1区二区.| 欧美国产综合一区二区| 成人黄色在线看| 亚洲视频免费观看| 91视频免费观看| 亚洲欧美国产77777| 欧美亚洲国产一区二区三区va| 亚洲一区二区三区四区在线| 欧美日韩在线精品一区二区三区激情 | 欧美日韩一区精品| 日日夜夜一区二区| 日韩欧美一区二区在线视频| 精彩视频一区二区| 国产日本一区二区| 97久久精品人人做人人爽| 亚洲午夜久久久久久久久电影院| 欧美猛男gaygay网站| 免费观看日韩电影| 国产午夜精品美女毛片视频| 91性感美女视频| 偷拍与自拍一区| 精品盗摄一区二区三区| 波多野结衣中文字幕一区二区三区| 一区在线中文字幕| 欧美日韩一区成人| 狠狠色丁香婷综合久久| 国产精品超碰97尤物18| 欧洲视频一区二区| 久久精品国产99国产精品| 国产欧美va欧美不卡在线| 在线观看一区不卡| 开心九九激情九九欧美日韩精美视频电影 | 精品一区二区三区免费| 国产精品美女久久久久久| 欧美性大战xxxxx久久久| 老司机精品视频一区二区三区| 国产日韩一级二级三级| 欧美在线色视频| 国产一区二区三区精品欧美日韩一区二区三区 | 国产原创一区二区三区| 亚洲人成在线观看一区二区| 欧美日本视频在线| 国产伦理精品不卡| 亚洲午夜视频在线| 国产亚洲美州欧州综合国| 欧美视频在线一区| 国产一区二区视频在线播放| 一区二区三区高清| 久久影院午夜片一区| 91福利区一区二区三区| 国产精品99久| 日韩影院免费视频| 中文字幕一区二区三区不卡 | 久久久精品综合| 欧美视频中文字幕| 成人精品国产福利| 青青青爽久久午夜综合久久午夜| 亚洲欧洲一区二区三区| 欧美电视剧免费全集观看| 91搞黄在线观看| 丁香激情综合国产| 日韩电影免费在线看| 亚洲欧美欧美一区二区三区| 国产亚洲自拍一区| 欧美一区二区三区色| 一本一道综合狠狠老| 国产成a人亚洲精品| 麻豆精品精品国产自在97香蕉| 亚洲综合精品久久| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产亚洲欧美激情| 欧美一区二区精品久久911| 91成人在线观看喷潮| 成人国产亚洲欧美成人综合网| 久久成人综合网| 日日噜噜夜夜狠狠视频欧美人 | 国产成人午夜电影网| 久久国产欧美日韩精品| 亚洲午夜国产一区99re久久| ...av二区三区久久精品| 国产欧美日韩综合精品一区二区 | 日本亚洲电影天堂| 亚洲1区2区3区4区| 亚洲主播在线观看| 一区二区在线看| 亚洲欧美激情插| 国产精品美女久久久久久久久| 久久久久久久久久久久久夜| 欧美成人精品1314www| 日韩美女视频在线| 91精品国产综合久久福利软件| 欧美日韩国产首页| 欧美军同video69gay|