sys-proc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/src/lib/sys-proc.rb +36 -0
- data/src/lib/sys/proc.rb +47 -0
- data/src/lib/sys/proc/concern.rb +7 -0
- data/src/lib/sys/proc/concern/helper.rb +16 -0
- data/src/lib/sys/proc/concern/static_instance.rb +25 -0
- data/src/lib/sys/proc/concern/system.rb +37 -0
- data/src/lib/sys/proc/concern/system/freebsd.rb +41 -0
- data/src/lib/sys/proc/concern/system/generic.rb +41 -0
- data/src/lib/sys/proc/concern/system/linux_gnu.rb +41 -0
- data/src/lib/sys/proc/concern/versionable.rb +42 -0
- data/src/lib/sys/proc/helper.rb +50 -0
- data/src/lib/sys/proc/helper/inflector.rb +35 -0
- data/src/lib/sys/proc/helper/lib_c.rb +53 -0
- data/src/lib/sys/proc/helper/system.rb +14 -0
- data/src/lib/sys/proc/helper/system/generic.rb +35 -0
- data/src/lib/sys/proc/system.rb +8 -0
- data/src/lib/sys/proc/system/freebsd.rb +8 -0
- data/src/lib/sys/proc/system/freebsd/lib_c.rb +66 -0
- data/src/lib/sys/proc/system/linux_gnu.rb +8 -0
- data/src/lib/sys/proc/system/linux_gnu/prctl.rb +75 -0
- data/src/lib/sys/proc/version_info.yml +16 -0
- metadata +288 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 39b451a1d8735506348a61a6a589dec046c5d6b8
|
4
|
+
data.tar.gz: 25fa3150119a1192fba407ea7d1e8c9a299b89a0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 73830b7f8a7c870ca72e163e9a51e9d812e72eed5524719c1b10cef503759bb84b2afa853e6dbd34ad1373e28a231848789833d6e14f150b7ffb03698845777a
|
7
|
+
data.tar.gz: c3a71e5772275baae9b0f3b58bde5c910cfcdf49e1498f2a23336b15fc9cad6a26a745fd8c1a99edbe8283a5b1879e8d0bbdde8cec414a75c6da60a75cb9da3c
|
data/src/lib/sys-proc.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# rubocop:disable Style/FileName
|
2
|
+
# frozen_string_literal: true
|
3
|
+
# rubocop:enable Style/FileName
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift __dir__
|
6
|
+
|
7
|
+
if 'development' == ENV['PROJECT_MODE']
|
8
|
+
require 'rubygems'
|
9
|
+
require 'bundler/setup'
|
10
|
+
|
11
|
+
require 'pp'
|
12
|
+
begin
|
13
|
+
require 'coderay'
|
14
|
+
require 'pry/color_printer'
|
15
|
+
rescue LoadError => e
|
16
|
+
warn('%s: %s' % [caller[0], e.message])
|
17
|
+
end
|
18
|
+
|
19
|
+
# Outputs obj to out in pretty printed format of width columns in width.
|
20
|
+
#
|
21
|
+
# If out is omitted, ``STDOUT`` is assumed.
|
22
|
+
# If width is omitted, ``79`` is assumed.
|
23
|
+
#
|
24
|
+
# @param [Object] obj
|
25
|
+
# @param [IO] out
|
26
|
+
# @param [Fixnum] width
|
27
|
+
# @see http://ruby-doc.org/stdlib-2.2.0/libdoc/pp/rdoc/PP.html
|
28
|
+
def pp(obj, out = STDOUT, width = nil)
|
29
|
+
args = [obj, out, width].compact
|
30
|
+
colorable = (out.isatty and Kernel.const_defined?('Pry::ColorPrinter'))
|
31
|
+
|
32
|
+
(colorable ? Pry::ColorPrinter : PP).pp(*args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
require File.basename(__FILE__, '.rb').tr('-', '/')
|
data/src/lib/sys/proc.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
|
5
|
+
# The Sys module is only used as a namespace
|
6
|
+
module Sys
|
7
|
+
end
|
8
|
+
|
9
|
+
# Operations on current process
|
10
|
+
#
|
11
|
+
# @see http://man7.org/linux/man-pages/man2/prctl.2.html
|
12
|
+
# @see http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html
|
13
|
+
class Sys::Proc
|
14
|
+
require 'singleton'
|
15
|
+
%i{versionable system static_instance}.each do |req|
|
16
|
+
require "sys/proc/concern/#{req}"
|
17
|
+
end
|
18
|
+
|
19
|
+
include Concern::Versionable
|
20
|
+
include Concern::StaticInstance
|
21
|
+
include Concern::System
|
22
|
+
|
23
|
+
# @param [String|Symbol] system
|
24
|
+
def initialize(system = nil)
|
25
|
+
@system = system
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
# Get available methods
|
30
|
+
#
|
31
|
+
# @return [Array<Symbol>]
|
32
|
+
def methods
|
33
|
+
super() + new.methods
|
34
|
+
end
|
35
|
+
|
36
|
+
# Get available public methods
|
37
|
+
#
|
38
|
+
# @return [Array<Symbol>]
|
39
|
+
def public_methods
|
40
|
+
super() + new.public_methods
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def pid
|
45
|
+
$PROCESS_ID
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern'
|
4
|
+
require 'sys/proc/helper'
|
5
|
+
|
6
|
+
# Provides access to helpers
|
7
|
+
module Sys::Proc::Concern::Helper
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
# @return [Sys::Proc::Helper]
|
13
|
+
def helper
|
14
|
+
Sys::Proc::Helper.instance
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern'
|
4
|
+
|
5
|
+
# Provides static accesses
|
6
|
+
module Sys::Proc::Concern::StaticInstance
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# Provides access to instance methods
|
11
|
+
def method_missing(method, *args, &block)
|
12
|
+
if respond_to_missing?(method)
|
13
|
+
new.public_send(method, *args, &block)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def respond_to_missing?(method, include_private = false)
|
20
|
+
return true if new.respond_to?(method, include_private)
|
21
|
+
|
22
|
+
super(method, include_private)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern'
|
4
|
+
require 'sys/proc/concern/helper'
|
5
|
+
|
6
|
+
# Provides Operating System related methods
|
7
|
+
#
|
8
|
+
# This ``Concern`` loads system (OS) related sub-concern (specialisation)
|
9
|
+
module Sys::Proc::Concern::System
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
include Sys::Proc::Concern::Helper
|
12
|
+
|
13
|
+
# Related concern is included recursively
|
14
|
+
included { include system_concern }
|
15
|
+
|
16
|
+
# Identify operating system
|
17
|
+
#
|
18
|
+
# @return [Symbol]
|
19
|
+
def system
|
20
|
+
(@system || helper.get(:system).identify).to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
# Get operating system related concern
|
24
|
+
#
|
25
|
+
# @return [Module]
|
26
|
+
def system_concern
|
27
|
+
inflector = helper.get(:inflector)
|
28
|
+
|
29
|
+
begin
|
30
|
+
inflector.resolve("sys/proc/concern/system/#{system}")
|
31
|
+
rescue LoadError => e
|
32
|
+
# m = /^cannot load such file -- #{Regexp.quote(system)}/ =~ e.to_s
|
33
|
+
|
34
|
+
inflector.resolve('sys/proc/concern/system/generic')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern/helper'
|
4
|
+
require 'sys/proc/concern/system'
|
5
|
+
require 'sys/proc/concern/system/generic'
|
6
|
+
require 'sys/proc/system/freebsd/lib_c'
|
7
|
+
|
8
|
+
# Provides specific Freebsd methods
|
9
|
+
module Sys::Proc::Concern::System::Freebsd
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
include Sys::Proc::Concern::Helper
|
13
|
+
include Sys::Proc::System::Freebsd
|
14
|
+
|
15
|
+
# Set program name
|
16
|
+
#
|
17
|
+
# @param [String] progname
|
18
|
+
# @return [String]
|
19
|
+
def progname=(progname)
|
20
|
+
self.helper.get('system/generic').setprogname(progname) do |s|
|
21
|
+
libc.setprogname(s.progname)
|
22
|
+
|
23
|
+
self.progname
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get program name
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
def progname
|
31
|
+
libc.getprogname
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# @return [Sys::Proc::System::Freebsd::LibC]
|
37
|
+
def libc
|
38
|
+
@libc ||= LibC.new
|
39
|
+
@libc
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern/system'
|
4
|
+
|
5
|
+
# Provides generic methods
|
6
|
+
#
|
7
|
+
# This generic module can be used through the ``system/generic`` helper
|
8
|
+
# in other system(s) specific modules.
|
9
|
+
# This is the default (included) module when specific module is missing.
|
10
|
+
module Sys::Proc::Concern::System::Generic
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
# Set program name
|
14
|
+
#
|
15
|
+
# When ``progname`` is ``nil`` will use a default ``progname``
|
16
|
+
#
|
17
|
+
# @param [String] progname
|
18
|
+
# @return [String]
|
19
|
+
def progname=(progname)
|
20
|
+
progname ||= default_progname
|
21
|
+
$PROGRAM_NAME = progname.to_s
|
22
|
+
|
23
|
+
progname
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get program name
|
27
|
+
#
|
28
|
+
# @return [String]
|
29
|
+
def progname
|
30
|
+
$PROGRAM_NAME
|
31
|
+
end
|
32
|
+
|
33
|
+
# Get default program name
|
34
|
+
#
|
35
|
+
# @return [String]
|
36
|
+
def default_progname
|
37
|
+
file = caller[-1].split(/:[0-9]+:in\s/).fetch(0)
|
38
|
+
|
39
|
+
File.basename(file, '.rb')
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/concern/helper'
|
4
|
+
require 'sys/proc/concern/system'
|
5
|
+
require 'sys/proc/concern/system/generic'
|
6
|
+
require 'sys/proc/system/linux_gnu/prctl'
|
7
|
+
|
8
|
+
# Provides specific Linux-GNU methods
|
9
|
+
module Sys::Proc::Concern::System::LinuxGnu
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
include Sys::Proc::Concern::Helper
|
13
|
+
include Sys::Proc::System::LinuxGnu
|
14
|
+
|
15
|
+
# Set program name
|
16
|
+
#
|
17
|
+
# @param [String] progname
|
18
|
+
# @return [String]
|
19
|
+
def progname=(progname)
|
20
|
+
self.helper.get('system/generic').setprogname(progname) do |s|
|
21
|
+
prctl.setprogname(s.progname)
|
22
|
+
|
23
|
+
self.progname
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get program name
|
28
|
+
#
|
29
|
+
# @return [String]
|
30
|
+
def progname
|
31
|
+
prctl.getprogname
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# @return [Sys::Proc::System::LinuxGnu::Prctl]
|
37
|
+
def prctl
|
38
|
+
@prctl ||= Prctl.new
|
39
|
+
@prctl
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
require 'sys/proc/concern'
|
6
|
+
|
7
|
+
# Provides a standardized way to use ``VersionInfo``
|
8
|
+
module Sys::Proc::Concern::Versionable
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included { version_info }
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def version_info
|
15
|
+
unless const_defined?(:VERSION)
|
16
|
+
require 'version_info'
|
17
|
+
include VersionInfo
|
18
|
+
# @todo deternmine format from extension?
|
19
|
+
VersionInfo.file_format = :yaml
|
20
|
+
|
21
|
+
self.VERSION.file_name = version_basedir.join('version_info.yml')
|
22
|
+
self.VERSION.load
|
23
|
+
end
|
24
|
+
|
25
|
+
self.VERSION.to_hash.freeze
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
# Extract basedir from ``caller``
|
31
|
+
#
|
32
|
+
# @raise [Errno::ENOENT]
|
33
|
+
# @return [Pathname]
|
34
|
+
def version_basedir
|
35
|
+
basedir = caller.grep(/in `include'/)
|
36
|
+
.fetch(0)
|
37
|
+
.split(/\.rb:[0-9]+:in\s+/).fetch(0)
|
38
|
+
|
39
|
+
Pathname.new(basedir).realpath
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc'
|
4
|
+
|
5
|
+
# Provides access to helper classes
|
6
|
+
class Sys::Proc::Helper
|
7
|
+
include ::Singleton
|
8
|
+
|
9
|
+
protected def initialize
|
10
|
+
@items = {
|
11
|
+
inflector: proc do
|
12
|
+
require 'sys/proc/helper/inflector'
|
13
|
+
|
14
|
+
Inflector.new
|
15
|
+
end.call
|
16
|
+
}
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [String|Symbol] name
|
22
|
+
# @return [Object]
|
23
|
+
#
|
24
|
+
# @raise [NotImplementedError]
|
25
|
+
def get(name)
|
26
|
+
name = name.to_sym
|
27
|
+
|
28
|
+
return items[name] if items[name]
|
29
|
+
|
30
|
+
begin
|
31
|
+
@items[name] = inflector.resolve("sys/proc/helper/#{name}").new
|
32
|
+
rescue LoadError
|
33
|
+
raise NotImplementedError, "helper not loadable: #{name}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
attr_reader :items
|
40
|
+
|
41
|
+
# @return [Hash]
|
42
|
+
def to_h
|
43
|
+
items
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [Sys::Proc::Helper::Inflector]
|
47
|
+
def inflector
|
48
|
+
to_h.fetch(:inflector)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/helper'
|
4
|
+
|
5
|
+
class Sys::Proc::Helper::Inflector
|
6
|
+
def initialize
|
7
|
+
require 'active_support/inflector'
|
8
|
+
|
9
|
+
@inflector = ActiveSupport::Inflector
|
10
|
+
end
|
11
|
+
|
12
|
+
# Load constant from a loadable/requirable path
|
13
|
+
#
|
14
|
+
# @param [String] loadable
|
15
|
+
# @return [Object]
|
16
|
+
def resolve(loadable)
|
17
|
+
require loadable
|
18
|
+
|
19
|
+
@inflector.constantize(@inflector.classify(loadable))
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing(method, *args, &block)
|
23
|
+
if respond_to_missing?(method)
|
24
|
+
@inflector.public_send(method, *args, &block)
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def respond_to_missing?(method, include_private = false)
|
31
|
+
return true if @inflector.respond_to?(method, include_private)
|
32
|
+
|
33
|
+
super(method, include_private)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fiddle'
|
4
|
+
require 'sys/proc/helper'
|
5
|
+
|
6
|
+
# System helper
|
7
|
+
class Sys::Proc::Helper::LibC
|
8
|
+
def initialize
|
9
|
+
@loadeds = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
# ``libc`` shared objects identified by system
|
13
|
+
#
|
14
|
+
# @return [Hash]
|
15
|
+
def loadables
|
16
|
+
{
|
17
|
+
linux_gnu: 'libc.so.6',
|
18
|
+
freebsd: 'libc.so.7',
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Open shared object (by system)
|
23
|
+
#
|
24
|
+
# @param [Symbol] system
|
25
|
+
# @return [self]
|
26
|
+
def dlopen(system = nil)
|
27
|
+
system = (system.nil? ? Sys::Proc.system : system).to_sym
|
28
|
+
|
29
|
+
loadeds[system] ||= Fiddle.dlopen(loadables.fetch(system))
|
30
|
+
|
31
|
+
loadeds[system]
|
32
|
+
end
|
33
|
+
|
34
|
+
# Denote if ``libc`` is seen as availbale on targeted system
|
35
|
+
#
|
36
|
+
# @return [Boolean]
|
37
|
+
def available?(system = nil)
|
38
|
+
begin
|
39
|
+
dlopen(system)
|
40
|
+
rescue Fiddle::DLError
|
41
|
+
return false
|
42
|
+
rescue KeyError
|
43
|
+
return false
|
44
|
+
end
|
45
|
+
|
46
|
+
loadables[system] != nil
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
# Cache for loaded shared objects
|
52
|
+
attr_reader :loadeds
|
53
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# System helper
|
4
|
+
class Sys::Proc::Helper::System
|
5
|
+
# Identify operating system
|
6
|
+
#
|
7
|
+
# @return [Symbol]
|
8
|
+
def identify
|
9
|
+
(RbConfig::CONFIG['host_os'] || 'generic')
|
10
|
+
.tr('-', '_')
|
11
|
+
.gsub(/[0-9]+(\.[0-9]+)*$/, '')
|
12
|
+
.to_sym
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sys/proc/helper/system'
|
4
|
+
|
5
|
+
# Provides access to ``Sys::Proc::Concerns::System::Generic`` methods
|
6
|
+
class Sys::Proc::Helper::System::Generic
|
7
|
+
def method_missing(method, *args, &block)
|
8
|
+
if respond_to_missing?(method)
|
9
|
+
system.public_send(method, *args, &block)
|
10
|
+
else
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def respond_to_missing?(method, include_private = false)
|
16
|
+
return true if system.respond_to?(method, include_private)
|
17
|
+
|
18
|
+
super(method, include_private)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def setprogname(progname = nil, &block)
|
23
|
+
system.progname = progname || system.default_progname
|
24
|
+
|
25
|
+
system.progname = yield(system) if block
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def system
|
31
|
+
require 'sys/proc/concern/system/generic'
|
32
|
+
|
33
|
+
(Class.new { include Sys::Proc::Concern::System::Generic }).new
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fiddle'
|
4
|
+
require 'sys/proc/system/freebsd'
|
5
|
+
require 'sys/proc/concern/helper'
|
6
|
+
|
7
|
+
# The ``getprogname()`` and ``setprogname()`` functions manipulate
|
8
|
+
# the name of the current program.
|
9
|
+
# They are used by error-reporting routines to produce consistent output.
|
10
|
+
#
|
11
|
+
# These functions first appeared in NetBSD 1.6, and made their way into
|
12
|
+
# FreeBSD 4.4.
|
13
|
+
#
|
14
|
+
# @see https://www.freebsd.org/cgi/man.cgi?query=setprogname&sektion=3
|
15
|
+
class Sys::Proc::System::Freebsd::LibC
|
16
|
+
include Sys::Proc::Concern::Helper
|
17
|
+
|
18
|
+
# Sets the name of the program
|
19
|
+
# to be the last component of the progname argument.
|
20
|
+
#
|
21
|
+
# Since a pointer to the given string is kept as the program name,
|
22
|
+
# it should not be modified for the rest of the program's lifetime.
|
23
|
+
#
|
24
|
+
# ```
|
25
|
+
# #include <stdlib.h>
|
26
|
+
#
|
27
|
+
# void setprogname(const char *progname);
|
28
|
+
# ```
|
29
|
+
#
|
30
|
+
# @return [Boolean]
|
31
|
+
def setprogname(progname)
|
32
|
+
function('setprogname', [Fiddle::TYPE_VOIDP]).call(progname.to_s)
|
33
|
+
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return the name of the program.
|
38
|
+
#
|
39
|
+
# If the name has not been set yet, it will return NULL.
|
40
|
+
#
|
41
|
+
# ```
|
42
|
+
# #include <stdlib.h>
|
43
|
+
#
|
44
|
+
# const char * getprogname(void);
|
45
|
+
# ```
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
def getprogname
|
49
|
+
function('getprogname', nil, Fiddle::TYPE_VOIDP).call.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
# Common method binding over system libc
|
55
|
+
#
|
56
|
+
# @return [Fiddle::Function]
|
57
|
+
def function(fname, args = [], ret_type = Fiddle::TYPE_INT)
|
58
|
+
config = {
|
59
|
+
handle: helper.get(:lib_c).dlopen[fname],
|
60
|
+
args: args || [],
|
61
|
+
ret_type: ret_type
|
62
|
+
}
|
63
|
+
|
64
|
+
Fiddle::Function.new(*config.values)
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fiddle'
|
4
|
+
require 'sys/proc/system/linux_gnu'
|
5
|
+
require 'sys/proc/concern/helper'
|
6
|
+
|
7
|
+
# Operations on a process
|
8
|
+
#
|
9
|
+
# @see http://man7.org/linux/man-pages/man2/prctl.2.html
|
10
|
+
#
|
11
|
+
# ~~~~
|
12
|
+
# #include <sys/prctl.h>
|
13
|
+
#
|
14
|
+
# int prctl(int option, unsigned long arg2, unsigned long arg3,
|
15
|
+
# unsigned long arg4, unsigned long arg5);
|
16
|
+
# ~~~~
|
17
|
+
class Sys::Proc::System::LinuxGnu::Prctl
|
18
|
+
include Sys::Proc::Concern::Helper
|
19
|
+
attr_reader :function
|
20
|
+
|
21
|
+
# Set the name of the calling threadThe attribute is
|
22
|
+
# likewise accessible via /proc/self/task/[tid]/comm, where tid
|
23
|
+
# is the name of the calling thread.
|
24
|
+
PR_SET_NAME = 15 # (since Linux 2.6.9)
|
25
|
+
|
26
|
+
# Return the name of the calling thread, in the buffer pointed
|
27
|
+
# to by (char *) arg2. The buffer should allow space for up to
|
28
|
+
# 16 bytes; the returned string will be null-terminated.
|
29
|
+
PR_GET_NAME = 16 # (since Linux 2.6.11)
|
30
|
+
|
31
|
+
# Set the name of the calling thread
|
32
|
+
#
|
33
|
+
# @param [String] name
|
34
|
+
# @return [Boolean]
|
35
|
+
def setprogname(name)
|
36
|
+
name = name.to_s
|
37
|
+
|
38
|
+
call(PR_SET_NAME, name).zero?
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return the name of the calling thread
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
def getprogname
|
45
|
+
ptr = Fiddle::Pointer.malloc(32, Fiddle::RUBY_FREE.to_i)
|
46
|
+
|
47
|
+
call(PR_GET_NAME, ptr.to_i)
|
48
|
+
ptr.to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
# prctl() is called with a first argument describing what to do (with
|
52
|
+
# values defined in <linux/prctl.h>), and further arguments with a
|
53
|
+
# significance depending on the first one.
|
54
|
+
#
|
55
|
+
# @return [Fixnum]
|
56
|
+
def call(*args)
|
57
|
+
args += ([0] * 5).slice(args.size..-1)
|
58
|
+
|
59
|
+
function.call(*args)
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
# @return [Fiddle::Function]
|
65
|
+
def function
|
66
|
+
config = {
|
67
|
+
handle: helper.get(:lib_c).dlopen['prctl'],
|
68
|
+
args: [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP,
|
69
|
+
Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG],
|
70
|
+
ret_type: Fiddle::TYPE_INT
|
71
|
+
}
|
72
|
+
|
73
|
+
Fiddle::Function.new(*config.values)
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
major: 1
|
3
|
+
minor: 0
|
4
|
+
patch: 0
|
5
|
+
authors: ['Dimitri Arrigoni']
|
6
|
+
email: 'dimitri@arrigoni.me'
|
7
|
+
date: '2017-05-20'
|
8
|
+
summary: 'An interface providing cross-platform process operations'
|
9
|
+
description: 'An interface providing cross-platform process operations'
|
10
|
+
licenses: ['GPL-3.0']
|
11
|
+
license_header: 'Copyright (C) 2017 Dimitri Arrigoni <dimitri@arrigoni.me>
|
12
|
+
License GPLv3+: GNU GPL version 3 or later
|
13
|
+
<http://www.gnu.org/licenses/gpl.html>.
|
14
|
+
This is free software: you are free to change and redistribute it.
|
15
|
+
There is NO WARRANTY, to the extent permitted by law.'
|
16
|
+
homepage: 'https://github.com/SwagDevOps/sys-proc'
|
metadata
ADDED
@@ -0,0 +1,288 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sys-proc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dimitri Arrigoni
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: version_info
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.9'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '11.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '11.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.10'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dotenv
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: cliver
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.2
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.3.2
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.47'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.47'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: gemspec_deps_gen
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.1.2
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.1.2
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: tenjin
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.7'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.7'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rainbow
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.2'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.2'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: tty-editor
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.2'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.2'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: yard
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0.9'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0.9'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: redcarpet
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '3.4'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '3.4'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: github-markup
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '1.4'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '1.4'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: rspec
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '3.4'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '3.4'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: rspec-sleeping_king_studios
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '2.1'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - "~>"
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '2.1'
|
237
|
+
description: An interface providing cross-platform process operations
|
238
|
+
email: dimitri@arrigoni.me
|
239
|
+
executables: []
|
240
|
+
extensions: []
|
241
|
+
extra_rdoc_files: []
|
242
|
+
files:
|
243
|
+
- src/lib/sys-proc.rb
|
244
|
+
- src/lib/sys/proc.rb
|
245
|
+
- src/lib/sys/proc/concern.rb
|
246
|
+
- src/lib/sys/proc/concern/helper.rb
|
247
|
+
- src/lib/sys/proc/concern/static_instance.rb
|
248
|
+
- src/lib/sys/proc/concern/system.rb
|
249
|
+
- src/lib/sys/proc/concern/system/freebsd.rb
|
250
|
+
- src/lib/sys/proc/concern/system/generic.rb
|
251
|
+
- src/lib/sys/proc/concern/system/linux_gnu.rb
|
252
|
+
- src/lib/sys/proc/concern/versionable.rb
|
253
|
+
- src/lib/sys/proc/helper.rb
|
254
|
+
- src/lib/sys/proc/helper/inflector.rb
|
255
|
+
- src/lib/sys/proc/helper/lib_c.rb
|
256
|
+
- src/lib/sys/proc/helper/system.rb
|
257
|
+
- src/lib/sys/proc/helper/system/generic.rb
|
258
|
+
- src/lib/sys/proc/system.rb
|
259
|
+
- src/lib/sys/proc/system/freebsd.rb
|
260
|
+
- src/lib/sys/proc/system/freebsd/lib_c.rb
|
261
|
+
- src/lib/sys/proc/system/linux_gnu.rb
|
262
|
+
- src/lib/sys/proc/system/linux_gnu/prctl.rb
|
263
|
+
- src/lib/sys/proc/version_info.yml
|
264
|
+
homepage: https://github.com/SwagDevOps/sys-proc
|
265
|
+
licenses:
|
266
|
+
- GPL-3.0
|
267
|
+
metadata: {}
|
268
|
+
post_install_message:
|
269
|
+
rdoc_options: []
|
270
|
+
require_paths:
|
271
|
+
- src/lib
|
272
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
273
|
+
requirements:
|
274
|
+
- - ">="
|
275
|
+
- !ruby/object:Gem::Version
|
276
|
+
version: 2.2.2
|
277
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
278
|
+
requirements:
|
279
|
+
- - ">="
|
280
|
+
- !ruby/object:Gem::Version
|
281
|
+
version: '0'
|
282
|
+
requirements: []
|
283
|
+
rubyforge_project:
|
284
|
+
rubygems_version: 2.5.1
|
285
|
+
signing_key:
|
286
|
+
specification_version: 4
|
287
|
+
summary: An interface providing cross-platform process operations
|
288
|
+
test_files: []
|