Patch title: Release 92 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 



abstract
  [This module will give you the ability to deal with Linux 



function filesystem_name device -> name
  arg Str device name
  name := ""
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
  var Stream dev ; dev open device in+safe
  if dev=failure
    return
  dev configure "seek "+string:438h
  var uInt16 sign2 ; dev raw_read addressof:sign2 uInt16:siz
  if sign2=0EF53h # EXT2
    dev configure "seek "+string:478h
    for (var Int i) 1 256
      var Char c ; dev raw_read addressof:c Char:size
      if c:number=0
        return
      else
        name += c
    return
  dev configure "seek "+(string 16*2048)
  var Str sign := repeat 8 " " ; dev raw_read sign:character
  console "sign is " sign eol
  if sign=character:1+"CD001"+character:1+"[0]" # ISO9660
    name := repeat 32 " "
    dev raw_read name:characters name:len
    dev raw_read name:characters name:len
    while name:len>0 and (name name:len-1)=" "
      name := name 0 name:len-1
    name := name 0 (name search "[0]" name:len)
    return
  name := ""
  part ext2
    dev configure "seek "+string:438h
    var uInt16 sign2 ; dev raw_read addressof:sign2 uInt16:size
    if sign2=0EF53h
      fs := "ext2"
      dev configure "seek "+string:478h
      for (var Int i) 1 256
        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 uInt32_hi:size
    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:characters sign:len
    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_filesystem device -> fs
  arg Str device fs
  filesystem_study device fs (var Str label)


function filesystem_name device -> label
  arg Str device label
  filesystem_study device (var Str fs) label

doc
  ['filesystem_scan' will call 'filesystem_name' on all stan


doc
  ['filesystem_scan' will call 'filesystem_name' on all stan


function filesystem_dev_mount dev path options -> status
  arg Str dev path options ; arg Status status
  var Str fs := options option "filesystem" Str "ext2"
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
  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 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
  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 not (options option "nocheck") and (fs="" or fs="ext2")
  if fs=""
    fs := filesystem_filesystem device
  if not (options option "nocheck") and fs="ext2" 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
    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 filesystem_is_mounted:path
    var Int err := execute "xfs_repair "+file_os_name:device mixed
    if err<>0
      console "Failed to repair " device " partition !  (error code is " err ")" eol
  if (options option "tune")
    execute "tune2fs -e remount-ro -r 1024 "+device quiet
  file_tree_create path
  if (options option "tune")
    execute "tune2fs -e remount-ro -r 1024 "+device quiet
  file_tree_create path
  status := filesystem_dev_mount device path options
  status := filesystem_dev_mount device path fs options






export filesystem_name
export filesystem_filesystem filesystem_name
export filesystem_scan filesystem_mount filesystem_dismount 
export filesystem_scan filesystem_mount filesystem_dismount