Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

better examples for std/inotify #23415

Open
wants to merge 10 commits into
base: devel
Choose a base branch
from
32 changes: 21 additions & 11 deletions lib/posix/inotify.nim
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ proc inotify_init*(): FileHandle {.cdecl, importc: "inotify_init",

proc inotify_init1*(flags: cint): FileHandle {.cdecl, importc: "inotify_init1",
header: "<sys/inotify.h>".}
## Create and initialize inotify instance.
## Like `inotify_init<#inotify_init>`_ ,
## but has a flags argument that provides access to some extra functionality.

proc inotify_add_watch*(fd: cint; name: cstring; mask: uint32): cint {.cdecl,
importc: "inotify_add_watch", header: "<sys/inotify.h>".}
Expand All @@ -79,11 +80,18 @@ proc inotify_rm_watch*(fd: cint; wd: cint): cint {.cdecl,

iterator inotify_events*(evs: pointer, n: int): ptr InotifyEvent =
## Abstract the packed buffer interface to yield event object pointers.
## ```Nim
## var evs = newSeq[byte](8192) # Already did inotify_init+add_watch
## while (let n = read(fd, evs[0].addr, 8192); n) > 0: # read forever
## for e in inotify_events(evs[0].addr, n): echo e[].len # echo name lens
## ```
runnableExamples("-r:off"):
when defined(linux):
import std/posix # needed for FileHandle read procedure
const MaxWatches = 8192

let inotifyFd = inotify_init() # create new inotify instance and get it's FileHandle
let wd = inotifyFd.inotify_add_watch("/tmp", IN_CREATE or IN_DELETE) # Add new watch

var events: array[MaxWatches, byte] # event buffer
while (let n = read(inotifyFd, addr events, MaxWatches); n) > 0: # blocks until any events have been read
for e in inotify_events(addr events, n):
echo (e[].wd, e[].mask, cast[cstring](addr e[].name)) # echo watch id, mask, and name value of each event
var ev: ptr InotifyEvent = cast[ptr InotifyEvent](evs)
var n = n
while n > 0:
Expand All @@ -94,8 +102,10 @@ iterator inotify_events*(evs: pointer, n: int): ptr InotifyEvent =

runnableExamples:
when defined(linux):
let inoty: FileHandle = inotify_init() ## Create 1 Inotify.
doAssert inoty >= 0 ## Check for errors (FileHandle is alias to cint).
let watchdoge: cint = inotify_add_watch(inoty, ".", IN_ALL_EVENTS) ## Add directory to watchdog.
doAssert watchdoge >= 0 ## Check for errors.
doAssert inotify_rm_watch(inoty, watchdoge) >= 0 ## Remove directory from the watchdog
let inotifyFd = inotify_init() # create and get new inotify FileHandle
doAssert inotifyFd >= 0 # check for errors

let wd = inotifyFd.inotify_add_watch("/tmp", IN_CREATE or IN_DELETE) # Add new watch
doAssert wd >= 0 # check for errors

discard inotifyFd.inotify_rm_watch(wd) # remove watch
Loading