rpm 0.0.0 → 0.0.2

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.
data/.gitignore CHANGED
@@ -2,3 +2,5 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ *.rbc
6
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,24 @@
1
+
2
+ Copyright © 2011 Duncan Mac-Vicar Prett <dmacvicar@suse.de>
3
+ Copyright © 2011 SUSE Linux Products GmbH
4
+ Copyright © 2002 Kenta Murata
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
data/README.rdoc ADDED
@@ -0,0 +1,298 @@
1
+
2
+ = RPM bindings for ruby
3
+
4
+ * http://github.com/dmacvicar/ruby-rpm
5
+
6
+ = WARNING
7
+
8
+ This is an alpha release! There is still work to be done
9
+
10
+ = Quickstart
11
+
12
+ == Working with RPM package files
13
+
14
+ require 'rpm'
15
+
16
+ pkg = RPM::Package.open("file.rpm")
17
+ pkg.arch => "x86_64"
18
+
19
+ pkg.files.each do |file|
20
+ puts file.path
21
+ end
22
+
23
+ pkg.changelog.each do |entry|
24
+ puts "#{entry.name} #{entry.time} #{entry.text}"
25
+ end
26
+
27
+ == Querying the rpm database
28
+
29
+ require 'rpm'
30
+
31
+ RPM.transaction do |ts|
32
+ ts.each do |pkg|
33
+ puts pkg
34
+ end
35
+ end
36
+
37
+ = Introduction
38
+
39
+ This library is a replacement for the ruby-rpm gem, originally
40
+ writen by Kenta Murata around 2002 for the Kondara distribution. Later
41
+ mantained by David Lutterkort and myself.
42
+
43
+ Why?
44
+
45
+ * The original gem supports ancient rpm versions not in use anymore
46
+ * The original gem was written in C using MRI API
47
+ * The #ifdef'ing required to support multiple rpm versions made the code
48
+ hard to maintain
49
+
50
+ This gem:
51
+
52
+ * Is pure ruby
53
+ * Is documented
54
+ * Has as a goal to support only the latest rpm version plus the ones in
55
+ use some releases back in popular rpm based distros
56
+ * Uses FFI, so it should work with other interpreters
57
+ (Because https://github.com/rubinius/rubinius/issues/682 it currently does
58
+ not work on Rubinius)
59
+ * Does not target rpm5, but it may support it someday
60
+
61
+ As an example the code that implements RPM::Package was reduced
62
+ from 1130 lines of code to 320.
63
+
64
+ = Architecture
65
+
66
+ The gem is divided in two modules:
67
+
68
+ * RPM::FFI:: which contains the 1:1 mapping to the librpm API
69
+ Not all functions are attached, only the ones we actually use.
70
+ * RPM:: contains the actual higher level API
71
+
72
+ = Status, Compatibility and Differences with ruby-rpm
73
+
74
+ * Tested rpm 4.9 only
75
+ * You can use symbols: instead of RPM::TAG_DESCRIPTION you
76
+ can use just :description. 'rpm/compat' is by default loaded
77
+ and provides compatibility with the RPM::TAG_* style constants
78
+ * RPM::DB is not supported. Use RPM::Transaction
79
+ * Spec and Source classes are not implemented yet
80
+
81
+ == API Checklist and TODO
82
+
83
+ * RPM
84
+
85
+ [ ] RPM#expand
86
+ [X] RPM#[]
87
+ [X] RPM#[]=
88
+ [ ] RPM#readrc
89
+ [ ] RPM#init_macros
90
+ [ ] RPM#verbosity
91
+ [ ] RPM#verbosity=
92
+
93
+ * RPM::Package
94
+
95
+ [X] Package#open
96
+ [X] Package#new
97
+ [X] Package#create
98
+ [ ] Package#load
99
+ [ ] Package#clear_cache
100
+ [ ] Package#use_cache
101
+ [X] Package#[]
102
+ [ ] Package#delete_tag
103
+ [X] Package#sprintf
104
+ [?] Package#signature
105
+ [X] Package#arch
106
+ [X] Package#name
107
+ [X] Package#version
108
+ [X] Package#files
109
+ [X] Package#provides
110
+ [X] Package#requires
111
+ [X] Package#conflicts
112
+ [X] Package#obsoletes
113
+ [X] Package#changelog
114
+ [ ] Package#add_dependency
115
+ [ ] Package#add_string
116
+ [ ] Package#add_string_array
117
+ [ ] Package#add_int32
118
+ [ ] Package#dump
119
+ [X] Package#to_s
120
+ [ ] Package#inspect
121
+ [ ] Package#copy_to
122
+
123
+ * RPM::Dependency
124
+
125
+ [X] Dependency#initialize
126
+ [X] Dependency#name
127
+ [X] Dependency#version
128
+ [X] Dependency#flags
129
+ [X] Dependency#owner
130
+ [X] Dependency#lt?
131
+ [X] Dependency#gt?
132
+ [X] Dependency#eq?
133
+ [X] Dependency#le?
134
+ [X] Dependency#ge?
135
+ [X] Dependency#satisfy?
136
+ [X] Dependency#nametag
137
+ [X] Dependency#versiontag
138
+ [X] Dependency#flagstag
139
+
140
+ * RPM::Provide
141
+ [X] Provide#initialize
142
+
143
+ * RPM::Require
144
+ [X] Require#initialize
145
+ [ ] Require#pre?
146
+
147
+ * RPM::Conflict
148
+ [X] Conflict#initialize
149
+
150
+ * RPM::Obsolete
151
+ [X] Obsolete#initialize
152
+
153
+ * RPM::ChangeLog
154
+
155
+ [X] ChangeLog#time
156
+ [X] ChangeLog#name
157
+ [X] ChangeLog#text
158
+
159
+ * RPM::Version
160
+
161
+ [X] Version (Comparable)
162
+ [X] Version#initialize
163
+ [X] Version#<=>
164
+ [X] Version#newer?
165
+ [X] Version#older?
166
+ [X] Version#v
167
+ [X] Version#r
168
+ [X] Version#e
169
+ [X] Version#to_s
170
+ [X] Version#to_vre
171
+ [X] Version#inspect
172
+ [X] Version#hash
173
+
174
+ * RPM::File
175
+
176
+ [X] File#initialize
177
+ [X] File#path
178
+ [ ] File#to_s (alias path)
179
+ [X] File#md5sum
180
+ [X] File#link_to
181
+ [X] File#size
182
+ [X] File#mtime
183
+ [X] File#owner
184
+ [X] File#group
185
+ [X] File#rdev
186
+ [X] File#mode
187
+ [X] File#attr
188
+ [X] File#state
189
+ [X] File#symlink?
190
+ [X] File#config?
191
+ [X] File#doc?
192
+ [X] File#donotuse?
193
+ [X] File#missingok?
194
+ [X] File#specfile?
195
+ [X] File#ghost?
196
+ [X] File#license?
197
+ [X] File#readme?
198
+ [X] File#exclude?
199
+ [X] File#replaced?
200
+ [X] File#notinstalled?
201
+ [X] File#netshared?
202
+
203
+ * RPM::DB
204
+
205
+ [ ] DB (Enumerable)
206
+ [ ] DB#new
207
+ [ ] DB#open
208
+ [ ] DB#init
209
+ [ ] DB#rebuild
210
+ [ ] DB#close
211
+ [ ] DB#closed?
212
+ [ ] DB#root
213
+ [ ] DB#home
214
+ [ ] DB#writable?
215
+ [ ] DB#each_match
216
+ [ ] DB#each
217
+ [ ] DB#transaction
218
+ [ ] DB#init_iterator
219
+ [ ] DB#dup
220
+ [ ] DB#clone
221
+
222
+ * RPM::MatchIterator
223
+
224
+ [X] MatchIterator (Enumerable)
225
+ [X] MatchIterator#each
226
+ [X] MatchIterator#next_iterator
227
+ [X] MatchIterator#offset
228
+ [X] MatchIterator#set_iterator_re
229
+ [X] MatchIterator#regexp
230
+ [X] MatchIterator#set_iterator_version
231
+ [X] MatchIterator#version
232
+ [X] MatchIterator#get_iterator_count
233
+ [X] MatchIterator#length
234
+
235
+ * RPM::Transaction
236
+
237
+ [ ] Transaction#db
238
+ [ ] Transaction#script_file
239
+ [ ] Transaction#script_file=
240
+ [ ] Transaction#install
241
+ [ ] Transaction#upgrade
242
+ [ ] Transaction#available
243
+ [ ] Transaction#delete
244
+ [ ] Transaction#check
245
+ [ ] Transaction#order
246
+ [ ] Transaction#keys
247
+ [ ] Transaction#commit
248
+ [ ] Transaction#abort
249
+ [ ] Transaction#dup
250
+ [ ] Transaction#clone
251
+
252
+ * RPM::Source
253
+
254
+ [ ] Source#initialize
255
+ [ ] Source#fullname
256
+ [ ] Source#to_s (alias fullname)
257
+ [ ] Source#num
258
+ [ ] Source#no?
259
+
260
+ * RPM::Patch
261
+ * RPM::Icon
262
+
263
+ * RPM::Spec
264
+
265
+ [ ] Spec#open
266
+ [ ] Spec#new
267
+ [ ] Spec#buildroot
268
+ [ ] Spec#buildsubdir
269
+ [ ] Spec#buildarchs
270
+ [ ] Spec#buildrequires
271
+ [ ] Spec#build_restrictions
272
+ [ ] Spec#sources
273
+ [ ] Spec#packages
274
+ [ ] Spec#build
275
+ [ ] Spec#expand_macros
276
+ [ ] Spec#dup
277
+ [ ] Spec#clone
278
+
279
+ == TODO
280
+
281
+ * Check Package#signature should return String?
282
+ => ruby-rpm seems to return symbol
283
+ * Food for thought: Package dependencies and changelog
284
+ methods could just use []. Calling headerGet directly saves
285
+ us from doing one iteration per attribute
286
+ * Not sure if Spec can be implemented as it was before with
287
+ newer rpms.
288
+
289
+ = LICENSE
290
+
291
+ * Copyright © 2011 Duncan Mac-Vicar Prett <dmacvicar@suse.de>
292
+ * Copyright © 2011 SUSE Linux Products GmbH
293
+
294
+ * This gem is a pure-ruby rewrite of ruby-rpm:
295
+ Copyright © 2002 Kenta Murata. Relicensed with his permission.
296
+
297
+ Licensed under the MIT license. See MIT-LICENSE for details.
298
+
data/Rakefile CHANGED
@@ -1 +1,32 @@
1
- require 'bundler/gem_tasks'
1
+ $:.push(File.join(File.dirname(__FILE__), 'lib'))
2
+ require "bundler/gem_tasks"
3
+ require 'rpm/gem_version'
4
+ require 'rake/testtask'
5
+
6
+ task :default => [:test]
7
+
8
+ Rake::TestTask.new do |t|
9
+ t.libs << File.expand_path('../test', __FILE__)
10
+ t.libs << File.expand_path('../', __FILE__)
11
+ t.test_files = FileList['test/test*.rb']
12
+ t.verbose = true
13
+ t.loader = :direct
14
+ end
15
+
16
+ extra_docs = ['README*', 'TODO*', 'CHANGELOG*']
17
+
18
+ begin
19
+ require 'yard'
20
+ YARD::Rake::YardocTask.new(:doc) do |t|
21
+ t.files = ['lib/**/*.rb', *extra_docs]
22
+ t.options = ['--no-private']
23
+ end
24
+ rescue LoadError
25
+ STDERR.puts "Install yard if you want prettier docs"
26
+ require 'rdoc/task'
27
+ Rake::RDocTask.new(:doc) do |rdoc|
28
+ rdoc.rdoc_dir = "doc"
29
+ rdoc.title = "rpm for Ruby #{RPM::GEM_VERSION}"
30
+ extra_docs.each { |ex| rdoc.rdoc_files.include ex }
31
+ end
32
+ end
data/lib/rpm/compat.rb ADDED
@@ -0,0 +1,43 @@
1
+ require 'rpm'
2
+
3
+ module RPM
4
+
5
+ # compatibility
6
+ TAG.to_h.each do |k,v|
7
+ const_set "TAG_#{k.to_s.upcase}", v.to_i
8
+ end
9
+
10
+ LOG.to_h.each do |k, v|
11
+ const_set "LOG_#{k.to_s.upcase}", v.to_i
12
+ end
13
+
14
+ SENSE.to_h.each do |k, v|
15
+ const_set "SENSE_#{k.to_s.upcase}", v.to_i
16
+ end
17
+
18
+ # RPMFILE_*
19
+ FILE.to_h.each do |k, v|
20
+ const_set "FILE_#{k.to_s.upcase}", v.to_i
21
+ end
22
+
23
+ # RPMFILE_STATE_*
24
+ FILE_STATE.to_h.each do |k, v|
25
+ const_set "FILE_STATE_#{k.to_s.upcase}", v.to_i
26
+ end
27
+
28
+ # RPMTRANS_FLAG_*
29
+ TRANS_FLAG.to_h.each do |k, v|
30
+ const_set "TRANS_FLAG_#{k.to_s.upcase}", v.to_i
31
+ end
32
+
33
+ # RPMPROB_FILTER_*
34
+ PROB_FILTER.to_h.each do |k, v|
35
+ const_set "PROB_FILTER_#{k.to_s.upcase}", v.to_i
36
+ end
37
+
38
+ # RPMPROB_FILTER_*
39
+ MIRE.to_h.each do |k, v|
40
+ const_set "MIRE_#{k.to_s.upcase}", v.to_i
41
+ end
42
+
43
+ end
data/lib/rpm/db.rb ADDED
@@ -0,0 +1,125 @@
1
+ require 'fcntl'
2
+
3
+ module RPM
4
+
5
+ class DB
6
+
7
+ include Enumerable
8
+
9
+ # @visibility private
10
+ # @param ts [Transaction] transaction object
11
+ def initialize(ts, opts={})
12
+ opts[:writable] ||= false
13
+
14
+ @ts = ts
15
+ RPM::FFI.rpmtsOpenDB(@ts.ptr, opts[:writable] ? Fcntl::O_RDWR | Fcntl::O_CREAT : Fcntl::O_RDONLY )
16
+ end
17
+
18
+ # @return [RPM::MatchIterator] Creates an iterator for +tag+ and +val+
19
+ def init_iterator(tag, val)
20
+ @ts.init_iterator(tag, val)
21
+ end
22
+
23
+ #
24
+ # @yield [Package] Called for each match
25
+ # @param [Number] key RPM tag key
26
+ # @param [String] val Value to match
27
+ # @example
28
+ # RPM.transaction do |t|
29
+ # t.each_match(RPM::TAG_ARCH, "x86_64") do |pkg|
30
+ # puts pkg.name
31
+ # end
32
+ # end
33
+ #
34
+ def each_match(key, val, &block)
35
+ @ts.each_match(key, val, &block)
36
+ end
37
+
38
+ #
39
+ # @yield [Package] Called for each package in the database
40
+ # @example
41
+ # db.each do |pkg|
42
+ # puts pkg.name
43
+ # end
44
+ #
45
+ def each(&block)
46
+ @ts.each(&block)
47
+ end
48
+
49
+ # @visibility private
50
+ def ptr
51
+ RPM::FFI.rpmtsGetRdb(@ts.ptr)
52
+ end
53
+
54
+ def close
55
+ RPM::FFI.rpmtsCloseDB(@ts.ptr)
56
+ end
57
+
58
+ def closed?
59
+ ptr.null?
60
+ end
61
+
62
+ #
63
+ # The package database is opened, but transactional processing
64
+ # (@see RPM::DB#transaction) cannot be done for when +writable+ is false.
65
+ # When +writable+ is +false+ then the generated object gets freezed.
66
+ # @param [Boolean] writable Whether the database is writable. Default is +false+.
67
+ # @param [String] root Root path for the database, default is empty.
68
+ # @return [RPM::DB]
69
+ #
70
+ # @example
71
+ # db = RPM::DB.open
72
+ # db.each do |pkg|
73
+ # puts pkg.name
74
+ # end
75
+ #
76
+ def self.open(writable=false, root='/', &block)
77
+ open_for_transaction(Transaction.new(:root => root), :writable => false, &block)
78
+ end
79
+
80
+ # @visibility private
81
+ def self.open_for_transaction(ts, opts={})
82
+ db = new(ts, opts)
83
+ return db unless block_given?
84
+
85
+ begin
86
+ yield db
87
+ ensure
88
+ db.close unless db.closed?
89
+ end
90
+ end
91
+
92
+
93
+ # @deprecated Not possible to get home value in
94
+ # newer RPM versions
95
+ def home
96
+ raise NotImplementedError
97
+ end
98
+
99
+ # @return [String] The root path of the database
100
+ def root
101
+ RPM::FFI.rpmtsRootDir(@ts.ptr)
102
+ end
103
+
104
+ # @deprecated Use RPM::Transaction#each
105
+ def self.each
106
+ DB.open do |db|
107
+ it = MatchIterator.from_ptr(RPM::FFI.rpmdbInitIterator(db.ptr, 0, nil, 0))
108
+ if block_given?
109
+ it.each do |pkg|
110
+ yield pkg
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ # @return number of instances of +name+ in the
117
+ # database
118
+ def count_packages(name)
119
+ end
120
+
121
+
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,132 @@
1
+ require 'rpm'
2
+
3
+ module RPM
4
+
5
+ class Dependency
6
+
7
+ # @return [String] dependency name
8
+ attr_accessor :name
9
+ # @return [String] dependency version
10
+ attr_accessor :version
11
+ # @return [String] dependency flags
12
+ attr_accessor :flags
13
+ # @return [Package] package this dependency belongs to
14
+ attr_accessor :owner
15
+
16
+ attr_accessor :nametag
17
+ attr_accessor :versiontag
18
+ attr_accessor :flagstag
19
+
20
+ def initialize(name, version, flags, owner)
21
+
22
+ RPM::Utils.check_type(version, RPM::Version)
23
+
24
+ @name = name
25
+ @version = version
26
+ @flags = flags
27
+ @owner = owner
28
+ end
29
+
30
+ # @param [Package, Dependency, Version] other
31
+ # @return [Boolean] true if +other+ satisfies this dependency
32
+ def satisfy?(other)
33
+ case other
34
+ when RPM::Package then
35
+ other.provides.each do |prov|
36
+ return true if self.satisfy?(prov)
37
+ end
38
+ return false
39
+ when RPM::Dependency then
40
+ RPM::FFI.rpmdsCompare(
41
+ RPM::FFI.rpmdsSingle(:providename, other.name,
42
+ other.version.to_vre, other.flags),
43
+ RPM::FFI.rpmdsSingle(:providename, name,
44
+ version.to_vre, flags)) != 0
45
+ when RPM::Version then
46
+ RPM::FFI.rpmdsCompare(
47
+ RPM::FFI.rpmdsSingle(:providename, name,
48
+ other.to_vre, other.to_vre.empty? ? 0 : :equal),
49
+ RPM::FFI.rpmdsSingle(:providename, name,
50
+ version.to_vre, flags)) != 0
51
+ else
52
+ raise(TypeError, "#{other} is not a Version or Dependency")
53
+ end
54
+ end
55
+
56
+ # @return [Boolean] true if '<' or '=<' are used to compare the version
57
+ def lt?
58
+ flags & RPM::SENSE[:less]
59
+ end
60
+
61
+ # @return [Boolean] true if '>' or '>=' are used to compare the version
62
+ def gt?
63
+ flags & RPM::SENSE[:greater]
64
+ end
65
+
66
+ # @return [Boolean] true if '=', '=<' or '>=' are used to compare the version
67
+ def eq?
68
+ flags & RPM::SENSE[:equal]
69
+ end
70
+
71
+ # @return [Boolean] true if '=<' is used to compare the version
72
+ def le?
73
+ (flags & RPM::SENSE[:less]) && (flags & RPMSENSE[:equal])
74
+ end
75
+
76
+ # @return [Boolean] true if '>=' is used to compare the version
77
+ def ge?
78
+ (flags & RPM::SENSE[:greater]) && (flags & RPMSENSE[:equal])
79
+ end
80
+
81
+ # @return [Boolean] true if this is a pre-requires
82
+ def pre?
83
+ flags & RPM::SENSE[:prereq]
84
+ end
85
+
86
+ end
87
+
88
+ class Provide < Dependency
89
+
90
+ def initialize(name, version, flags, owner)
91
+ super(name, version, flags, owner)
92
+ @nametag = RPM::TAG[:providename]
93
+ @versiontag = RPM::TAG[:provideversion]
94
+ @flagstag = RPM::TAG[:provideflags]
95
+ end
96
+
97
+ end
98
+
99
+ class Require < Dependency
100
+
101
+ def initialize(name, version, flags, owner)
102
+ super(name, version, flags, owner)
103
+ @nametag = RPM::TAG[:requirename]
104
+ @versiontag = RPM::TAG[:requireversion]
105
+ @flagstag = RPM::TAG[:requireflags]
106
+ end
107
+
108
+ end
109
+
110
+ class Conflict < Dependency
111
+
112
+ def initialize(name, version, flags, owner)
113
+ super(name, version, flags, owner)
114
+ @nametag = RPM::TAG[:conflictname]
115
+ @versiontag = RPM::TAG[:conflictversion]
116
+ @flagstag = RPM::TAG[:conflictflags]
117
+ end
118
+
119
+ end
120
+
121
+ class Conflict < Dependency
122
+
123
+ def initialize(name, version, flags, owner)
124
+ super(name, version, flags, owner)
125
+ @nametag = RPM::TAG[:conflictname]
126
+ @versiontag = RPM::TAG[:conflictversion]
127
+ @flagstag = RPM::TAG[:conflictflags]
128
+ end
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,37 @@
1
+
2
+ module RPM
3
+
4
+ module FFI
5
+
6
+ typedef :pointer, :header
7
+
8
+ attach_function 'headerNew', [], :header
9
+ attach_function 'headerFree', [:header], :header
10
+ attach_function 'headerLink', [:header], :header
11
+ # ..
12
+ HEADERGET_DEFAULT = 0,
13
+ HEADERGET_MINMEM = (1 << 0)
14
+ HEADERGET_EXT = (1 << 1)
15
+ HEADERGET_RAW = (1 << 2)
16
+ HEADERGET_ALLOC = (1 << 3)
17
+ HEADERGET_ARGV = (1 << 4)
18
+
19
+ # ..
20
+ attach_function 'headerGet', [:header, :rpmTagVal, :pointer, :uint32], :int
21
+ attach_function 'headerPut', [:header, :pointer, :uint32], :int
22
+ # ...
23
+ attach_function 'headerFormat', [:header, :string, :pointer], :pointer
24
+ # ...
25
+ attach_function 'headerNVR', [:header, :pointer, :pointer, :pointer], :int
26
+ # ...
27
+ attach_function 'headerGetAsString', [:header, :rpmTagVal], :string
28
+ # ...
29
+ attach_function 'headerPutString', [:header, :rpmTagVal, :string], :int
30
+ # ...
31
+ attach_function 'headerPutUint32', [:header, :rpmTagVal, :pointer, :rpm_count_t], :int
32
+ # ...
33
+ attach_function 'rpmReadPackageFile', [:header, :FD_t, :string, :pointer], Rc
34
+
35
+ end
36
+
37
+ end