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