static void detach_disk_image(disk_image_t *image, vdrive_t *floppy, unsigned int unit) { /* if (image != NULL) {; test moved to sub functions */ switch (unit) { case 8: machine_drive_image_detach(image, 8); drive_image_detach(image, 8); vdrive_detach_image(image, 8, floppy); break; case 9: machine_drive_image_detach(image, 9); drive_image_detach(image, 9); vdrive_detach_image(image, 9, floppy); break; case 10: machine_drive_image_detach(image, 10); drive_image_detach(image, 10); vdrive_detach_image(image, 10, floppy); break; case 11: machine_drive_image_detach(image, 11); drive_image_detach(image, 11); vdrive_detach_image(image, 11, floppy); break; } disk_image_close(image); disk_image_media_destroy(image); /* } */ }
int vdrive_internal_close_disk_image(vdrive_t *vdrive) { disk_image_t *image = vdrive->image; if (vdrive->unit != 8 && vdrive->unit != 9 && vdrive->unit != 10 && vdrive->unit != 11) { vdrive_detach_image(image, 100, vdrive); if (disk_image_close(image) < 0) return -1; disk_image_media_destroy(image); vdrive_device_shutdown(vdrive); lib_free(image); lib_free(vdrive); } return 0; }
static int attach_disk_image(disk_image_t **imgptr, vdrive_t *floppy, const char *filename, unsigned int unit, int devicetype) { disk_image_t *image; disk_image_t new_image; int err = -1; if (filename == NULL) { log_error(attach_log, "No name, cannot attach floppy image."); return -1; } new_image.gcr = NULL; new_image.p64 = lib_calloc(1, sizeof(TP64Image)); new_image.read_only = (unsigned int)attach_device_readonly_enabled[unit - 8]; switch (devicetype) { case ATTACH_DEVICE_NONE: case ATTACH_DEVICE_VIRT: case ATTACH_DEVICE_FS: new_image.device = DISK_IMAGE_DEVICE_FS; break; case ATTACH_DEVICE_RAW: new_image.device = DISK_IMAGE_DEVICE_RAW; break; } disk_image_media_create(&new_image); switch (devicetype) { case ATTACH_DEVICE_NONE: case ATTACH_DEVICE_VIRT: case ATTACH_DEVICE_FS: disk_image_fsimage_name_set(&new_image, filename); break; case ATTACH_DEVICE_RAW: disk_image_rawimage_driver_name_set(&new_image); break; } if (disk_image_open(&new_image) < 0) { P64ImageDestroy((PP64Image) new_image.p64); lib_free(new_image.p64); disk_image_media_destroy(&new_image); return -1; } detach_disk_image_and_free(*imgptr, floppy, unit); *imgptr = disk_image_create(); image = *imgptr; memcpy(image, &new_image, sizeof(disk_image_t)); switch (unit) { case 8: case 9: case 10: case 11: err = drive_image_attach(image, unit); err &= vdrive_attach_image(image, unit, floppy); err &= machine_drive_image_attach(image, unit); break; } if (err) { disk_image_close(image); disk_image_media_destroy(image); disk_image_destroy(image); *imgptr = NULL; } return err; }