size_t data_length() const noexcept { if (is_ext2()) return __builtin_bswap64(*(uint64_t*) vla) & 0xffffffff; if (is_ext()) return __builtin_bswap16(*(uint16_t*) vla); return payload(); }
void filesys_init (bool format){ fs_device = block_get_role(BLOCK_FILESYS); if(fs_device == NULL) PANIC("No file system device found, can't initialize file system."); if(is_ext2(fs_device) == false) PANIC("Device file system not recognised!"); else { ext2_init(); ext2_register(fs_device); printf("File system type: ext2.\n"); } }
void set_payload(const size_t len) { uint16_t pbits = len; if (len > 65535) pbits = 127; else if (len > 125) pbits = 126; bits &= 0x80ff; bits |= (pbits & 0x7f) << 8; if (is_ext()) *(uint16_t*) vla = __builtin_bswap16(len); else if (is_ext2()) *(uint64_t*) vla = __builtin_bswap64(len); assert(data_length() == len); }
size_t data_offset() const noexcept { size_t len = mask_length(); if (is_ext2()) return len + 8; if (is_ext()) return len + 2; return len; }
int guess_filesystem(int start_session) { int ret = 0; read_super(start_session); #undef _DEBUG #ifdef _DEBUG /* buffer is defined */ if (is_cdi()) printf("CD-I, "); if (is_cd_rtos()) printf("CD-RTOS, "); if (is_isofs()) printf("ISOFS, "); if (is_hs()) printf("HS, "); if (is_bridge()) printf("BRIDGE, "); if (is_xa()) printf("XA, "); if (is_cdtv()) printf("CDTV, "); puts(""); #endif /* filesystem */ if (is_cdi() && is_cd_rtos() && !is_bridge() && !is_xa()) { return FS_INTERACTIVE; } else { /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ read_super2(start_session); #ifdef _DEBUG /* buffer2 is defined */ if (is_photocd()) printf("PHOTO CD, "); if (is_hfs()) printf("HFS, "); if (is_ext2()) printf("EXT2 FS, "); puts(""); #endif if (is_hs()) ret |= FS_HIGH_SIERRA; else if (is_isofs()) { if (is_cd_rtos() && is_bridge()) ret = FS_ISO_9660_INTERACTIVE; else if (is_hfs()) ret = FS_ISO_HFS; else ret = FS_ISO_9660; isofs_size = get_size(); read_super4(start_session); #ifdef _DEBUG /* buffer4 is defined */ if (is_bootable()) printf("BOOTABLE, "); puts(""); #endif if (is_bootable()) ret |= BOOTABLE; if (is_bridge() && is_xa() && is_isofs() && is_cd_rtos()) { read_super5(start_session); #ifdef _DEBUG /* buffer5 is defined */ if (is_video_cdi()) printf("VIDEO-CDI, "); puts(""); #endif if (is_video_cdi()) ret |= VIDEOCDI; } } else if (is_hfs()) ret |= FS_HFS; else if (is_ext2()) ret |= FS_EXT2; else { read_super3(start_session); #ifdef _DEBUG /* buffer3 is defined */ if (is_ufs()) printf("UFS, "); puts(""); #endif if (is_ufs()) ret |= FS_UFS; else ret |= FS_UNKNOWN; } } /* other checks */ if (is_xa()) ret |= XA; if (is_photocd()) ret |= PHOTO_CD; if (is_cdtv()) ret |= CDTV; return ret; }