static int vdi_open(BlockDriverState *bs, const char *filename, int flags) { BDRVVdiState *s = bs->opaque; VdiHeader header; size_t bmap_size; int ret; logout("\n"); ret = bdrv_file_open(&s->hd, filename, flags); if (ret < 0) { return ret; } if (bdrv_read(s->hd, 0, (uint8_t *)&header, 1) < 0) { goto fail; } vdi_header_to_cpu(&header); #if defined(CONFIG_VDI_DEBUG) vdi_header_print(&header); #endif if (header.version != VDI_VERSION_1_1) { logout("unsupported version %u.%u\n", header.version >> 16, header.version & 0xffff); goto fail; } else if (header.offset_bmap % SECTOR_SIZE != 0) {
static int openfile(char *name, int flags, int growable) { if (bs) { fprintf(stderr, "file open already, try 'help close'\n"); return 1; } if (growable) { if (bdrv_file_open(&bs, name, NULL, flags)) { fprintf(stderr, "%s: can't open device %s\n", progname, name); return 1; } } else { bs = bdrv_new("hda"); if (bdrv_open(bs, name, NULL, flags, NULL) < 0) { fprintf(stderr, "%s: can't open device %s\n", progname, name); bdrv_delete(bs); bs = NULL; return 1; } } return 0; }
static int openfile(char *name, int flags, int growable, QDict *opts) { Error *local_err = NULL; if (qemuio_bs) { fprintf(stderr, "file open already, try 'help close'\n"); return 1; } if (growable) { if (bdrv_file_open(&qemuio_bs, name, NULL, opts, flags, &local_err)) { fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, error_get_pretty(local_err)); error_free(local_err); return 1; } } else { qemuio_bs = bdrv_new("hda"); if (bdrv_open(qemuio_bs, name, opts, flags, NULL, &local_err) < 0) { fprintf(stderr, "%s: can't open device %s: %s\n", progname, name, error_get_pretty(local_err)); error_free(local_err); bdrv_unref(qemuio_bs); qemuio_bs = NULL; return 1; } } return 0; }
static int blkverify_open(BlockDriverState *bs, QDict *options, int flags) { BDRVBlkverifyState *s = bs->opaque; QemuOpts *opts; Error *local_err = NULL; const char *filename, *raw; int ret; opts = qemu_opts_create_nofail(&runtime_opts); qemu_opts_absorb_qdict(opts, options, &local_err); if (error_is_set(&local_err)) { qerror_report_err(local_err); error_free(local_err); ret = -EINVAL; goto fail; } /* Parse the raw image filename */ raw = qemu_opt_get(opts, "x-raw"); if (raw == NULL) { ret = -EINVAL; goto fail; } ret = bdrv_file_open(&bs->file, raw, NULL, flags); if (ret < 0) { goto fail; } /* Open the test file */ filename = qemu_opt_get(opts, "x-image"); if (filename == NULL) { ret = -EINVAL; goto fail; } s->test_file = bdrv_new(""); ret = bdrv_open(s->test_file, filename, NULL, flags, NULL); if (ret < 0) { bdrv_unref(s->test_file); s->test_file = NULL; goto fail; } ret = 0; fail: return ret; }
/* Valid blkverify filenames look like blkverify:path/to/raw_image:path/to/image */ static int blkverify_open(BlockDriverState *bs, const char *filename, int flags) { BDRVBlkverifyState *s = bs->opaque; int ret; char *raw, *c; /* Parse the blkverify: prefix */ if (strncmp(filename, "blkverify:", strlen("blkverify:"))) { return -EINVAL; } filename += strlen("blkverify:"); /* Parse the raw image filename */ c = strchr(filename, ':'); if (c == NULL) { return -EINVAL; } raw = g_strdup(filename); raw[c - filename] = '\0'; ret = bdrv_file_open(&bs->file, raw, flags); g_free(raw); if (ret < 0) { return ret; } filename = c + 1; /* Open the test file */ s->test_file = bdrv_new(""); ret = bdrv_open(s->test_file, filename, flags, NULL); if (ret < 0) { bdrv_delete(s->test_file); s->test_file = NULL; return ret; } return 0; }
static int tar_open(BlockDriverState *bs, const char *filename, int flags) { BDRVTarState *s = bs->opaque; char header[SECTOR_SIZE]; char *real_file = header; char *magic; const char *fname = filename; size_t header_offs = 0; int ret; if (!strncmp(filename, "tar://", 6)) fname += 6; else if (!strncmp(filename, "tar:", 4)) fname += 4; ret = bdrv_file_open(&s->hd, fname, flags); if (ret < 0) return ret; /* Search the file for an image */ do { /* tar header */ if (bdrv_pread(s->hd, header_offs, header, SECTOR_SIZE) != SECTOR_SIZE) goto fail; if ((header_offs > 1) && !header[0]) { fprintf(stderr, "Tar: No image file found in archive\n"); goto fail; } magic = &header[OFFS_MAGIC]; if (strncmp(magic, POSIX_TAR_MAGIC, 5)) { fprintf(stderr, "Tar: Invalid magic: %s\n", magic); goto fail; } dprintf("file type: %c\n", header[OFFS_TYPE]); /* file length*/ s->file_len = (tar2u64(&header[OFFS_LENGTH]) + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1); s->file_sec = (header_offs / SECTOR_SIZE) + 1; header_offs += s->file_len + SECTOR_SIZE; if (header[OFFS_TYPE] == 'L') { bdrv_pread(s->hd, header_offs - s->file_len, s->longfile, sizeof(s->longfile)); s->longfile[sizeof(s->longfile)-1] = '\0'; real_file = header; } else if (s->longfile[0]) { real_file = s->longfile; } else { real_file = header; } } while(!is_target_file(bs, real_file, header)); /* We found an image! */ if (header[OFFS_TYPE] == 'S') { uint8_t isextended; int i; for (i = OFFS_S_SP; i < (OFFS_S_SP + (4 * 24)); i += 24) tar_sparse(s, tar2u64(&header[i]), tar2u64(&header[i+12])); s->file_len = tar2u64(&header[OFFS_S_LENGTH]); isextended = header[OFFS_S_EXT]; while (isextended) { if (bdrv_pread(s->hd, s->file_sec * SECTOR_SIZE, header, SECTOR_SIZE) != SECTOR_SIZE) goto fail; for (i = 0; i < (21 * 24); i += 24) tar_sparse(s, tar2u64(&header[i]), tar2u64(&header[i+12])); isextended = header[OFFS_SX_EXT]; s->file_sec++; } tar_sparse(s, s->file_len, 1); } return 0; fail: fprintf(stderr, "Tar: Error opening file\n"); bdrv_delete(s->hd); return -EINVAL; }
static int vmdk_parse_extents(const char *desc, BlockDriverState *bs, const char *desc_file_path) { int ret; char access[11]; char type[11]; char fname[512]; const char *p = desc; int64_t sectors = 0; int64_t flat_offset; char extent_path[PATH_MAX]; BlockDriverState *extent_file; while (*p) { /* parse extent line: * RW [size in sectors] FLAT "file-name.vmdk" OFFSET * or * RW [size in sectors] SPARSE "file-name.vmdk" */ flat_offset = -1; ret = sscanf(p, "%10s %" SCNd64 " %10s %511s %" SCNd64, access, §ors, type, fname, &flat_offset); if (ret < 4 || strcmp(access, "RW")) { goto next_line; } else if (!strcmp(type, "FLAT")) { if (ret != 5 || flat_offset < 0) { return -EINVAL; } } else if (ret != 4) { return -EINVAL; } /* trim the quotation marks around */ if (fname[0] == '"') { memmove(fname, fname + 1, strlen(fname)); if (strlen(fname) <= 1 || fname[strlen(fname) - 1] != '"') { return -EINVAL; } fname[strlen(fname) - 1] = '\0'; } if (sectors <= 0 || (strcmp(type, "FLAT") && strcmp(type, "SPARSE")) || (strcmp(access, "RW"))) { goto next_line; } path_combine(extent_path, sizeof(extent_path), desc_file_path, fname); ret = bdrv_file_open(&extent_file, extent_path, bs->open_flags); if (ret) { return ret; } /* save to extents array */ if (!strcmp(type, "FLAT")) { /* FLAT extent */ VmdkExtent *extent; extent = vmdk_add_extent(bs, extent_file, true, sectors, 0, 0, 0, 0, sectors); extent->flat_start_offset = flat_offset << 9; } else if (!strcmp(type, "SPARSE")) { /* SPARSE extent */ ret = vmdk_open_sparse(bs, extent_file, bs->open_flags); if (ret) { bdrv_delete(extent_file); return ret; } } else { fprintf(stderr, "VMDK: Not supported extent type \"%s\""".\n", type); return -ENOTSUP; } next_line: /* move to next line */ while (*p && *p != '\n') { p++; } p++; } return 0; }