示例#1
0
/* 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;
}
示例#2
0
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));
    }
}