On 03/15/2012 05:26 PM, Nikola Pajkovsky wrote:
Denys Vlasenko<dvlasenk(a)redhat.com> writes:
+static void run_scanner_prog(int fd, struct stat *statbuf, char **prog)
+{
+ /* fstat(fd,&statbuf) was just done by caller */
+
+ off_t cur_pos = lseek(fd, 0, SEEK_CUR);
+ if (statbuf->st_size<= cur_pos)
+ {
+ /* If file was truncated, treat it as a new file.
+ * (changing inode# causes caller to think that file was closed or renamed)
+ */
+ if (statbuf->st_size< cur_pos)
+ statbuf->st_ino++;
+ return; /* we are at EOF, nothing to do */
+ }
+
+ VERB3 log("File grew by %llu bytes, from %llu to %llu",
+ (long long)(statbuf->st_size - cur_pos),
+ (long long)(cur_pos),
+ (long long)(statbuf->st_size));
+
+ pid_t pid = vfork();
+ if (pid< 0)
+ perror_msg_and_die("vfork");
+ if (pid == 0)
+ {
+ xmove_fd(fd, STDIN_FILENO);
+ execvp(prog[0], prog);
+ perror_msg_and_die("Can't execute '%s'", prog[0]);
+ }
+
+ safe_waitpid(pid, NULL, 0);
I think, we should here check returned value from execvp
program. Program which SIGSEGV or fails from whatever reason is
pointless to run.
- but you need to run it to find out that it doesn't work, so I don't
understand your proposal - you mean if we detect it failed once then
disable it and never try to run it again?
I can't help myself, but I think I'm reading very stupid
cron, which is
activated by inotify :)
- yes, because we want it to be event driven not timer driver..
Apart of this, its looks good