int fsimage_write_sector(disk_image_t *image, BYTE *buf, unsigned int track, unsigned int sector) { int sectors; long offset; fsimage_t *fsimage; fsimage = image->media.fsimage; if (fsimage->fd == NULL) { log_error(fsimage_log, "Attempt to write without disk image."); return -1; } if (image->read_only != 0) { log_error(fsimage_log, "Attempt to write to read-only disk image."); return -1; } sectors = disk_image_check_sector(image, track, sector); switch (image->type) { case DISK_IMAGE_TYPE_D64: case DISK_IMAGE_TYPE_D67: case DISK_IMAGE_TYPE_D71: case DISK_IMAGE_TYPE_D81: case DISK_IMAGE_TYPE_D80: case DISK_IMAGE_TYPE_D82: case DISK_IMAGE_TYPE_X64: if (sectors < 0) { log_error(fsimage_log, "Track: %i, Sector: %i out of bounds.", track, sector); return -1; } offset = sectors << 8; if (image->type == DISK_IMAGE_TYPE_X64) offset += X64_HEADER_LENGTH; fseek(fsimage->fd, offset, SEEK_SET); if (fwrite((char *)buf, 256, 1, fsimage->fd) < 1) { log_error(fsimage_log, "Error writing T:%i S:%i to disk image.", track, sector); return -1; } /* Make sure the stream is visible to other readers. */ fflush(fsimage->fd); break; case DISK_IMAGE_TYPE_G64: if (fsimage_gcr_write_sector(image, buf, track, sector) < 0) return -1; break; default: log_error(fsimage_log, "Unknown disk image. Cannot write sector."); return -1; } return 0; }
int fsimage_write_sector(disk_image_t *image, const uint8_t *buf, const disk_addr_t *dadr) { fsimage_t *fsimage; fsimage = image->media.fsimage; if (fsimage->fd == NULL) { log_error(fsimage_log, "Attempt to write without disk image."); return -1; } switch (image->type) { case DISK_IMAGE_TYPE_D64: case DISK_IMAGE_TYPE_D67: case DISK_IMAGE_TYPE_D71: case DISK_IMAGE_TYPE_D81: case DISK_IMAGE_TYPE_D80: case DISK_IMAGE_TYPE_D82: case DISK_IMAGE_TYPE_X64: case DISK_IMAGE_TYPE_D1M: case DISK_IMAGE_TYPE_D2M: case DISK_IMAGE_TYPE_D4M: if (fsimage_dxx_write_sector(image, buf, dadr) < 0) { return -1; } break; case DISK_IMAGE_TYPE_G64: case DISK_IMAGE_TYPE_G71: if (fsimage_gcr_write_sector(image, buf, dadr) < 0) { return -1; } break; case DISK_IMAGE_TYPE_P64: if (fsimage_p64_write_sector(image, buf, dadr) < 0) { return -1; } break; default: log_error(fsimage_log, "Unknown disk image. Cannot write sector."); return -1; } return 0; }