static int internal_load_mess_hd(mess_image *image, const char *metadata) { int err = 0; struct mess_hd *hd; chd_file *chd; int is_writeable; int id = image_index_in_device(image); hd = get_drive(image); /* open the CHD file */ do { is_writeable = image_is_writable(image); chd = chd_open_ref(image, is_writeable, NULL); if (!chd) { err = chd_get_last_error(); /* special case; if we get CHDERR_FILE_NOT_WRITEABLE, make the * image read only and repeat */ if (err == CHDERR_FILE_NOT_WRITEABLE) image_make_readonly(image); } } while(!chd && is_writeable && (err == CHDERR_FILE_NOT_WRITEABLE)); if (!chd) goto error; /* if we created the image and hence, have metadata to set, set the metadata */ if (metadata) { err = chd_set_metadata(chd, HARD_DISK_STANDARD_METADATA, 0, metadata, strlen(metadata) + 1); if (err != CHDERR_NONE) goto error; } /* open the hard disk file */ hd->hard_disk_handle = hard_disk_open(chd); if (!hd->hard_disk_handle) goto error; drive_handles[id] = hd->hard_disk_handle; return INIT_PASS; error: if (chd) chd_close(chd); err = chd_get_last_error(); if (err) image_seterror(image, IMAGE_ERROR_UNSPECIFIED, chd_get_error_string(err)); return INIT_FAIL; }
int harddisk_image_device::internal_load_hd(const char *metadata) { chd_error err = (chd_error)0; int is_writeable; /* open the CHD file */ do { is_writeable = !is_readonly(); m_chd = NULL; err = chd_open_file(image_core_file(), is_writeable ? CHD_OPEN_READWRITE : CHD_OPEN_READ, NULL, &m_chd); /* special case; if we get CHDERR_FILE_NOT_WRITEABLE, make the * image read only and repeat */ if (err == CHDERR_FILE_NOT_WRITEABLE) make_readonly(); } while(!m_chd && is_writeable && (err == CHDERR_FILE_NOT_WRITEABLE)); if (!m_chd) goto done; /* if we created the image and hence, have metadata to set, set the metadata */ if (metadata) { err = chd_set_metadata(m_chd, HARD_DISK_METADATA_TAG, 0, metadata, strlen(metadata) + 1, 0); if (err != CHDERR_NONE) goto done; } /* open the hard disk file */ m_hard_disk_handle = hard_disk_open(m_chd); if (!m_hard_disk_handle) goto done; done: if (err) { /* if we had an error, close out the CHD */ if (m_chd != NULL) { chd_close(m_chd); m_chd = NULL; } seterror(IMAGE_ERROR_UNSPECIFIED, chd_get_error_string(err)); } return err ? IMAGE_INIT_FAIL : IMAGE_INIT_PASS; }
/* imghd_create() Create a MAME HD image */ imgtoolerr_t imghd_create(imgtool_stream *stream, UINT32 hunksize, UINT32 cylinders, UINT32 heads, UINT32 sectors, UINT32 seclen) { imgtoolerr_t err = IMGTOOLERR_SUCCESS; char encoded_image_ref[encoded_image_ref_max_len]; chd_interface interface_save; UINT8 *cache = NULL; chd_file *chd = NULL; int rc; UINT64 logicalbytes; int hunknum, totalhunks; char metadata[256]; /* jump through the hoops as required by the CHD system */ encode_image_ref(stream, encoded_image_ref); chd_save_interface(&interface_save); chd_set_interface(&imgtool_chd_interface); /* sanity check args */ if (hunksize >= 2048) { err = IMGTOOLERR_PARAMCORRUPT; goto done; } if (hunksize <= 0) hunksize = 1024; /* default value */ /* bail if we are read only */ if (stream_isreadonly(stream)) { err = IMGTOOLERR_READONLY; goto done; } /* calculations */ logicalbytes = (UINT64)cylinders * heads * sectors * seclen; /* create the new hard drive */ rc = chd_create(encoded_image_ref, logicalbytes, hunksize, CHDCOMPRESSION_NONE, NULL); if (rc != CHDERR_NONE) { err = map_chd_error(rc); goto done; } /* open the new hard drive */ rc = chd_open(encoded_image_ref, CHD_OPEN_READWRITE, NULL, &chd); if (rc != CHDERR_NONE) { err = map_chd_error(rc); goto done; } /* write the metadata */ sprintf(metadata, HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, seclen); err = chd_set_metadata(chd, HARD_DISK_METADATA_TAG, 0, metadata, strlen(metadata) + 1); if (rc != CHDERR_NONE) { err = map_chd_error(rc); goto done; } /* alloc and zero buffer */ cache = malloc(hunksize); if (!cache) { err = IMGTOOLERR_OUTOFMEMORY; goto done; } memset(cache, '\0', hunksize); /* zero out every hunk */ totalhunks = (logicalbytes + hunksize - 1) / hunksize; for (hunknum = 0; hunknum < totalhunks; hunknum++) { rc = chd_write(chd, hunknum, cache); if (rc) { err = IMGTOOLERR_WRITEERROR; goto done; } } done: if (cache) free(cache); if (chd) chd_close(chd); chd_set_interface(&interface_save); return err; }