Patch title: Release 91 bulk changes
Abstract:
File: /fullpliant/export.pli
Key:
    Removed line
    Added line
module "/pliant/language/context.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/kernel/module.pli"
module "/pliant/fullpliant/computer.pli"
module "/pliant/linux/schedule/process.pli"

module "/pliant/admin/asciifile.pli"
module "/pliant/protocol/dns/name.pli"

constant uid 65534
constant gid 65534

function export_init
  (var Stream s) open "embedded:/var/run/afpd.pid" out+mkdir+safe ; s close
  file_configure "embedded:/var/run/afpd.pid" "uid "+string:uid
  (var Stream s) open "embedded:/var/log/smb" in+out+mkdir+safe ; s close
  file_configure "embedded:/var/log/smb" "uid "+string:uid
  (var AsciiFile h) load "embedded:/etc/hosts"
  part add_name
    for (var Int i) 0 h:size-1
      if (" "+(replace h:i "[tab]" " ")+" " search " "+computer_name+" " -1)<>(-1)
        leave add_name
    if name_ip:computer_fullname<>""
      h += name_ip:computer_fullname+" "+computer_name
      h store


function export_nfs_start
  execute "insmod sunrpc" quiet
  execute "insmod lockd" quiet
  execute "insmod nfsd" quiet
  kernel_load_module "sunrpc"
  kernel_load_module "lockd"
  kernel_load_module "nfsd"
  execute "portmap" root "embedded:/" path "embedded:/" # user uid group gid
  sleep 1
  execute "rpc.nfsd" root "embedded:/" path "embedded:/" # user uid group gid
  (var Stream s) open "embedded:/etc/exports" out+mkdir+safe
  each c computer
    if c:env:"pliant":"system":"medium"="nfs"
      var Str ip := name_ip keyof:c
      if ip<>""
        file_tree_create "embedded:/export/diskless/"+keyof:c+"/"
        s writeline "/export/diskless/"+keyof:c+" "+ip+"(rw,no_root_squash)"
  each e this_computer:env:"export"
    if e:"protocol"="nfs" or e:"protocol"="all"
      file_tree_create e:"path"
      if ((file_os_name e:"path") parse (pattern file_os_name:"embedded:/") any:(var Str subpath))
        s writeline "/"+subpath+" ("+(shunt e:"mode"="rw" "rw" "ro")+")"
      else
        console "Cannot export " e:"path" " through NFS since it's outside the embedded computer."
  plugin nfs_configure
  s close
  execute "rpc.mountd" root "embedded:/" path "embedded:/" # user uid group gid
  sleep 1
  execute "exportfs -a" root "embedded:/" path "embedded:/" # user uid group gid

function export_nfs_stop
  process_kill "rpc.mountd"
  process_kill "nfsd" "force"
  sleep 1
  process_kill "portmap"
  sleep 1
  execute "rmmod nfsd" quiet
  execute "rmmod lockd" quiet
  execute "rmmod sunrpc" quiet
  kernel_unload_module "nfsd"
  kernel_unload_module "lockd"
  kernel_unload_module "sunrpc"

function export_nfs_test -> running
  arg CBool running
  running := process_pid:"nfsd"=defined  


function os_sethostname name len
  arg Address name ; arg Int len
  kernel_function 74

function export_samba_start
  var Str name := computer_name ; os_sethostname name:characters name:len
  (var Stream s) open "embedded:/etc/samba/smb.conf" out+mkdir+safe
  s writeline "[lb]global[rb]"
  s writeline "  security = share"
  # s writeline "  max connections = 0"
  s writeline ""
  each e this_computer:env:"export"
    if e:"protocol"="samba" or e:"protocol"="all"
      if ((file_os_name e:"path") parse (pattern file_os_name:"embedded:/") any:(var Str subpath))
        file_tree_create e:"path"
        s writeline "[lb]"+keyof:e+"[rb]"
        s writeline "  path = /"+subpath
        s writeline "  public = yes"
        s writeline "  writable = "+(shunt e:"mode"="rw" "yes" "no")
      else
        console "Cannot export " e:"path" " through Samba since it's outside the embedded computer."
  plugin samba_configure
  s close
  # execute "nmbd" root "embedded:/" path "embedded:/" # user uid group gid
  execute "smbd" root "embedded:/" path "embedded:/" # user uid group gid

function export_samba_stop
  # process_kill "nmbd"
  process_kill "smbd"

function export_samba_test -> running
  arg CBool running
  running := process_pid:"smbd"=defined  


gvar Str export_netatalk_options := "-noddp -uampath /usr/lib/netatalk -uamlist uams_guest.so -nlspath /etc/netatalk/nls"
gvar Int export_netatalk_slot := 25
# +" -setuplog [dq]AFPDaemon LOG_MAXDEBUG /tmp/atalk.log[dq]"
# see /usr/src/netatalk-x.y.z/include/atalk/logger.h for constants

function export_netatalk_start
  (var Stream s) open "embedded:/etc/netatalk/afpd.conf" out+mkdir+safe
  s writeline export_netatalk_options
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.system" out+mkdir+safe
  each e this_computer:env:"export"
    if e:"protocol"="netatalk" or e:"protocol"="all"
      if ((file_os_name e:"path") parse (pattern file_os_name:"embedded:/") any:(var Str subpath))
        file_tree_create e:"path"
        # file_rights e:"path" undefined undefined 7*8^2+7*8+7 0
        s writeline "/"+subpath+" [dq]"+keyof:e+"[dq]"
        each ext e
          if (keyof:ext parse "extmap" any)
            s writeline ext
        # s writeline ".tif TIFF ArtW" # fix me
      else
        console "Cannot export " e:"path" " through Netatalk since it's outside the embedded computer."
  plugin netatalk_configure
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.default" out+mkdir+safe
  s close
  # execute "afpd -noddp -c 25" root "embedded:/" path "embedded:/" user uid group gid # potato
  execute "afpd -c "+string:export_netatalk_slot root "embedded:/" path "embedded:/" # user uid group gid

function export_netatalk_stop
  process_kill "afpd"

function export_netatalk_test -> running
  arg CBool running
  running := process_pid:"afpd"=defined  


export export_init
export export_nfs_start export_nfs_stop export_nfs_test 
export export_samba_start export_samba_stop export_samba_test 
export export_netatalk_options export_netatalk_slot export_netatalk_start export_netatalk_stop export_netatalk_test