packages feed

kqueue-0.1.1: examples/MonitorFile.hs

import Control.Monad
import Foreign.Ptr
import System.KQueue
import System.Posix.IO

-- Monitor file 'foo for changes until it is deleted. Prints the
-- events as they are received. The file has to exist when this
-- program is started.
main = do
  -- Initialize the queue.
  kq <- kqueue
  -- Open file descriptor.
  fd <- openFd "foo" ReadOnly Nothing defaultFileFlags
  -- Construct the event to monitor.
  let event = KEvent
        { ident = fromIntegral fd
        , evfilter = EvfiltVnode
        , flags = [EvAdd, EvOneshot]
        , fflags = [NoteDelete, NoteExtend, NoteWrite, NoteAttrib, NoteRename, NoteLink, NoteRevoke]
        , data_ = 0
        , udata = nullPtr
        }
  let poll = do
        -- Add or poll the event.
        chgs <- kevent kq [event] 1 Nothing
        -- If something happened, print it.
        when (not . null $ chgs) (print chgs)
        -- If the file was deleted, stop. Otherwise, continue polling.
        when (not (NoteDelete `elem` fflags (head chgs))) poll
  poll