Patch title: Release 94 bulk changes
Abstract:
File: /pliant/admin/file.pli
Key:
    Removed line
    Added line
   
abstract
  [Files handling (listing, copying, ...)] ; eol


abstract
  [Files handling (listing, copying, ...)] ; eol


constant use_sendfile false # os_api="linux"

if use_sendfile
  function os_sendfile64 out_fd in_fd offset count -> copied
    arg Int out_fd in_fd ; arg_rw Int64 offset ; arg Int count copied
    kernel_function 239

function file_copy src dest flags -> status
  arg FileInfo src dest ; arg Int flags ; arg ExtendedStatus
  check (flags .and. recursive)=0
  check (flags .and. delete)=0 or (flags .and. bidirectional
  check src:datetime=defined or dest:datetime=defined or (fl
  if (flags .and. bidirectional)<>0
    if dest=defined and (src=undefined or (src:datetime=defi
      return (file_copy dest src flags)
  if (flags .and. (newer .or. bidirectional))<>0
    if src:datetime=defined and dest:datetime=defined and de
      return success
  if (flags .and. lazy)<>0
    if dest:datetime=src:datetime and dest:size=src:size
      return success
  var Str cmd
  if (flags .and. level_flags)>=standard and src:datetime=de
    src:datetime split (var Int year) (var Int month) (var I
    cmd := "datetime "+string:year+"/"+string:month+"/"+stri
  else
    cmd := ""
  cmd += (shunt cmd<>"" " " "")+"file_size "+(string src:siz
  if (flags .and. level_flags)>=extended and src:options<>""
    cmd += (shunt cmd<>"" " " "")+src:options
  if src:is_link and (flags .and. linktransparent)=0
    if ((dest:options option "link" Str)=(src:options option
      return success
    if (file_configure dest:name "link "+string:(src:options
      return success
    file_tree_create dest:name
    return (file_configure dest:name "link "+string:(src:opt
function file_copy src dest flags -> status
  arg FileInfo src dest ; arg Int flags ; arg ExtendedStatus
  check (flags .and. recursive)=0
  check (flags .and. delete)=0 or (flags .and. bidirectional
  check src:datetime=defined or dest:datetime=defined or (fl
  if (flags .and. bidirectional)<>0
    if dest=defined and (src=undefined or (src:datetime=defi
      return (file_copy dest src flags)
  if (flags .and. (newer .or. bidirectional))<>0
    if src:datetime=defined and dest:datetime=defined and de
      return success
  if (flags .and. lazy)<>0
    if dest:datetime=src:datetime and dest:size=src:size
      return success
  var Str cmd
  if (flags .and. level_flags)>=standard and src:datetime=de
    src:datetime split (var Int year) (var Int month) (var I
    cmd := "datetime "+string:year+"/"+string:month+"/"+stri
  else
    cmd := ""
  cmd += (shunt cmd<>"" " " "")+"file_size "+(string src:siz
  if (flags .and. level_flags)>=extended and src:options<>""
    cmd += (shunt cmd<>"" " " "")+src:options
  if src:is_link and (flags .and. linktransparent)=0
    if ((dest:options option "link" Str)=(src:options option
      return success
    if (file_configure dest:name "link "+string:(src:options
      return success
    file_tree_create dest:name
    return (file_configure dest:name "link "+string:(src:opt
  eif src:is_directory
  eif src:is_directory and (flags .and. forcefile)=0
    if dest=defined and dest:is_directory
      status := success
    else
      status := file_tree_create dest:name
  else
    var Stream s ; s open src:name in+safe+bigcache
    if s=failure
      return failure
    var Stream d ; d open dest:name cmd out+mkdir+safe+bigca
    if d=failure
      return failure
    var Intn total := 0
    if dest=defined and dest:is_directory
      status := success
    else
      status := file_tree_create dest:name
  else
    var Stream s ; s open src:name in+safe+bigcache
    if s=failure
      return failure
    var Stream d ; d open dest:name cmd out+mkdir+safe+bigca
    if d=failure
      return failure
    var Intn total := 0
    while { var Int step := raw_copy s d 1 2^30 ; step>0 }
      total += step
    if use_sendfile and s:stream_handle<>undefined and d:stream_handle<>undefined
      while { var Int step := os_sendfile64 d:stream_handle s:stream_handle (null map Int64) 2^16 ; step>0 }
        total += step
    if not use_sendfile or total=0
      while { var Int step := raw_copy s d 1 2^30 ; step>0 }
        total += step
    if (flags .and. level_flags)<standard
      status := success
    eif (s safe_query "encoding")<>"" or (d safe_query "enco
      status := success
    else
      status := shunt total=src:size success failure
    if d:close=failure # let's close the destination first a
      status := failure
    if s:close=failure
      status := failure
  if cmd<>""
    file_configure dest:name cmd
  if trace
    console src:name+" -> "+dest:name+(shunt status=success 


export file_delete file_link file_clone file_copy file_move 
export file_tree_create file_tree_delete file_tree_copy file
export file_temporary file_temporary_cleanup file_os_name fi
    if (flags .and. level_flags)<standard
      status := success
    eif (s safe_query "encoding")<>"" or (d safe_query "enco
      status := success
    else
      status := shunt total=src:size success failure
    if d:close=failure # let's close the destination first a
      status := failure
    if s:close=failure
      status := failure
  if cmd<>""
    file_configure dest:name cmd
  if trace
    console src:name+" -> "+dest:name+(shunt status=success 


export file_delete file_link file_clone file_copy file_move 
export file_tree_create file_tree_delete file_tree_copy file
export file_temporary file_temporary_cleanup file_os_name fi