This file is indexed.

/usr/lib/ruby/vendor_ruby/ffi_yajl/map_library_name.rb is in ruby-ffi-yajl 2.2.3-2.

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
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
# Copyright (c) 2015 Lamont Granquist
# Copyright (c) 2015 Chef Software, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

require 'libyajl2'

# Mixin for use in finding the right yajl library on the system.  The 'caller'
# needs to also mixin either the FFI module or the DLopen module.  Those are
# deliberately not mixed in to avoid loading the dlopen module in the ffi
# codepath (which fails on jruby which does not have that C extension).

module FFI_Yajl
  module MapLibraryName
    private

    # Stub for tests to override the host_os
    #
    # @api private
    # @return Array<String> lower case ruby host_os string
    def host_os
      RbConfig::CONFIG['host_os'].downcase
    end

    # Array of yajl library names on the platform.  Some platforms like Windows
    # and Mac may have different names/extensions.
    #
    # @api private
    # @return Array<String> Array of yajl library names for platform
    def library_names
      case host_os
      when /mingw|mswin/
        [ "libyajl.so", "yajl.dll" ]
      when /cygwin/
        [ "libyajl.so", "cygyajl.dll" ]
      when /darwin/
        [ "libyajl.bundle", "libyajl.dylib" ]
      else
        [ "libyajl.so" ]
      end
    end

    # Array of yajl library names prepended with the libyajl2 path to use to
    # load those directly and bypass the system libyajl by default.  Since
    # these are full paths, this API checks to ensure that the file exists on
    # the filesystem.  May return an empty array.
    #
    # @api private
    # @return Array<String> Array of full paths to libyajl2 gem libraries
    def expanded_library_names
      library_names.map do |libname|
        pathname = File.expand_path(File.join(Libyajl2.opt_path, libname))
        pathname if File.file?(pathname)
      end.compact
    end

    # Iterate across the expanded library names in the libyajl2-gem and then
    # attempt to load the system libraries.  Uses the native dlopen extension
    # that ships in this gem.
    #
    # @api private
    def dlopen_yajl_library
      found = false
      ( expanded_library_names + library_names ).each do |libname|
        begin
          dlopen(libname)
          found = true
          break
        rescue ArgumentError
        end
      end
      raise "cannot find yajl library for platform" unless found
    end

    # Iterate across the expanded library names in the libyajl2-gem and attempt
    # to load them.  If they are missing just use `ffi_lib 'yajl'` to accept
    # the FFI default algorithm to find the library.
    #
    # @api private
    def ffi_open_yajl_library
      found = false
      expanded_library_names.each do |libname|
        begin
          ffi_lib libname
          found = true
        rescue LoadError
        end
      end
      ffi_lib 'yajl' unless found
    end
  end
end