Module: Inotify

Defined in:
ext/inotify/inotify.c

Class Method Summary collapse

Class Method Details

.inotify_watch(path, processor) ⇒ Object

Calls the block with the changed paths when something changes in the specified path. This method blocks the thread forever.

Inotify.watch('/tmp', Proc.new { |files| p files })


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'ext/inotify/inotify.c', line 41

static VALUE inotify_watch(VALUE self, VALUE path, VALUE processor)
{
  int length, i;
  int notify;
  int watch;
  char buffer[BUF_LEN];
  VALUE mFile = rb_const_get(rb_cObject, rb_intern("File"));

  fd_set rfds;
  struct timeval tv;
  int retval;

  notify = inotify_init();

  if (notify < 0) perror("inotify_init");

  watch = inotify_add_watch(notify, RSTRING_PTR(path), IN_MODIFY | IN_CREATE | IN_DELETE );

  for (;;)
  {
    FD_ZERO(&rfds);
    FD_SET(notify, &rfds);

    tv.tv_sec = 0;
    tv.tv_usec = 500;

    retval = select(notify + 1, &rfds, NULL, NULL, &tv);

    if (retval < 0) {
      perror("select()");
      return Qfalse;
    } else if (FD_ISSET(notify, &rfds)) {
      length = read(notify, buffer, BUF_LEN);
      if (length < 0) perror("read");

      i = 0;
      while(i < length) {
        struct inotify_event *event = (struct inotify_event *)&buffer[i];
        if (event->len) {
          rb_funcall(processor, rb_intern("call"), 2,
            rb_funcall(mFile, rb_intern("join"), 2, path, rb_str_new2(event->name)),
            inotify_event_flags(event->mask)
          );
        }
        i += EVENT_SIZE + event->len;
      }
    }
  }

  inotify_rm_watch(notify, watch);
  close(notify);

  return Qnil;
}