entangler 0.4.1 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +9 -0
- data/.travis.yml +17 -2
- data/README.md +12 -12
- data/Rakefile +5 -3
- data/bin/console +3 -3
- data/entangler.gemspec +15 -14
- data/exe/entangler +30 -19
- data/lib/entangler/entangled_file.rb +31 -102
- data/lib/entangler/executor/background/base.rb +79 -74
- data/lib/entangler/executor/background/master.rb +8 -3
- data/lib/entangler/executor/base.rb +19 -16
- data/lib/entangler/executor/master.rb +74 -24
- data/lib/entangler/executor/slave.rb +1 -1
- data/lib/entangler/version.rb +1 -1
- data/lib/entangler.rb +2 -2
- metadata +25 -25
- data/lib/entangler/executor/processing/base.rb +0 -122
- data/lib/notifier/README.md +0 -3
- data/lib/notifier/bin/darwin/notify +0 -0
- data/lib/notifier/bin/linux/notify +0 -0
- data/lib/notifier/src/darwin/BUILD +0 -7
- data/lib/notifier/src/darwin/README +0 -12
- data/lib/notifier/src/darwin/notify.c +0 -63
- data/lib/notifier/src/linux/BUILD +0 -4
- data/lib/notifier/src/linux/README +0 -18
- data/lib/notifier/src/linux/notify.c +0 -296
- data/lib/notifier/src/linux/old/BUILD +0 -11
- data/lib/notifier/src/linux/old/README +0 -14
- data/lib/notifier/src/linux/old/kernel-filesystem-monitor-daemon-cat.cpp +0 -165
- data/lib/notifier/src/linux/old/kernel-filesystem-monitor-daemon.cpp +0 -727
- data/lib/notifier/src/linux/old/kernel-filesystem-monitor-daemon.hh +0 -212
@@ -1,296 +0,0 @@
|
|
1
|
-
#include <stdio.h>
|
2
|
-
#include <stdlib.h>
|
3
|
-
#include <sys/types.h>
|
4
|
-
#include <sys/stat.h>
|
5
|
-
#include <sys/inotify.h>
|
6
|
-
#include <unistd.h>
|
7
|
-
#include <dirent.h>
|
8
|
-
#include <errno.h>
|
9
|
-
#include <stdlib.h>
|
10
|
-
#include <fcntl.h>
|
11
|
-
#include <sys/ioctl.h>
|
12
|
-
|
13
|
-
/* gcc should be able to optimize strlen() for constant strings */
|
14
|
-
#define PRINT(str) write(1, str, strlen(str))
|
15
|
-
#define ERROR(str) write(2, str, strlen(str))
|
16
|
-
|
17
|
-
#define EVENT_MASK (IN_CLOSE_WRITE|IN_CREATE|IN_DELETE|IN_DELETE_SELF|IN_MODIFY|IN_MOVE_SELF\
|
18
|
-
|IN_MOVED_FROM|IN_MOVED_TO|IN_DONT_FOLLOW|IN_ONLYDIR|IN_ATTRIB)
|
19
|
-
|
20
|
-
#ifdef DEBUG
|
21
|
-
#define DEBUG_PRINT printf
|
22
|
-
#else
|
23
|
-
#define DEBUG_PRINT(...) /* printf actually adds about 7k to binary size :) */
|
24
|
-
#endif
|
25
|
-
|
26
|
-
typedef struct {
|
27
|
-
int wd;
|
28
|
-
int parent_wd;
|
29
|
-
char *name;
|
30
|
-
} _watchstruct;
|
31
|
-
|
32
|
-
char events_buf[PATH_MAX + sizeof(struct inotify_event) + 1];
|
33
|
-
static _watchstruct *watches;
|
34
|
-
int ifd = 0, max_watches;
|
35
|
-
char *watch_dir;
|
36
|
-
|
37
|
-
/* make directory path for watch descriptor (recursively) */
|
38
|
-
static void wd_path(int wd, char *path)
|
39
|
-
{
|
40
|
-
if (wd == 0) {
|
41
|
-
strcpy(path, watch_dir);
|
42
|
-
strcat(path, "/");
|
43
|
-
return;
|
44
|
-
}
|
45
|
-
|
46
|
-
if (wd < 0 || !watches[wd].name) {
|
47
|
-
DEBUG_PRINT("Recusive %d, %x\n", wd, watches[wd].name);
|
48
|
-
ERROR("Memory corrupted: asked path of deleted event\n");
|
49
|
-
exit(1);
|
50
|
-
}
|
51
|
-
|
52
|
-
wd_path(watches[wd].parent_wd, path);
|
53
|
-
if (watches[wd].name[0] == 0) return;
|
54
|
-
|
55
|
-
strcat(path, watches[wd].name);
|
56
|
-
strcat(path, "/");
|
57
|
-
}
|
58
|
-
|
59
|
-
static int add_dir_watch(int parent_wd, char *dir, char *dir_name, int no_print)
|
60
|
-
{
|
61
|
-
int wd = inotify_add_watch(ifd, dir, EVENT_MASK);
|
62
|
-
if (wd < 0) {
|
63
|
-
ERROR("Cannot add watch to '");
|
64
|
-
ERROR(dir);
|
65
|
-
ERROR("' using inotify: ");
|
66
|
-
if (errno == ENOSPC) {
|
67
|
-
ERROR("too many watches\nYou can increase number of user watches using /proc/sys/fs/inotify/max_user_watches");
|
68
|
-
} else {
|
69
|
-
ERROR(strerror(errno));
|
70
|
-
}
|
71
|
-
ERROR("\n");
|
72
|
-
if (errno != EACCES && errno != ENOENT) exit(1);
|
73
|
-
return wd;
|
74
|
-
}
|
75
|
-
|
76
|
-
if (wd >= max_watches) {
|
77
|
-
ERROR("\nToo many events; restart required to prevent watch descriptor overflow.\n");
|
78
|
-
exit(3);
|
79
|
-
}
|
80
|
-
|
81
|
-
dir_name = strdup(dir_name);
|
82
|
-
if (!dir_name) {
|
83
|
-
ERROR("Cannot strdup(dir_name)\n");
|
84
|
-
exit(1);
|
85
|
-
}
|
86
|
-
|
87
|
-
watches[wd].wd = wd;
|
88
|
-
watches[wd].parent_wd = parent_wd;
|
89
|
-
if (watches[wd].name) free(watches[wd].name);
|
90
|
-
watches[wd].name = dir_name;
|
91
|
-
|
92
|
-
if (!no_print) {
|
93
|
-
PRINT("M ");
|
94
|
-
PRINT(dir);
|
95
|
-
PRINT("\n");
|
96
|
-
}
|
97
|
-
|
98
|
-
return wd;
|
99
|
-
}
|
100
|
-
|
101
|
-
static void add_dir(int dir_wd, char *dir, int errors_fatal, int no_print)
|
102
|
-
{
|
103
|
-
char path[PATH_MAX + 1];
|
104
|
-
DIR *dh = opendir(dir);
|
105
|
-
struct dirent *ent;
|
106
|
-
struct stat st;
|
107
|
-
int dirl = strlen(dir), n = sizeof(path) - 1 - dirl, had_errors = 0, wd;
|
108
|
-
|
109
|
-
if (dirl > sizeof(path) - 3) {
|
110
|
-
ERROR("Too long path (not watched): ");
|
111
|
-
ERROR(dir);
|
112
|
-
ERROR("\n");
|
113
|
-
|
114
|
-
if (errors_fatal) exit(1);
|
115
|
-
return;
|
116
|
-
}
|
117
|
-
|
118
|
-
if (!dh) {
|
119
|
-
ERROR("Cannot opendir(");
|
120
|
-
ERROR(dir);
|
121
|
-
ERROR("): ");
|
122
|
-
ERROR(strerror(errno));
|
123
|
-
ERROR("\n");
|
124
|
-
|
125
|
-
if (errors_fatal) exit(1);
|
126
|
-
return;
|
127
|
-
}
|
128
|
-
|
129
|
-
strcpy(path, dir);
|
130
|
-
|
131
|
-
while ((ent = readdir(dh)) != NULL) {
|
132
|
-
if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..") || !strcmp(ent->d_name, ".unrealsync")) continue;
|
133
|
-
|
134
|
-
path[dirl] = '/';
|
135
|
-
path[dirl + 1] = 0;
|
136
|
-
strncat(path + dirl, ent->d_name, n);
|
137
|
-
path[sizeof(path) - 1] = 0;
|
138
|
-
if (lstat(path, &st)) {
|
139
|
-
ERROR("Cannot lstat(");
|
140
|
-
ERROR(path);
|
141
|
-
ERROR("): ");
|
142
|
-
ERROR(strerror(errno));
|
143
|
-
ERROR("\n");
|
144
|
-
had_errors = 1;
|
145
|
-
continue;
|
146
|
-
}
|
147
|
-
|
148
|
-
if (S_ISDIR(st.st_mode)) {
|
149
|
-
wd = add_dir_watch(dir_wd, path, ent->d_name, no_print);
|
150
|
-
if (wd < 0) continue;
|
151
|
-
add_dir(wd, path, errors_fatal, no_print);
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
closedir(dh);
|
156
|
-
|
157
|
-
if (errors_fatal && had_errors) exit(1);
|
158
|
-
}
|
159
|
-
|
160
|
-
void debug_print_mask(uint32_t mask)
|
161
|
-
{
|
162
|
-
if (mask & IN_DELETE_SELF) DEBUG_PRINT("IN_DELETE_SELF ");
|
163
|
-
if (mask & IN_MOVE_SELF) DEBUG_PRINT("IN_MOVE_SELF ");
|
164
|
-
if (mask & IN_MOVED_FROM) DEBUG_PRINT("IN_MOVED_FROM ");
|
165
|
-
if (mask & IN_MOVED_TO) DEBUG_PRINT("IN_MOVED_TO ");
|
166
|
-
if (mask & IN_CLOSE_WRITE) DEBUG_PRINT("IN_CLOSE_WRITE ");
|
167
|
-
if (mask & IN_MODIFY) DEBUG_PRINT("IN_MODIFY ");
|
168
|
-
if (mask & IN_IGNORED) DEBUG_PRINT("IN_IGNORED ");
|
169
|
-
if (mask & IN_ISDIR) DEBUG_PRINT("IN_ISDIR ");
|
170
|
-
if (mask & IN_Q_OVERFLOW) DEBUG_PRINT("IN_Q_OVERFLOW ");
|
171
|
-
if (mask & IN_UNMOUNT) DEBUG_PRINT("IN_UNMOUNT ");
|
172
|
-
if (mask & IN_CREATE) DEBUG_PRINT("IN_CREATE ");
|
173
|
-
}
|
174
|
-
|
175
|
-
static int do_watch(int max_watches)
|
176
|
-
{
|
177
|
-
struct inotify_event *ev = (struct inotify_event*)events_buf;
|
178
|
-
ssize_t n = 0, wd;
|
179
|
-
char path[PATH_MAX + 1];
|
180
|
-
|
181
|
-
watches = (_watchstruct*) calloc(max_watches, sizeof(_watchstruct));
|
182
|
-
if (!watches) {
|
183
|
-
ERROR("Cannot allocate memory\n");
|
184
|
-
exit(1);
|
185
|
-
}
|
186
|
-
|
187
|
-
DEBUG_PRINT("Doing initial watches setup\n");
|
188
|
-
|
189
|
-
ifd = inotify_init();
|
190
|
-
if (ifd == -1) {
|
191
|
-
perror("Cannot init inotify");
|
192
|
-
exit(1);
|
193
|
-
}
|
194
|
-
|
195
|
-
wd = add_dir_watch(0, watch_dir, "", 1);
|
196
|
-
if (wd < 0) {
|
197
|
-
ERROR("Cannot add dir watch\n");
|
198
|
-
exit(1);
|
199
|
-
}
|
200
|
-
add_dir(wd, watch_dir, 1, 1);
|
201
|
-
|
202
|
-
while ((n = read(ifd, events_buf, sizeof(events_buf))) > 0) {
|
203
|
-
ev = (struct inotify_event*)events_buf;
|
204
|
-
while (n > 0) {
|
205
|
-
if (ev->mask & IN_Q_OVERFLOW) {
|
206
|
-
ERROR("Queue overflow, restart needed\n");
|
207
|
-
exit(3);
|
208
|
-
}
|
209
|
-
|
210
|
-
if (ev->mask & IN_IGNORED) {
|
211
|
-
free(watches[ev->wd].name);
|
212
|
-
watches[ev->wd].parent_wd = -1;
|
213
|
-
watches[ev->wd].name = NULL;
|
214
|
-
goto loop_end;
|
215
|
-
}
|
216
|
-
|
217
|
-
wd_path(ev->wd, path);
|
218
|
-
PRINT("M ");
|
219
|
-
PRINT(path);
|
220
|
-
PRINT("\n");
|
221
|
-
#ifdef DEBUG
|
222
|
-
if (ev->len) {
|
223
|
-
DEBUG_PRINT(" | ");
|
224
|
-
DEBUG_PRINT("%s", ev->name);
|
225
|
-
}
|
226
|
-
DEBUG_PRINT(" | ");
|
227
|
-
debug_print_mask(ev->mask);
|
228
|
-
#endif
|
229
|
-
|
230
|
-
if ((ev->mask & IN_DELETE) || (ev->mask & IN_MOVED_FROM)) {
|
231
|
-
goto loop_end;
|
232
|
-
}
|
233
|
-
|
234
|
-
if (ev->mask & IN_ISDIR) {
|
235
|
-
if (ev->len + strlen(path) > sizeof(path) - 1) {
|
236
|
-
ERROR("Too deep directory: ");
|
237
|
-
ERROR(path);
|
238
|
-
ERROR(ev->name);
|
239
|
-
ERROR("\n");
|
240
|
-
goto loop_end;
|
241
|
-
}
|
242
|
-
strcat(path, ev->name);
|
243
|
-
wd = add_dir_watch(ev->wd, path, ev->name, 0);
|
244
|
-
if (wd < 0) goto loop_end;
|
245
|
-
add_dir(ev->wd, path, 0, 0);
|
246
|
-
}
|
247
|
-
|
248
|
-
loop_end:
|
249
|
-
n -= sizeof(struct inotify_event) + ev->len;
|
250
|
-
ev = (struct inotify_event*) ((char*)ev + sizeof(struct inotify_event) + ev->len);
|
251
|
-
}
|
252
|
-
|
253
|
-
PRINT("-\n");
|
254
|
-
}
|
255
|
-
|
256
|
-
perror("Cannot read() inotify queue");
|
257
|
-
exit(1);
|
258
|
-
}
|
259
|
-
|
260
|
-
int main(int argc, char *argv[])
|
261
|
-
{
|
262
|
-
int fd, n;
|
263
|
-
char buf[12];
|
264
|
-
|
265
|
-
if (argc != 2) {
|
266
|
-
ERROR("Usage: notify <dir>\n");
|
267
|
-
return 1;
|
268
|
-
}
|
269
|
-
|
270
|
-
fd = open("/proc/sys/fs/inotify/max_user_watches", O_RDONLY);
|
271
|
-
if (fd < 0) {
|
272
|
-
perror("Cannot open /proc/sys/fs/inotify/max_user_watches");
|
273
|
-
return 1;
|
274
|
-
}
|
275
|
-
|
276
|
-
if ( (n = read(fd, buf, sizeof(buf) - 1)) < 0) {
|
277
|
-
perror("Cannot read() /proc/sys/fs/inotify/max_user_watches");
|
278
|
-
return 1;
|
279
|
-
}
|
280
|
-
|
281
|
-
buf[n] = 0;
|
282
|
-
max_watches = atoi(buf) * 2;
|
283
|
-
if (max_watches <= 0) {
|
284
|
-
ERROR("Incorrect number of watches: ");
|
285
|
-
ERROR(buf);
|
286
|
-
ERROR("\n");
|
287
|
-
return 1;
|
288
|
-
} else {
|
289
|
-
DEBUG_PRINT("Max watches: %d\n", max_watches);
|
290
|
-
}
|
291
|
-
|
292
|
-
watch_dir = argv[1];
|
293
|
-
do_watch(max_watches);
|
294
|
-
|
295
|
-
return 0;
|
296
|
-
}
|
@@ -1,11 +0,0 @@
|
|
1
|
-
The utility has been built using the following command under Ubuntu Linux 11.10 32-bit:
|
2
|
-
|
3
|
-
g++ -static -s -I. *.cpp /usr/lib/libpopt.a -o notify
|
4
|
-
|
5
|
-
Or, to achieve the minimal size of the binary:
|
6
|
-
|
7
|
-
g++ -static -s -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -I. *.cpp /usr/lib/libpopt.a -o notify
|
8
|
-
|
9
|
-
You might need to change path to libpopt to whatever location it is on your system.
|
10
|
-
Libpopt is the only dependency aside from g++ if you want to build the utility.
|
11
|
-
It comes pre-built statically with realsync, so it will most probably just work
|
@@ -1,14 +0,0 @@
|
|
1
|
-
This is a daemon that notifies about filesystem changes in the following form:
|
2
|
-
|
3
|
-
M /path/to/changed/file
|
4
|
-
M /path/to/other/changed/file
|
5
|
-
-
|
6
|
-
|
7
|
-
The daemon is based on kfsmd-0.3.3 and tuned a little bit to be more realtime
|
8
|
-
The original kfsmd-0.3.3 could be found at http://sourceforge.net/projects/witme/files/kfsmd/
|
9
|
-
The preferred way to use this daemon is to run the following:
|
10
|
-
|
11
|
-
./notify watch /path/to/watch | uniq
|
12
|
-
|
13
|
-
You can get rid of "| uniq", but in this case you will get multiple lines per each file
|
14
|
-
for each type of event (e.g. OPEN/WRITE/CLOSE)
|
@@ -1,165 +0,0 @@
|
|
1
|
-
/******************************************************************************
|
2
|
-
*******************************************************************************
|
3
|
-
*******************************************************************************
|
4
|
-
|
5
|
-
|
6
|
-
kernel-filesystem-monitor-daemon-cat
|
7
|
-
Copyright (C) 2005 Ben Martin
|
8
|
-
|
9
|
-
This program is free software; you can redistribute it and/or modify
|
10
|
-
it under the terms of the GNU General Public License as published by
|
11
|
-
the Free Software Foundation; either version 2 of the License, or
|
12
|
-
(at your option) any later version.
|
13
|
-
|
14
|
-
This program is distributed in the hope that it will be useful,
|
15
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
GNU General Public License for more details.
|
18
|
-
|
19
|
-
You should have received a copy of the GNU General Public License
|
20
|
-
along with this program; if not, write to the Free Software
|
21
|
-
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
22
|
-
|
23
|
-
For more details see the COPYING file in the root directory of this
|
24
|
-
distribution.
|
25
|
-
|
26
|
-
$Id: kernel-filesystem-monitor-daemon-cat.cpp,v 1.3 2008/05/25 21:30:52 ben Exp $
|
27
|
-
|
28
|
-
*******************************************************************************
|
29
|
-
*******************************************************************************
|
30
|
-
******************************************************************************/
|
31
|
-
|
32
|
-
#include <iostream>
|
33
|
-
#include "kernel-filesystem-monitor-daemon.hh"
|
34
|
-
#include <stdlib.h>
|
35
|
-
|
36
|
-
using namespace std;
|
37
|
-
|
38
|
-
|
39
|
-
const char* PROGRAM_NAME = "kernel-filesystem-monitor-cat";
|
40
|
-
|
41
|
-
void usage(poptContext optCon, int exitcode, char *error, char *addl)
|
42
|
-
{
|
43
|
-
poptPrintUsage(optCon, stderr, 0);
|
44
|
-
if (error) fprintf(stderr, "%s: %s0", error, addl);
|
45
|
-
exit(exitcode);
|
46
|
-
}
|
47
|
-
|
48
|
-
/********************************************************************************/
|
49
|
-
/********************************************************************************/
|
50
|
-
/********************************************************************************/
|
51
|
-
/********************************************************************************/
|
52
|
-
/********************************************************************************/
|
53
|
-
/********************************************************************************/
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
class KernelFileSystemMonitorDaemonCat
|
58
|
-
:
|
59
|
-
public KernelFileSystemMonitorDaemon
|
60
|
-
{
|
61
|
-
protected:
|
62
|
-
|
63
|
-
virtual void handle_event( struct inotify_event *pevent, time_t tt );
|
64
|
-
virtual void Closedown();
|
65
|
-
virtual void setupWorkingDirToPersistentDirIDMapping( long wd, const string& earl );
|
66
|
-
|
67
|
-
void
|
68
|
-
event_batch_start( time_t tt )
|
69
|
-
{}
|
70
|
-
|
71
|
-
void
|
72
|
-
event_batch_end( time_t tt )
|
73
|
-
{}
|
74
|
-
|
75
|
-
|
76
|
-
public:
|
77
|
-
|
78
|
-
string homedir;
|
79
|
-
|
80
|
-
KernelFileSystemMonitorDaemonCat()
|
81
|
-
{}
|
82
|
-
};
|
83
|
-
|
84
|
-
|
85
|
-
void
|
86
|
-
KernelFileSystemMonitorDaemonCat::setupWorkingDirToPersistentDirIDMapping(
|
87
|
-
long wd, const string& earl )
|
88
|
-
{
|
89
|
-
}
|
90
|
-
|
91
|
-
void
|
92
|
-
KernelFileSystemMonitorDaemonCat::handle_event( struct inotify_event *pevent, time_t tt )
|
93
|
-
{
|
94
|
-
print_event( pevent );
|
95
|
-
fflush(stdout);
|
96
|
-
}
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
void
|
101
|
-
KernelFileSystemMonitorDaemonCat::Closedown()
|
102
|
-
{
|
103
|
-
}
|
104
|
-
|
105
|
-
int main( int argc, char** argv )
|
106
|
-
{
|
107
|
-
unsigned long RunInForground = 0;
|
108
|
-
const char* homedir_CSTR = 0;
|
109
|
-
|
110
|
-
KernelFileSystemMonitorDaemonCat* daemon
|
111
|
-
= new KernelFileSystemMonitorDaemonCat();
|
112
|
-
|
113
|
-
struct poptOption optionsTable[] =
|
114
|
-
{
|
115
|
-
{ "forground", 'F', POPT_ARG_NONE, &RunInForground, 0,
|
116
|
-
"Don't run the daemon in the background", "" },
|
117
|
-
|
118
|
-
{ "homedir", 'H', POPT_ARG_STRING, &homedir_CSTR, 0,
|
119
|
-
"Home directory for user doing the monitoring", "" },
|
120
|
-
|
121
|
-
{ 0, 0, POPT_ARG_INCLUDE_TABLE, daemon->getPopTable(), \
|
122
|
-
0, "generic kfsmd daemon options:", 0 },
|
123
|
-
|
124
|
-
{ "verbose", 'v', POPT_ARG_NONE, &Verbose, 0,
|
125
|
-
"output more info", "" },
|
126
|
-
|
127
|
-
|
128
|
-
POPT_AUTOHELP
|
129
|
-
POPT_TABLEEND
|
130
|
-
};
|
131
|
-
poptContext optCon;
|
132
|
-
|
133
|
-
optCon = poptGetContext(PROGRAM_NAME, argc, (const char**)argv, optionsTable, 0);
|
134
|
-
poptSetOtherOptionHelp(optCon, "[OPTIONS]* [IGNOREPFX URL]* [WATCH URL]+ ...");
|
135
|
-
|
136
|
-
|
137
|
-
/* Now do options processing */
|
138
|
-
char c=-1;
|
139
|
-
while ((c = poptGetNextOpt(optCon)) >= 0)
|
140
|
-
{
|
141
|
-
}
|
142
|
-
|
143
|
-
daemon->ParseWatchOptions( optCon );
|
144
|
-
daemon->setRunInForground( true );
|
145
|
-
daemon->setupSignalHandlers();
|
146
|
-
|
147
|
-
daemon->homedir = getHomeDir( homedir_CSTR );
|
148
|
-
|
149
|
-
try
|
150
|
-
{
|
151
|
-
if( Verbose )
|
152
|
-
cerr << "setting up watches" << endl;
|
153
|
-
daemon->setupWatches();
|
154
|
-
if( Verbose )
|
155
|
-
cerr << "calling run" << endl;
|
156
|
-
return daemon->run();
|
157
|
-
}
|
158
|
-
catch( exception& e )
|
159
|
-
{
|
160
|
-
cerr << "Exiting due to error reason:" << e.what() << endl;
|
161
|
-
}
|
162
|
-
|
163
|
-
return 0;
|
164
|
-
}
|
165
|
-
|