F_NOTIFY in fcntl(2)?

2008-04-03 Thread John Conover

Does freebsd support the F_NOTIFY, (i.e., File and directory change
notification,) in fcntl(2)?

I get that it doesn't, but its an old 5X version, and I might have to
upgrade.

Thanks,

John

-- 

John Conover, [EMAIL PROTECTED], http://www.johncon.com/
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: F_NOTIFY in fcntl(2)?

2008-04-03 Thread Mel
On Thursday 03 April 2008 12:25:55 John Conover wrote:
 Does freebsd support the F_NOTIFY, (i.e., File and directory change
 notification,) in fcntl(2)?

 I get that it doesn't, but its an old 5X version, and I might have to
 upgrade.

Nope, this is a GNU extension to fcntl. File change notifications are done 
with EVFILT_VNODE using kqueue(2). Directory changes have no interface that I 
know of. You might wanna take a look at how devel/gamin handles this, 
specifically the kqueue implementation.

-- 
Mel

Problem with today's modular software: they start with the modules
and never get to the software part.
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: F_NOTIFY in fcntl(2)?

2008-04-03 Thread Mel
On Thursday 03 April 2008 16:11:59 Mel wrote:
 On Thursday 03 April 2008 12:25:55 John Conover wrote:
  Does freebsd support the F_NOTIFY, (i.e., File and directory change
  notification,) in fcntl(2)?
 
  I get that it doesn't, but its an old 5X version, and I might have to
  upgrade.

 Nope, this is a GNU extension to fcntl. File change notifications are done
 with EVFILT_VNODE using kqueue(2). Directory changes have no interface that
 I know of. You might wanna take a look at how devel/gamin handles this,
 specifically the kqueue implementation.

Figured I'd give an example of how it can be done (as in: works for me for 
file deletion/creation and renames). Doesn't work for utimes(2) operations on 
a file, as in touch /tmp/this_file_exists will not fire.
Code inlined below sig.

-- 
Mel

#include sys/types.h
#include sys/event.h
#include sys/time.h
#include sysexits.h
#include err.h
#include stdio.h
#include sys/stat.h
#include time.h
#include fcntl.h

int main(int argc, char **argv)
{
int kq, fd;
struct kevent changes, events;
time_t *mtime;
struct stat sb;

if( -1 == (fd = open(/tmp/., O_RDONLY)) )
err(EX_OSERR, Cannot open dir /tmp);

if( NULL == (mtime = malloc(sizeof(time_t))) )
err(EX_OSERR, Failed to allocate %d bytes, sizeof(time_t));

if( -1 == fstat(fd, sb) )
err(EX_OSERR, Cannot stat fd %u, fd);

*mtime = sb.st_mtime;

if( -1 == (kq = kqueue()) )
err(EX_OSERR, Cannot get a kqueue);

EV_SET(changes, fd, EVFILT_TIMER, EV_ADD|EV_ENABLE, 0, 500,
(void *)mtime);

for( ;; )
{

/* we can only get one event, really. */
if( -1 == kevent(kq, changes, 1, events, 1, NULL) )
err(EX_OSERR, kevent);

if( events.flags  EV_ERROR )
errc(EX_OSERR, events.data, Event error);

/* secretly, our timer is an fd, we probably should use udata for this
 * though.
 */
if( -1 == fstat(events.ident, sb) )
{
warn(Failed to stat fd %u, events.ident);
break;
}
else
{
if( *mtime  *mtime != sb.st_mtime )
printf(Mtime changed: %u = %u\n, *mtime, sb.st_mtime);
else
printf(Mtime unchanged: %u\n, *mtime);

*mtime = sb.st_mtime;
}
}

close(kq);
return 0;
}
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]