2016-07-28 18:13:49 +01:00
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : SysV.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : UNIX System V filesystem plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies the UNIX System V filesystem and shows information.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2016 Natalia Portillo
// ****************************************************************************/
2014-04-17 19:58:14 +00:00
2012-08-07 06:20:13 +00:00
using System ;
using System.Text ;
2016-07-21 17:16:08 +01:00
using System.Collections.Generic ;
2012-08-07 06:20:13 +00:00
2016-07-21 16:15:39 +01:00
namespace DiscImageChef.Filesystems
2012-08-07 06:20:13 +00:00
{
2016-07-28 22:25:26 +01:00
// Information from the Linux kernel
2016-07-21 16:15:39 +01:00
class SysVfs : Filesystem
2014-04-14 02:29:13 +00:00
{
2016-07-28 22:25:26 +01:00
const uint XENIX_MAGIC = 0x002B5544 ;
const uint XENIX_CIGAM = 0x44552B00 ;
const uint SYSV_MAGIC = 0xFD187E20 ;
const uint SYSV_CIGAM = 0x207E18FD ;
2014-04-14 02:29:13 +00:00
// Rest have no magic.
// Per a Linux kernel, Coherent fs has following:
const string COH_FNAME = "nonamexxxxx " ;
const string COH_FPACK = "nopackxxxxx\n" ;
// SCO AFS
2016-07-28 22:25:26 +01:00
const ushort SCO_NFREE = 0xFFFF ;
2014-04-14 02:29:13 +00:00
// UNIX 7th Edition has nothing to detect it, so check for a valid filesystem is a must :(
2016-07-28 22:25:26 +01:00
const ushort V7_NICINOD = 100 ;
const ushort V7_NICFREE = 50 ;
const uint V7_MAXSIZE = 0x00FFFFFF ;
2014-04-14 02:29:13 +00:00
2015-10-05 20:04:05 +01:00
public SysVfs ( )
2012-08-07 06:20:13 +00:00
{
2014-04-14 02:29:13 +00:00
Name = "UNIX System V filesystem" ;
2016-07-27 13:32:45 +01:00
PluginUUID = new Guid ( "9B8D016A-8561-400E-A12A-A198283C211D" ) ;
}
public SysVfs ( ImagePlugins . ImagePlugin imagePlugin , ulong partitionStart , ulong partitionEnd )
{
Name = "UNIX System V filesystem" ;
2014-04-14 02:29:13 +00:00
PluginUUID = new Guid ( "9B8D016A-8561-400E-A12A-A198283C211D" ) ;
2012-08-07 06:20:13 +00:00
}
2014-04-14 02:29:13 +00:00
2015-04-20 05:09:46 +01:00
public override bool Identify ( ImagePlugins . ImagePlugin imagePlugin , ulong partitionStart , ulong partitionEnd )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( ( 2 + partitionStart ) > = imagePlugin . GetSectors ( ) )
2014-07-09 19:49:14 +01:00
return false ;
2016-07-28 22:25:26 +01:00
uint magic ;
2014-04-14 02:29:13 +00:00
string s_fname , s_fpack ;
2016-07-28 22:25:26 +01:00
ushort s_nfree , s_ninode ;
uint s_fsize ;
2012-08-07 06:20:13 +00:00
2014-04-14 02:29:13 +00:00
/ * for ( int j = 0 ; j < = ( br . BaseStream . Length / 0x200 ) ; j + + )
2015-12-06 07:18:36 +00:00
{
br . BaseStream . Seek ( offset + j * 0x200 + 0x1F8 , SeekOrigin . Begin ) ; // System V magic location
2016-07-28 22:25:26 +01:00
magic = br . Readuint ( ) ;
2012-08-07 06:20:13 +00:00
2015-12-06 07:18:36 +00:00
if ( magic = = SYSV_MAGIC | | magic = = SYSV_CIGAM )
Console . WriteLine ( "0x{0:X8}: 0x{1:X8} FOUND" , br . BaseStream . Position - 4 , magic ) ;
else
Console . WriteLine ( "0x{0:X8}: 0x{1:X8}" , br . BaseStream . Position - 4 , magic ) ;
} * /
2012-08-07 06:20:13 +00:00
2016-07-28 22:25:26 +01:00
/ * uint number ;
2015-12-06 07:18:36 +00:00
br . BaseStream . Seek ( offset + 0x3A00 , SeekOrigin . Begin ) ;
while ( ( br . BaseStream . Position ) < = ( offset + 0x3C00 ) )
{
2016-07-28 22:25:26 +01:00
number = br . Readuint ( ) ;
2012-08-07 06:20:13 +00:00
2015-12-06 07:18:36 +00:00
Console . WriteLine ( "@{0:X8}: 0x{1:X8} ({1})" , br . BaseStream . Position - offset - 4 , number ) ;
} * /
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
byte sb_size_in_sectors ;
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) < = 0x400 ) // Check if underlying device sector size is smaller than SuperBlock size
2014-04-14 01:14:20 +00:00
sb_size_in_sectors = ( byte ) ( 0x400 / imagePlugin . GetSectorSize ( ) ) ;
else
sb_size_in_sectors = 1 ; // If not a single sector can store it
2016-07-28 22:25:26 +01:00
if ( imagePlugin . GetSectors ( ) < = ( partitionStart + 4 * ( ulong ) sb_size_in_sectors + sb_size_in_sectors ) ) // Device must be bigger than SB location + SB size + offset
2014-04-14 01:14:20 +00:00
return false ;
// Superblock can start on 0x000, 0x200, 0x600 and 0x800, not aligned, so we assume 16 (128 bytes/sector) sectors as a safe value
2016-04-19 02:11:47 +01:00
for ( int i = 0 ; i < = 16 ; i + + )
2014-04-14 02:29:13 +00:00
{
2016-08-01 18:52:34 +01:00
if ( i + sb_size_in_sectors > = ( int ) imagePlugin . ImageInfo . sectors )
break ;
2015-04-20 05:09:46 +01:00
byte [ ] sb_sector = imagePlugin . ReadSectors ( ( ulong ) i + partitionStart , sb_size_in_sectors ) ;
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
magic = BitConverter . ToUInt32 ( sb_sector , 0x3F8 ) ; // XENIX magic location
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( magic = = XENIX_MAGIC | | magic = = XENIX_CIGAM )
2014-04-14 02:29:13 +00:00
return true ;
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
magic = BitConverter . ToUInt32 ( sb_sector , 0x1F8 ) ; // System V magic location
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( magic = = SYSV_MAGIC | | magic = = SYSV_CIGAM )
2014-04-14 02:29:13 +00:00
return true ;
2012-08-07 06:20:13 +00:00
2016-08-03 02:57:08 +01:00
magic = BitConverter . ToUInt32 ( sb_sector , 0x1F0 ) ; // XENIX 3 magic location
2016-08-01 00:02:14 +01:00
if ( magic = = XENIX_MAGIC | | magic = = XENIX_CIGAM )
return true ;
2014-04-14 01:14:20 +00:00
byte [ ] coherent_string = new byte [ 6 ] ;
Array . Copy ( sb_sector , 0x1E8 , coherent_string , 0 , 6 ) ; // Coherent UNIX s_fname location
s_fname = StringHandlers . CToString ( coherent_string ) ;
Array . Copy ( sb_sector , 0x1EE , coherent_string , 0 , 6 ) ; // Coherent UNIX s_fpack location
s_fpack = StringHandlers . CToString ( coherent_string ) ;
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( s_fname = = COH_FNAME | | s_fpack = = COH_FPACK )
2014-04-14 02:29:13 +00:00
return true ;
2012-08-07 06:20:13 +00:00
2014-04-14 02:29:13 +00:00
// Now try to identify 7th edition
2014-04-14 01:14:20 +00:00
s_fsize = BitConverter . ToUInt32 ( sb_sector , 0x002 ) ; // 7th edition's s_fsize
s_nfree = BitConverter . ToUInt16 ( sb_sector , 0x006 ) ; // 7th edition's s_nfree
s_ninode = BitConverter . ToUInt16 ( sb_sector , 0x0D0 ) ; // 7th edition's s_ninode
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( s_fsize > 0 & & s_fsize < 0xFFFFFFFF & & s_nfree > 0 & & s_nfree < 0xFFFF & & s_ninode > 0 & & s_ninode < 0xFFFF )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( ( s_fsize & 0xFF ) = = 0x00 & & ( s_nfree & 0xFF ) = = 0x00 & & ( s_ninode & 0xFF ) = = 0x00 )
2014-04-14 02:29:13 +00:00
{
// Byteswap
s_fsize = ( ( s_fsize & 0xFF ) < < 24 ) + ( ( s_fsize & 0xFF00 ) < < 8 ) + ( ( s_fsize & 0xFF0000 ) > > 8 ) + ( ( s_fsize & 0xFF000000 ) > > 24 ) ;
2016-07-28 22:25:26 +01:00
s_nfree = ( ushort ) ( s_nfree > > 8 ) ;
s_ninode = ( ushort ) ( s_ninode > > 8 ) ;
2014-04-14 02:29:13 +00:00
}
2016-04-19 02:11:47 +01:00
if ( ( s_fsize & 0xFF000000 ) = = 0x00 & & ( s_nfree & 0xFF00 ) = = 0x00 & & ( s_ninode & 0xFF00 ) = = 0x00 )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( s_fsize < V7_MAXSIZE & & s_nfree < V7_NICFREE & & s_ninode < V7_NICINOD )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( ( s_fsize * 1024 ) = = ( imagePlugin . GetSectors ( ) * imagePlugin . GetSectorSize ( ) ) | | ( s_fsize * 512 ) = = ( imagePlugin . GetSectors ( ) * imagePlugin . GetSectorSize ( ) ) )
2014-04-14 02:29:13 +00:00
return true ;
}
}
}
}
return false ;
}
2015-04-20 05:09:46 +01:00
public override void GetInformation ( ImagePlugins . ImagePlugin imagePlugin , ulong partitionStart , ulong partitionEnd , out string information )
2014-04-14 02:29:13 +00:00
{
information = "" ;
2016-04-19 02:11:47 +01:00
2014-04-14 02:29:13 +00:00
StringBuilder sb = new StringBuilder ( ) ;
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = true ; // Start in little endian until we know what are we handling here
2014-04-14 02:29:13 +00:00
int start ;
2016-07-28 22:25:26 +01:00
uint magic ;
2014-04-14 02:29:13 +00:00
string s_fname , s_fpack ;
2016-07-28 22:25:26 +01:00
ushort s_nfree , s_ninode ;
uint s_fsize ;
2014-04-14 02:29:13 +00:00
bool xenix = false ;
bool sysv = false ;
bool sysvr4 = false ;
bool sys7th = false ;
bool coherent = false ;
2016-08-03 02:57:08 +01:00
bool xenix3 = false ;
2014-04-14 01:14:20 +00:00
byte [ ] sb_sector ;
byte sb_size_in_sectors ;
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) < = 0x400 ) // Check if underlying device sector size is smaller than SuperBlock size
2014-04-14 01:14:20 +00:00
sb_size_in_sectors = ( byte ) ( 0x400 / imagePlugin . GetSectorSize ( ) ) ;
else
sb_size_in_sectors = 1 ; // If not a single sector can store it
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
// Superblock can start on 0x000, 0x200, 0x600 and 0x800, not aligned, so we assume 16 (128 bytes/sector) sectors as a safe value
2016-04-19 02:11:47 +01:00
for ( start = 0 ; start < = 16 ; start + + )
2014-04-14 02:29:13 +00:00
{
2015-04-20 05:09:46 +01:00
sb_sector = imagePlugin . ReadSectors ( ( ulong ) start + partitionStart , sb_size_in_sectors ) ;
2014-04-14 01:14:20 +00:00
magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x3F8 ) ; // XENIX magic location
2016-04-19 02:11:47 +01:00
if ( magic = = XENIX_MAGIC )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = true ; // Little endian
2014-04-14 02:29:13 +00:00
xenix = true ;
break ;
}
2016-04-19 02:11:47 +01:00
if ( magic = = XENIX_CIGAM )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = false ; // Big endian
2014-04-14 02:29:13 +00:00
xenix = true ;
break ;
}
2012-08-07 06:20:13 +00:00
2016-08-03 02:57:08 +01:00
magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F0 ) ; // XENIX 3 magic location
2016-08-01 00:02:14 +01:00
if ( magic = = XENIX_MAGIC )
{
BigEndianBitConverter . IsLittleEndian = true ; // Little endian
2016-08-03 02:57:08 +01:00
xenix3 = true ;
2016-08-01 00:02:14 +01:00
break ;
}
if ( magic = = XENIX_CIGAM )
{
BigEndianBitConverter . IsLittleEndian = false ; // Big endian
2016-08-03 02:57:08 +01:00
xenix3 = true ;
2016-08-01 00:02:14 +01:00
break ;
}
2014-04-14 01:14:20 +00:00
magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F8 ) ; // XENIX magic location
2016-04-19 02:11:47 +01:00
if ( magic = = SYSV_MAGIC )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = true ; // Little endian
2014-04-14 02:29:13 +00:00
sysv = true ;
break ;
}
2016-04-19 02:11:47 +01:00
if ( magic = = SYSV_CIGAM )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = false ; // Big endian
2014-04-14 02:29:13 +00:00
sysv = true ;
break ;
}
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
byte [ ] coherent_string = new byte [ 6 ] ;
Array . Copy ( sb_sector , 0x1E8 , coherent_string , 0 , 6 ) ; // Coherent UNIX s_fname location
s_fname = StringHandlers . CToString ( coherent_string ) ;
Array . Copy ( sb_sector , 0x1EE , coherent_string , 0 , 6 ) ; // Coherent UNIX s_fpack location
s_fpack = StringHandlers . CToString ( coherent_string ) ;
2016-04-19 02:11:47 +01:00
if ( s_fname = = COH_FNAME | | s_fpack = = COH_FPACK )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = true ; // Coherent is in PDP endianness, use helper for that
2014-04-14 02:29:13 +00:00
coherent = true ;
break ;
}
2012-08-07 06:20:13 +00:00
2014-04-14 02:29:13 +00:00
// Now try to identify 7th edition
2014-04-14 01:14:20 +00:00
s_fsize = BitConverter . ToUInt32 ( sb_sector , 0x002 ) ; // 7th edition's s_fsize
s_nfree = BitConverter . ToUInt16 ( sb_sector , 0x006 ) ; // 7th edition's s_nfree
s_ninode = BitConverter . ToUInt16 ( sb_sector , 0x0D0 ) ; // 7th edition's s_ninode
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( s_fsize > 0 & & s_fsize < 0xFFFFFFFF & & s_nfree > 0 & & s_nfree < 0xFFFF & & s_ninode > 0 & & s_ninode < 0xFFFF )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( ( s_fsize & 0xFF ) = = 0x00 & & ( s_nfree & 0xFF ) = = 0x00 & & ( s_ninode & 0xFF ) = = 0x00 )
2014-04-14 02:29:13 +00:00
{
// Byteswap
s_fsize = ( ( s_fsize & 0xFF ) < < 24 ) + ( ( s_fsize & 0xFF00 ) < < 8 ) + ( ( s_fsize & 0xFF0000 ) > > 8 ) + ( ( s_fsize & 0xFF000000 ) > > 24 ) ;
2016-07-28 22:25:26 +01:00
s_nfree = ( ushort ) ( s_nfree > > 8 ) ;
s_ninode = ( ushort ) ( s_ninode > > 8 ) ;
2014-04-14 02:29:13 +00:00
}
2016-04-19 02:11:47 +01:00
if ( ( s_fsize & 0xFF000000 ) = = 0x00 & & ( s_nfree & 0xFF00 ) = = 0x00 & & ( s_ninode & 0xFF00 ) = = 0x00 )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( s_fsize < V7_MAXSIZE & & s_nfree < V7_NICFREE & & s_ninode < V7_NICINOD )
2014-04-14 02:29:13 +00:00
{
2016-04-19 02:11:47 +01:00
if ( ( s_fsize * 1024 ) = = ( imagePlugin . GetSectors ( ) * imagePlugin . GetSectorSize ( ) ) | | ( s_fsize * 512 ) = = ( imagePlugin . GetSectors ( ) * imagePlugin . GetSectorSize ( ) ) )
2014-04-14 02:29:13 +00:00
{
sys7th = true ;
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = true ;
2014-04-14 02:29:13 +00:00
break ;
}
}
}
}
}
2016-08-03 02:57:08 +01:00
if ( ! sys7th & & ! sysv & & ! coherent & & ! xenix & & ! xenix3 )
2014-04-14 02:29:13 +00:00
return ;
2015-12-05 17:10:27 +00:00
xmlFSType = new Schemas . FileSystemType ( ) ;
2016-08-03 02:57:08 +01:00
if ( xenix | | xenix3 )
2014-04-14 02:29:13 +00:00
{
2014-04-14 01:14:20 +00:00
byte [ ] xenix_strings = new byte [ 6 ] ;
2014-04-14 02:29:13 +00:00
XenixSuperBlock xnx_sb = new XenixSuperBlock ( ) ;
2015-04-20 05:09:46 +01:00
sb_sector = imagePlugin . ReadSectors ( ( ulong ) start + partitionStart , sb_size_in_sectors ) ;
2016-04-19 02:11:47 +01:00
2016-08-03 02:57:08 +01:00
if ( xenix3 )
2016-08-01 00:02:14 +01:00
{
xnx_sb . s_isize = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x000 ) ;
xnx_sb . s_fsize = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x002 ) ;
xnx_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x006 ) ;
2016-08-03 02:57:08 +01:00
xnx_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x0D0 ) ;
2016-08-01 00:02:14 +01:00
xnx_sb . s_flock = sb_sector [ 0x19A ] ;
xnx_sb . s_ilock = sb_sector [ 0x19B ] ;
xnx_sb . s_fmod = sb_sector [ 0x19C ] ;
xnx_sb . s_ronly = sb_sector [ 0x19D ] ;
2016-08-03 02:57:08 +01:00
xnx_sb . s_time = BigEndianBitConverter . ToInt32 ( sb_sector , 0x19E ) ;
2016-08-01 00:02:14 +01:00
xnx_sb . s_tfree = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1A2 ) ;
xnx_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A6 ) ;
xnx_sb . s_cylblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A8 ) ;
xnx_sb . s_gapblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AA ) ;
xnx_sb . s_dinfo0 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AC ) ;
xnx_sb . s_dinfo1 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AE ) ;
Array . Copy ( sb_sector , 0x1B0 , xenix_strings , 0 , 6 ) ;
xnx_sb . s_fname = StringHandlers . CToString ( xenix_strings ) ;
Array . Copy ( sb_sector , 0x1B6 , xenix_strings , 0 , 6 ) ;
xnx_sb . s_fpack = StringHandlers . CToString ( xenix_strings ) ;
xnx_sb . s_clean = sb_sector [ 0x1BC ] ;
xnx_sb . s_magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F0 ) ;
xnx_sb . s_type = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F4 ) ;
}
else
{
xnx_sb . s_isize = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x000 ) ;
xnx_sb . s_fsize = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x002 ) ;
xnx_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x006 ) ;
xnx_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x198 ) ;
xnx_sb . s_flock = sb_sector [ 0x262 ] ;
xnx_sb . s_ilock = sb_sector [ 0x263 ] ;
xnx_sb . s_fmod = sb_sector [ 0x264 ] ;
xnx_sb . s_ronly = sb_sector [ 0x265 ] ;
2016-08-03 02:57:08 +01:00
xnx_sb . s_time = BigEndianBitConverter . ToInt32 ( sb_sector , 0x266 ) ;
2016-08-01 00:02:14 +01:00
xnx_sb . s_tfree = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x26A ) ;
xnx_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x26E ) ;
xnx_sb . s_cylblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x270 ) ;
xnx_sb . s_gapblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x272 ) ;
xnx_sb . s_dinfo0 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x274 ) ;
xnx_sb . s_dinfo1 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x276 ) ;
Array . Copy ( sb_sector , 0x278 , xenix_strings , 0 , 6 ) ;
xnx_sb . s_fname = StringHandlers . CToString ( xenix_strings ) ;
Array . Copy ( sb_sector , 0x27E , xenix_strings , 0 , 6 ) ;
xnx_sb . s_fpack = StringHandlers . CToString ( xenix_strings ) ;
xnx_sb . s_clean = sb_sector [ 0x284 ] ;
xnx_sb . s_magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x3F8 ) ;
xnx_sb . s_type = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x3FC ) ;
}
2012-08-07 06:20:13 +00:00
2016-07-28 22:25:26 +01:00
uint bs = 512 ;
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "XENIX filesystem" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . Type = "XENIX fs" ;
2016-04-19 02:11:47 +01:00
switch ( xnx_sb . s_type )
2014-04-14 02:29:13 +00:00
{
case 1 :
sb . AppendLine ( "512 bytes per block" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 512 ;
2014-04-14 02:29:13 +00:00
break ;
case 2 :
sb . AppendLine ( "1024 bytes per block" ) ;
bs = 1024 ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 1024 ;
2014-04-14 02:29:13 +00:00
break ;
case 3 :
sb . AppendLine ( "2048 bytes per block" ) ;
bs = 2048 ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 2048 ;
2014-04-14 02:29:13 +00:00
break ;
default :
sb . AppendFormat ( "Unknown s_type value: 0x{0:X8}" , xnx_sb . s_type ) . AppendLine ( ) ;
break ;
}
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) = = 2336 | | imagePlugin . GetSectorSize ( ) = = 2352 | | imagePlugin . GetSectorSize ( ) = = 2448 )
2014-04-14 01:14:20 +00:00
{
2016-04-19 02:11:47 +01:00
if ( bs ! = 2048 )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , bs , 2048 ) . AppendLine ( ) ;
}
else
{
2016-04-19 02:11:47 +01:00
if ( bs ! = imagePlugin . GetSectorSize ( ) )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , bs , imagePlugin . GetSectorSize ( ) ) . AppendLine ( ) ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "{0} zones on volume ({1} bytes)" , xnx_sb . s_fsize , xnx_sb . s_fsize * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free zones on volume ({1} bytes)" , xnx_sb . s_tfree , xnx_sb . s_tfree * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free blocks on list ({1} bytes)" , xnx_sb . s_nfree , xnx_sb . s_nfree * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} blocks per cylinder ({1} bytes)" , xnx_sb . s_cylblks , xnx_sb . s_cylblks * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} blocks per gap ({1} bytes)" , xnx_sb . s_gapblks , xnx_sb . s_gapblks * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "First data zone: {0}" , xnx_sb . s_isize ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on volume" , xnx_sb . s_tinode ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on list" , xnx_sb . s_ninode ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_flock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Free block list is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_ilock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "inode cache is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_fmod > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Superblock is being modified" ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_ronly > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is mounted read-only" ) ;
2016-08-03 02:57:08 +01:00
sb . AppendFormat ( "Superblock last updated on {0}" , DateHandlers . UNIXToDateTime ( xnx_sb . s_time ) ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_time ! = 0 )
2015-12-06 05:09:31 +00:00
{
2016-08-03 02:57:08 +01:00
xmlFSType . ModificationDate = DateHandlers . UNIXToDateTime ( xnx_sb . s_time ) ;
2015-12-06 05:09:31 +00:00
xmlFSType . ModificationDateSpecified = true ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Volume name: {0}" , xnx_sb . s_fname ) . AppendLine ( ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . VolumeName = xnx_sb . s_fname ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Pack name: {0}" , xnx_sb . s_fpack ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( xnx_sb . s_clean = = 0x46 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is clean" ) ;
else
2015-12-05 17:10:27 +00:00
{
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is dirty" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . Dirty = true ;
}
2014-04-14 02:29:13 +00:00
}
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( sysv )
2014-04-14 02:29:13 +00:00
{
2015-04-20 05:09:46 +01:00
sb_sector = imagePlugin . ReadSectors ( ( ulong ) start + partitionStart , sb_size_in_sectors ) ;
2016-07-28 22:25:26 +01:00
ushort pad0 , pad1 , pad2 ;
2014-04-14 01:14:20 +00:00
byte [ ] sysv_strings = new byte [ 6 ] ;
2012-08-07 06:20:13 +00:00
2014-04-14 01:14:20 +00:00
pad0 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x002 ) ; // First padding
pad1 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x00A ) ; // Second padding
pad2 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x0D6 ) ; // Third padding
2012-08-07 06:20:13 +00:00
2014-04-14 02:29:13 +00:00
// This detection is not working as expected
sysvr4 | = pad0 = = 0 & & pad1 = = 0 & & pad2 = = 0 ;
2012-08-07 06:20:13 +00:00
2014-04-14 02:29:13 +00:00
SystemVRelease4SuperBlock sysv_sb = new SystemVRelease4SuperBlock ( ) ;
2014-04-14 01:14:20 +00:00
// Common offsets
sysv_sb . s_isize = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x000 ) ;
sysv_sb . s_state = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F4 ) ;
sysv_sb . s_magic = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1F8 ) ;
sysv_sb . s_type = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1FC ) ;
2016-04-19 02:11:47 +01:00
if ( sysvr4 )
2014-04-14 01:14:20 +00:00
{
sysv_sb . s_fsize = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x004 ) ;
sysv_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x008 ) ;
sysv_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x0D4 ) ;
sysv_sb . s_flock = sb_sector [ 0x1A0 ] ;
sysv_sb . s_ilock = sb_sector [ 0x1A1 ] ;
sysv_sb . s_fmod = sb_sector [ 0x1A2 ] ;
sysv_sb . s_ronly = sb_sector [ 0x1A3 ] ;
sysv_sb . s_time = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1A4 ) ;
sysv_sb . s_cylblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A8 ) ;
sysv_sb . s_gapblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AA ) ;
sysv_sb . s_dinfo0 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AC ) ;
sysv_sb . s_dinfo1 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AE ) ;
sysv_sb . s_tfree = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1B0 ) ;
sysv_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1B4 ) ;
Array . Copy ( sb_sector , 0x1B8 , sysv_strings , 0 , 6 ) ;
sysv_sb . s_fname = StringHandlers . CToString ( sysv_strings ) ;
Array . Copy ( sb_sector , 0x1BE , sysv_strings , 0 , 6 ) ;
sysv_sb . s_fpack = StringHandlers . CToString ( sysv_strings ) ;
}
else
{
sysv_sb . s_fsize = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x002 ) ;
sysv_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x006 ) ;
sysv_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x0D0 ) ;
sysv_sb . s_flock = sb_sector [ 0x19A ] ;
sysv_sb . s_ilock = sb_sector [ 0x19B ] ;
sysv_sb . s_fmod = sb_sector [ 0x19C ] ;
sysv_sb . s_ronly = sb_sector [ 0x19D ] ;
sysv_sb . s_time = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x19E ) ;
sysv_sb . s_cylblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A2 ) ;
sysv_sb . s_gapblks = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A4 ) ;
sysv_sb . s_dinfo0 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A6 ) ;
sysv_sb . s_dinfo1 = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A8 ) ;
sysv_sb . s_tfree = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1AA ) ;
sysv_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AE ) ;
Array . Copy ( sb_sector , 0x1B0 , sysv_strings , 0 , 6 ) ;
sysv_sb . s_fname = StringHandlers . CToString ( sysv_strings ) ;
Array . Copy ( sb_sector , 0x1B6 , sysv_strings , 0 , 6 ) ;
sysv_sb . s_fpack = StringHandlers . CToString ( sysv_strings ) ;
}
2012-08-07 06:20:13 +00:00
2016-07-28 22:25:26 +01:00
uint bs = 512 ;
2016-04-19 02:11:47 +01:00
if ( sysvr4 )
2015-12-05 17:10:27 +00:00
{
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "System V Release 4 filesystem" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . Type = "SVR4 fs" ;
}
2014-04-14 02:29:13 +00:00
else
2015-12-05 17:10:27 +00:00
{
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "System V Release 2 filesystem" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . Type = "SVR2 fs" ;
}
2016-04-19 02:11:47 +01:00
switch ( sysv_sb . s_type )
2014-04-14 02:29:13 +00:00
{
case 1 :
sb . AppendLine ( "512 bytes per block" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 512 ;
2014-04-14 02:29:13 +00:00
break ;
case 2 :
sb . AppendLine ( "1024 bytes per block" ) ;
bs = 1024 ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 1024 ;
2014-04-14 02:29:13 +00:00
break ;
case 3 :
sb . AppendLine ( "2048 bytes per block" ) ;
bs = 2048 ;
2015-12-05 17:10:27 +00:00
xmlFSType . ClusterSize = 2048 ;
2014-04-14 02:29:13 +00:00
break ;
default :
sb . AppendFormat ( "Unknown s_type value: 0x{0:X8}" , sysv_sb . s_type ) . AppendLine ( ) ;
break ;
}
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) = = 2336 | | imagePlugin . GetSectorSize ( ) = = 2352 | | imagePlugin . GetSectorSize ( ) = = 2448 )
2014-04-14 01:14:20 +00:00
{
2016-04-19 02:11:47 +01:00
if ( bs ! = 2048 )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , bs , 2048 ) . AppendLine ( ) ;
}
else
{
2016-04-19 02:11:47 +01:00
if ( bs ! = imagePlugin . GetSectorSize ( ) )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , bs , imagePlugin . GetSectorSize ( ) ) . AppendLine ( ) ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "{0} zones on volume ({1} bytes)" , sysv_sb . s_fsize , sysv_sb . s_fsize * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free zones on volume ({1} bytes)" , sysv_sb . s_tfree , sysv_sb . s_tfree * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free blocks on list ({1} bytes)" , sysv_sb . s_nfree , sysv_sb . s_nfree * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} blocks per cylinder ({1} bytes)" , sysv_sb . s_cylblks , sysv_sb . s_cylblks * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} blocks per gap ({1} bytes)" , sysv_sb . s_gapblks , sysv_sb . s_gapblks * bs ) . AppendLine ( ) ;
sb . AppendFormat ( "First data zone: {0}" , sysv_sb . s_isize ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on volume" , sysv_sb . s_tinode ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on list" , sysv_sb . s_ninode ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_flock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Free block list is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_ilock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "inode cache is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_fmod > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Superblock is being modified" ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_ronly > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is mounted read-only" ) ;
sb . AppendFormat ( "Superblock last updated on {0}" , DateHandlers . UNIXUnsignedToDateTime ( sysv_sb . s_time ) ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_time ! = 0 )
2015-12-06 05:09:31 +00:00
{
xmlFSType . ModificationDate = DateHandlers . UNIXUnsignedToDateTime ( sysv_sb . s_time ) ;
xmlFSType . ModificationDateSpecified = true ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Volume name: {0}" , sysv_sb . s_fname ) . AppendLine ( ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . VolumeName = sysv_sb . s_fname ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Pack name: {0}" , sysv_sb . s_fpack ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( sysv_sb . s_state = = ( 0x7C269D38 - sysv_sb . s_time ) )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is clean" ) ;
else
2015-12-05 17:10:27 +00:00
{
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is dirty" ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . Dirty = true ;
}
2014-04-14 02:29:13 +00:00
}
2012-08-07 06:20:13 +00:00
2016-04-19 02:11:47 +01:00
if ( coherent )
2014-04-14 02:29:13 +00:00
{
2015-04-20 05:09:46 +01:00
sb_sector = imagePlugin . ReadSectors ( ( ulong ) start + partitionStart , sb_size_in_sectors ) ;
2014-04-14 02:29:13 +00:00
CoherentSuperBlock coh_sb = new CoherentSuperBlock ( ) ;
2014-04-14 01:14:20 +00:00
byte [ ] coh_strings = new byte [ 6 ] ;
coh_sb . s_isize = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x000 ) ;
coh_sb . s_fsize = Swapping . PDPFromLittleEndian ( BigEndianBitConverter . ToUInt32 ( sb_sector , 0x002 ) ) ;
coh_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x006 ) ;
coh_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x108 ) ;
coh_sb . s_flock = sb_sector [ 0x1D2 ] ;
coh_sb . s_ilock = sb_sector [ 0x1D3 ] ;
coh_sb . s_fmod = sb_sector [ 0x1D4 ] ;
coh_sb . s_ronly = sb_sector [ 0x1D5 ] ;
coh_sb . s_time = Swapping . PDPFromLittleEndian ( BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1D6 ) ) ;
coh_sb . s_tfree = Swapping . PDPFromLittleEndian ( BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1DE ) ) ;
coh_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1E2 ) ;
coh_sb . s_int_m = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1E4 ) ;
coh_sb . s_int_n = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1E6 ) ;
Array . Copy ( sb_sector , 0x1E8 , coh_strings , 0 , 6 ) ;
coh_sb . s_fname = StringHandlers . CToString ( coh_strings ) ;
Array . Copy ( sb_sector , 0x1EE , coh_strings , 0 , 6 ) ;
coh_sb . s_fpack = StringHandlers . CToString ( coh_strings ) ;
2012-08-07 06:20:13 +00:00
2015-12-05 17:10:27 +00:00
xmlFSType . Type = "Coherent fs" ;
xmlFSType . ClusterSize = 512 ;
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Coherent UNIX filesystem" ) ;
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) ! = 512 )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , 512 , 2048 ) . AppendLine ( ) ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "{0} zones on volume ({1} bytes)" , coh_sb . s_fsize , coh_sb . s_fsize * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free zones on volume ({1} bytes)" , coh_sb . s_tfree , coh_sb . s_tfree * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free blocks on list ({1} bytes)" , coh_sb . s_nfree , coh_sb . s_nfree * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "First data zone: {0}" , coh_sb . s_isize ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on volume" , coh_sb . s_tinode ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on list" , coh_sb . s_ninode ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( coh_sb . s_flock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Free block list is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( coh_sb . s_ilock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "inode cache is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( coh_sb . s_fmod > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Superblock is being modified" ) ;
2016-04-19 02:11:47 +01:00
if ( coh_sb . s_ronly > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is mounted read-only" ) ;
sb . AppendFormat ( "Superblock last updated on {0}" , DateHandlers . UNIXUnsignedToDateTime ( coh_sb . s_time ) ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( coh_sb . s_time ! = 0 )
2015-12-06 05:09:31 +00:00
{
xmlFSType . ModificationDate = DateHandlers . UNIXUnsignedToDateTime ( coh_sb . s_time ) ;
xmlFSType . ModificationDateSpecified = true ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Volume name: {0}" , coh_sb . s_fname ) . AppendLine ( ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . VolumeName = coh_sb . s_fname ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Pack name: {0}" , coh_sb . s_fpack ) . AppendLine ( ) ;
}
2016-04-19 02:11:47 +01:00
if ( sys7th )
2014-04-14 02:29:13 +00:00
{
2015-04-20 05:09:46 +01:00
sb_sector = imagePlugin . ReadSectors ( ( ulong ) start + partitionStart , sb_size_in_sectors ) ;
2014-04-14 01:14:20 +00:00
UNIX7thEditionSuperBlock v7_sb = new UNIX7thEditionSuperBlock ( ) ;
byte [ ] sys7_strings = new byte [ 6 ] ;
v7_sb . s_isize = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x000 ) ;
v7_sb . s_fsize = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x002 ) ;
v7_sb . s_nfree = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x006 ) ;
v7_sb . s_ninode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x0D0 ) ;
v7_sb . s_flock = sb_sector [ 0x19A ] ;
v7_sb . s_ilock = sb_sector [ 0x19B ] ;
v7_sb . s_fmod = sb_sector [ 0x19C ] ;
v7_sb . s_ronly = sb_sector [ 0x19D ] ;
v7_sb . s_time = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x19E ) ;
v7_sb . s_tfree = BigEndianBitConverter . ToUInt32 ( sb_sector , 0x1A2 ) ;
v7_sb . s_tinode = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A6 ) ;
v7_sb . s_int_m = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1A8 ) ;
v7_sb . s_int_n = BigEndianBitConverter . ToUInt16 ( sb_sector , 0x1AA ) ;
Array . Copy ( sb_sector , 0x1AC , sys7_strings , 0 , 6 ) ;
v7_sb . s_fname = StringHandlers . CToString ( sys7_strings ) ;
Array . Copy ( sb_sector , 0x1B2 , sys7_strings , 0 , 6 ) ;
v7_sb . s_fpack = StringHandlers . CToString ( sys7_strings ) ;
2012-08-07 06:20:13 +00:00
2015-12-05 17:10:27 +00:00
xmlFSType . Type = "UNIX 7th Edition fs" ;
xmlFSType . ClusterSize = 512 ;
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "UNIX 7th Edition filesystem" ) ;
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) ! = 512 )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/sector" , 512 , 2048 ) . AppendLine ( ) ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "{0} zones on volume ({1} bytes)" , v7_sb . s_fsize , v7_sb . s_fsize * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free zones on volume ({1} bytes)" , v7_sb . s_tfree , v7_sb . s_tfree * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free blocks on list ({1} bytes)" , v7_sb . s_nfree , v7_sb . s_nfree * 512 ) . AppendLine ( ) ;
sb . AppendFormat ( "First data zone: {0}" , v7_sb . s_isize ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on volume" , v7_sb . s_tinode ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} free inodes on list" , v7_sb . s_ninode ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( v7_sb . s_flock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Free block list is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( v7_sb . s_ilock > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "inode cache is locked" ) ;
2016-04-19 02:11:47 +01:00
if ( v7_sb . s_fmod > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Superblock is being modified" ) ;
2016-04-19 02:11:47 +01:00
if ( v7_sb . s_ronly > 0 )
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Volume is mounted read-only" ) ;
sb . AppendFormat ( "Superblock last updated on {0}" , DateHandlers . UNIXUnsignedToDateTime ( v7_sb . s_time ) ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( v7_sb . s_time ! = 0 )
2015-12-06 05:09:31 +00:00
{
xmlFSType . ModificationDate = DateHandlers . UNIXUnsignedToDateTime ( v7_sb . s_time ) ;
xmlFSType . ModificationDateSpecified = true ;
}
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Volume name: {0}" , v7_sb . s_fname ) . AppendLine ( ) ;
2015-12-05 17:10:27 +00:00
xmlFSType . VolumeName = v7_sb . s_fname ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "Pack name: {0}" , v7_sb . s_fpack ) . AppendLine ( ) ;
}
information = sb . ToString ( ) ;
2014-04-14 01:14:20 +00:00
BigEndianBitConverter . IsLittleEndian = false ; // Return to default (bigendian)
2014-04-14 02:29:13 +00:00
}
2016-08-01 00:02:14 +01:00
// Old XENIX use different offsets
2014-04-14 02:29:13 +00:00
struct XenixSuperBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x000, index of first data zone</summary>
2016-07-28 22:25:26 +01:00
public ushort s_isize ;
2015-12-06 07:18:36 +00:00
/// <summary>0x002, total number of zones of this volume</summary>
2016-07-28 22:25:26 +01:00
public uint s_fsize ;
2014-04-14 02:29:13 +00:00
// the start of the free block list:
2015-12-06 07:18:36 +00:00
/// <summary>0x006, blocks in s_free, <=100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_nfree ;
2016-08-03 02:57:08 +01:00
/// <summary>0x008, 100 entries, 50 entries for Xenix 3, first free block list chunk</summary>
2016-07-28 22:25:26 +01:00
public uint [ ] s_free ;
2014-04-14 02:29:13 +00:00
// the cache of free inodes:
2016-08-03 02:57:08 +01:00
/// <summary>0x198 (0xD0), number of inodes in s_inode, <= 100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_ninode ;
2016-08-03 02:57:08 +01:00
/// <summary>0x19A (0xD2), 100 entries, some free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort [ ] s_inode ;
2016-08-03 02:57:08 +01:00
/// <summary>0x262 (0x19A), free block list manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_flock ;
2016-08-03 02:57:08 +01:00
/// <summary>0x263 (0x19B), inode cache manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_ilock ;
2016-08-03 02:57:08 +01:00
/// <summary>0x264 (0x19C), superblock modification flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_fmod ;
2016-08-03 02:57:08 +01:00
/// <summary>0x265 (0x19D), read-only mounted flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_ronly ;
2016-08-03 02:57:08 +01:00
/// <summary>0x266 (0x19E), time of last superblock update</summary>
public int s_time ;
/// <summary>0x26A (0x1A2), total number of free zones</summary>
2016-07-28 22:25:26 +01:00
public uint s_tfree ;
2016-08-03 02:57:08 +01:00
/// <summary>0x26E (0x1A6), total number of free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort s_tinode ;
2016-08-03 02:57:08 +01:00
/// <summary>0x270 (0x1A8), blocks per cylinder</summary>
2016-07-28 22:25:26 +01:00
public ushort s_cylblks ;
2016-08-03 02:57:08 +01:00
/// <summary>0x272 (0x1AA), blocks per gap</summary>
2016-07-28 22:25:26 +01:00
public ushort s_gapblks ;
2016-08-03 02:57:08 +01:00
/// <summary>0x274 (0x1AC), device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo0 ;
2016-08-03 02:57:08 +01:00
/// <summary>0x276 (0x1AE), device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo1 ;
2016-08-03 02:57:08 +01:00
/// <summary>0x278 (0x1B0), 6 bytes, volume name</summary>
2014-04-14 02:29:13 +00:00
public string s_fname ;
2016-08-03 02:57:08 +01:00
/// <summary>0x27E (0x1B6), 6 bytes, pack name</summary>
2014-04-14 02:29:13 +00:00
public string s_fpack ;
2016-08-03 02:57:08 +01:00
/// <summary>0x284 (0x1BC), 0x46 if volume is clean</summary>
2014-04-14 02:29:13 +00:00
public byte s_clean ;
2016-08-03 02:57:08 +01:00
/// <summary>0x285 (0x1BD), 371 bytes, 51 bytes for Xenix 3</summary>
2014-04-14 02:29:13 +00:00
public byte [ ] s_fill ;
2016-08-03 02:57:08 +01:00
/// <summary>0x3F8 (0x1F0), magic</summary>
2016-07-28 22:25:26 +01:00
public uint s_magic ;
2016-08-03 02:57:08 +01:00
/// <summary>0x3FC (0x1F4), filesystem type (1 = 512 bytes/blk, 2 = 1024 bytes/blk, 3 = 2048 bytes/blk)</summary>
2016-07-28 22:25:26 +01:00
public uint s_type ;
2014-04-14 02:29:13 +00:00
}
struct SystemVRelease4SuperBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x000, index of first data zone</summary>
2016-07-28 22:25:26 +01:00
public ushort s_isize ;
2015-12-06 07:18:36 +00:00
/// <summary>0x002, padding</summary>
2016-07-28 22:25:26 +01:00
public ushort s_pad0 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x004, total number of zones of this volume</summary>
2016-07-28 22:25:26 +01:00
public uint s_fsize ;
2014-04-14 02:29:13 +00:00
// the start of the free block list:
2015-12-06 07:18:36 +00:00
/// <summary>0x008, blocks in s_free, <=100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_nfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x00A, padding</summary>
2016-07-28 22:25:26 +01:00
public ushort s_pad1 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x00C, 50 entries, first free block list chunk</summary>
2016-07-28 22:25:26 +01:00
public uint [ ] s_free ;
2014-04-14 02:29:13 +00:00
// the cache of free inodes:
2015-12-06 07:18:36 +00:00
/// <summary>0x0D4, number of inodes in s_inode, <= 100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_ninode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0D6, padding</summary>
2016-07-28 22:25:26 +01:00
public ushort s_pad2 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0D8, 100 entries, some free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort [ ] s_inode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A0, free block list manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_flock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A1, inode cache manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_ilock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A2, superblock modification flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_fmod ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A3, read-only mounted flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_ronly ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A4, time of last superblock update</summary>
2016-07-28 22:25:26 +01:00
public uint s_time ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A8, blocks per cylinder</summary>
2016-07-28 22:25:26 +01:00
public ushort s_cylblks ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AA, blocks per gap</summary>
2016-07-28 22:25:26 +01:00
public ushort s_gapblks ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AC, device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo0 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AE, device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo1 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B0, total number of free zones</summary>
2016-07-28 22:25:26 +01:00
public uint s_tfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B4, total number of free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort s_tinode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B6, padding</summary>
2016-07-28 22:25:26 +01:00
public ushort s_pad3 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B8, 6 bytes, volume name</summary>
2014-04-14 02:29:13 +00:00
public string s_fname ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1BE, 6 bytes, pack name</summary>
2014-04-14 02:29:13 +00:00
public string s_fpack ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1C4, 48 bytes</summary>
2014-04-14 02:29:13 +00:00
public byte [ ] s_fill ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1F4, if s_state == (0x7C269D38 - s_time) then filesystem is clean</summary>
2016-07-28 22:25:26 +01:00
public uint s_state ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1F8, magic</summary>
2016-07-28 22:25:26 +01:00
public uint s_magic ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1FC, filesystem type (1 = 512 bytes/blk, 2 = 1024 bytes/blk)</summary>
2016-07-28 22:25:26 +01:00
public uint s_type ;
2014-04-14 02:29:13 +00:00
}
struct SystemVRelease2SuperBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x000, index of first data zone</summary>
2016-07-28 22:25:26 +01:00
public ushort s_isize ;
2015-12-06 07:18:36 +00:00
/// <summary>0x002, total number of zones of this volume</summary>
2016-07-28 22:25:26 +01:00
public uint s_fsize ;
2014-04-14 02:29:13 +00:00
// the start of the free block list:
2015-12-06 07:18:36 +00:00
/// <summary>0x006, blocks in s_free, <=100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_nfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x008, 50 entries, first free block list chunk</summary>
2016-07-28 22:25:26 +01:00
public uint [ ] s_free ;
2014-04-14 02:29:13 +00:00
// the cache of free inodes:
2015-12-06 07:18:36 +00:00
/// <summary>0x0D0, number of inodes in s_inode, <= 100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_ninode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0D2, 100 entries, some free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort [ ] s_inode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19A, free block list manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_flock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19B, inode cache manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_ilock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19C, superblock modification flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_fmod ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19D, read-only mounted flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_ronly ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19E, time of last superblock update</summary>
2016-07-28 22:25:26 +01:00
public uint s_time ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A2, blocks per cylinder</summary>
2016-07-28 22:25:26 +01:00
public ushort s_cylblks ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A4, blocks per gap</summary>
2016-07-28 22:25:26 +01:00
public ushort s_gapblks ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A6, device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo0 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A8, device information ??</summary>
2016-07-28 22:25:26 +01:00
public ushort s_dinfo1 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AA, total number of free zones</summary>
2016-07-28 22:25:26 +01:00
public uint s_tfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AE, total number of free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort s_tinode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B0, 6 bytes, volume name</summary>
2014-04-14 02:29:13 +00:00
public string s_fname ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B6, 6 bytes, pack name</summary>
2014-04-14 02:29:13 +00:00
public string s_fpack ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1BC, 56 bytes</summary>
2014-04-14 02:29:13 +00:00
public byte [ ] s_fill ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1F4, if s_state == (0x7C269D38 - s_time) then filesystem is clean</summary>
2016-07-28 22:25:26 +01:00
public uint s_state ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1F8, magic</summary>
2016-07-28 22:25:26 +01:00
public uint s_magic ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1FC, filesystem type (1 = 512 bytes/blk, 2 = 1024 bytes/blk)</summary>
2016-07-28 22:25:26 +01:00
public uint s_type ;
2014-04-14 02:29:13 +00:00
}
struct UNIX7thEditionSuperBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x000, index of first data zone</summary>
2016-07-28 22:25:26 +01:00
public ushort s_isize ;
2015-12-06 07:18:36 +00:00
/// <summary>0x002, total number of zones of this volume</summary>
2016-07-28 22:25:26 +01:00
public uint s_fsize ;
2014-04-14 02:29:13 +00:00
// the start of the free block list:
2015-12-06 07:18:36 +00:00
/// <summary>0x006, blocks in s_free, <=100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_nfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x008, 50 entries, first free block list chunk</summary>
2016-07-28 22:25:26 +01:00
public uint [ ] s_free ;
2014-04-14 02:29:13 +00:00
// the cache of free inodes:
2015-12-06 07:18:36 +00:00
/// <summary>0x0D0, number of inodes in s_inode, <= 100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_ninode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0D2, 100 entries, some free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort [ ] s_inode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19A, free block list manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_flock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19B, inode cache manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_ilock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19C, superblock modification flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_fmod ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19D, read-only mounted flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_ronly ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19E, time of last superblock update</summary>
2016-07-28 22:25:26 +01:00
public uint s_time ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A2, total number of free zones</summary>
2016-07-28 22:25:26 +01:00
public uint s_tfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A6, total number of free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort s_tinode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1A8, interleave factor</summary>
2016-07-28 22:25:26 +01:00
public ushort s_int_m ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AA, interleave factor</summary>
2016-07-28 22:25:26 +01:00
public ushort s_int_n ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1AC, 6 bytes, volume name</summary>
2014-04-14 02:29:13 +00:00
public string s_fname ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B2, 6 bytes, pack name</summary>
2014-04-14 02:29:13 +00:00
public string s_fpack ;
}
struct CoherentSuperBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x000, index of first data zone</summary>
2016-07-28 22:25:26 +01:00
public ushort s_isize ;
2015-12-06 07:18:36 +00:00
/// <summary>0x002, total number of zones of this volume</summary>
2016-07-28 22:25:26 +01:00
public uint s_fsize ;
2014-04-14 02:29:13 +00:00
// the start of the free block list:
2015-12-06 07:18:36 +00:00
/// <summary>0x006, blocks in s_free, <=100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_nfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x008, 64 entries, first free block list chunk</summary>
2016-07-28 22:25:26 +01:00
public uint [ ] s_free ;
2014-04-14 02:29:13 +00:00
// the cache of free inodes:
2015-12-06 07:18:36 +00:00
/// <summary>0x108, number of inodes in s_inode, <= 100</summary>
2016-07-28 22:25:26 +01:00
public ushort s_ninode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x10A, 100 entries, some free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort [ ] s_inode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1D2, free block list manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_flock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1D3, inode cache manipulation lock</summary>
2014-04-14 02:29:13 +00:00
public byte s_ilock ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1D4, superblock modification flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_fmod ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1D5, read-only mounted flag</summary>
2014-04-14 02:29:13 +00:00
public byte s_ronly ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1D6, time of last superblock update</summary>
2016-07-28 22:25:26 +01:00
public uint s_time ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1DE, total number of free zones</summary>
2016-07-28 22:25:26 +01:00
public uint s_tfree ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1E2, total number of free inodes</summary>
2016-07-28 22:25:26 +01:00
public ushort s_tinode ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1E4, interleave factor</summary>
2016-07-28 22:25:26 +01:00
public ushort s_int_m ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1E6, interleave factor</summary>
2016-07-28 22:25:26 +01:00
public ushort s_int_n ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1E8, 6 bytes, volume name</summary>
2014-04-14 02:29:13 +00:00
public string s_fname ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1EE, 6 bytes, pack name</summary>
2014-04-14 02:29:13 +00:00
public string s_fpack ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1F4, zero-filled</summary>
2016-07-28 22:25:26 +01:00
public uint s_unique ;
2014-04-14 02:29:13 +00:00
}
2016-07-21 17:16:08 +01:00
public override Errno Mount ( )
{
return Errno . NotImplemented ;
}
2016-07-22 00:43:22 +01:00
public override Errno Mount ( bool debug )
{
return Errno . NotImplemented ;
}
2016-07-21 17:16:08 +01:00
public override Errno Unmount ( )
{
return Errno . NotImplemented ;
}
public override Errno MapBlock ( string path , long fileBlock , ref long deviceBlock )
{
return Errno . NotImplemented ;
}
public override Errno GetAttributes ( string path , ref FileAttributes attributes )
{
return Errno . NotImplemented ;
}
public override Errno ListXAttr ( string path , ref List < string > xattrs )
{
return Errno . NotImplemented ;
}
public override Errno GetXattr ( string path , string xattr , ref byte [ ] buf )
{
return Errno . NotImplemented ;
}
public override Errno Read ( string path , long offset , long size , ref byte [ ] buf )
{
return Errno . NotImplemented ;
}
public override Errno ReadDir ( string path , ref List < string > contents )
{
return Errno . NotImplemented ;
}
public override Errno StatFs ( ref FileSystemInfo stat )
{
return Errno . NotImplemented ;
}
public override Errno Stat ( string path , ref FileEntryInfo stat )
{
return Errno . NotImplemented ;
}
public override Errno ReadLink ( string path , ref string dest )
{
return Errno . NotImplemented ;
}
2014-04-14 02:29:13 +00:00
}
2014-04-14 01:14:20 +00:00
}