/* Autostart disk image `file_name'. */ int autostart_disk(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { char *name = NULL; if (network_connected() || event_record_active() || event_playback_active() || !file_name || !autostart_enabled) return -1; /* Get program name first to avoid more than one file handle open on image. */ if (!program_name && program_number > 0) name = image_contents_filename_by_number(diskcontents_filesystem_read(file_name), program_number); else name = lib_stralloc(program_name ? program_name : "*"); if (name) { autostart_disk_cook_name(&name); if (!(file_system_attach_disk(8, file_name) < 0)) { log_message(autostart_log, "Attached file `%s' as a disk image.", file_name); reboot_for_autostart(name, AUTOSTART_HASDISK, runmode); lib_free(name); return 0; } } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); lib_free(name); return -1; }
image_contents_t *diskcontents_read(const char *file_name, unsigned int unit) { switch (machine_bus_device_type_get(unit)) { default: return diskcontents_filesystem_read(file_name); case SERIAL_DEVICE_REAL: return machine_diskcontents_bus_read(unit); case SERIAL_DEVICE_RAW: return diskcontents_block_read(file_system_get_vdrive(unit)); } }