All Projects → massemanet → Inotify

massemanet / Inotify

Licence: other
erlang binding to inotify

Programming Languages

c
50402 projects - #5 most used programming language

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;

([email protected])19> inoteefy:watch("/home/masse/.emacs",fun(X)->io:fwrite("pn",[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,[]} ([email protected])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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].