This file is indexed.

/usr/lib/ruby/1.8/rb-inotify/watcher.rb is in librb-inotify-ruby1.8 0.7.0-4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
module INotify
  # Watchers monitor a single path for changes,
  # specified by {INotify::Notifier#watch event flags}.
  # A watcher is usually created via \{Notifier#watch}.
  #
  # One {Notifier} may have many {Watcher}s.
  # The Notifier actually takes care of the checking for events,
  # via \{Notifier#run #run} or \{Notifier#process #process}.
  # The main purpose of having Watcher objects
  # is to be able to disable them using \{#close}.
  class Watcher
    # The {Notifier} that this Watcher belongs to.
    #
    # @return [Notifier]
    attr_reader :notifier

    # The path that this Watcher is watching.
    #
    # @return [String]
    attr_reader :path

    # The {INotify::Notifier#watch flags}
    # specifying the events that this Watcher is watching for,
    # and potentially some options as well.
    #
    # @return [Array<Symbol>]
    attr_reader :flags

    # The id for this Watcher.
    # Used to retrieve this Watcher from {Notifier#watchers}.
    #
    # @private
    # @return [Fixnum]
    attr_reader :id

    # Calls this Watcher's callback with the given {Event}.
    #
    # @private
    # @param event [Event]
    def callback!(event)
      @callback[event]
    end

    # Disables this Watcher, so that it doesn't fire any more events.
    #
    # @raise [SystemCallError] if the watch fails to be disabled for some reason
    def close
      return if Native.inotify_rm_watch(@notifier.fd, @id) == 0
      raise SystemCallError.new("Failed to stop watching #{path.inspect}", FFI.errno)
    end

    # Creates a new {Watcher}.
    #
    # @private
    # @see Notifier#watch
    def initialize(notifier, path, *flags, &callback)
      @notifier = notifier
      @callback = callback || proc {}
      @path = path
      @flags = flags.freeze
      @id = Native.inotify_add_watch(@notifier.fd, path,
        Native::Flags.to_mask(flags))

      unless @id < 0
        @notifier.watchers[@id] = self
        return
      end

      raise SystemCallError.new(
        "Failed to watch #{path.inspect}" +
        case FFI.errno
        when Errno::EACCES::Errno; ": read access to the given file is not permitted."
        when Errno::EBADF::Errno; ": the given file descriptor is not valid."
        when Errno::EFAULT::Errno; ": path points outside of the process's accessible address space."
        when Errno::EINVAL::Errno; ": the given event mask contains no legal events; or fd is not an inotify file descriptor."
        when Errno::ENOMEM::Errno; ": insufficient kernel memory was available."
        when Errno::ENOSPC::Errno; ": The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource."
        else; ""
        end,
        FFI.errno)
    end
  end
end