ffi-libc 0.0.5 → 0.1.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/.gitignore +4 -0
- data/.travis.yml +14 -0
- data/ChangeLog.md +25 -4
- data/LICENSE.txt +1 -1
- data/README.md +21 -10
- data/Rakefile +5 -5
- data/ffi-libc.gemspec +56 -11
- data/gemspec.yml +5 -5
- data/lib/ffi/libc.rb +11 -0
- data/lib/ffi/libc/ifaddrs.rb +93 -0
- data/lib/ffi/libc/ifaddrs_union.rb +15 -0
- data/lib/ffi/libc/libc.rb +130 -18
- data/lib/ffi/libc/rusage.rb +30 -0
- data/lib/ffi/libc/sockaddr.rb +16 -0
- data/lib/ffi/libc/{sock_addr_dl.rb → sockaddr_dl.rb} +2 -2
- data/lib/ffi/libc/{sock_addr_family.rb → sockaddr_family.rb} +1 -1
- data/lib/ffi/libc/sockaddr_in.rb +19 -0
- data/lib/ffi/libc/{sock_addr_in6.rb → sockaddr_in6.rb} +2 -1
- data/lib/ffi/libc/types.rb +3 -0
- data/spec/ifaddrs_spec.rb +30 -0
- data/spec/libc_spec.rb +32 -5
- data/spec/spec_helper.rb +3 -1
- metadata +85 -77
- data/lib/ffi/libc/sock_addr.rb +0 -17
- data/lib/ffi/libc/sock_addr_in.rb +0 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8b34fc7cee6607ace19df65af88ddd4f84c9b9eb
|
4
|
+
data.tar.gz: 872117aa89b9d0728ab50ebf9d299f88d0af3db5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fcf582bb0a029f134897796dda7eb570931da272ece724473e95a58b3650a3c5dbfa0439061f3277d2107e5b18e758333cf21200d75b51666ebc5ba50b33183e
|
7
|
+
data.tar.gz: 5c456c33211162a7bd2662b5fbc94d4aea64bf9a0ca904cbe6dfd658817637ef0fe8a77ce67126fe5088bc532a99d066c06e4018b05cb45e942af603cdf3d97a
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/ChangeLog.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
### 0.1.0 / 2013-08-15
|
2
|
+
|
3
|
+
* Require ffi ~> 1.0.
|
4
|
+
* Added `alarm`.
|
5
|
+
* Added `clock`.
|
6
|
+
* Added `getc`.
|
7
|
+
* Added `getchar`.
|
8
|
+
* Added `gets`.
|
9
|
+
* Added `ungetc`.
|
10
|
+
* Added `getifaddrs`.
|
11
|
+
* Added `puts`.
|
12
|
+
* Added `putchar`.
|
13
|
+
* Added `putc`.
|
14
|
+
* Added `strcmp`.
|
15
|
+
* Added `strncmp`.
|
16
|
+
* Added {FFI::LibC::NULL}.
|
17
|
+
* Added {FFI::LibC::Ifaddrs}.
|
18
|
+
* Added {FFI::LibC.raise_error}.
|
19
|
+
* Added {FFI::LibC.each_ifaddr}.
|
20
|
+
* Added {FFI::LibC.rusage}.
|
21
|
+
|
1
22
|
### 0.0.5 / 2011-05-11
|
2
23
|
|
3
24
|
* Skip `clearenv`, `memrchr`, `stdin`, `stdout` and `stderr` if they cannot
|
@@ -27,10 +48,10 @@
|
|
27
48
|
* Added the Structs:
|
28
49
|
* {FFI::LibC::InAddr}.
|
29
50
|
* {FFI::LibC::In6Addr}.
|
30
|
-
* {FFI::LibC::
|
31
|
-
* {FFI::LibC::
|
32
|
-
* {FFI::LibC::
|
33
|
-
* {FFI::LibC::
|
51
|
+
* {FFI::LibC::Sockaddr}.
|
52
|
+
* {FFI::LibC::SockaddrDL}.
|
53
|
+
* {FFI::LibC::SockaddrIn}.
|
54
|
+
* {FFI::LibC::SockaddrIn6}.
|
34
55
|
|
35
56
|
### 0.0.1 / 2010-05-19
|
36
57
|
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# ffi-libc
|
2
2
|
|
3
|
-
* [Source](
|
4
|
-
* [Issues](
|
3
|
+
* [Source](https://github.com/postmodern/ffi-libc/)
|
4
|
+
* [Issues](https://github.com/postmodern/ffi-libc/issues)
|
5
5
|
* [Documentation](http://rubydoc.info/gems/ffi-libc)
|
6
6
|
* [Email](postmodern.mod3 at gmail.com)
|
7
7
|
|
@@ -12,15 +12,17 @@ Useful Ruby FFI bindings for `libc`.
|
|
12
12
|
## Features
|
13
13
|
|
14
14
|
* Provides common Structs used in `libc`:
|
15
|
+
* {FFI::LibC::Ifaddrs}
|
15
16
|
* {FFI::LibC::In6Addr}
|
16
17
|
* {FFI::LibC::InAddr}
|
17
|
-
* {FFI::LibC::
|
18
|
-
* {FFI::LibC::
|
19
|
-
* {FFI::LibC::
|
20
|
-
* {FFI::LibC::
|
21
|
-
* {FFI::LibC::
|
18
|
+
* {FFI::LibC::SockaddrDL}
|
19
|
+
* {FFI::LibC::SockaddrFamily}
|
20
|
+
* {FFI::LibC::SockaddrIn6}
|
21
|
+
* {FFI::LibC::SockaddrIn}
|
22
|
+
* {FFI::LibC::Sockaddr}
|
22
23
|
* {FFI::LibC::Timeval}
|
23
24
|
* {FFI::LibC::Timezone}
|
25
|
+
* {FFI::LibC::RUsage}
|
24
26
|
* Binds to common functions and global variables in `libc`:
|
25
27
|
* `errno.h`:
|
26
28
|
* `sys_errlist`
|
@@ -49,6 +51,8 @@ Useful Ruby FFI bindings for `libc`.
|
|
49
51
|
* `sys/time.h`:
|
50
52
|
* `gettimeofday`
|
51
53
|
* `settimeofday`
|
54
|
+
* `sys/resource.h` / `bits/resource.h`:
|
55
|
+
* `getrusage`
|
52
56
|
* `sys/mman.h`:
|
53
57
|
* `mmap`
|
54
58
|
* `munmap`
|
@@ -91,17 +95,24 @@ Useful Ruby FFI bindings for `libc`.
|
|
91
95
|
* `ferror`
|
92
96
|
* `fileno`
|
93
97
|
* `perror`
|
98
|
+
* `netdb.h`:
|
99
|
+
* `getnameinfo`
|
100
|
+
* `ifaddrs.h`:
|
101
|
+
* `getifaddrs`
|
102
|
+
* `freeifaddrs`
|
94
103
|
|
95
104
|
## Requirements
|
96
105
|
|
97
|
-
* [ffi]
|
106
|
+
* [ffi] ~> 1.0
|
98
107
|
|
99
108
|
## Install
|
100
109
|
|
101
|
-
$
|
110
|
+
$ gem install ffi-libc
|
102
111
|
|
103
112
|
## License
|
104
113
|
|
105
|
-
Copyright (c) 2010-
|
114
|
+
Copyright (c) 2010-2013 Hal Brodigan
|
106
115
|
|
107
116
|
See {file:LICENSE.txt} for license information.
|
117
|
+
|
118
|
+
[ffi]: https://github.com/ffi/ffi#readme
|
data/Rakefile
CHANGED
@@ -2,13 +2,13 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
|
4
4
|
begin
|
5
|
-
gem '
|
6
|
-
require '
|
5
|
+
gem 'rubygems-tasks', '~> 0.1'
|
6
|
+
require 'rubygems/tasks'
|
7
7
|
|
8
|
-
|
8
|
+
Gem::Tasks.new
|
9
9
|
rescue LoadError => e
|
10
10
|
STDERR.puts e.message
|
11
|
-
STDERR.puts "Run `gem install
|
11
|
+
STDERR.puts "Run `gem install rubygems-tasks` to install 'rubygems/tasks'."
|
12
12
|
end
|
13
13
|
|
14
14
|
begin
|
@@ -25,7 +25,7 @@ task :test => :spec
|
|
25
25
|
task :default => :spec
|
26
26
|
|
27
27
|
begin
|
28
|
-
gem 'yard', '~> 0.
|
28
|
+
gem 'yard', '~> 0.8'
|
29
29
|
require 'yard'
|
30
30
|
|
31
31
|
YARD::Rake::YardocTask.new
|
data/ffi-libc.gemspec
CHANGED
@@ -1,15 +1,60 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gemspec = YAML.load_file('gemspec.yml')
|
7
|
+
|
8
|
+
gem.name = gemspec.fetch('name')
|
9
|
+
gem.version = gemspec.fetch('version') do
|
10
|
+
lib_dir = File.join(File.dirname(__FILE__),'lib')
|
11
|
+
$LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
|
12
|
+
|
13
|
+
require 'ffi/libc/version'
|
14
|
+
FFI::LibC::VERSION
|
15
|
+
end
|
16
|
+
|
17
|
+
gem.summary = gemspec['summary']
|
18
|
+
gem.description = gemspec['description']
|
19
|
+
gem.licenses = Array(gemspec['license'])
|
20
|
+
gem.authors = Array(gemspec['authors'])
|
21
|
+
gem.email = gemspec['email']
|
22
|
+
gem.homepage = gemspec['homepage']
|
23
|
+
|
24
|
+
glob = lambda { |patterns| gem.files & Dir[*patterns] }
|
25
|
+
|
26
|
+
gem.files = `git ls-files`.split($/)
|
27
|
+
gem.files = glob[gemspec['files']] if gemspec['files']
|
28
|
+
|
29
|
+
gem.executables = gemspec.fetch('executables') do
|
30
|
+
glob['bin/*'].map { |path| File.basename(path) }
|
6
31
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
32
|
+
gem.default_executable = gem.executables.first if Gem::VERSION < '1.7.'
|
33
|
+
|
34
|
+
gem.extensions = glob[gemspec['extensions'] || 'ext/**/extconf.rb']
|
35
|
+
gem.test_files = glob[gemspec['test_files'] || '{test/{**/}*_test.rb']
|
36
|
+
gem.extra_rdoc_files = glob[gemspec['extra_doc_files'] || '*.{txt,md}']
|
37
|
+
|
38
|
+
gem.require_paths = Array(gemspec.fetch('require_paths') {
|
39
|
+
%w[ext lib].select { |dir| File.directory?(dir) }
|
40
|
+
})
|
41
|
+
|
42
|
+
gem.requirements = gemspec['requirements']
|
43
|
+
gem.required_ruby_version = gemspec['required_ruby_version']
|
44
|
+
gem.required_rubygems_version = gemspec['required_rubygems_version']
|
45
|
+
gem.post_install_message = gemspec['post_install_message']
|
46
|
+
|
47
|
+
split = lambda { |string| string.split(/,\s*/) }
|
48
|
+
|
49
|
+
if gemspec['dependencies']
|
50
|
+
gemspec['dependencies'].each do |name,versions|
|
51
|
+
gem.add_dependency(name,split[versions])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if gemspec['development_dependencies']
|
56
|
+
gemspec['development_dependencies'].each do |name,versions|
|
57
|
+
gem.add_development_dependency(name,split[versions])
|
58
|
+
end
|
14
59
|
end
|
15
60
|
end
|
data/gemspec.yml
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
name: ffi-libc
|
2
|
-
version: 0.0
|
2
|
+
version: 0.1.0
|
3
3
|
summary: Useful FFI bindings for libc
|
4
4
|
description: Useful Ruby FFI bindings for libc.
|
5
5
|
license: MIT
|
6
6
|
authors: Postmodern
|
7
7
|
email: postmodern.mod3@gmail.com
|
8
|
-
homepage:
|
8
|
+
homepage: https://github.com/postmodern/ffi-libc#redme
|
9
9
|
has_yard: true
|
10
10
|
|
11
11
|
dependencies:
|
12
|
-
ffi:
|
12
|
+
ffi: ~> 1.0
|
13
13
|
|
14
14
|
development_dependencies:
|
15
|
-
|
15
|
+
rubygems-tasks: ~> 0.1
|
16
16
|
rspec: ~> 2.4
|
17
|
-
yard: ~> 0.
|
17
|
+
yard: ~> 0.8
|
data/lib/ffi/libc.rb
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
require 'ffi/libc/types'
|
2
|
+
require 'ffi/libc/af'
|
3
|
+
require 'ffi/libc/ifaddrs'
|
4
|
+
require 'ffi/libc/in_addr'
|
5
|
+
require 'ffi/libc/in6_addr'
|
6
|
+
require 'ffi/libc/sockaddr'
|
7
|
+
require 'ffi/libc/sockaddr_dl'
|
8
|
+
require 'ffi/libc/sockaddr_in'
|
9
|
+
require 'ffi/libc/sockaddr_in6'
|
10
|
+
require 'ffi/libc/timeval'
|
11
|
+
require 'ffi/libc/timezone'
|
12
|
+
require 'ffi/libc/rusage'
|
2
13
|
require 'ffi/libc/libc'
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'ffi/libc/ifaddrs_union'
|
2
|
+
require 'ffi/libc/sockaddr'
|
3
|
+
|
4
|
+
module FFI
|
5
|
+
module LibC
|
6
|
+
#
|
7
|
+
# @since 0.1.0
|
8
|
+
#
|
9
|
+
class Ifaddrs < FFI::Struct
|
10
|
+
|
11
|
+
layout :ifa_next, :pointer,
|
12
|
+
:ifa_name, :string,
|
13
|
+
:ifa_flags, :uint,
|
14
|
+
:ifa_addr, :pointer,
|
15
|
+
:ifa_netmask, :pointer,
|
16
|
+
:ifa_ifu, IfaddrsUnion,
|
17
|
+
:ifa_data, :pointer
|
18
|
+
|
19
|
+
#
|
20
|
+
# Gets the next Interface Address in the list.
|
21
|
+
#
|
22
|
+
# @return [Ifaddrs, nil]
|
23
|
+
# The next Interface Address in the list.
|
24
|
+
#
|
25
|
+
def next
|
26
|
+
unless self[:ifa_next].null?
|
27
|
+
Ifaddrs.new(self[:ifa_next])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# The name of the Interface.
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
# The name.
|
36
|
+
#
|
37
|
+
def name
|
38
|
+
self[:ifa_name]
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# The flags of the Interface.
|
43
|
+
#
|
44
|
+
# @return [Integer]
|
45
|
+
# The flags.
|
46
|
+
#
|
47
|
+
def flags
|
48
|
+
self[:ifa_flags]
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# The address of the Interface.
|
53
|
+
#
|
54
|
+
# @return [Sockaddr]
|
55
|
+
# The basic socket address.
|
56
|
+
#
|
57
|
+
def addr
|
58
|
+
Sockaddr.new(self[:ifa_addr])
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# The netmask of the Interface.
|
63
|
+
#
|
64
|
+
# @return [Sockaddr]
|
65
|
+
# The socket address containing the netmask.
|
66
|
+
#
|
67
|
+
def netmask
|
68
|
+
Sockaddr.new(self[:ifa_netmask])
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# The broadcast address of the Interface.
|
73
|
+
#
|
74
|
+
# @return [Sockaddr]
|
75
|
+
# The broadcast address.
|
76
|
+
#
|
77
|
+
def broadaddr
|
78
|
+
Sockaddr.new(self[:ifa_ifu][:ifu_broadaddr])
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# The destination address of the Interface.
|
83
|
+
#
|
84
|
+
# @return [Sockaddr]
|
85
|
+
# The destination address.
|
86
|
+
#
|
87
|
+
def dstaddr
|
88
|
+
Sockaddr.new(self[:ifa_ifu][:ifu_dstaddr])
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/ffi/libc/libc.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'ffi/libc/types'
|
2
2
|
require 'ffi/libc/timeval'
|
3
3
|
require 'ffi/libc/timezone'
|
4
|
+
require 'ffi/libc/ifaddrs'
|
5
|
+
require 'ffi/libc/rusage'
|
4
6
|
|
5
7
|
require 'ffi'
|
6
8
|
|
@@ -10,11 +12,18 @@ module FFI
|
|
10
12
|
|
11
13
|
ffi_lib [FFI::CURRENT_PROCESS, 'c']
|
12
14
|
|
15
|
+
# The NULL constant
|
16
|
+
NULL = nil
|
17
|
+
|
13
18
|
# errno.h
|
14
19
|
attach_variable :sys_errlist, :pointer
|
15
20
|
attach_variable :sys_nerr, :int
|
16
21
|
attach_variable :errno, :int
|
17
22
|
|
23
|
+
def self.raise_error(error=self.errno)
|
24
|
+
raise(strerror(error))
|
25
|
+
end
|
26
|
+
|
18
27
|
# unistd.h
|
19
28
|
attach_function :brk, [:pointer], :int
|
20
29
|
attach_function :sbrk, [:pointer], :pointer
|
@@ -24,6 +33,7 @@ module FFI
|
|
24
33
|
attach_function :geteuid, [], :uid_t
|
25
34
|
attach_function :getgid, [], :gid_t
|
26
35
|
attach_function :getegid, [], :gid_t
|
36
|
+
attach_function :alarm, [:uint], :uint
|
27
37
|
|
28
38
|
# stdlib.h
|
29
39
|
attach_function :calloc, [:size_t, :size_t], :pointer
|
@@ -41,6 +51,7 @@ module FFI
|
|
41
51
|
end
|
42
52
|
|
43
53
|
# time.h
|
54
|
+
attach_function :clock, [], :clock_t
|
44
55
|
attach_function :time, [:pointer], :time_t
|
45
56
|
|
46
57
|
# sys/time.h
|
@@ -54,26 +65,28 @@ module FFI
|
|
54
65
|
# string.h
|
55
66
|
attach_function :bzero, [:pointer, :size_t], :void
|
56
67
|
attach_function :memset, [:pointer, :int, :size_t], :pointer
|
57
|
-
attach_function :memcpy, [:
|
58
|
-
attach_function :memcmp, [:
|
59
|
-
attach_function :memchr, [:
|
68
|
+
attach_function :memcpy, [:buffer_out, :buffer_in, :size_t], :pointer
|
69
|
+
attach_function :memcmp, [:buffer_in, :buffer_in, :size_t], :int
|
70
|
+
attach_function :memchr, [:buffer_in, :int, :size_t], :pointer
|
60
71
|
|
61
72
|
begin
|
62
|
-
attach_function :memrchr, [:
|
73
|
+
attach_function :memrchr, [:buffer_in, :int, :size_t], :pointer
|
63
74
|
rescue FFI::NotFoundError
|
64
75
|
# memrchr is not available on OSX
|
65
76
|
end
|
66
77
|
|
67
|
-
attach_function :strcpy, [:
|
68
|
-
attach_function :strncpy, [:
|
69
|
-
attach_function :
|
70
|
-
attach_function :
|
71
|
-
attach_function :
|
72
|
-
attach_function :
|
73
|
-
attach_function :
|
74
|
-
attach_function :
|
78
|
+
attach_function :strcpy, [:buffer_out, :string], :pointer
|
79
|
+
attach_function :strncpy, [:buffer_out, :string, :size_t], :pointer
|
80
|
+
attach_function :strcmp, [:buffer_in, :buffer_in], :int
|
81
|
+
attach_function :strncmp, [:buffer_in, :buffer_in, :size_t], :int
|
82
|
+
attach_function :strlen, [:buffer_in], :size_t
|
83
|
+
attach_function :index, [:buffer_in, :int], :pointer
|
84
|
+
attach_function :rindex, [:buffer_in, :int], :pointer
|
85
|
+
attach_function :strchr, [:buffer_in, :int], :pointer
|
86
|
+
attach_function :strrchr, [:buffer_in, :int], :pointer
|
87
|
+
attach_function :strstr, [:buffer_in, :string], :pointer
|
75
88
|
attach_function :strerror, [:int], :string
|
76
|
-
|
89
|
+
|
77
90
|
begin
|
78
91
|
attach_variable :stdin, :pointer
|
79
92
|
attach_variable :stdout, :pointer
|
@@ -81,19 +94,19 @@ module FFI
|
|
81
94
|
rescue FFI::NotFoundError
|
82
95
|
# stdin, stdout, stderr are not available on OSX
|
83
96
|
end
|
84
|
-
|
97
|
+
|
85
98
|
attach_function :fopen, [:string, :string], :FILE
|
86
99
|
attach_function :fdopen, [:int, :string], :FILE
|
87
100
|
attach_function :freopen, [:string, :string, :FILE], :FILE
|
88
101
|
attach_function :fseek, [:FILE, :long, :int], :int
|
89
102
|
attach_function :ftell, [:FILE], :long
|
90
103
|
attach_function :rewind, [:FILE], :void
|
91
|
-
attach_function :fread, [:
|
92
|
-
attach_function :fwrite, [:
|
104
|
+
attach_function :fread, [:buffer_out, :size_t, :size_t, :FILE], :size_t
|
105
|
+
attach_function :fwrite, [:buffer_in, :size_t, :size_t, :FILE], :size_t
|
93
106
|
attach_function :fgetc, [:FILE], :int
|
94
|
-
attach_function :fgets, [:
|
107
|
+
attach_function :fgets, [:buffer_out, :int, :FILE], :pointer
|
95
108
|
attach_function :fputc, [:int, :FILE], :int
|
96
|
-
attach_function :fputs, [:
|
109
|
+
attach_function :fputs, [:buffer_in, :FILE], :int
|
97
110
|
attach_function :fflush, [:FILE], :int
|
98
111
|
attach_function :fclose, [:FILE], :int
|
99
112
|
attach_function :clearerr, [:FILE], :void
|
@@ -101,5 +114,104 @@ module FFI
|
|
101
114
|
attach_function :ferror, [:FILE], :int
|
102
115
|
attach_function :fileno, [:FILE], :int
|
103
116
|
attach_function :perror, [:string], :void
|
117
|
+
|
118
|
+
attach_function :getc, [:FILE], :int
|
119
|
+
attach_function :getchar, [], :int
|
120
|
+
attach_function :gets, [:buffer_out], :int
|
121
|
+
attach_function :ungetc, [:int, :pointer], :int
|
122
|
+
|
123
|
+
attach_function :putc, [:int, :FILE], :int
|
124
|
+
attach_function :putchar, [:int], :int
|
125
|
+
attach_function :puts, [:string], :int
|
126
|
+
|
127
|
+
# netdb.h
|
128
|
+
attach_function :getnameinfo, [
|
129
|
+
:pointer,
|
130
|
+
:socklen_t, :pointer,
|
131
|
+
:socklen_t, :pointer,
|
132
|
+
:socklen_t, :int
|
133
|
+
], :int
|
134
|
+
|
135
|
+
NI_MAXHOST = 1024
|
136
|
+
NI_MAXSERV = 32
|
137
|
+
|
138
|
+
NI_NUMERICHOST = 1 # Don't try to look up hostname.
|
139
|
+
NI_NUMERICSERV = 2 # Don't convert port number to name.
|
140
|
+
NI_NOFQDN = 4 # Only return nodename portion.
|
141
|
+
NI_NAMEREQD = 8 # Don't return numeric addresses.
|
142
|
+
NI_DGRAM = 16 # Look up UDP service rather than TCP.
|
143
|
+
|
144
|
+
# ifaddrs.h
|
145
|
+
attach_function :getifaddrs, [:pointer], :int
|
146
|
+
attach_function :freeifaddrs, [:pointer], :void
|
147
|
+
|
148
|
+
#
|
149
|
+
# Enumerates over the Interface Addresses.
|
150
|
+
#
|
151
|
+
# @yield [ifaddr]
|
152
|
+
# The given block will be passed each Interface Address.
|
153
|
+
#
|
154
|
+
# @yieldparam [Ifaddrs] ifaddr
|
155
|
+
# An Interface Address.
|
156
|
+
#
|
157
|
+
# @return [Enumerator]
|
158
|
+
# If no block is given, an enumerator will be returned.
|
159
|
+
#
|
160
|
+
# @since 0.1.0
|
161
|
+
#
|
162
|
+
def self.each_ifaddr
|
163
|
+
return enum_for(__method__) unless block_given?
|
164
|
+
|
165
|
+
ptr = MemoryPointer.new(:pointer)
|
166
|
+
|
167
|
+
if getifaddrs(ptr) == -1
|
168
|
+
raise_error
|
169
|
+
end
|
170
|
+
|
171
|
+
if (ifaddrs = ptr.get_pointer(0)).null?
|
172
|
+
return
|
173
|
+
end
|
174
|
+
|
175
|
+
ifaddr = Ifaddrs.new(ifaddrs)
|
176
|
+
|
177
|
+
while ifaddr
|
178
|
+
yield ifaddr
|
179
|
+
|
180
|
+
ifaddr = ifaddr.next
|
181
|
+
end
|
182
|
+
|
183
|
+
freeifaddrs(ifaddrs)
|
184
|
+
end
|
185
|
+
|
186
|
+
# bits/resource.h (Linux) / sys/resource.h (Darwin)
|
187
|
+
RUSAGE_SELF = 0
|
188
|
+
RUSAGE_CHILDREN = -1
|
189
|
+
RUSAGE_THREAD = 1 # Linux/glibc only
|
190
|
+
|
191
|
+
attach_function :getrusage, [:int, :pointer], :int
|
192
|
+
|
193
|
+
#
|
194
|
+
# Gets the RUsage for the user.
|
195
|
+
#
|
196
|
+
# @param [RUSAGE_SELF, RUSAGE_CHILDREN, RUSAGE_THREAD] who
|
197
|
+
# Whome to get RUsage statistics for.
|
198
|
+
#
|
199
|
+
# @return [RUsage]
|
200
|
+
# The RUsage statistics.
|
201
|
+
#
|
202
|
+
# @raise [RuntimeError]
|
203
|
+
# An error has occurred.
|
204
|
+
#
|
205
|
+
# @since 0.1.0
|
206
|
+
#
|
207
|
+
def self.rusage(who=RUSAGE_SELF)
|
208
|
+
rusage = RUsage.new
|
209
|
+
|
210
|
+
unless (ret = getrusage(who,rusage)) == 0
|
211
|
+
raise_error(ret)
|
212
|
+
end
|
213
|
+
|
214
|
+
return rusage
|
215
|
+
end
|
104
216
|
end
|
105
217
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'ffi/libc/types'
|
2
|
+
require 'ffi/libc/timeval'
|
3
|
+
|
4
|
+
module FFI
|
5
|
+
module LibC
|
6
|
+
#
|
7
|
+
# @since 0.1.0
|
8
|
+
#
|
9
|
+
class RUsage < FFI::Struct
|
10
|
+
|
11
|
+
layout :ru_utime, Timeval,
|
12
|
+
:ru_stime, Timeval,
|
13
|
+
:ru_maxrss, :long,
|
14
|
+
:ru_ixrss, :long,
|
15
|
+
:ru_idrss, :long,
|
16
|
+
:ru_isrss, :long,
|
17
|
+
:ru_minflt, :long,
|
18
|
+
:ru_majflt, :long,
|
19
|
+
:ru_nswap, :long,
|
20
|
+
:ru_inblock, :long,
|
21
|
+
:ru_oublock, :long,
|
22
|
+
:ru_msgsnd, :long,
|
23
|
+
:ru_msgrcv, :long,
|
24
|
+
:ru_nsignals, :long,
|
25
|
+
:ru_nvcsw, :long,
|
26
|
+
:ru_nivcsw, :long
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ffi/libc/types'
|
2
|
+
require 'ffi/libc/sockaddr_family'
|
3
|
+
|
4
|
+
module FFI
|
5
|
+
module LibC
|
6
|
+
#
|
7
|
+
# The generic `sockaddr` structure.
|
8
|
+
#
|
9
|
+
class Sockaddr < SockaddrFamily
|
10
|
+
|
11
|
+
layout :family, :sa_family_t,
|
12
|
+
:data, [:char, 14]
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'ffi/libc/types'
|
2
|
-
require 'ffi/libc/
|
2
|
+
require 'ffi/libc/sockaddr_family'
|
3
3
|
|
4
4
|
module FFI
|
5
5
|
module LibC
|
6
6
|
#
|
7
7
|
# The data-link socket address
|
8
8
|
#
|
9
|
-
class
|
9
|
+
class SockaddrDL < SockaddrFamily
|
10
10
|
|
11
11
|
layout :len, :uint8,
|
12
12
|
:family, :sa_family_t,
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'ffi/libc/types'
|
2
|
+
require 'ffi/libc/sockaddr_family'
|
3
|
+
|
4
|
+
module FFI
|
5
|
+
module LibC
|
6
|
+
#
|
7
|
+
# sockaddr inet, always good to have around
|
8
|
+
#
|
9
|
+
class SockaddrIn < SockaddrFamily
|
10
|
+
|
11
|
+
layout :len, :uint8,
|
12
|
+
:family, :sa_family_t,
|
13
|
+
:port, :in_port_t,
|
14
|
+
:addr, :in_addr_t,
|
15
|
+
:_sa_zero, [:uint8, 8]
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ffi/libc/types'
|
2
|
+
require 'ffi/libc/sockaddr_family'
|
2
3
|
require 'ffi/libc/in6_addr'
|
3
4
|
|
4
5
|
module FFI
|
@@ -6,7 +7,7 @@ module FFI
|
|
6
7
|
#
|
7
8
|
# IPv6 socket address
|
8
9
|
#
|
9
|
-
class
|
10
|
+
class SockaddrIn6 < SockaddrFamily
|
10
11
|
|
11
12
|
layout :len, :uint8,
|
12
13
|
:family, :sa_family_t,
|
data/lib/ffi/libc/types.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ffi/libc/ifaddrs'
|
3
|
+
|
4
|
+
describe Ifaddrs do
|
5
|
+
subject { LibC.each_ifaddr.first }
|
6
|
+
|
7
|
+
it "should have a name" do
|
8
|
+
subject.name.should_not be_empty
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should have flags" do
|
12
|
+
subject.flags.should be_kind_of(Integer)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have an addr" do
|
16
|
+
subject.addr.should be_kind_of(Sockaddr)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have an netmask" do
|
20
|
+
subject.netmask.should be_kind_of(Sockaddr)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have a broadcast addr" do
|
24
|
+
subject.broadaddr.should be_kind_of(Sockaddr)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have a destination addr" do
|
28
|
+
subject.dstaddr.should be_kind_of(Sockaddr)
|
29
|
+
end
|
30
|
+
end
|
data/spec/libc_spec.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'ffi/libc'
|
2
3
|
|
3
|
-
describe
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
}
|
4
|
+
describe FFI::LibC do
|
5
|
+
describe "NULL" do
|
6
|
+
subject { described_class::NULL }
|
7
|
+
|
8
|
+
it { should == nil }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "each_ifaddr" do
|
12
|
+
it "should yield Ifaddrs" do
|
13
|
+
addrs = []
|
14
|
+
|
15
|
+
described_class.each_ifaddr do |ifaddr|
|
16
|
+
addrs << ifaddr
|
17
|
+
end
|
18
|
+
|
19
|
+
addrs.all? { |addr| addr.kind_of?(Ifaddrs) }.should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when not given a block" do
|
23
|
+
subject { described_class.each_ifaddr }
|
24
|
+
|
25
|
+
it { should be_kind_of(Enumerable) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "rusage" do
|
30
|
+
subject { described_class.rusage }
|
31
|
+
|
32
|
+
it "should be able to fetch its own memory usage" do
|
33
|
+
subject[:ru_maxrss].should be > 4000
|
34
|
+
end
|
8
35
|
end
|
9
36
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,76 +1,84 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-libc
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.0.5
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Postmodern
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-08-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
16
14
|
name: ffi
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.1.0
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.6.0
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
27
20
|
type: :runtime
|
28
|
-
version_requirements: *id001
|
29
|
-
- !ruby/object:Gem::Dependency
|
30
|
-
name: ore-tasks
|
31
21
|
prerelease: false
|
32
|
-
|
33
|
-
|
34
|
-
requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
35
24
|
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version:
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubygems-tasks
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
38
34
|
type: :development
|
39
|
-
version_requirements: *id002
|
40
|
-
- !ruby/object:Gem::Dependency
|
41
|
-
name: rspec
|
42
35
|
prerelease: false
|
43
|
-
|
44
|
-
|
45
|
-
requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
46
38
|
- - ~>
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version:
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.4'
|
49
48
|
type: :development
|
50
|
-
version_requirements: *id003
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: yard
|
53
49
|
prerelease: false
|
54
|
-
|
55
|
-
|
56
|
-
requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
57
52
|
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.8'
|
60
62
|
type: :development
|
61
|
-
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.8'
|
62
69
|
description: Useful Ruby FFI bindings for libc.
|
63
|
-
email:
|
64
|
-
- postmodern.mod3@gmail.com
|
70
|
+
email: postmodern.mod3@gmail.com
|
65
71
|
executables: []
|
66
|
-
|
67
72
|
extensions: []
|
68
|
-
|
69
|
-
|
73
|
+
extra_rdoc_files:
|
74
|
+
- ChangeLog.md
|
75
|
+
- LICENSE.txt
|
70
76
|
- README.md
|
71
|
-
files:
|
77
|
+
files:
|
72
78
|
- .gemtest
|
79
|
+
- .gitignore
|
73
80
|
- .rspec
|
81
|
+
- .travis.yml
|
74
82
|
- .yardopts
|
75
83
|
- ChangeLog.md
|
76
84
|
- LICENSE.txt
|
@@ -80,45 +88,45 @@ files:
|
|
80
88
|
- gemspec.yml
|
81
89
|
- lib/ffi/libc.rb
|
82
90
|
- lib/ffi/libc/af.rb
|
91
|
+
- lib/ffi/libc/ifaddrs.rb
|
92
|
+
- lib/ffi/libc/ifaddrs_union.rb
|
83
93
|
- lib/ffi/libc/in6_addr.rb
|
84
94
|
- lib/ffi/libc/in_addr.rb
|
85
95
|
- lib/ffi/libc/libc.rb
|
86
|
-
- lib/ffi/libc/
|
87
|
-
- lib/ffi/libc/
|
88
|
-
- lib/ffi/libc/
|
89
|
-
- lib/ffi/libc/
|
90
|
-
- lib/ffi/libc/
|
96
|
+
- lib/ffi/libc/rusage.rb
|
97
|
+
- lib/ffi/libc/sockaddr.rb
|
98
|
+
- lib/ffi/libc/sockaddr_dl.rb
|
99
|
+
- lib/ffi/libc/sockaddr_family.rb
|
100
|
+
- lib/ffi/libc/sockaddr_in.rb
|
101
|
+
- lib/ffi/libc/sockaddr_in6.rb
|
91
102
|
- lib/ffi/libc/timeval.rb
|
92
103
|
- lib/ffi/libc/timezone.rb
|
93
104
|
- lib/ffi/libc/types.rb
|
105
|
+
- spec/ifaddrs_spec.rb
|
94
106
|
- spec/libc_spec.rb
|
95
107
|
- spec/spec_helper.rb
|
96
|
-
homepage:
|
97
|
-
licenses:
|
108
|
+
homepage: https://github.com/postmodern/ffi-libc#redme
|
109
|
+
licenses:
|
98
110
|
- MIT
|
111
|
+
metadata: {}
|
99
112
|
post_install_message:
|
100
113
|
rdoc_options: []
|
101
|
-
|
102
|
-
require_paths:
|
114
|
+
require_paths:
|
103
115
|
- lib
|
104
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: "0"
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
116
126
|
requirements: []
|
117
|
-
|
118
|
-
|
119
|
-
rubygems_version: 1.8.1
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.0.5
|
120
129
|
signing_key:
|
121
|
-
specification_version:
|
130
|
+
specification_version: 4
|
122
131
|
summary: Useful FFI bindings for libc
|
123
|
-
test_files:
|
124
|
-
- spec/libc_spec.rb
|
132
|
+
test_files: []
|
data/lib/ffi/libc/sock_addr.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'ffi/libc/types'
|
2
|
-
require 'ffi/libc/sock_addr_family'
|
3
|
-
|
4
|
-
module FFI
|
5
|
-
module LibC
|
6
|
-
#
|
7
|
-
# The generic `sock_addr` structure.
|
8
|
-
#
|
9
|
-
class SockAddr < SockAddrFamily
|
10
|
-
|
11
|
-
layout :len, :uint8,
|
12
|
-
:family, :sa_family_t,
|
13
|
-
:data, :char
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'ffi/libc/types'
|
2
|
-
require 'ffi/libc/sock_addr_family'
|
3
|
-
|
4
|
-
module FFI
|
5
|
-
module LibC
|
6
|
-
#
|
7
|
-
# sockaddr inet, always good to have around
|
8
|
-
#
|
9
|
-
class SockAddrIn < SockAddrFamily
|
10
|
-
|
11
|
-
layout :len, :uint8,
|
12
|
-
:family, :sa_family_t,
|
13
|
-
:port, :in_port_t,
|
14
|
-
:addr, :in_addr_t,
|
15
|
-
:_sa_zero, [:uint8, 8]
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|