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

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

?? block.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * QEMU System Emulator block driver * * Copyright (c) 2003 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: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */#include "qemu-common.h"#ifndef QEMU_IMG#include "console.h"#endif#include "block_int.h"#ifdef _BSD#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <sys/queue.h>#include <sys/disk.h>#endif#define SECTOR_BITS 9#define SECTOR_SIZE (1 << SECTOR_BITS)typedef struct BlockDriverAIOCBSync {    BlockDriverAIOCB common;    QEMUBH *bh;    int ret;} BlockDriverAIOCBSync;static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,        int64_t sector_num, uint8_t *buf, int nb_sectors,        BlockDriverCompletionFunc *cb, void *opaque);static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,        int64_t sector_num, const uint8_t *buf, int nb_sectors,        BlockDriverCompletionFunc *cb, void *opaque);static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb);static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,                        uint8_t *buf, int nb_sectors);static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,                         const uint8_t *buf, int nb_sectors);BlockDriverState *bdrv_first;static BlockDriver *first_drv;int path_is_absolute(const char *path){    const char *p;#ifdef _WIN32    /* specific case for names like: "\\.\d:" */    if (*path == '/' || *path == '\\')        return 1;#endif    p = strchr(path, ':');    if (p)        p++;    else        p = path;#ifdef _WIN32    return (*p == '/' || *p == '\\');#else    return (*p == '/');#endif}/* if filename is absolute, just copy it to dest. Otherwise, build a   path to it by considering it is relative to base_path. URL are   supported. */void path_combine(char *dest, int dest_size,                  const char *base_path,                  const char *filename){    const char *p, *p1;    int len;    if (dest_size <= 0)        return;    if (path_is_absolute(filename)) {        pstrcpy(dest, dest_size, filename);    } else {        p = strchr(base_path, ':');        if (p)            p++;        else            p = base_path;        p1 = strrchr(base_path, '/');#ifdef _WIN32        {            const char *p2;            p2 = strrchr(base_path, '\\');            if (!p1 || p2 > p1)                p1 = p2;        }#endif        if (p1)            p1++;        else            p1 = base_path;        if (p1 > p)            p = p1;        len = p - base_path;        if (len > dest_size - 1)            len = dest_size - 1;        memcpy(dest, base_path, len);        dest[len] = '\0';        pstrcat(dest, dest_size, filename);    }}static void bdrv_register(BlockDriver *bdrv){    if (!bdrv->bdrv_aio_read) {        /* add AIO emulation layer */        bdrv->bdrv_aio_read = bdrv_aio_read_em;        bdrv->bdrv_aio_write = bdrv_aio_write_em;        bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;        bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);    } else if (!bdrv->bdrv_read && !bdrv->bdrv_pread) {        /* add synchronous IO emulation layer */        bdrv->bdrv_read = bdrv_read_em;        bdrv->bdrv_write = bdrv_write_em;    }    bdrv->next = first_drv;    first_drv = bdrv;}/* create a new block device (by default it is empty) */BlockDriverState *bdrv_new(const char *device_name){    BlockDriverState **pbs, *bs;    bs = qemu_mallocz(sizeof(BlockDriverState));    if(!bs)        return NULL;    pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);    if (device_name[0] != '\0') {        /* insert at the end */        pbs = &bdrv_first;        while (*pbs != NULL)            pbs = &(*pbs)->next;        *pbs = bs;    }    return bs;}BlockDriver *bdrv_find_format(const char *format_name){    BlockDriver *drv1;    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {        if (!strcmp(drv1->format_name, format_name))            return drv1;    }    return NULL;}int bdrv_create(BlockDriver *drv,                const char *filename, int64_t size_in_sectors,                const char *backing_file, int flags){    if (!drv->bdrv_create)        return -ENOTSUP;    return drv->bdrv_create(filename, size_in_sectors, backing_file, flags);}#ifdef _WIN32void get_tmp_filename(char *filename, int size){    char temp_dir[MAX_PATH];    GetTempPath(MAX_PATH, temp_dir);    GetTempFileName(temp_dir, "qem", 0, filename);}#elsevoid get_tmp_filename(char *filename, int size){    int fd;    /* XXX: race condition possible */    pstrcpy(filename, size, "/tmp/vl.XXXXXX");    fd = mkstemp(filename);    close(fd);}#endif#ifdef _WIN32static int is_windows_drive_prefix(const char *filename){    return (((filename[0] >= 'a' && filename[0] <= 'z') ||             (filename[0] >= 'A' && filename[0] <= 'Z')) &&            filename[1] == ':');}static int is_windows_drive(const char *filename){    if (is_windows_drive_prefix(filename) &&        filename[2] == '\0')        return 1;    if (strstart(filename, "\\\\.\\", NULL) ||        strstart(filename, "//./", NULL))        return 1;    return 0;}#endifstatic BlockDriver *find_protocol(const char *filename){    BlockDriver *drv1;    char protocol[128];    int len;    const char *p;#ifdef _WIN32    if (is_windows_drive(filename) ||        is_windows_drive_prefix(filename))        return &bdrv_raw;#endif    p = strchr(filename, ':');    if (!p)        return &bdrv_raw;    len = p - filename;    if (len > sizeof(protocol) - 1)        len = sizeof(protocol) - 1;    memcpy(protocol, filename, len);    protocol[len] = '\0';    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {        if (drv1->protocol_name &&            !strcmp(drv1->protocol_name, protocol))            return drv1;    }    return NULL;}/* XXX: force raw format if block or character device ? It would   simplify the BSD case */static BlockDriver *find_image_format(const char *filename){    int ret, score, score_max;    BlockDriver *drv1, *drv;    uint8_t buf[2048];    BlockDriverState *bs;    /* detect host devices. By convention, /dev/cdrom[N] is always       recognized as a host CDROM */    if (strstart(filename, "/dev/cdrom", NULL))        return &bdrv_host_device;#ifdef _WIN32    if (is_windows_drive(filename))        return &bdrv_host_device;#else    {        struct stat st;        if (stat(filename, &st) >= 0 &&            (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {            return &bdrv_host_device;        }    }#endif    drv = find_protocol(filename);    /* no need to test disk image formats for vvfat */    if (drv == &bdrv_vvfat)        return drv;    ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY);    if (ret < 0)        return NULL;    ret = bdrv_pread(bs, 0, buf, sizeof(buf));    bdrv_delete(bs);    if (ret < 0) {        return NULL;    }    score_max = 0;    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {        if (drv1->bdrv_probe) {            score = drv1->bdrv_probe(buf, ret, filename);            if (score > score_max) {                score_max = score;                drv = drv1;            }        }    }    return drv;}int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags){    BlockDriverState *bs;    int ret;    bs = bdrv_new("");    if (!bs)        return -ENOMEM;    ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);    if (ret < 0) {        bdrv_delete(bs);        return ret;    }    *pbs = bs;    return 0;}int bdrv_open(BlockDriverState *bs, const char *filename, int flags){    return bdrv_open2(bs, filename, flags, NULL);}int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,               BlockDriver *drv){    int ret, open_flags;    char tmp_filename[PATH_MAX];    char backing_filename[PATH_MAX];    bs->read_only = 0;    bs->is_temporary = 0;    bs->encrypted = 0;    if (flags & BDRV_O_SNAPSHOT) {        BlockDriverState *bs1;        int64_t total_size;        /* if snapshot, we create a temporary backing file and open it           instead of opening 'filename' directly */        /* if there is a backing file, use it */        bs1 = bdrv_new("");        if (!bs1) {            return -ENOMEM;        }        if (bdrv_open(bs1, filename, 0) < 0) {            bdrv_delete(bs1);            return -1;        }        total_size = bdrv_getlength(bs1) >> SECTOR_BITS;        bdrv_delete(bs1);        get_tmp_filename(tmp_filename, sizeof(tmp_filename));        realpath(filename, backing_filename);        if (bdrv_create(&bdrv_qcow2, tmp_filename,                        total_size, backing_filename, 0) < 0) {            return -1;        }        filename = tmp_filename;        bs->is_temporary = 1;    }    pstrcpy(bs->filename, sizeof(bs->filename), filename);    if (flags & BDRV_O_FILE) {        drv = find_protocol(filename);        if (!drv)            return -ENOENT;    } else {        if (!drv) {            drv = find_image_format(filename);            if (!drv)                return -1;        }    }    bs->drv = drv;    bs->opaque = qemu_mallocz(drv->instance_size);    if (bs->opaque == NULL && drv->instance_size > 0)        return -1;    /* Note: for compatibility, we open disk image files as RDWR, and       RDONLY as fallback */    if (!(flags & BDRV_O_FILE))        open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT);    else        open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);    ret = drv->bdrv_open(bs, filename, open_flags);    if (ret == -EACCES && !(flags & BDRV_O_FILE)) {        ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY);        bs->read_only = 1;    }    if (ret < 0) {        qemu_free(bs->opaque);        bs->opaque = NULL;        bs->drv = NULL;        return ret;    }    if (drv->bdrv_getlength) {        bs->total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;    }#ifndef _WIN32    if (bs->is_temporary) {        unlink(filename);    }#endif    if (bs->backing_file[0] != '\0') {        /* if there is a backing file, use it */        bs->backing_hd = bdrv_new("");        if (!bs->backing_hd) {        fail:            bdrv_close(bs);            return -ENOMEM;        }        path_combine(backing_filename, sizeof(backing_filename),                     filename, bs->backing_file);        if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0)            goto fail;    }    /* call the change callback */    bs->media_changed = 1;    if (bs->change_cb)        bs->change_cb(bs->change_opaque);    return 0;}void bdrv_close(BlockDriverState *bs){    if (bs->drv) {        if (bs->backing_hd)            bdrv_delete(bs->backing_hd);        bs->drv->bdrv_close(bs);        qemu_free(bs->opaque);#ifdef _WIN32        if (bs->is_temporary) {            unlink(bs->filename);        }#endif        bs->opaque = NULL;        bs->drv = NULL;        /* call the change callback */        bs->media_changed = 1;        if (bs->change_cb)            bs->change_cb(bs->change_opaque);    }}void bdrv_delete(BlockDriverState *bs){    /* XXX: remove the driver list */    bdrv_close(bs);    qemu_free(bs);}/* commit COW file into the raw image */int bdrv_commit(BlockDriverState *bs){    BlockDriver *drv = bs->drv;    int64_t i, total_sectors;    int n, j;    unsigned char sector[512];    if (!drv)        return -ENOMEDIUM;    if (bs->read_only) {	return -EACCES;    }    if (!bs->backing_hd) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性大战久久久久久久 | 久久久亚洲精品一区二区三区 | 免费精品视频最新在线| 国内精品免费在线观看| 99久久久国产精品| 欧美大胆一级视频| 最新欧美精品一区二区三区| 青青青伊人色综合久久| 91污片在线观看| 精品国产凹凸成av人导航| 亚洲精品免费看| 丁香婷婷深情五月亚洲| 欧美一二三四在线| 中文字幕视频一区二区三区久| 日韩国产欧美在线播放| 91小视频免费观看| 欧美国产成人精品| 精久久久久久久久久久| 欧美日韩国产色站一区二区三区| 国产精品久久久久影视| 国产在线麻豆精品观看| 9191精品国产综合久久久久久| wwwwxxxxx欧美| 日韩精品三区四区| 欧美图片一区二区三区| 中文字幕一区免费在线观看| 国产成人亚洲综合a∨婷婷图片 | 色综合久久久久| 国产欧美一二三区| 国产精华液一区二区三区| 欧美sm极限捆绑bd| 久久电影网电视剧免费观看| 3atv一区二区三区| 亚洲一区二区不卡免费| 在线视频欧美精品| 一区二区三区国产精华| 欧美中文一区二区三区| 亚洲成人av福利| 欧美日韩在线不卡| 偷拍自拍另类欧美| 日韩一区二区免费视频| 喷水一区二区三区| 精品国产免费人成电影在线观看四季 | 综合自拍亚洲综合图不卡区| 成人黄页在线观看| 亚洲欧洲一区二区三区| 91在线免费播放| 亚洲免费看黄网站| 欧美日韩久久不卡| 日本一区中文字幕| 欧美精品一区二区在线观看| 国产91精品一区二区麻豆网站| 国产精品色婷婷| 色偷偷一区二区三区| 亚洲综合一区二区三区| 欧美伦理视频网站| 国内外成人在线| 国产欧美中文在线| 91在线观看视频| 在线91免费看| 国产精品污污网站在线观看| jizzjizzjizz欧美| 日日嗨av一区二区三区四区| 精品国产髙清在线看国产毛片 | 日韩视频中午一区| 国产一区二区剧情av在线| 亚洲图片另类小说| 日韩一区二区三区四区| 国产91露脸合集magnet| 亚洲无人区一区| 久久综合久久综合久久| 972aa.com艺术欧美| 日本成人在线看| 亚洲欧洲av在线| 欧美日韩精品电影| 成人免费看片app下载| 亚洲成人自拍网| 中文字幕欧美国产| 欧美一区二区精品久久911| 不卡一区二区中文字幕| 日韩av电影天堂| 国产精品免费视频一区| 91精品国产综合久久久久| 成人免费看视频| 久久66热偷产精品| 亚洲高清不卡在线观看| 国产精品美女久久久久高潮| 日韩一区二区不卡| 欧美在线free| 成人黄色小视频| 精油按摩中文字幕久久| 亚洲国产裸拍裸体视频在线观看乱了 | 中文字幕在线观看一区| 精品日韩在线观看| 欧美精品乱码久久久久久| 99久久久久久| 不卡的av中国片| 国产精品一二二区| 蜜臀精品一区二区三区在线观看| 夜夜爽夜夜爽精品视频| 亚洲欧洲av另类| 国产日韩成人精品| 久久久亚洲午夜电影| 欧美v日韩v国产v| 精品国产乱码久久久久久久久| 欧美三级视频在线| 欧美伊人久久久久久久久影院| 成人国产精品免费观看视频| 国产在线播精品第三| 久久精品国产一区二区三区免费看| 一区二区三区**美女毛片| 最新久久zyz资源站| 日韩毛片视频在线看| 国产精品久久久久久久岛一牛影视 | 亚洲r级在线视频| 亚洲一区二区精品久久av| 国产精品91xxx| 国产精品中文有码| 精品午夜久久福利影院| 悠悠色在线精品| 亚洲欧美综合在线精品| 国产日韩精品一区二区三区| 色av成人天堂桃色av| 日本少妇一区二区| 日韩福利电影在线观看| 三级欧美韩日大片在线看| 天天综合色天天综合色h| 亚洲一级二级三级在线免费观看| 亚洲一区二区视频在线| 亚洲h动漫在线| 美女网站在线免费欧美精品| 精品一区二区三区在线观看| 精品一区二区综合| www.亚洲色图.com| 欧美色偷偷大香| 91精品国产综合久久久蜜臀粉嫩 | 亚洲手机成人高清视频| 中文字幕成人在线观看| 日本成人在线一区| 国产99精品国产| 欧美午夜在线一二页| 国产女人18毛片水真多成人如厕| 亚洲欧洲另类国产综合| 国产麻豆日韩欧美久久| 久久99在线观看| 男人操女人的视频在线观看欧美| 久久精品在这里| 亚洲欧洲美洲综合色网| 亚洲综合偷拍欧美一区色| 日韩精品亚洲一区二区三区免费| 亚洲成人在线观看视频| 丝袜亚洲另类欧美| 黄页网站大全一区二区| 国产成人av在线影院| 欧美三区免费完整视频在线观看| 日韩美女视频在线| 亚洲精品免费在线播放| 蜜臀a∨国产成人精品| 国产露脸91国语对白| 欧美三级欧美一级| 国产无人区一区二区三区| 亚洲免费av在线| 国产伦精品一区二区三区免费迷| 色婷婷精品大在线视频| 精品少妇一区二区| 男女视频一区二区| 在线免费观看一区| 亚洲第一激情av| 久久综合成人精品亚洲另类欧美| 亚洲女同一区二区| 日日夜夜一区二区| 成人h动漫精品一区二区| 欧美日韩精品高清| 亚洲国产精品久久人人爱蜜臀| 日韩欧美高清dvd碟片| 欧美α欧美αv大片| 国产日韩欧美一区二区三区综合| 亚洲午夜一区二区三区| 风间由美性色一区二区三区| 91精品国产91久久综合桃花 | 国产精品无遮挡| 美女网站一区二区| 欧美欧美欧美欧美首页| 亚洲免费观看高清| kk眼镜猥琐国模调教系列一区二区| 日韩三级电影网址| 亚欧色一区w666天堂| 欧美日韩高清影院| 丝袜亚洲另类欧美| 精品国产乱码久久久久久久久| 日韩国产精品久久久| 欧美日韩国产一级片| 亚洲一区成人在线| 亚洲美女在线一区| 欧美成va人片在线观看| 成人h动漫精品一区二区| 91精品国产乱| 日韩中文字幕av电影| 在线不卡一区二区| 亚洲va欧美va人人爽午夜|