Showing
5 changed files
with
276 additions
and
0 deletions
Makefile.am
0 → 100644
bootstrap
0 → 100755
configure.ac
0 → 100644
| 1 | +AC_PREREQ(2.68) | |
| 2 | +AC_INIT([checkout_files], | |
| 3 | + [0.0.1], | |
| 4 | + [georg@steffers.org]) | |
| 5 | +LT_INIT | |
| 6 | +AM_INIT_AUTOMAKE | |
| 7 | +AM_SILENT_RULES([no]) | |
| 8 | +AC_COPYRIGHT([Copyright © 2000 Georg Hopp]) | |
| 9 | +AC_REVISION([0.0.1]) | |
| 10 | +AC_CONFIG_SRCDIR([inotify1.c]) | |
| 11 | +AC_CONFIG_HEADER([config.h]) | |
| 12 | +AC_CONFIG_MACRO_DIR([m4]) | |
| 13 | + | |
| 14 | +AC_CANONICAL_HOST | |
| 15 | + | |
| 16 | +use_inotify="yes" | |
| 17 | + | |
| 18 | +# Checks for programs. | |
| 19 | +AC_PROG_CC | |
| 20 | +AC_PROG_MAKE_SET | |
| 21 | + | |
| 22 | +# Checks for header files. | |
| 23 | +AC_HEADER_STDC | |
| 24 | + | |
| 25 | +# Checks for typedefs, structures, and compiler characteristics. | |
| 26 | +AC_C_CONST | |
| 27 | + | |
| 28 | +# Checks for library functions. | |
| 29 | +AC_CHECK_FUNCS([memset malloc free read ioctl syscall select perror printf]) | |
| 30 | + | |
| 31 | +dnl We need to check if the right inotify version is accessible | |
| 32 | +AC_MSG_CHECKING([whether inotify is to be used for filemonitoring]) | |
| 33 | +AC_ARG_ENABLE(inotify, | |
| 34 | + [ --disable-inotify disable inotify in the ecore_file module], | |
| 35 | + [ | |
| 36 | + if test "$enableval" == "yes"; then | |
| 37 | + AC_MSG_RESULT([yes]) | |
| 38 | + else | |
| 39 | + AC_MSG_RESULT([no - but we need it]) | |
| 40 | + use_inotify="no" | |
| 41 | + fi | |
| 42 | + ], [ | |
| 43 | + AC_MSG_RESULT([yes]) | |
| 44 | + ] | |
| 45 | +) | |
| 46 | + | |
| 47 | +dnl It's hard to find a good test on how to check the correct | |
| 48 | +dnl inotify version. They changed the headers a lot. | |
| 49 | +dnl in kernel 2.6.13 __NR_inotify_init was added to the defined syscalls | |
| 50 | +dnl in asm/unistd.h and IN_MOVE_SELF was added to linux/inotify.h | |
| 51 | +dnl so with this check you need a very new kernel and kernel-headers! | |
| 52 | +dnl On my gentoo, /usr/include/asm and /usr/include/linux are no symlinks | |
| 53 | +dnl into the current kernel tree....so i also try to find the includes | |
| 54 | +dnl under /usr/src/linux or under /usr/include/linux-`uname -r` | |
| 55 | +linux_rev=`uname -r` | |
| 56 | +INOTIFY_INCLUDES= | |
| 57 | +if test "x$use_inotify" = "xyes"; then | |
| 58 | + AC_MSG_CHECKING([for sufficient inotify includes]) | |
| 59 | + AC_TRY_COMPILE( | |
| 60 | + [ | |
| 61 | + #include <asm/unistd.h> | |
| 62 | + #include <linux/inotify.h> | |
| 63 | + ], | |
| 64 | + [ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], | |
| 65 | + [ | |
| 66 | + AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) | |
| 67 | + an_inc=/usr/include | |
| 68 | + ], | |
| 69 | + [ | |
| 70 | + AC_TRY_COMPILE( | |
| 71 | + [ | |
| 72 | + #include "/usr/src/linux/include/asm/unistd.h" | |
| 73 | + #include "/usr/src/linux/include/linux/inotify.h" | |
| 74 | + ], | |
| 75 | + [ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], | |
| 76 | + [ | |
| 77 | + AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) | |
| 78 | + AC_DEFINE(IN_KERNEL, 1, [ blablabla ]) | |
| 79 | + INOTIFY_INCLUDES=-I/usr/src/linux/include | |
| 80 | + an_inc=/usr/src/linux/include | |
| 81 | + ], | |
| 82 | + [ | |
| 83 | + AC_TRY_COMPILE( | |
| 84 | + [ | |
| 85 | + #include </usr/src/linux-$linux_rev/include/asm/unistd.h> | |
| 86 | + #include </usr/src/linux-$linux_rev/include/linux/inotify.h> | |
| 87 | + ], | |
| 88 | + [ int a = __NR_inotify_init; int b = IN_MOVE_SELF; ], | |
| 89 | + [ | |
| 90 | + AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ]) | |
| 91 | + AC_DEFINE(IN_KERNEL_UNAME, 1, [ blablabla ]) | |
| 92 | + INOTIFY_INCLUDES=-I/usr/src/linux-$linux_rev/include | |
| 93 | + an_inc=/usr/src/linux-$linux_rev/include | |
| 94 | + ], | |
| 95 | + [ | |
| 96 | + use_inotify="no" | |
| 97 | + an_inc="not found" | |
| 98 | + ] | |
| 99 | + ) | |
| 100 | + ] | |
| 101 | + ) | |
| 102 | + ] | |
| 103 | + ) | |
| 104 | + AC_MSG_RESULT([$an_inc]) | |
| 105 | + test "x$an_inc" == "xnot found" && exit | |
| 106 | +else | |
| 107 | + exit | |
| 108 | +fi | |
| 109 | + | |
| 110 | +AC_SUBST(INOTIFY_INCLUDES) | |
| 111 | + | |
| 112 | +AC_CONFIG_FILES([Makefile]) | |
| 113 | + | |
| 114 | +AC_OUTPUT | ... | ... |
inotify.h
0 → 100644
| 1 | +#ifndef INOTIFY_H | |
| 2 | +#define INOTIFY_H | |
| 3 | + | |
| 4 | +#include <sys/syscall.h> | |
| 5 | +#include <asm/unistd.h> | |
| 6 | +#include <linux/inotify.h> | |
| 7 | + | |
| 8 | +#define IN_NEXT_EVENT(ev) \ | |
| 9 | + (struct inotify_event *) \ | |
| 10 | + ((char *)(ev) + sizeof (struct inotify_event) + (ev)->len) | |
| 11 | + | |
| 12 | +#define IN_NO_EVENT(ev) ((ev)->mask|IN_ALL_EVENTS) == IN_ALL_EVENTS | |
| 13 | + | |
| 14 | + | |
| 15 | +static inline int inotify_init (void) | |
| 16 | +{ | |
| 17 | + return syscall (__NR_inotify_init); | |
| 18 | +} | |
| 19 | + | |
| 20 | +static inline int inotify_add_watch (int fd, const char *name, __u32 mask) | |
| 21 | +{ | |
| 22 | + return syscall (__NR_inotify_add_watch, fd, name, mask); | |
| 23 | +} | |
| 24 | + | |
| 25 | +static inline int inotify_rm_watch (int fd, __u32 wd) | |
| 26 | +{ | |
| 27 | + return syscall (__NR_inotify_rm_watch, fd, wd); | |
| 28 | +} | |
| 29 | + | |
| 30 | +#endif /* INOTIFY_H */ | ... | ... |
inotify1.c
0 → 100644
| 1 | +#include <stdio.h> | |
| 2 | +#include <errno.h> | |
| 3 | +#include <string.h> | |
| 4 | +#include <sys/ioctl.h> | |
| 5 | +#include <sys/select.h> | |
| 6 | + | |
| 7 | +#include <inotify.h> | |
| 8 | + | |
| 9 | +int | |
| 10 | +main (int arg, char * argv []) | |
| 11 | +{ | |
| 12 | + int notify_d, | |
| 13 | + watch_id; | |
| 14 | + fd_set rfds; | |
| 15 | + int sel_ret; | |
| 16 | + | |
| 17 | + FD_ZERO (&rfds); | |
| 18 | + | |
| 19 | + notify_d = inotify_init (); | |
| 20 | + if (notify_d == -1) | |
| 21 | + { | |
| 22 | + perror ("could not init inotify"); | |
| 23 | + return 1; | |
| 24 | + } | |
| 25 | + | |
| 26 | + FD_SET (notify_d, &rfds); | |
| 27 | + | |
| 28 | + watch_id = inotify_add_watch (notify_d, argv[1], | |
| 29 | + IN_CREATE|IN_OPEN|IN_MODIFY|IN_CLOSE); | |
| 30 | + if (watch_id == -1) | |
| 31 | + { | |
| 32 | + perror ("could not add watch"); | |
| 33 | + return 2; | |
| 34 | + } | |
| 35 | + | |
| 36 | + while (sel_ret = select (notify_d+1, &rfds, NULL, NULL, NULL)) | |
| 37 | + { | |
| 38 | + char * in_ev = NULL; | |
| 39 | + struct inotify_event * act_ev = NULL; | |
| 40 | + size_t size = 0; | |
| 41 | + size_t size_avail; | |
| 42 | + char * ev_name = NULL; | |
| 43 | + | |
| 44 | + ioctl (notify_d, FIONREAD, &size_avail); | |
| 45 | + in_ev = (char *)malloc (size_avail); | |
| 46 | + if (in_ev == NULL) | |
| 47 | + { | |
| 48 | + perror ("could not get memory for event list"); | |
| 49 | + return 4; | |
| 50 | + } | |
| 51 | + memset (in_ev, 0, size_avail); | |
| 52 | + | |
| 53 | + while (size < size_avail) | |
| 54 | + { | |
| 55 | + int got = read (notify_d, in_ev + size, | |
| 56 | + size_avail - size); | |
| 57 | + if (got == 0) | |
| 58 | + { | |
| 59 | + perror ("notify FD was closed unexpectedly"); | |
| 60 | + return 3; | |
| 61 | + } | |
| 62 | + size += got; | |
| 63 | + } | |
| 64 | + | |
| 65 | + for (act_ev = (struct inotify_event *) in_ev; | |
| 66 | + (char *) act_ev < in_ev + size_avail && IN_NO_EVENT (act_ev); | |
| 67 | + act_ev = IN_NEXT_EVENT (act_ev)) | |
| 68 | + { | |
| 69 | + printf ("Watch Descriptor: %d\n", act_ev->wd); | |
| 70 | + switch (act_ev->mask) | |
| 71 | + { | |
| 72 | + case IN_ACCESS: | |
| 73 | + ev_name = "IN_ACCESS"; break; | |
| 74 | + case IN_ATTRIB: | |
| 75 | + ev_name = "IN_ATTRIB"; break; | |
| 76 | + case IN_CLOSE_WRITE: | |
| 77 | + ev_name = "IN_CLOSE_WRITE"; break; | |
| 78 | + case IN_CLOSE_NOWRITE: | |
| 79 | + ev_name = "IN_CLOSE_NOWRITE"; break; | |
| 80 | + case IN_CREATE: | |
| 81 | + ev_name = "IN_CREATE"; break; | |
| 82 | + case IN_DELETE: | |
| 83 | + ev_name = "IN_DELETE"; break; | |
| 84 | + case IN_DELETE_SELF: | |
| 85 | + ev_name = "IN_DELETE_SELF"; break; | |
| 86 | + case IN_MODIFY: | |
| 87 | + ev_name = "IN_MODIFY"; break; | |
| 88 | + case IN_MOVE_SELF: | |
| 89 | + ev_name = "IN_MOVE_SELF"; break; | |
| 90 | + case IN_MOVED_FROM: | |
| 91 | + ev_name = "IN_MOVED_FROM"; break; | |
| 92 | + case IN_MOVED_TO: | |
| 93 | + ev_name = "IN_MOVED_TO"; break; | |
| 94 | + case IN_OPEN: | |
| 95 | + ev_name = "IN_OPEN"; break; | |
| 96 | + } | |
| 97 | + printf ("Mask of Events: %s(%d)\n", ev_name, act_ev->mask); | |
| 98 | + printf ("Events Cookie: %u\n", act_ev->cookie); | |
| 99 | + printf ("Length of name: %u\n", act_ev->len); | |
| 100 | + printf ("Event Name: %s\n", act_ev->name); | |
| 101 | + } | |
| 102 | + | |
| 103 | + if (in_ev) | |
| 104 | + { | |
| 105 | + free (in_ev); | |
| 106 | + in_ev = NULL; | |
| 107 | + } | |
| 108 | + | |
| 109 | + puts ("---"); | |
| 110 | + | |
| 111 | + FD_SET (notify_d, &rfds); | |
| 112 | + } | |
| 113 | + | |
| 114 | + return 0; | |
| 115 | +} | ... | ... |
Please
register
or
login
to post a comment