Patch title: Release 93 bulk changes
Abstract:
File: /linux/storage/filesystem.pli
Key:
    Removed line
    Added line
   
abstract
  [This module will give you the ability to deal with Linux 



function filesystem_study device fs label
  arg Str device ; arg_w Str fs label
  fs := "" ; label := ""
  var Stream dev ; dev open device in+safe
  if dev=failure
    return
  part ext2
    dev configure "seek "+string:438h
    var uInt16 sign2 ; dev raw_read addressof:sign2 uInt16:s
    if sign2=0EF53h
abstract
  [This module will give you the ability to deal with Linux 



function filesystem_study device fs label
  arg Str device ; arg_w Str fs label
  fs := "" ; label := ""
  var Stream dev ; dev open device in+safe
  if dev=failure
    return
  part ext2
    dev configure "seek "+string:438h
    var uInt16 sign2 ; dev raw_read addressof:sign2 uInt16:s
    if sign2=0EF53h
      fs := "ext2"
      dev configure "seek "+(string 1024+224)
      dev raw_read addressof:(var uInt32 journal) uInt32:size
      fs := shunt journal=0 "ext2" "ext3"
      dev configure "seek "+string:478h
      dev configure "seek "+string:478h
      for (var Int i) 1 256
      for (var Int i) 1 16
        var Char c ; dev raw_read addressof:c Char:size
        if c:number=0
          return
        else
          label += c
      return
  part xfs
    dev configure "seek 0"
    var uInt32_hi sign4 ; dev raw_read addressof:sign4 uInt3
    if sign4=58465342h
      fs := "xfs"
      dev configure "seek 108"
      for (var Int i) 1 12
        var Char c ; dev raw_read addressof:c Char:size
        if c:number=0
          return
        else
          label += c
      return
  part iso9660
    dev configure "seek "+(string 16*2048)
    var Str sign := repeat 8 " " ; dev raw_read sign:charact
    if sign=character:1+"CD001"+character:1+"[0]" # ISO9660
      fs := "iso9660"
      label := repeat 32 " "
      dev raw_read label:characters label:len
      dev raw_read label:characters label:len
      while label:len>0 and (label label:len-1)=" "
        label := label 0 label:len-1
      label := label 0 (label search "[0]" label:len)
      return


function filesystem_dev_mount dev path fs options -> status
  arg Str dev path fs options ; arg Status status
        var Char c ; dev raw_read addressof:c Char:size
        if c:number=0
          return
        else
          label += c
      return
  part xfs
    dev configure "seek 0"
    var uInt32_hi sign4 ; dev raw_read addressof:sign4 uInt3
    if sign4=58465342h
      fs := "xfs"
      dev configure "seek 108"
      for (var Int i) 1 12
        var Char c ; dev raw_read addressof:c Char:size
        if c:number=0
          return
        else
          label += c
      return
  part iso9660
    dev configure "seek "+(string 16*2048)
    var Str sign := repeat 8 " " ; dev raw_read sign:charact
    if sign=character:1+"CD001"+character:1+"[0]" # ISO9660
      fs := "iso9660"
      label := repeat 32 " "
      dev raw_read label:characters label:len
      dev raw_read label:characters label:len
      while label:len>0 and (label label:len-1)=" "
        label := label 0 label:len-1
      label := label 0 (label search "[0]" label:len)
      return


function filesystem_dev_mount dev path fs options -> status
  arg Str dev path fs options ; arg Status status
  if trace
    console "mounting " file_os_name:dev " at " file_os_name
  var Str extra := options option "linux_options" Str
  var Int err := os_mount file_os_name:dev file_os_name:path
  var Str extra := options option "linux_options" Str
  var Int err := os_mount file_os_name:dev file_os_name:path
  if true # trace
    console "mounting " file_os_name:dev " at " file_os_name:path " with filesystem " fs " and options " extra " -> " err eol
  status := shunt err=0 success failure


function filesystem_mount name path options -> status
  arg Str name path options ; arg Status status
  var Str device
  if file_os_name:name<>""
    device := name
  eif { var Pointer:Arrow a :> partitions first name ; a<>nu
    device := a map Str
  else
    return failure
  if (file_query device standard)=undefined
    kernel_make_device device
  var Str fs := options option "filesystem" Str
  if fs=""
    fs := filesystem_filesystem device
  status := shunt err=0 success failure


function filesystem_mount name path options -> status
  arg Str name path options ; arg Status status
  var Str device
  if file_os_name:name<>""
    device := name
  eif { var Pointer:Arrow a :> partitions first name ; a<>nu
    device := a map Str
  else
    return failure
  if (file_query device standard)=undefined
    kernel_make_device device
  var Str fs := options option "filesystem" Str
  if fs=""
    fs := filesystem_filesystem device
  if not (options option "nocheck") and fs="ext2" and not fi
  if not (options option "nocheck") and (fs="ext2" or fs="ext3") and not filesystem_is_mounted:path
    var Int err := execute "e2fsck -y"+(shunt (options optio
    if err<>0
      console "Failed to check " device " partition (error c
      err := execute "e2fsck -y"+(shunt (options option "che
      if err<>0
        console "Failed to check " device " partition !  (er
  if (options option "check") and fs="xfs" and not filesyste
    var Int err := execute "xfs_repair "+file_os_name:device
    if err<>0
      console "Failed to repair " device " partition !  (err
  if (options option "tune")
    execute "tune2fs -e remount-ro -r 1024 "+device quiet
  file_tree_create path
  status := filesystem_dev_mount device path fs options



export filesystem_filesystem filesystem_name
export filesystem_scan filesystem_mount filesystem_dismount 
    var Int err := execute "e2fsck -y"+(shunt (options optio
    if err<>0
      console "Failed to check " device " partition (error c
      err := execute "e2fsck -y"+(shunt (options option "che
      if err<>0
        console "Failed to check " device " partition !  (er
  if (options option "check") and fs="xfs" and not filesyste
    var Int err := execute "xfs_repair "+file_os_name:device
    if err<>0
      console "Failed to repair " device " partition !  (err
  if (options option "tune")
    execute "tune2fs -e remount-ro -r 1024 "+device quiet
  file_tree_create path
  status := filesystem_dev_mount device path fs options



export filesystem_filesystem filesystem_name
export filesystem_scan filesystem_mount filesystem_dismount