definition module Inotify from Data.Either import ::Either from Data.Maybe import ::Maybe // Inotify file descriptor :: *Inotify st // Inotify watch descriptor :: INWatch // Inotify event mask :: INMask :== Int // Inotify event :: INEvent :== Int // Inotify callback: event, maybe filename, state, world -> state, world :: INCallback st :== INEvent (Maybe String) st *World -> *(st, *World) (|-) infixl 6 :: (INMask INMask -> INMask) /* Initialise an inotify file descriptor with some state */ inotify_init :: st -> Maybe *(Inotify st) /* Close an inotify file descriptor and get back the state */ inotify_close :: *(Inotify st) -> st /** * Add a watch on some file * * INCallback st: the callback for events * INMask: a mask of events to watch for * String: the filename * Inotify st: the inotify file descriptor * * Either Int INWatch: either an error code or a watch descriptor * Inotify st: the new file descriptor */ inotify_add_watch :: (INCallback st) !INMask !String !*(Inotify st) -> *(!Either Int INWatch, !*Inotify st) /** * Remove a watch * * INWatch: the watch to remove * Inotify st: the inotify file descriptor * * Bool: success * Inotify st: the new file descriptor */ inotify_rm_watch :: !INWatch !*(Inotify st) -> *(!Bool, !*Inotify st) /** * Poll an inotify file descriptor; i.e. wait for new events * * Maybe Int timeout in milliseconds (Nothing for no timeout) * * Int the number of events */ inotify_poll :: !(Maybe Int) !*(Inotify st) -> *(!Int, !*Inotify st) /** * Check for new events and call callbacks */ inotify_check :: !*(Inotify st) !*World -> *(!*Inotify st, !*World) /** * Check if an event matches a mask */ inotify_is_event :: INMask INEvent -> Bool /** * Combination of inotify_poll and inotify_check that will return only if no * events were given when a timeout occurred. */ inotify_loop_with_timeout :: !(Maybe Int) !*(Inotify st) !*World -> *(!*Inotify st, !*World) /** * inotify_loop_with_timeout with Nothing as timeout (will never return) */ inotify_loop_forever :: !*(Inotify st) !*World -> *(!*Inotify st, !*World) /*** Begin inotify.h ***/ IN_ACCESS :== 0x00000001 // File was accessed IN_MODIFY :== 0x00000002 // File was modified IN_ATTRIB :== 0x00000004 // Metadata changed IN_CLOSE_WRITE :== 0x00000008 // Writtable file was closed IN_CLOSE_NOWRITE :== 0x00000010 // Unwrittable file closed IN_OPEN :== 0x00000020 // File was opened IN_MOVED_FROM :== 0x00000040 // File was moved from X IN_MOVED_TO :== 0x00000080 // File was moved to Y IN_CREATE :== 0x00000100 // Subfile was created IN_DELETE :== 0x00000200 // Subfile was deleted IN_DELETE_SELF :== 0x00000400 // Self was deleted IN_MOVE_SELF :== 0x00000800 // Self was moved IN_UNMOUNT :== 0x00002000 // Backing fs was unmounted IN_Q_OVERFLOW :== 0x00004000 // Event queued overflowed IN_IGNORED :== 0x00008000 // File was ignored IN_CLOSE :== (IN_CLOSE_WRITE |- IN_CLOSE_NOWRITE) // close IN_MOVE :== (IN_MOVED_FROM |- IN_MOVED_TO) // moves IN_ONLYDIR :== 0x01000000 // only watch the path if it is a directory IN_DONT_FOLLOW :== 0x02000000 // don't follow a sym link IN_EXCL_UNLINK :== 0x04000000 // exclude events on unlinked objects IN_MASK_ADD :== 0x20000000 // add to the mask of an already existing watch IN_ISDIR :== 0x40000000 // event occurred against dir IN_ONESHOT :== 0x80000000 // only send event once IN_ALL_EVENTS :== (IN_ACCESS |- IN_MODIFY |- IN_ATTRIB |- IN_CLOSE_WRITE |- IN_CLOSE_NOWRITE |- IN_OPEN |- IN_MOVED_FROM |- IN_MOVED_TO |- IN_DELETE |- IN_CREATE |- IN_DELETE_SELF |- IN_MOVE_SELF) /*** End inotify.h ***/