/* Try to determine what kind of CD-image and/or filesystem we have at track i_track. Return information about the CD image is returned in cdio_analysis and the return value. */ cdio_fs_anal_t cdio_guess_cd_type(const CdIo_t *p_cdio, int start_session, track_t i_track, /*out*/ cdio_iso_analysis_t *iso_analysis) { int ret = CDIO_FS_UNKNOWN; bool sector0_read_ok; if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i_track)) return CDIO_FS_AUDIO; if ( DRIVER_OP_SUCCESS != _cdio_read_block(p_cdio, ISO_PVD_SECTOR, start_session, 0, i_track) ) return CDIO_FS_UNKNOWN; if ( _cdio_is_it(INDEX_XISO) ) return CDIO_FS_ANAL_XISO; if ( DRIVER_OP_SUCCESS != _cdio_read_block(p_cdio, ISO_SUPERBLOCK_SECTOR, start_session, 0, i_track) ) return ret; if ( _cdio_is_it(INDEX_UDF) ) { /* Detect UDF version Test if we have a valid version of UDF the xbox can read natively */ if (_cdio_read_block(p_cdio, 35, start_session, 5, i_track) < 0) return CDIO_FS_UNKNOWN; iso_analysis->UDFVerMinor=(unsigned int)buffer[5][240]; iso_analysis->UDFVerMajor=(unsigned int)buffer[5][241]; /* Read disc label */ if (_cdio_read_block(p_cdio, 32, start_session, 5, i_track) < 0) return CDIO_FS_UDF; strncpy(iso_analysis->iso_label, buffer[5]+25, 33); iso_analysis->iso_label[32] = '\0'; return CDIO_FS_UDF; } /* We have something that smells of a filesystem. */ if (_cdio_is_it(INDEX_CD_I) && _cdio_is_it(INDEX_CD_RTOS) && !_cdio_is_it(INDEX_BRIDGE) && !_cdio_is_it(INDEX_XA)) { return (CDIO_FS_INTERACTIVE | CDIO_FS_ANAL_ISO9660_ANY); } else { /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ sector0_read_ok = _cdio_read_block(p_cdio, 0, start_session, 1, i_track) == 0; if (_cdio_is_it(INDEX_HS)) ret |= CDIO_FS_HIGH_SIERRA; else if (_cdio_is_it(INDEX_ISOFS)) { if (_cdio_is_it(INDEX_CD_RTOS) && _cdio_is_it(INDEX_BRIDGE)) ret = (CDIO_FS_ISO_9660_INTERACTIVE | CDIO_FS_ANAL_ISO9660_ANY); else if (_cdio_is_hfs()) ret = CDIO_FS_ISO_HFS; else ret = (CDIO_FS_ISO_9660 | CDIO_FS_ANAL_ISO9660_ANY); iso_analysis->isofs_size = _cdio_get_iso9660_fs_sec_count(); strncpy(iso_analysis->iso_label, buffer[0]+40,33); iso_analysis->iso_label[32] = '\0'; if ( _cdio_read_block(p_cdio, UDF_ANCHOR_SECTOR, start_session, 5, i_track) < 0) return ret; /* Maybe there is an UDF anchor in IOS session so its ISO/UDF session and we prefere UDF */ if ( _cdio_is_UDF() ) { /* Detect UDF version. Test if we have a valid version of UDF the xbox can read natively */ if ( _cdio_read_block(p_cdio, 35, start_session, 5, i_track) < 0) return ret; iso_analysis->UDFVerMinor=(unsigned int)buffer[5][240]; iso_analysis->UDFVerMajor=(unsigned int)buffer[5][241]; #if 0 /* We are using ISO/UDF cd's as iso, no need to get UDF disc label */ if (_cdio_read_block(p_cdio, 32, start_session, 5, i_track) < 0) return ret; stnrcpy(iso_analysis->iso_label, buffer[5]+25, 33); iso_analysis->iso_label[32] = '\0'; #endif ret=CDIO_FS_ISO_UDF; } #if 0 if (_cdio_is_rockridge()) ret |= CDIO_FS_ANAL_ROCKRIDGE; #endif if (_cdio_read_block(p_cdio, BOOT_SECTOR, start_session, 3, i_track) < 0) return ret; if (_cdio_is_joliet()) { iso_analysis->joliet_level = _cdio_get_joliet_level(); ret |= (CDIO_FS_ANAL_JOLIET | CDIO_FS_ANAL_ISO9660_ANY); } if (_cdio_is_it(INDEX_BOOTABLE)) ret |= CDIO_FS_ANAL_BOOTABLE; if ( _cdio_is_it(INDEX_XA) && _cdio_is_it(INDEX_ISOFS) && !(sector0_read_ok && _cdio_is_it(INDEX_PHOTO_CD)) ) { if ( _cdio_read_block(p_cdio, VCD_INFO_SECTOR, start_session, 4, i_track) < 0 ) return ret; if (_cdio_is_it(INDEX_BRIDGE) && _cdio_is_it(INDEX_CD_RTOS)) { ret |= CDIO_FS_ANAL_ISO9660_ANY; if (_cdio_is_it(INDEX_VIDEO_CD)) ret |= CDIO_FS_ANAL_VIDEOCD; else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_SVCD; } else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_CVD; } } else if (_cdio_is_hfs()) ret |= CDIO_FS_HFS; else if (sector0_read_ok && _cdio_is_it(INDEX_EXT2)) ret |= (CDIO_FS_EXT2 | CDIO_FS_ANAL_ISO9660_ANY); else if (_cdio_is_3do()) ret |= CDIO_FS_3DO; else { if ( _cdio_read_block(p_cdio, UFS_SUPERBLOCK_SECTOR, start_session, 2, i_track) < 0 ) return ret; if (sector0_read_ok && _cdio_is_it(INDEX_UFS)) ret |= CDIO_FS_UFS; else ret |= CDIO_FS_UNKNOWN; } } /* other checks */ if (_cdio_is_it(INDEX_XA)) ret |= (CDIO_FS_ANAL_XA | CDIO_FS_ANAL_ISO9660_ANY); if (_cdio_is_it(INDEX_PHOTO_CD)) ret |= (CDIO_FS_ANAL_PHOTO_CD | CDIO_FS_ANAL_ISO9660_ANY); if (_cdio_is_it(INDEX_CDTV)) ret |= CDIO_FS_ANAL_CDTV; return ret; }
/* Try to determine what kind of CD-image and/or filesystem we have at track track_num. Return information about the CD image is returned in cdio_analysis and the return value. */ cdio_fs_anal_t cdio_guess_cd_type(const CdIo *cdio, int start_session, track_t track_num, /*out*/ cdio_analysis_t *cdio_analysis) { int ret = 0; bool sector0_read_ok; if (TRACK_FORMAT_AUDIO == cdio_get_track_format(cdio, track_num)) return CDIO_FS_AUDIO; if ( _cdio_read_block(cdio, ISO_PVD_SECTOR, start_session, 0, track_num) < 0 ) return CDIO_FS_UNKNOWN; /* We have something that smells of a filesystem. */ if (_cdio_is_it(INDEX_CD_I) && _cdio_is_it(INDEX_CD_RTOS) && !_cdio_is_it(INDEX_BRIDGE) && !_cdio_is_it(INDEX_XA)) { return CDIO_FS_INTERACTIVE; } else { /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ sector0_read_ok = _cdio_read_block(cdio, 0, start_session, 1, track_num) == 0; if (_cdio_is_it(INDEX_HS)) ret |= CDIO_FS_HIGH_SIERRA; else if (_cdio_is_it(INDEX_ISOFS)) { if (_cdio_is_it(INDEX_CD_RTOS) && _cdio_is_it(INDEX_BRIDGE)) ret = CDIO_FS_ISO_9660_INTERACTIVE; else if (_cdio_is_hfs()) ret = CDIO_FS_ISO_HFS; else ret = CDIO_FS_ISO_9660; cdio_analysis->isofs_size = _cdio_get_iso9660_fs_sec_count(); sprintf(cdio_analysis->iso_label, buffer[0]+40); #if 0 if (_cdio_is_rockridge()) ret |= CDIO_FS_ANAL_ROCKRIDGE; #endif if (_cdio_read_block(cdio, BOOT_SECTOR, start_session, 3, track_num) < 0) return ret; if (_cdio_is_joliet()) { cdio_analysis->joliet_level = _cdio_get_joliet_level(); ret |= CDIO_FS_ANAL_JOLIET; } if (_cdio_is_it(INDEX_BOOTABLE)) ret |= CDIO_FS_ANAL_BOOTABLE; if ( _cdio_is_it(INDEX_XA) && _cdio_is_it(INDEX_ISOFS) && !(sector0_read_ok && _cdio_is_it(INDEX_PHOTO_CD)) ) { if ( _cdio_read_block(cdio, VCD_INFO_SECTOR, start_session, 4, track_num) < 0 ) return ret; if (_cdio_is_it(INDEX_BRIDGE) && _cdio_is_it(INDEX_CD_RTOS)) { if (_cdio_is_it(INDEX_VIDEO_CD)) ret |= CDIO_FS_ANAL_VIDEOCD; else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_SVCD; } else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_CVD; } } else if (_cdio_is_hfs()) ret |= CDIO_FS_HFS; else if (sector0_read_ok && _cdio_is_it(INDEX_EXT2)) ret |= CDIO_FS_EXT2; else if (_cdio_is_3do()) ret |= CDIO_FS_3DO; else { if ( _cdio_read_block(cdio, UFS_SUPERBLOCK_SECTOR, start_session, 2, track_num) < 0 ) return ret; if (sector0_read_ok && _cdio_is_it(INDEX_UFS)) ret |= CDIO_FS_UFS; else ret |= CDIO_FS_UNKNOWN; } } /* other checks */ if (_cdio_is_it(INDEX_XA)) ret |= CDIO_FS_ANAL_XA; if (_cdio_is_it(INDEX_PHOTO_CD)) ret |= CDIO_FS_ANAL_PHOTO_CD; if (_cdio_is_it(INDEX_CDTV)) ret |= CDIO_FS_ANAL_CDTV; return ret; }