📄 diskio.c
字号:
MAP_FSTSK, mid, fsinfo); setSyncAtExit(SAE_FSTSK, fsinfo); return (DfFileHeaderBlock*)mapadr;err_ret: DEBUG_PRINT(("fmpMapFileHeader err = %d\n", *mid)); return NULL;}/* ======================================================================== *//* * File system format and endian check * Normal return value (>=0) * bit 0 (LSB) - 15 File system format * bit 16 Endian format (1 when big endian) * bit 17 - 31 (MSB) Always 0. * Return value when the format is abnormal. * E_ILFMT */EXPORT WER fmCheckDiskFormat( DfSystemHeader *sh ){ W diskform = E_ILFMT; if ( (sh->fsid == StdfsDiskMagic) || (sh->fsid == StdfsDiskMagic_E) ) { switch ( sh->diskid ) { case StdfsDiskID_A: /* STDFS standard format */ case StdfsDiskID_A2: /* STDFS standard format (HD) */ diskform = TSD_FCD_SFT_MC1 | DiskForm_A; break; case StdfsDiskID_B: /* STDFS extended format 1 */ diskform = TSD_FCD_SFT_MC1 | DiskForm_B; break; case StdfsDiskID_C: /* STDFS extended format 2 */ diskform = TSD_FCD_SFT_MC1 | DiskForm_C; break; default: /* nothing to do */ break; } } if ( (sh->fsid == swapH(StdfsDiskMagic)) || (sh->fsid == swapH(StdfsDiskMagic_E)) ) { switch ( swapH(sh->diskid) ) { case StdfsDiskID_A: /* STDFS standard format */ case StdfsDiskID_A2: /* STDFS standard format (HD) */ diskform = TSD_FCD_SFT_MC2 | DiskForm_A; break; case StdfsDiskID_B: /* STDFS extended format 1 */ diskform = TSD_FCD_SFT_MC2 | DiskForm_B; break; case StdfsDiskID_C: /* STDFS extended format 2 */ diskform = TSD_FCD_SFT_MC2 | DiskForm_C; break; default: /* nothing to do */ break; } } return diskform;}/* * Disk mapping (for common section task) */LOCAL VP fmcMapPhyBlks( PhyBlk padr[], DiskMapInfo *dmInfo, ID_ERR *mid ){ MapMode mode = FmTskMapMode; ER err; mode.info = (VW)MAP_FMTSK; *mid = err = MapDisk(dmInfo->dskid, padr, &mode); if ( err < E_OK ) { if ( err == E_TMOUT ) { *mid = E_SYSMEM; } DEBUG_PRINT(("fmcMapPhyBlks err = %d\n", err)); return NULL; } return mode.addr;}/* * Map the one logical block. */LOCAL VP fmcMapLogBlk( UW lblk, W sblk, DiskMapInfo *dmInfo, ID_ERR *mid ){ PhyBlk pblk[TSD_DIO_BLK_2]; W blkRatio; blkRatio = sblk / dmInfo->dskInfo.blocksize; pblk[0].blk = (lblk * (UW)blkRatio) + (UW)dmInfo->pbadj; pblk[0].len = (UW)blkRatio; pblk[1].len = 0; return fmcMapPhyBlks(pblk, dmInfo, mid);}/* * Find the file system header and set the DiskMapInfo. */LOCAL ER fmcScanFileSystemHeader( DiskMapInfo *dmInfo, PhyBlk pblk[TSD_DIO_BLK_2] ){ static const UW bootsz[] = StdBootBlkSizeList;#define N_BOOTSZ ( sizeof(bootsz)/sizeof(UW) ) DfSystemHeader *sh = NULL; ID mid; W i; FsSpec fsspec; ER err; /* * Retrieve the boot block size. * Try several sizes. */ for ( i = 0; i < (W)N_BOOTSZ; ++i ) { if ( (UW)dmInfo->dskInfo.blocksize > bootsz[i] ) { continue; } /* Location of the system header */ pblk[0].blk = bootsz[i] / (UW)dmInfo->dskInfo.blocksize; pblk[0].len = ((sizeof(DfSystemHeader) - 1) / (UW)dmInfo->dskInfo.blocksize) + 1; pblk[1].len = 0; /* Map the system header. */ sh = fmcMapPhyBlks(pblk, dmInfo, &mid); if ( sh == NULL ) { err = (ER)mid; goto err_ret; } /* Check the disk format. */ err = fmCheckDiskFormat(sh); if ( err >= 0 ) { /* OK: Set the file system format and endian format. */ dmInfo->diskform = DiskFormVersion(err); dmInfo->big = DiskFormEndian(err); break; } (void)fmcUnmapDisk(mid, MD_RDONLY); } if ( i >= (W)N_BOOTSZ ) { err = E_ILFMT; goto err_ret; } /* Correction value for computing the physical block number Correction value when the boot block size and logical block size are not equal. */ dmInfo->pbadj = ((W)bootsz[i] - (W)fmConvEndianH(sh->sblk, dmInfo->big)) / dmInfo->dskInfo.blocksize;#if !MisalignLogBlk if ( dmInfo->pbadj != 0 ) { (void)fmcUnmapDisk(mid, MD_RDONLY); err = E_ILFMT; goto err_ret; }#endif /* Notify the segment management of the file system information. */ fsspec.lbsz = fmConvEndianH(sh->sblk, dmInfo->big); fsspec.btsz = (UH)bootsz[i]; (void)fmcUnmapDisk(mid, MD_RDONLY); err = InformFS(dmInfo->dskid, &fsspec); if ( err < E_OK ) { if ( err == E_BUSY ) { err = E_SYS; } goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("fmcScanFileSystemHeader err = %d\n", err)); return err;}/* * Map the file system header. * Check also the disk format when the file system is not connected. */EXPORT DfSystemHeader* fmcMapFileSystemHeader( DiskMapInfo *dmInfo, FsInfo *fsinfo, ID_ERR *mid ){ PhyBlk pblk[TSD_DIO_BLK_2]; DfSystemHeader *sh; ER err; if ( fsinfo == NULL ) { /* The file system is not connected. */ err = fmcScanFileSystemHeader(dmInfo, pblk); if ( err < E_OK ) { goto err_ret; } } else { /* The file system has already connected. */ dmInfo->big = fsinfo->bigEndian; dmInfo->pbadj = fsinfo->pbadj; /* Location of the system header */ pblk[0].blk = fsinfo->blkRatio + (UW)dmInfo->pbadj; pblk[0].len = ((sizeof(DfSystemHeader) - 1U) / (UW)dmInfo->dskInfo.blocksize) + 1U; pblk[1].len = 0; } /* Map the file system header. */ sh = fmcMapPhyBlks(pblk, dmInfo, mid); if ( sh == NULL ) { err = (ER)*mid; goto err_ret; } return sh;err_ret: DEBUG_PRINT(("fmcMapFileSystemHeader err = %d\n", err)); *mid = err; return NULL;}/* * Map the root file header. */EXPORT DfFileHeader* fmcMapRootFileHeader( DfSystemHeader *sh, DiskMapInfo *dmInfo, ID_ERR *mid ){ W ssys, sblk; DfFileID *fidt, f; DfFileHeader *fh; ER err; /* Logical block size */ sblk = (W)fmConvEndianH(sh->sblk, dmInfo->big); /* System block size */ ssys = (W)fmConvEndianH(sh->ssys, dmInfo->big); /* Map the file ID table. */ fidt = fmcMapLogBlk((UW)(ssys + 1), sblk, dmInfo, mid); if ( fidt == NULL ) { err = (ER)*mid; goto err_ret; } /* Obtain the file header block address. */ f = fmConvEndianFileID(*fidt, dmInfo->big); err = fmcUnmapDisk(*mid, MD_RDONLY); if ( err < E_OK ) { goto err_ret; } /* Map the file header. */ fh = fmcMapLogBlk(f.s.blkadr, sblk, dmInfo, mid); if ( fh == NULL ) { err = (ER)*mid; goto err_ret; } return fh;err_ret: DEBUG_PRINT(("fmcMapRootFileHeader err = %d\n", err)); *mid = err; return NULL;}/* * Map the root file abbreviated name. */EXPORT DfShortName* fmcMapRootFileShortName( DfSystemHeader *sh, DiskMapInfo *dmInfo, ID_ERR *mid ){ W sblk, ssys, sfidt; DfShortName *sfnt; ER err; /* Logical block size */ sblk = (W)fmConvEndianH(sh->sblk, dmInfo->big); /* System block size */ ssys = (W)fmConvEndianH(sh->ssys, dmInfo->big); /* File ID table size */ sfidt = (W)fmConvEndianH(sh->sfidt, dmInfo->big); /* Map the first one block of the file abbreviated name table. */ sfnt = fmcMapLogBlk((UW)(ssys + sfidt + 1), sblk, dmInfo, mid); if ( sfnt == NULL ) { err = (ER)*mid; goto err_ret; } return sfnt;err_ret: DEBUG_PRINT(("fmcMapRootFileShortName err = %d\n", err)); *mid = err; return NULL;}/* ======================================================================== */#if !USE_DEVICE_MANAGERLOCAL UB devname[L_DEVNM + 1];#endif/* * Check the disk partition information. */EXPORT ER fmCheckPartitionID( DevName devnm ){ DiskPartInfo info; W dd, asz; ER err, chk;#if USE_DEVICE_MANAGER dd = tkse_opn_dev2(devnm, D_READ, NULL); if ( dd < E_OK ) { err = dd; goto err_ret1; } err = tkse_rea_dev2(dd, DN_DISKPARTINFO, (B*)&info, sizeof(info), &asz, NULL); if ( err < E_OK ) { if ( !((err == E_NOSPT) || (err == E_PAR)) ) { goto err_ret2; } chk = E_OK; } else { chk = isSTDFS_SID(info.systemid)? E_OK: E_ILFMT; } err = tkse_cls_dev2(dd, 0, NULL); if ( err < E_OK ) { goto err_ret1; }#else /* Convert the device name. TC -> ASCII */ if ( tcstoeucs(NULL, devnm) > L_DEVNM || tcstoeucs(devname, devnm) < 0 ) { err = E_PAR; goto err_ret1; } /* Disk connection */ dd = tk_opn_dev(devname, TD_READ); if ( dd < E_OK ) { err = ERtoERR(dd); goto err_ret1; } /* Obtain the disk information. */ err = tk_srea_dev(dd, DN_DISKPARTINFO, (B*)&info, sizeof(info), &asz); if ( err < E_OK ) { err = ERtoERR(err); if ( !((err == E_NOSPT) || (err == E_PAR)) ) { goto err_ret2; } chk = E_OK; } else { chk = isSTDFS_SID(info.systemid)? E_OK: E_ILFMT; } err = tk_cls_dev(dd, 0); if ( err < E_OK ) { err = ERtoERR(err); goto err_ret1; }#endif return chk;err_ret2:#if USE_DEVICE_MANAGER (void)tkse_cls_dev2(dd, 0, NULL);#else (void)tk_cls_dev(dd, 0);#endiferr_ret1: DEBUG_PRINT(("fmCheckPartitionID err = %d\n", err)); return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -