/* Autostart tape image `file_name'. */ int autostart_tape(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { char *name = NULL; if (network_connected() || !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(IMAGE_CONTENTS_TAPE, file_name, 0, program_number); else name = lib_stralloc(program_name ? program_name : ""); if (!(tape_image_attach(1, file_name) < 0)) { log_message(autostart_log, "Attached file `%s' as a tape image.", file_name); if (tape_tap_attched()) { if (program_number > 0) { lib_free(name); name = NULL; /* program numbers in tape_seek_to_file() start at 0 */ tape_seek_to_file(tape_image_dev1, program_number-1); } else { tape_seek_start(tape_image_dev1); } } resources_set_int("VirtualDevices", 1); /* Kludge: iAN CooG - for t64 images we need devtraps ON */ reboot_for_autostart(name, AUTOSTART_HASTAPE, runmode); lib_free(name); return 0; } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); if (name) lib_free(name); return -1; }
/* Autostart tape image `file_name'. */ int autostart_tape(const char *file_name, const char *program_name, unsigned int program_number, unsigned int runmode) { BYTE do_seek = 1; if (network_connected() || event_record_active() || event_playback_active() || !file_name || !autostart_enabled) { return -1; } if (!(tape_image_attach(1, file_name) < 0)) { log_message(autostart_log, "Attached file `%s' as a tape image.", file_name); if (!tape_tap_attached()) { if (program_number == 0 || program_number == 1) { do_seek = 0; } program_number -= 1; } if (do_seek) { if (program_number > 0) { /* program numbers in tape_seek_to_file() start at 0 */ tape_seek_to_file(tape_image_dev1, program_number - 1); } else { tape_seek_start(tape_image_dev1); } } if (!tape_tap_attached()) { resources_set_int("VirtualDevices", 1); /* Kludge: for t64 images we need devtraps ON */ } reboot_for_autostart(program_name, AUTOSTART_HASTAPE, runmode); return 0; } autostartmode = AUTOSTART_ERROR; deallocate_program_name(); return -1; }
static int fsdevice_open_file(vdrive_t *vdrive, unsigned int secondary, bufinfo_t *bufinfo, cbmdos_cmd_parse_t *cmd_parse, char *rname) { char *comma; tape_image_t *tape; unsigned int format = 0; fileio_info_t *finfo; if (fsdevice_convert_p00_enabled[(vdrive->unit) - 8]) { format |= FILEIO_FORMAT_P00; } if (!fsdevice_hide_cbm_files_enabled[vdrive->unit - 8]) { format |= FILEIO_FORMAT_RAW; } /* Remove comma. */ if ((cmd_parse->parsecmd)[0] == ',') { (cmd_parse->parsecmd)[1] = '\0'; } else { comma = strchr(cmd_parse->parsecmd, ','); if (comma != NULL) { *comma = '\0'; } } /* Test on wildcards. */ if (cbmdos_parse_wildcard_check(cmd_parse->parsecmd, (unsigned int)strlen(cmd_parse->parsecmd)) > 0) { if (bufinfo[secondary].mode == Write || bufinfo[secondary].mode == Append) { fsdevice_error(vdrive, CBMDOS_IPE_BAD_NAME); return FLOPPY_ERROR; } } /* Open file for write mode access. */ if (bufinfo[secondary].mode == Write) { if (fsdevice_save_p00_enabled[vdrive->unit - 8]) { format = FILEIO_FORMAT_P00; } else { format = FILEIO_FORMAT_RAW; } finfo = fileio_open(rname, fsdevice_get_path(vdrive->unit), format, FILEIO_COMMAND_WRITE, bufinfo[secondary].type); if (finfo != NULL) { bufinfo[secondary].fileio_info = finfo; fsdevice_error(vdrive, CBMDOS_IPE_OK); return FLOPPY_COMMAND_OK; } else { fsdevice_error(vdrive, CBMDOS_IPE_FILE_EXISTS); return FLOPPY_ERROR; } } if (bufinfo[secondary].mode == Append) { /* Open file for append mode access. */ finfo = fileio_open(rname, fsdevice_get_path(vdrive->unit), format, FILEIO_COMMAND_APPEND_READ, bufinfo[secondary].type); if (finfo != NULL) { bufinfo[secondary].fileio_info = finfo; fsdevice_error(vdrive, CBMDOS_IPE_OK); return FLOPPY_COMMAND_OK; } else { fsdevice_error(vdrive, CBMDOS_IPE_NOT_FOUND); return FLOPPY_ERROR; } } /* Open file for read mode access. */ tape = bufinfo[secondary].tape; tape->name = util_concat(fsdevice_get_path(vdrive->unit), FSDEV_DIR_SEP_STR, rname, NULL); charset_petconvstring((BYTE *)(tape->name) + strlen(fsdevice_get_path(vdrive->unit))+ strlen(FSDEV_DIR_SEP_STR), 1); tape->read_only = 1; /* Prepare for buffered reads */ bufinfo[secondary].isbuffered = 0; bufinfo[secondary].iseof = 0; if (tape_image_open(tape) < 0) { lib_free(tape->name); tape->name = NULL; } else { tape_file_record_t *r; static BYTE startaddr[2]; tape_seek_start(tape); tape_seek_to_file(tape, 0); r = tape_get_current_file_record(tape); if ( (r->type==1) || (r->type==3) ) { startaddr[0] = r->start_addr & 255; startaddr[1] = r->start_addr >> 8; bufinfo[secondary].bufp = startaddr; bufinfo[secondary].buflen = 2; } else {