Mercurial > hg > toybox
annotate toys/pending/inotifyd.c @ 1306:2d4675617dff draft
inotifyd - watch for filesystem events.
author | Ashwini Sharma <ak.ashwini1981@gmail.com> |
---|---|
date | Fri, 23 May 2014 08:58:08 -0500 |
parents | |
children | 85f297591693 |
rev | line source |
---|---|
1306
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* inotifyd.c - inotify daemon. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2013 Ashwini Kumar <ak.ashwini1981@gmail.com> |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
8 USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN)) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
9 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 config INOTIFYD |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 bool "inotifyd" |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 default n |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 help |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
14 usage: inotifyd PROG FILE[:mask] ... |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
15 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
16 Run PROG on filesystem changes. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 When a filesystem event matching MASK occurs on FILEn, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 PROG ACTUAL_EVENTS FILEn [SUBFILE] is run. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 If PROG is -, events are sent to stdout. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 Events: |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 a File is accessed |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 c File is modified |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 e Metadata changed |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
25 w Writable file is closed |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 0 Unwritable file is closed |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 r File is opened |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 D File is deleted |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 M File is moved |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 u Backing fs is unmounted |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
31 o Event queue overflowed |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 x File can't be watched anymore |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 If watching a directory: |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 m Subfile is moved into dir |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 y Subfile is moved out of dir |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 n Subfile is created |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 d Subfile is deleted |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 inotifyd waits for PROG to exit. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 When x event happens for all FILEs, inotifyd exits. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 */ |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 #define FOR_inotifyd |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 #include "toys.h" |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 #include <sys/inotify.h> |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 GLOBALS( |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 int gotsignal; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 ) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 static void sig_handler(int sig) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 TT.gotsignal = sig; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 static int exec_wait(char **args) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 int status = 0; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 pid_t pid = fork(); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 if (!pid) xexec(args); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 else if (pid > 0) waitpid(pid, &status, 0); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 else perror_exit("fork"); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 return WEXITSTATUS(status); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 void inotifyd_main(void) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 struct pollfd fds; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 char *prog_args[5], **files, **restore; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 struct mask_nameval { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 char name; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 unsigned long val; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 } mask_nv[] = { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 { 'a', IN_ACCESS }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 { 'c', IN_MODIFY }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 { 'e', IN_ATTRIB }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 { 'w', IN_CLOSE_WRITE }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 { '0', IN_CLOSE_NOWRITE }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 { 'r', IN_OPEN }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 { 'm', IN_MOVED_FROM }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 { 'y', IN_MOVED_TO }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 { 'n', IN_CREATE }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 { 'd', IN_DELETE }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 { 'D', IN_DELETE_SELF }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 { 'M', IN_MOVE_SELF }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 { 'u', IN_UNMOUNT }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 { 'o', IN_Q_OVERFLOW }, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 { 'x', IN_IGNORED } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 }; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 int mask, masks_len = ARRAY_LEN(mask_nv); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 prog_args[0] = toys.optargs[0]; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 prog_args[4] = NULL; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 toys.optc--; // 1st one is program, rest are files to be watched |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 //wd ZERO is not used, hence toys.optargs is assigned to files. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 restore = files = toys.optargs; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 if ((fds.fd = inotify_init()) == -1) perror_exit("initialization failed"); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
98 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
99 while (*++toys.optargs) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
100 char *path = *toys.optargs; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
101 char *masks = strchr(path, ':'); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
102 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
103 mask = 0x0fff; //assuming all non-kernel events to be notified. |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
104 if (masks) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
105 *masks++ = '\0'; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
106 mask = 0; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
107 while (*masks) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
108 int i = 0; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
109 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
110 for (i = 0; i < masks_len; i++) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
111 if (*masks == mask_nv[i].name) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
112 mask |= mask_nv[i].val; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
113 break; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
114 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
115 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
116 if (i == masks_len) error_exit("wrong mask '%c'", *masks); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
117 masks++; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
118 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
119 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
120 if (inotify_add_watch(fds.fd, path, mask) < 0) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
121 perror_exit("add watch '%s' failed", path); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
122 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
123 toys.optargs = restore; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
124 sigatexit(sig_handler); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
125 fds.events = POLLIN; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
126 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
127 while (1) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
128 int ret = 0, queue_len; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
129 void *buf = NULL; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
130 struct inotify_event *event; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
131 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
132 retry: |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
133 if (TT.gotsignal) break; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
134 ret = poll(&fds, 1, -1); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
135 if (ret < 0 && errno == EINTR) goto retry; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
136 if (ret <= 0) break; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
137 xioctl(fds.fd, FIONREAD, &queue_len); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
138 event = buf = xmalloc(queue_len); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
139 queue_len = readall(fds.fd, buf, queue_len); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
140 while (queue_len > 0) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
141 uint32_t m = event->mask; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
142 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
143 if (m) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
144 char evts[masks_len+1], *s = evts; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
145 int i; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
146 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
147 for (i = 0; i < masks_len; i++) |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
148 if (m & mask_nv[i].val) *s++ = mask_nv[i].name; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
149 *s = '\0'; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
150 |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
151 if (prog_args[0][0] == '-' && !prog_args[0][1]) { //stdout |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
152 printf(event->len ? "%s\t%s\t%s\n" : "%s\t%s\n", evts, |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
153 files[event->wd], event->name); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
154 fflush(stdout); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
155 } else { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
156 prog_args[1] = evts; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
157 prog_args[2] = files[event->wd]; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
158 prog_args[3] = event->len ? event->name : NULL; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
159 exec_wait(prog_args); //exec and wait... |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
160 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
161 if (event->mask & IN_IGNORED) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
162 if (--toys.optc <= 0) { |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
163 free(buf); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
164 goto done; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
165 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
166 inotify_rm_watch(fds.fd, event->wd); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
167 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
168 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
169 queue_len -= sizeof(struct inotify_event) + event->len; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
170 event = (void*)((char*)event + sizeof(struct inotify_event) + event->len); //next event |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
171 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
172 free(buf); |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
173 } |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
174 done: |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
175 toys.exitval = TT.gotsignal; |
2d4675617dff
inotifyd - watch for filesystem events.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
176 } |