Patch title: Release 93 bulk changes
Abstract:
File: /linux/storage/fuse.pli
Key:
    Removed line
    Added line
# gcc -I/usr/src/fuse-1.3/include -shared -s -o fuse.so -u fuse_main /usr/src/fuse-1.3/lib/libfuse.a -lpthread

module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/language/os.pli"
module "/pliant/language/os/linux64.pli"
module "/pliant/linux/kernel/module.pli"

constant trace true


type fuse_operations
  field Address getattr
  field Address readlink
  field Address getdir
  field Address mknod
  field Address mkdir
  field Address unlink
  field Address rmdir
  field Address symlink
  field Address rename
  field Address link
  field Address chmod
  field Address chown
  field Address truncate
  field Address utime
  field Address open
  field Address read
  field Address write
  field Address statfs
  field Address release
  field Address fsync

function fuse_main argc argv operations
  arg Int argc ; arg Address argv ; arg fuse_operations operations
  external "/pliant/pliant/linux/storage/fuse.so" "fuse_main"


gvar Str root

function filler h name flags f
  arg Address h ; arg CStr name ; arg Int flags ; arg Function f
  external_calling_convention
  indirect

constant os_S_IFDIR 04000h
constant os_S_IFREG 08000h

function getattr path stat -> err
  arg CStr path ; arg_w os_stat64 stat ; arg Int err
  external_calling_convention
  if trace
    console "getattr " (cast path Str) eol
  var FileInfo info := file_query root+path standard
  if info=success
    memory_clear addressof:stat os_stat64:size
    stat st_mode := shunt info:is_directory os_S_IFDIR+7*64+7*8+7 os_S_IFREG+6*64+6*8+6
    stat st_size := info size
    stat st_mtime := cast info:datetime:seconds-os_datetime_origin:seconds uInt
    stat st_nlink := 1
    stat st_uid := 65534 ; stat st_gid := 65534
    err := 0
  else
    err := -2


function getdir path h filler -> err
  arg CStr path ; arg Address h ; arg Address filler ; arg Int err
  external_calling_convention
  if trace
    console "getdir " (cast path Str) eol
  var Array:FileInfo files := file_list root+path+(shunt path:len=0 or (path path:len-1)<>"/" "/" "") standard+relative+directories
  var Function f
  f executable := filler
  filler h "." 0 f
  filler h ".." 0 f
  for (var Int i) 0 files:size-1
    var Str name := files:i:name
    if name:len>0 and (name name:len-1)="/"
      name := name 0 name:len-1
    filler h name 0 f
  err := 0


constant os_O_ACCMODE 3

function open path flags -> err
  arg CStr path ; arg Int flags ; arg Int err
  external_calling_convention
  if trace
    console "open " (cast path Str) " " flags eol
  var Int mode := flags .and. os_O_ACCMODE
  (var Stream s) open root+path (shunt mode=os_O_RDONLY in mode=os_O_WRONLY out mode=os_O_RDWR in+out 0)+safe
  if s=success
    err := 0
  else
    err := -2 # -ENOENT


function read path buf size offset1 offset2 -> err
  arg CStr path ; arg Address buf ; arg Int size ; arg uInt offset1 offset2 ; arg Int err
  external_calling_convention
  if trace
    console "read " (cast path Str) " " offset1 " " offset2 eol
  (var Stream s) open root+path in+safe+seek
  if s=success
    var Intn offset := offset1+2n^30*offset2
    s configure "seek "+string:offset
    s read_available (var Address adr) err size
    memory_copy adr buf err
  else
    err := -2 # -ENOENT


function fuse_mount path mountpoint options
  arg Str path mountpoint options
  kernel_load_module "fuse"
  if (file_query "file:/etc/mtab" standard)=failure
    (var Stream s) open "file:/etc/mtab" in+out+safe+mkdir
    s close
  root := path 0 path:len-1
  var fuse_operations ops
  memory_clear addressof:ops fuse_operations:size
  ops getattr := (the_function getattr CStr os_stat64 -> Int) executable
  ops getdir := (the_function getdir CStr Address Address -> Int) executable
  ops open := (the_function open CStr Int -> Int) executable
  ops read := (the_function read CStr Address Int uInt uInt -> Int) executable
  var (Array Address 8) args
  args 0 := "[0]":characters
  var Str mp := file_os_name:mountpoint+"[0]"
  args 1 := mp characters
  var Int n := 2
  if (options option "debug")
    args n := "-d[0]" characters ; n += 1
  if (options option "singlethread")
    args n := "-s[0]" characters ; n += 1
  if (options option "share")
    args n := "--[0]" characters ; n += 1
    args n := "-x[0]" characters ; n += 1
  args n := null
  fuse_main n addressof:args ops


export fuse_mount