commit
cd2869d251
5 changed files with 276 additions and 0 deletions
-
10Makefile.am
-
7bootstrap
-
114configure.ac
-
30inotify.h
-
115inotify1.c
@ -0,0 +1,10 @@ |
|||
|
|||
INCLUDES = -I. -I./include @INOTIFY_INCLUDES@ |
|||
|
|||
bin_PROGRAMS = inotify |
|||
|
|||
inotify_SOURCES = inotify1.c |
|||
inotify_INCLUDES = inotify.h |
|||
|
|||
SUBDIRS = |
|||
|
|||
@ -0,0 +1,7 @@ |
|||
#!/bin/sh |
|||
|
|||
aclocal |
|||
libtoolize --copy |
|||
autoheader |
|||
automake --gnu --add-missing --copy |
|||
autoconf |
|||
@ -0,0 +1,114 @@ |
|||
AC_PREREQ(2.68) |
|||
AC_INIT([checkout_files], |
|||
[0.0.1], |
|||
[georg@steffers.org]) |
|||
LT_INIT |
|||
AM_INIT_AUTOMAKE |
|||
AM_SILENT_RULES([no]) |
|||
AC_COPYRIGHT([Copyright © 2000 Georg Hopp]) |
|||
AC_REVISION([0.0.1]) |
|||
AC_CONFIG_SRCDIR([inotify1.c]) |
|||
AC_CONFIG_HEADER([config.h]) |
|||
AC_CONFIG_MACRO_DIR([m4]) |
|||
|
|||
AC_CANONICAL_HOST |
|||
|
|||
use_inotify="yes" |
|||
|
|||
# Checks for programs. |
|||
AC_PROG_CC |
|||
AC_PROG_MAKE_SET |
|||
|
|||
# Checks for header files. |
|||
AC_HEADER_STDC |
|||
|
|||
# Checks for typedefs, structures, and compiler characteristics. |
|||
AC_C_CONST |
|||
|
|||
# Checks for library functions. |
|||
AC_CHECK_FUNCS([memset malloc free read ioctl syscall select perror printf]) |
|||
|
|||
dnl We need to check if the right inotify version is accessible |
|||
AC_MSG_CHECKING([whether inotify is to be used for filemonitoring]) |
|||
AC_ARG_ENABLE(inotify, |
|||
[ --disable-inotify disable inotify in the ecore_file module], |
|||
[ |
|||
if test "$enableval" == "yes"; then |
|||
AC_MSG_RESULT([yes]) |
|||
else |
|||
AC_MSG_RESULT([no - but we need it]) |
|||
use_inotify="no" |
|||
fi |
|||
], [ |
|||
AC_MSG_RESULT([yes]) |
|||
] |
|||
) |
|||
|
|||
dnl It's hard to find a good test on how to check the correct |
|||
dnl inotify version. They changed the headers a lot. |
|||
dnl in kernel 2.6.13 __NR_inotify_init was added to the defined syscalls |
|||
dnl in asm/unistd.h and IN_MOVE_SELF was added to linux/inotify.h |
|||
dnl so with this check you need a very new kernel and kernel-headers! |
|||
dnl On my gentoo, /usr/include/asm and /usr/include/linux are no symlinks |
|||
dnl into the current kernel tree....so i also try to find the includes |
|||
dnl under /usr/src/linux or under /usr/include/linux-`uname -r` |
|||
linux_rev=`uname -r` |
|||
INOTIFY_INCLUDES= |
|||
if test "x$use_inotify" = "xyes"; then |
|||
AC_MSG_CHECKING([for sufficient inotify includes]) |
|||
AC_TRY_COMPILE( |
|||
[ |
|||
#include <asm/unistd.h> |
|||
#include <linux/inotify.h> |
|||
], |
|||
[ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], |
|||
[ |
|||
AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) |
|||
an_inc=/usr/include |
|||
], |
|||
[ |
|||
AC_TRY_COMPILE( |
|||
[ |
|||
#include "/usr/src/linux/include/asm/unistd.h" |
|||
#include "/usr/src/linux/include/linux/inotify.h" |
|||
], |
|||
[ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], |
|||
[ |
|||
AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) |
|||
AC_DEFINE(IN_KERNEL, 1, [ blablabla ]) |
|||
INOTIFY_INCLUDES=-I/usr/src/linux/include |
|||
an_inc=/usr/src/linux/include |
|||
], |
|||
[ |
|||
AC_TRY_COMPILE( |
|||
[ |
|||
#include </usr/src/linux-$linux_rev/include/asm/unistd.h> |
|||
#include </usr/src/linux-$linux_rev/include/linux/inotify.h> |
|||
], |
|||
[ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], |
|||
[ |
|||
AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) |
|||
AC_DEFINE(IN_KERNEL_UNAME, 1, [ blablabla ]) |
|||
INOTIFY_INCLUDES=-I/usr/src/linux-$linux_rev/include |
|||
an_inc=/usr/src/linux-$linux_rev/include |
|||
], |
|||
[ |
|||
use_inotify="no" |
|||
an_inc="not found" |
|||
] |
|||
) |
|||
] |
|||
) |
|||
] |
|||
) |
|||
AC_MSG_RESULT([$an_inc]) |
|||
test "x$an_inc" == "xnot found" && exit |
|||
else |
|||
exit |
|||
fi |
|||
|
|||
AC_SUBST(INOTIFY_INCLUDES) |
|||
|
|||
AC_CONFIG_FILES([Makefile]) |
|||
|
|||
AC_OUTPUT |
|||
@ -0,0 +1,30 @@ |
|||
#ifndef INOTIFY_H |
|||
#define INOTIFY_H |
|||
|
|||
#include <sys/syscall.h> |
|||
#include <asm/unistd.h> |
|||
#include <linux/inotify.h> |
|||
|
|||
#define IN_NEXT_EVENT(ev) \ |
|||
(struct inotify_event *) \ |
|||
((char *)(ev) + sizeof (struct inotify_event) + (ev)->len) |
|||
|
|||
#define IN_NO_EVENT(ev) ((ev)->mask|IN_ALL_EVENTS) == IN_ALL_EVENTS |
|||
|
|||
|
|||
static inline int inotify_init (void) |
|||
{ |
|||
return syscall (__NR_inotify_init); |
|||
} |
|||
|
|||
static inline int inotify_add_watch (int fd, const char *name, __u32 mask) |
|||
{ |
|||
return syscall (__NR_inotify_add_watch, fd, name, mask); |
|||
} |
|||
|
|||
static inline int inotify_rm_watch (int fd, __u32 wd) |
|||
{ |
|||
return syscall (__NR_inotify_rm_watch, fd, wd); |
|||
} |
|||
|
|||
#endif /* INOTIFY_H */ |
|||
@ -0,0 +1,115 @@ |
|||
#include <stdio.h> |
|||
#include <errno.h> |
|||
#include <string.h> |
|||
#include <sys/ioctl.h> |
|||
#include <sys/select.h> |
|||
|
|||
#include <inotify.h> |
|||
|
|||
int |
|||
main (int arg, char * argv []) |
|||
{ |
|||
int notify_d, |
|||
watch_id; |
|||
fd_set rfds; |
|||
int sel_ret; |
|||
|
|||
FD_ZERO (&rfds); |
|||
|
|||
notify_d = inotify_init (); |
|||
if (notify_d == -1) |
|||
{ |
|||
perror ("could not init inotify"); |
|||
return 1; |
|||
} |
|||
|
|||
FD_SET (notify_d, &rfds); |
|||
|
|||
watch_id = inotify_add_watch (notify_d, argv[1], |
|||
IN_CREATE|IN_OPEN|IN_MODIFY|IN_CLOSE); |
|||
if (watch_id == -1) |
|||
{ |
|||
perror ("could not add watch"); |
|||
return 2; |
|||
} |
|||
|
|||
while (sel_ret = select (notify_d+1, &rfds, NULL, NULL, NULL)) |
|||
{ |
|||
char * in_ev = NULL; |
|||
struct inotify_event * act_ev = NULL; |
|||
size_t size = 0; |
|||
size_t size_avail; |
|||
char * ev_name = NULL; |
|||
|
|||
ioctl (notify_d, FIONREAD, &size_avail); |
|||
in_ev = (char *)malloc (size_avail); |
|||
if (in_ev == NULL) |
|||
{ |
|||
perror ("could not get memory for event list"); |
|||
return 4; |
|||
} |
|||
memset (in_ev, 0, size_avail); |
|||
|
|||
while (size < size_avail) |
|||
{ |
|||
int got = read (notify_d, in_ev + size, |
|||
size_avail - size); |
|||
if (got == 0) |
|||
{ |
|||
perror ("notify FD was closed unexpectedly"); |
|||
return 3; |
|||
} |
|||
size += got; |
|||
} |
|||
|
|||
for (act_ev = (struct inotify_event *) in_ev; |
|||
(char *) act_ev < in_ev + size_avail && IN_NO_EVENT (act_ev); |
|||
act_ev = IN_NEXT_EVENT (act_ev)) |
|||
{ |
|||
printf ("Watch Descriptor: %d\n", act_ev->wd); |
|||
switch (act_ev->mask) |
|||
{ |
|||
case IN_ACCESS: |
|||
ev_name = "IN_ACCESS"; break; |
|||
case IN_ATTRIB: |
|||
ev_name = "IN_ATTRIB"; break; |
|||
case IN_CLOSE_WRITE: |
|||
ev_name = "IN_CLOSE_WRITE"; break; |
|||
case IN_CLOSE_NOWRITE: |
|||
ev_name = "IN_CLOSE_NOWRITE"; break; |
|||
case IN_CREATE: |
|||
ev_name = "IN_CREATE"; break; |
|||
case IN_DELETE: |
|||
ev_name = "IN_DELETE"; break; |
|||
case IN_DELETE_SELF: |
|||
ev_name = "IN_DELETE_SELF"; break; |
|||
case IN_MODIFY: |
|||
ev_name = "IN_MODIFY"; break; |
|||
case IN_MOVE_SELF: |
|||
ev_name = "IN_MOVE_SELF"; break; |
|||
case IN_MOVED_FROM: |
|||
ev_name = "IN_MOVED_FROM"; break; |
|||
case IN_MOVED_TO: |
|||
ev_name = "IN_MOVED_TO"; break; |
|||
case IN_OPEN: |
|||
ev_name = "IN_OPEN"; break; |
|||
} |
|||
printf ("Mask of Events: %s(%d)\n", ev_name, act_ev->mask); |
|||
printf ("Events Cookie: %u\n", act_ev->cookie); |
|||
printf ("Length of name: %u\n", act_ev->len); |
|||
printf ("Event Name: %s\n", act_ev->name); |
|||
} |
|||
|
|||
if (in_ev) |
|||
{ |
|||
free (in_ev); |
|||
in_ev = NULL; |
|||
} |
|||
|
|||
puts ("---"); |
|||
|
|||
FD_SET (notify_d, &rfds); |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue