/inotify

erlang binding to inotify

Primary LanguageCOtherNOASSERTION

Introduction
------------
Inotify is on erlang port for the Linux inotify API allowing one to monitor
changes to files and directory in the filesystem.

Installation
------------
If building from git;
 aclocal ; autoconf ; automake --add-missing ; ./configure ; make 

If building from the tar ball;
 ./configure ; make 

This will build in-tree (i.e. the binaries/beams will be in the src
directory).

If you want to install, do;
 ./configure --prefix=/usr ; make ; sudo make install

Prefix /usr will install in the OTP installation directory on a
debian/ubuntu. Adjust to something fitting.

To test, execute;
 make test. 

This will run inotify:test() and you should see output similar to;

 $ make test
 erl -noshell -eval "inotify:test(), erlang:halt()."
 Simplistic test/example
 Start... Open the port and receive a file descriptor... F = 3
 list..L = [3]
 Watch for any changes in a Directory... W = 1
 launch listener....
 start playing with the file...
 attempt to create file "../test/file"
 listener got: {event,1,[create],0,[102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]}
 listener got: {event,1,[create],0,[102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]}
 write a message to file
 listener got: {event,1,[modify],0,[102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]}
 close the file
 listener got: {event,1,
                     [close_write],
                     0,
                     [102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]}
 delete file "../test/file"
 listener got: {event,1,[delete],0,[102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]}
 end playing with file
 stop the listener...
 stop inotify controller...
 test is now concluded

The test creates a file in the test directory, writes to it and then deletes it.


Using inoteefy
--------------

inoteefy associates a callback fun with a file.
inoteefy:watch(File,Fun) -> ok
inoteefy:unwatch(File) -> ok

If File is watched, Fun/1 will be called everytime File is
touched. The argument to Fun will look like;

{File,[Mask],Cookie,Name}
Mask - atom() - see inotify docs (man inotify).
Cookie - integer() - see inotify docs (man inotify). Only used for dirs.
Name - string() - see inotify docs (man inotify). Only used for dirs.

Example;

(doozy@dixie)19> inoteefy:watch("/home/masse/.emacs",fun(X)->io:fwrite("~p~n",[X])end).
ok                                                                              
<changing the .emacs file>
{"/home/masse/.emacs",[modify],0,[]}                                            
{"/home/masse/.emacs",[open],0,[]}                                              
{"/home/masse/.emacs",[modify],0,[]}
{"/home/masse/.emacs",[modify],0,[]}
{"/home/masse/.emacs",[close_write],0,[]}
{"/home/masse/.emacs",[modify],0,[]}
{"/home/masse/.emacs",[open],0,[]}
{"/home/masse/.emacs",[modify],0,[]}
{"/home/masse/.emacs",[close_write],0,[]}
(doozy@dixie)20> inoteefy:unwatch("/home/masse/.emacs").
ok


Using inotify
-------------
This is the erlang program inotify.erl, not the underlying linux syscall.

For an example on how to use inotify take a look at the function
test/0 in inotify.erl.

The listener process gets a message of the form
   {event, WatchDescriptor, EventList, Cookie, Name}
where
   WatchDescriptor is the watch descriptor which caused the event
   EventList is one or more event which is/are the reason for the message these 
     include,
       access, attrib, close_write, close_nowrite, create, delete, delete_self,
       modify, move_self, moved_from, moved_to, open
   Cookie
   Name is the filesystem name relative to the base which caused the event. It
     the example test above the list [102,105,108,101,0,0,0,0,0,0,0,0,0,0,0,0]
     is the string "file" zero padded which is the file referred to by the
     event relative to the test directory with the attached inotify watch.


License
-------
In short, you can do anything you want with the code including using it as part
of you plan for world domination (if your successful can I have one of the nicer
countries please). No responsiblity it taken for the fitness of the any purpose,
etc, etc. The only thing I ask is that if you find a bug and fix send me the
patch. Likewise, feature suggestions and patches are welcome.

TODO
----
* add support for multiple controller functions
* Write some documentation!



Release History
---------------
20100206 version 0.3 on github
20090221 release 0.2 bug fix
20080929 initial release version 0.1