Patch title: Release 94 bulk changes
Abstract:
File: /pliant/linux/storage/inotify.pli
Key:
    Removed line
    Added line
module "/pliant/language/os.pli"
module "/pliant/admin/file.pli"

type inotify_watch_request
  field Int fd
  field uInt32 mask

type inotify_event
  field Int32 wd
  field uInt32 mask
  field uInt32 cookie
  field uInt32 len

constant INOTIFY_WATCH 80085101h
constant INOTIFY_IGNORE 80085102h

constant IN_ACCESS 00000001h
constant IN_MODIFY 00000002h
constant IN_ATTRIB 00000004h
constant IN_CLOSE_WRITE 00000008h
constant IN_CLOSE_NOWRITE 00000010h
constant IN_OPEN 00000020h
constant IN_MOVED_FROM 00000040h
constant IN_MOVED_TO 00000080h
constant IN_DELETE_SUBDIR 00000100h
constant IN_DELETE_FILE 00000200h
constant IN_CREATE_SUBDIR 00000400h
constant IN_CREATE_FILE 00000800h
constant IN_DELETE_SELF 00001000h
constant IN_UNMOUNT 00002000h
constant IN_Q_OVERFLOW 00004000h
constant IN_IGNORED 00008000h


function inotify_open -> handle
  arg Int handle
  handle := os_open "/dev/inotify" os_O_RDONLY 0

function inotify_watch handle filename -> wd
  arg Int handle ; arg Str filename ; arg Int wd
  var Int fd := os_open file_os_name:filename os_O_RDONLY 0
  if fd<0
    return -1
  var inotify_watch_request r
  r fd := fd
  r mask := IN_CLOSE_WRITE+IN_MOVED_FROM+IN_MOVED_TO+IN_CREATE_FILE+IN_DELETE_FILE+IN_CREATE_SUBDIR+IN_DELETE_SUBDIR
  wd := os_ioctl handle INOTIFY_WATCH addressof:r
  os_close fd

function inotify_ignore handle wd
  arg Int handle wd
  os_ioctl handle INOTIFY_IGNORE (cast wd Address)

function inotify_close handle
  arg Int handle
  os_close handle

export inotify_open inotify_watch


if false

  function test
    var Int handle := inotify_open
    if handle<0
      console "no handle" eol
      return
    if true
      var Int wd1 := inotify_watch handle "file:/foo"
      if wd1<0
        console "failed to watch " wd1 eol
        return
    if false
      var Int wd2 := inotify_watch handle "file:/foo/test"
      if wd2<0
        console "failed to watch " wd2 eol
        return
    var Int bufsize := 1024
    var Address buffer := memory_allocate bufsize null
    while true
      var Int size := os_read handle buffer bufsize
      # console "size = " size eol
      var Int offset := 0
      while size>=offset+inotify_event:size
        var Pointer:inotify_event ev :> (buffer translate Byte offset) map inotify_event
        # console "wd = " (cast ev:wd Int) eol
        console "mask = " (string (cast ev:mask uInt) "radix 16") "h" eol
        # console "cookie = " (cast ev:cookie uInt) eol
        # console "len = " (cast ev:len uInt) eol
        var Int len := ev len
        offset += inotify_event size
        var Str name := repeat len " "
        memory_copy (buffer translate Byte offset) name:characters len
        name := name 0 (name search "[0]" name:len)
        console "name = " name eol
        console eol
        offset += len
    inotify_close handle
    console "done" eol
  
  test