ruby-magic 0.3.1 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +4 -0
- data/CHANGELOG.md +28 -0
- data/CONTRIBUTORS.md +16 -0
- data/NOTICE +39 -0
- data/README.md +9 -3
- data/dependencies.yml +22 -0
- data/ext/magic/common.h +52 -19
- data/ext/magic/extconf.rb +325 -45
- data/ext/magic/functions.c +40 -14
- data/ext/magic/functions.h +18 -12
- data/ext/magic/ruby-magic.c +575 -329
- data/ext/magic/ruby-magic.h +211 -103
- data/lib/magic/version.rb +1 -1
- data/lib/magic.rb +16 -1
- data.tar.gz.sig +0 -0
- metadata +49 -9
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
data/ext/magic/extconf.rb
CHANGED
@@ -1,42 +1,195 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'find'
|
3
4
|
require 'mkmf'
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
5
|
+
require 'pathname'
|
6
|
+
|
7
|
+
# helpful constants
|
8
|
+
PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
9
|
+
|
10
|
+
# The gem version constraint in the Rakefile is not respected at install time.
|
11
|
+
# Keep this version in sync with the one in the Rakefile !
|
12
|
+
REQUIRED_MINI_PORTILE_VERSION = "~> 2.6"
|
13
|
+
|
14
|
+
MAGIC_HELP_MESSAGE = <<~HELP
|
15
|
+
USAGE: ruby #{$0} [options]
|
16
|
+
|
17
|
+
Flags that are always valid:
|
18
|
+
|
19
|
+
--use-system-libraries
|
20
|
+
--enable-system-libraries
|
21
|
+
Use system libraries instead of building and using the packaged libraries.
|
22
|
+
|
23
|
+
--disable-system-libraries
|
24
|
+
Use the packaged libraries, and ignore the system libraries. This is the default on most
|
25
|
+
platforms, and overrides `--use-system-libraries` and the environment variable
|
26
|
+
`MAGIC_USE_SYSTEM_LIBRARIES`.
|
27
|
+
|
28
|
+
--disable-clean
|
29
|
+
Do not clean out intermediate files after successful build.
|
30
|
+
|
31
|
+
Flags only used when building and using the packaged libraries:
|
32
|
+
|
33
|
+
--disable-static
|
34
|
+
Do not statically link packaged libraries, instead use shared libraries.
|
35
|
+
|
36
|
+
--enable-cross-build
|
37
|
+
Enable cross-build mode. (You probably do not want to set this manually.)
|
38
|
+
|
39
|
+
Flags only used when using system libraries:
|
40
|
+
|
41
|
+
Related to libmagic:
|
42
|
+
|
43
|
+
--with-magic-dir=DIRECTORY
|
44
|
+
Look for libmagic headers and library in DIRECTORY.
|
45
|
+
|
46
|
+
--with-magic-lib=DIRECTORY
|
47
|
+
Look for libmagic library in DIRECTORY.
|
48
|
+
|
49
|
+
--with-magic-include=DIRECTORY
|
50
|
+
Look for libmagic headers in DIRECTORY.
|
51
|
+
|
52
|
+
Environment variables used:
|
53
|
+
|
54
|
+
CC
|
55
|
+
Use this path to invoke the compiler instead of `RbConfig::CONFIG['CC']`
|
56
|
+
|
57
|
+
CPPFLAGS
|
58
|
+
If this string is accepted by the C preprocessor, add it to the flags passed to the C preprocessor
|
59
|
+
|
60
|
+
CFLAGS
|
61
|
+
If this string is accepted by the compiler, add it to the flags passed to the compiler
|
62
|
+
|
63
|
+
LDFLAGS
|
64
|
+
If this string is accepted by the linker, add it to the flags passed to the linker
|
65
|
+
|
66
|
+
LIBS
|
67
|
+
Add this string to the flags passed to the linker
|
68
|
+
HELP
|
69
|
+
|
70
|
+
def process_recipe(name, version, static_p, cross_p)
|
71
|
+
require 'rubygems'
|
72
|
+
gem('mini_portile2', REQUIRED_MINI_PORTILE_VERSION)
|
73
|
+
require 'mini_portile2'
|
74
|
+
message("Using mini_portile version #{MiniPortile::VERSION}\n")
|
75
|
+
|
76
|
+
MiniPortile.new(name, version).tap do |recipe|
|
77
|
+
# Prefer host_alias over host in order to use i586-mingw32msvc as
|
78
|
+
# correct compiler prefix for cross build, but use host if not set.
|
79
|
+
recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
|
80
|
+
recipe.target = File.join(PACKAGE_ROOT_DIR, "ports")
|
81
|
+
recipe.patch_files = Dir[File.join(PACKAGE_ROOT_DIR, "patches", name, "*.patch")].sort
|
82
|
+
recipe.configure_options << "--libdir=#{File.join(recipe.path, 'lib')}"
|
83
|
+
|
84
|
+
yield recipe
|
85
|
+
|
86
|
+
env = Hash.new do |hash, key|
|
87
|
+
hash[key] = (ENV[key]).to_s
|
24
88
|
end
|
25
|
-
end
|
26
89
|
|
27
|
-
|
90
|
+
recipe.configure_options.flatten!
|
91
|
+
|
92
|
+
recipe.configure_options.delete_if do |option|
|
93
|
+
case option
|
94
|
+
when /\A(\w+)=(.*)\z/
|
95
|
+
env[Regexp.last_match(1)] = if env.key?(Regexp.last_match(1))
|
96
|
+
concat_flags(env[Regexp.last_match(1)], Regexp.last_match(2))
|
97
|
+
else
|
98
|
+
Regexp.last_match(2)
|
99
|
+
end
|
100
|
+
true
|
101
|
+
else
|
102
|
+
false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
recipe.configure_options = [
|
107
|
+
"--disable-silent-rules",
|
108
|
+
"--disable-dependency-tracking",
|
109
|
+
"--enable-fsect-man5"
|
110
|
+
]
|
111
|
+
|
112
|
+
if static_p
|
113
|
+
recipe.configure_options += [
|
114
|
+
"--disable-shared",
|
115
|
+
"--enable-static",
|
116
|
+
]
|
117
|
+
env["CFLAGS"] = concat_flags(env["CFLAGS"], "-fPIC")
|
118
|
+
else
|
119
|
+
recipe.configure_options += [
|
120
|
+
"--enable-shared",
|
121
|
+
"--disable-static",
|
122
|
+
]
|
123
|
+
end
|
124
|
+
|
125
|
+
if cross_p
|
126
|
+
recipe.configure_options += [
|
127
|
+
"--target=#{recipe.host}",
|
128
|
+
"--host=#{recipe.host}",
|
129
|
+
]
|
130
|
+
end
|
131
|
+
|
132
|
+
if RbConfig::CONFIG['target_cpu'] == 'universal'
|
133
|
+
%w[CFLAGS LDFLAGS].each do |key|
|
134
|
+
unless env[key].include?('-arch')
|
135
|
+
env[key] = concat_flags(env[key], RbConfig::CONFIG['ARCH_FLAG'])
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
recipe.configure_options += env.map do |key, value|
|
141
|
+
"#{key}=#{value.strip}"
|
142
|
+
end
|
143
|
+
|
144
|
+
checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
145
|
+
|
146
|
+
if File.exist?(checkpoint)
|
147
|
+
message("Building Ruby Magic with a packaged version of #{name}-#{version}.\n")
|
148
|
+
else
|
149
|
+
message(<<~EOM)
|
150
|
+
---------- IMPORTANT NOTICE ----------
|
151
|
+
Building Ruby Magic with a packaged version of #{name}-#{version}.
|
152
|
+
Configuration options: #{recipe.configure_options.shelljoin}
|
153
|
+
EOM
|
154
|
+
|
155
|
+
unless recipe.patch_files.empty?
|
156
|
+
message("The following patches are being applied:\n")
|
28
157
|
|
29
|
-
|
30
|
-
|
158
|
+
recipe.patch_files.each do |patch|
|
159
|
+
message(" - %s\n" % File.basename(patch))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
recipe.cook
|
164
|
+
|
165
|
+
FileUtils.touch(checkpoint)
|
166
|
+
end
|
167
|
+
|
168
|
+
recipe.activate
|
31
169
|
end
|
32
170
|
end
|
33
171
|
|
34
|
-
|
35
|
-
|
172
|
+
#
|
173
|
+
# utility functions
|
174
|
+
#
|
175
|
+
def config_clean?
|
176
|
+
enable_config('clean', true)
|
177
|
+
end
|
178
|
+
|
179
|
+
def config_static?
|
180
|
+
default_static = !truffle?
|
181
|
+
enable_config("static", default_static)
|
182
|
+
end
|
183
|
+
|
184
|
+
def config_cross_build?
|
185
|
+
enable_config("cross-build")
|
186
|
+
end
|
36
187
|
|
37
|
-
|
38
|
-
|
39
|
-
|
188
|
+
def config_system_libraries?
|
189
|
+
enable_config("system-libraries", ENV.key?("MAGIC_USE_SYSTEM_LIBRARIES")) do |_, default|
|
190
|
+
arg_config('--use-system-libraries', default)
|
191
|
+
end
|
192
|
+
end
|
40
193
|
|
41
194
|
def darwin?
|
42
195
|
RbConfig::CONFIG['target_os'] =~ /darwin/
|
@@ -46,38 +199,148 @@ def windows?
|
|
46
199
|
RbConfig::CONFIG['target_os'] =~ /mswin|mingw32|windows/
|
47
200
|
end
|
48
201
|
|
202
|
+
def truffle?
|
203
|
+
::RUBY_ENGINE == 'truffleruby'
|
204
|
+
end
|
205
|
+
|
206
|
+
def concat_flags(*args)
|
207
|
+
args.compact.join(" ")
|
208
|
+
end
|
209
|
+
|
210
|
+
def do_help
|
211
|
+
print(MAGIC_HELP_MESSAGE)
|
212
|
+
exit!(0)
|
213
|
+
end
|
214
|
+
|
215
|
+
def do_clean
|
216
|
+
root = Pathname(PACKAGE_ROOT_DIR)
|
217
|
+
pwd = Pathname(Dir.pwd)
|
218
|
+
|
219
|
+
# Skip if this is a development work tree
|
220
|
+
unless (root + '.git').exist?
|
221
|
+
message("Cleaning files only used during build.\n")
|
222
|
+
|
223
|
+
# (root + 'tmp') cannot be removed at this stage because
|
224
|
+
# libmagic.so is yet to be copied to lib.
|
225
|
+
|
226
|
+
# clean the ports build directory
|
227
|
+
Pathname.glob(pwd.join('tmp', '*', 'ports')) do |dir|
|
228
|
+
FileUtils.rm_rf(dir, verbose: true)
|
229
|
+
end
|
230
|
+
|
231
|
+
FileUtils.rm_rf(root + 'ports' + 'archives', verbose: true)
|
232
|
+
|
233
|
+
# Remove everything but share/ directory
|
234
|
+
remove_paths = %w[bin include]
|
235
|
+
remove_paths << 'lib' if config_static?
|
236
|
+
|
237
|
+
Pathname.glob(File.join(root, 'ports', '*', 'libmagic', '*')) do |dir|
|
238
|
+
remove_paths.each do |path|
|
239
|
+
remove_dir = File.join(dir, path)
|
240
|
+
FileUtils.rm_rf(remove_dir, verbose: true)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
exit!(0)
|
246
|
+
end
|
247
|
+
|
248
|
+
#
|
249
|
+
# main
|
250
|
+
#
|
251
|
+
do_help if arg_config('--help')
|
252
|
+
do_clean if arg_config('--clean')
|
253
|
+
|
49
254
|
if ENV['CC']
|
50
255
|
RbConfig::CONFIG['CC'] = RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC']
|
51
256
|
end
|
52
257
|
|
53
258
|
ENV['CC'] = RbConfig::CONFIG['CC']
|
54
259
|
|
55
|
-
|
56
|
-
|
260
|
+
append_cflags(ENV["CFLAGS"].split) if ENV["CFLAGS"]
|
261
|
+
append_cppflags(ENV["CPPFLAGS"].split) if ENV["CPPFLAGS"]
|
262
|
+
append_ldflags(ENV["LDFLAGS"].split) if ENV["LDFLAGS"]
|
263
|
+
|
264
|
+
$LIBS = concat_flags($LIBS, ENV["LIBS"]) if ENV["LIBS"]
|
265
|
+
|
266
|
+
if truffle?
|
267
|
+
$CPPFLAGS += " -DMAGIC_CUSTOM_CHECK_TYPE"
|
268
|
+
end
|
269
|
+
|
270
|
+
if config_system_libraries?
|
271
|
+
message "Building ruby-magic using system libraries.\n"
|
272
|
+
|
273
|
+
$CPPFLAGS += " -DMAGIC_SYSTEM_LIBRARIES"
|
274
|
+
|
275
|
+
dir_config('magic')
|
276
|
+
else
|
277
|
+
message "Building ruby-magic using packaged libraries.\n"
|
278
|
+
|
279
|
+
require 'yaml'
|
280
|
+
dependencies = YAML.load_file(File.join(PACKAGE_ROOT_DIR, "dependencies.yml"))
|
281
|
+
|
282
|
+
static_p = config_static?
|
283
|
+
message "Static linking is #{static_p ? 'enabled' : 'disabled'}.\n"
|
284
|
+
cross_build_p = config_cross_build?
|
285
|
+
message "Cross build is #{cross_build_p ? 'enabled' : 'disabled'}.\n"
|
286
|
+
|
287
|
+
libmagic_recipe = process_recipe('libmagic', dependencies["libmagic"]["version"], static_p, cross_build_p) do |recipe|
|
288
|
+
recipe.files = [{
|
289
|
+
url: "https://ruby-magic.s3.nl-ams.scw.cloud/file-#{recipe.version}.tar.gz",
|
290
|
+
sha256: dependencies["libmagic"]["sha256"],
|
291
|
+
}]
|
292
|
+
end
|
293
|
+
|
294
|
+
$LIBPATH = [File.join(libmagic_recipe.path, 'lib')]
|
295
|
+
$CFLAGS << " -I#{File.join(libmagic_recipe.path, 'include')} "
|
296
|
+
$LDFLAGS += " -Wl,-rpath,#{libmagic_recipe.path}/lib"
|
297
|
+
|
298
|
+
if static_p
|
299
|
+
ENV['PKG_CONFIG_PATH'] = "#{libmagic_recipe.path}/lib/pkgconfig"
|
300
|
+
# mkmf appends -- to the first option
|
301
|
+
pkg_config_flags = pkg_config('libmagic', 'libs --static')
|
302
|
+
|
303
|
+
raise 'Please install the `pkg-config` utility' unless pkg_config_flags
|
304
|
+
|
305
|
+
$LIBS += " " + pkg_config_flags
|
306
|
+
$LIBS += " " + File.join(libmagic_recipe.path, 'lib', "libmagic.#{$LIBEXT}")
|
307
|
+
end
|
308
|
+
|
309
|
+
if cross_build_p
|
310
|
+
# database files will be packaged up by the cross-compiling callback in the ExtensionTask
|
311
|
+
to_path = File.join(PACKAGE_ROOT_DIR, "ext/magic/share")
|
312
|
+
FileUtils.rm_rf(to_path, secure: true)
|
313
|
+
FileUtils.mkdir(to_path)
|
314
|
+
FileUtils.cp_r(Dir[File.join(libmagic_recipe.path, 'share/misc/*.mgc')], to_path)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
$CFLAGS += ' -std=c99'
|
57
319
|
|
58
320
|
if RbConfig::CONFIG['CC'] =~ /gcc/
|
59
321
|
$CFLAGS += ' -O3' unless $CFLAGS =~ /-O\d/
|
60
|
-
|
322
|
+
end
|
323
|
+
|
324
|
+
%w[
|
325
|
+
-Wcast-qual
|
326
|
+
-Wwrite-strings
|
327
|
+
-Wconversion
|
328
|
+
-Wmissing-noreturn
|
329
|
+
-Winline
|
330
|
+
].select do |flag|
|
331
|
+
try_link('int main(void) { return 0; }', flag)
|
332
|
+
end.each do |flag|
|
333
|
+
$CFLAGS += " " + flag
|
61
334
|
end
|
62
335
|
|
63
336
|
unless darwin?
|
64
|
-
$LDFLAGS += ' -Wl,--as-needed -Wl,--
|
337
|
+
$LDFLAGS += ' -Wl,--as-needed -Wl,--exclude-libs,ALL'
|
65
338
|
end
|
66
339
|
|
67
340
|
if windows?
|
68
341
|
$LDFLAGS += ' -static-libgcc'
|
69
342
|
end
|
70
343
|
|
71
|
-
%w[
|
72
|
-
CFLAGS
|
73
|
-
CXXFLAGS
|
74
|
-
CPPFLAGS
|
75
|
-
].each do |variable|
|
76
|
-
$CFLAGS += format(' %s', ENV[variable]) if ENV[variable]
|
77
|
-
end
|
78
|
-
|
79
|
-
$LDFLAGS += format(' %s', ENV['LDFLAGS']) if ENV['LDFLAGS']
|
80
|
-
|
81
344
|
unless have_header('ruby.h')
|
82
345
|
abort "\n" + (<<-EOS).gsub(/^[ ]{,3}/, '') + "\n"
|
83
346
|
You appear to be missing Ruby development libraries and/or header
|
@@ -120,6 +383,13 @@ unless have_header('ruby.h')
|
|
120
383
|
EOS
|
121
384
|
end
|
122
385
|
|
386
|
+
# these are needed for `rb_thread_call_without_gvl` to be properly detected on some linux systems.
|
387
|
+
# specifically, rake-compiler-dock's redhat-based image needs these.
|
388
|
+
have_library('pthread')
|
389
|
+
have_library('rt')
|
390
|
+
have_library('dl')
|
391
|
+
have_library('crypt')
|
392
|
+
|
123
393
|
have_func('rb_thread_call_without_gvl')
|
124
394
|
have_func('rb_thread_blocking_region')
|
125
395
|
|
@@ -188,7 +458,17 @@ end
|
|
188
458
|
have_func(f)
|
189
459
|
end
|
190
460
|
|
191
|
-
dir_config('magic', [gem_include_dir], [gem_lib_dir])
|
192
|
-
|
193
461
|
create_header
|
194
462
|
create_makefile('magic/magic')
|
463
|
+
|
464
|
+
if config_clean?
|
465
|
+
# Do not clean if run in a development work tree.
|
466
|
+
File.open('Makefile', 'at') do |mk|
|
467
|
+
mk.print(<<~EOF)
|
468
|
+
|
469
|
+
all: clean-ports
|
470
|
+
clean-ports: $(DLLIB)
|
471
|
+
\t-$(Q)$(RUBY) $(srcdir)/extconf.rb --clean --#{static_p ? 'enable' : 'disable'}-static
|
472
|
+
EOF
|
473
|
+
end
|
474
|
+
end
|
data/ext/magic/functions.c
CHANGED
@@ -4,14 +4,14 @@ extern "C" {
|
|
4
4
|
|
5
5
|
#include "functions.h"
|
6
6
|
|
7
|
-
int check_fd(int fd);
|
7
|
+
static int check_fd(int fd);
|
8
8
|
static int safe_dup(int fd);
|
9
9
|
static int safe_close(int fd);
|
10
10
|
static int safe_cloexec(int fd);
|
11
|
-
int override_error_output(void *data);
|
12
|
-
int restore_error_output(void *data);
|
11
|
+
static int override_error_output(void *data);
|
12
|
+
static int restore_error_output(void *data);
|
13
13
|
|
14
|
-
inline int
|
14
|
+
static inline int
|
15
15
|
check_fd(int fd)
|
16
16
|
{
|
17
17
|
errno = 0;
|
@@ -42,6 +42,7 @@ safe_dup(int fd)
|
|
42
42
|
goto error;
|
43
43
|
}
|
44
44
|
}
|
45
|
+
|
45
46
|
if (safe_cloexec(new_fd) < 0) {
|
46
47
|
local_errno = errno;
|
47
48
|
goto error;
|
@@ -78,6 +79,7 @@ safe_cloexec(int fd)
|
|
78
79
|
local_errno = errno;
|
79
80
|
goto error;
|
80
81
|
}
|
82
|
+
|
81
83
|
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
|
82
84
|
local_errno = errno;
|
83
85
|
goto error;
|
@@ -89,18 +91,18 @@ error:
|
|
89
91
|
return -1;
|
90
92
|
}
|
91
93
|
|
92
|
-
int
|
94
|
+
static int
|
93
95
|
override_error_output(void *data)
|
94
96
|
{
|
95
97
|
int local_errno;
|
96
|
-
|
98
|
+
int flags = O_WRONLY | O_APPEND;
|
97
99
|
save_t *s = data;
|
98
100
|
|
99
101
|
#if defined(HAVE_O_CLOEXEC)
|
100
|
-
|
102
|
+
flags |= O_CLOEXEC;
|
101
103
|
#endif
|
102
104
|
|
103
|
-
assert(s != NULL &&
|
105
|
+
assert(s != NULL &&
|
104
106
|
"Must be a valid pointer to `save_t' type");
|
105
107
|
|
106
108
|
s->file.old_fd = -1;
|
@@ -116,7 +118,7 @@ override_error_output(void *data)
|
|
116
118
|
goto error;
|
117
119
|
}
|
118
120
|
|
119
|
-
s->file.new_fd = open("/dev/null",
|
121
|
+
s->file.new_fd = open("/dev/null", flags, 0222);
|
120
122
|
if (s->file.new_fd < 0) {
|
121
123
|
local_errno = errno;
|
122
124
|
|
@@ -128,10 +130,12 @@ override_error_output(void *data)
|
|
128
130
|
safe_close(s->file.old_fd);
|
129
131
|
goto error;
|
130
132
|
}
|
133
|
+
|
131
134
|
if (safe_cloexec(s->file.new_fd) < 0) {
|
132
135
|
local_errno = errno;
|
133
136
|
goto error;
|
134
137
|
}
|
138
|
+
|
135
139
|
if (dup2(s->file.new_fd, fileno(stderr)) < 0) {
|
136
140
|
local_errno = errno;
|
137
141
|
goto error;
|
@@ -146,13 +150,13 @@ error:
|
|
146
150
|
return -1;
|
147
151
|
}
|
148
152
|
|
149
|
-
int
|
153
|
+
static int
|
150
154
|
restore_error_output(void *data)
|
151
155
|
{
|
152
156
|
int local_errno;
|
153
157
|
save_t *s = data;
|
154
158
|
|
155
|
-
assert(s != NULL &&
|
159
|
+
assert(s != NULL &&
|
156
160
|
"Must be a valid pointer to `save_t' type");
|
157
161
|
|
158
162
|
if (s->file.old_fd < 0 && s->status != 0)
|
@@ -208,6 +212,14 @@ magic_errno_wrapper(magic_t magic)
|
|
208
212
|
inline const char*
|
209
213
|
magic_getpath_wrapper(void)
|
210
214
|
{
|
215
|
+
/*
|
216
|
+
* The second argument translates to same value as the
|
217
|
+
* FILE_LOAD constant, which when used results in this
|
218
|
+
* function calling the get_default_magic() internally.
|
219
|
+
*
|
220
|
+
* N.B. magic_getpath() also honors the "MAGIC"
|
221
|
+
* environment variable."
|
222
|
+
*/
|
211
223
|
return magic_getpath(NULL, 0);
|
212
224
|
}
|
213
225
|
|
@@ -270,15 +282,21 @@ inline int
|
|
270
282
|
magic_load_wrapper(magic_t magic, const char *magic_file, int flags)
|
271
283
|
{
|
272
284
|
int rv;
|
285
|
+
|
273
286
|
MAGIC_FUNCTION(magic_load, rv, flags, magic, magic_file);
|
287
|
+
|
274
288
|
return rv;
|
275
289
|
}
|
276
290
|
|
277
291
|
inline int
|
278
|
-
magic_load_buffers_wrapper(magic_t magic, void **buffers, size_t *sizes,
|
292
|
+
magic_load_buffers_wrapper(magic_t magic, void **buffers, size_t *sizes,
|
293
|
+
size_t count, int flags)
|
279
294
|
{
|
280
295
|
int rv;
|
281
|
-
|
296
|
+
|
297
|
+
MAGIC_FUNCTION(magic_load_buffers, rv, flags, magic, buffers, sizes,
|
298
|
+
count);
|
299
|
+
|
282
300
|
return rv;
|
283
301
|
}
|
284
302
|
|
@@ -286,7 +304,9 @@ inline int
|
|
286
304
|
magic_compile_wrapper(magic_t magic, const char *magic_file, int flags)
|
287
305
|
{
|
288
306
|
int rv;
|
307
|
+
|
289
308
|
MAGIC_FUNCTION(magic_compile, rv, flags, magic, magic_file);
|
309
|
+
|
290
310
|
return rv;
|
291
311
|
}
|
292
312
|
|
@@ -294,15 +314,19 @@ inline int
|
|
294
314
|
magic_check_wrapper(magic_t magic, const char *magic_file, int flags)
|
295
315
|
{
|
296
316
|
int rv;
|
317
|
+
|
297
318
|
MAGIC_FUNCTION(magic_check, rv, flags, magic, magic_file);
|
319
|
+
|
298
320
|
return rv;
|
299
321
|
}
|
300
322
|
|
301
323
|
inline const char*
|
302
|
-
magic_file_wrapper(magic_t magic, const char*
|
324
|
+
magic_file_wrapper(magic_t magic, const char *filename, int flags)
|
303
325
|
{
|
304
326
|
const char *cstring;
|
327
|
+
|
305
328
|
MAGIC_FUNCTION(magic_file, cstring, flags, magic, filename);
|
329
|
+
|
306
330
|
return cstring;
|
307
331
|
}
|
308
332
|
|
@@ -310,7 +334,9 @@ inline const char*
|
|
310
334
|
magic_buffer_wrapper(magic_t magic, const void *buffer, size_t size, int flags)
|
311
335
|
{
|
312
336
|
const char *cstring;
|
337
|
+
|
313
338
|
MAGIC_FUNCTION(magic_buffer, cstring, flags, magic, buffer, size);
|
339
|
+
|
314
340
|
return cstring;
|
315
341
|
}
|
316
342
|
|
data/ext/magic/functions.h
CHANGED
@@ -9,7 +9,7 @@ extern "C" {
|
|
9
9
|
|
10
10
|
#define MAGIC_FUNCTION(f, r, x, ...) \
|
11
11
|
do { \
|
12
|
-
if ((x) & MAGIC_DEBUG)
|
12
|
+
if ((x) & (MAGIC_DEBUG | MAGIC_CHECK)) \
|
13
13
|
r = f(__VA_ARGS__); \
|
14
14
|
else { \
|
15
15
|
save_t __##f; \
|
@@ -17,7 +17,7 @@ extern "C" {
|
|
17
17
|
r = f(__VA_ARGS__); \
|
18
18
|
restore_error_output(&(__##f)); \
|
19
19
|
} \
|
20
|
-
} while(0)
|
20
|
+
} while (0)
|
21
21
|
|
22
22
|
typedef struct file_data {
|
23
23
|
fpos_t position;
|
@@ -33,30 +33,36 @@ typedef struct save {
|
|
33
33
|
extern magic_t magic_open_wrapper(int flags);
|
34
34
|
extern void magic_close_wrapper(magic_t magic);
|
35
35
|
|
36
|
-
extern const char*
|
36
|
+
extern const char *magic_error_wrapper(magic_t magic);
|
37
37
|
extern int magic_errno_wrapper(magic_t magic);
|
38
38
|
|
39
|
-
extern const char*
|
39
|
+
extern const char *magic_getpath_wrapper(void);
|
40
40
|
|
41
|
-
extern int magic_getparam_wrapper(magic_t magic, int parameter,
|
41
|
+
extern int magic_getparam_wrapper(magic_t magic, int parameter,
|
42
|
+
void *value);
|
42
43
|
extern int magic_setparam_wrapper(magic_t magic, int parameter,
|
43
44
|
const void *value);
|
44
45
|
|
45
46
|
extern int magic_getflags_wrapper(magic_t magic);
|
46
47
|
extern int magic_setflags_wrapper(magic_t magic, int flags);
|
47
48
|
|
48
|
-
extern int magic_load_wrapper(magic_t magic, const char *magic_file,
|
49
|
+
extern int magic_load_wrapper(magic_t magic, const char *magic_file,
|
50
|
+
int flags);
|
49
51
|
extern int magic_load_buffers_wrapper(magic_t magic, void **buffers,
|
50
|
-
size_t *sizes, size_t count,
|
52
|
+
size_t *sizes, size_t count,
|
53
|
+
int flags);
|
51
54
|
|
52
|
-
extern int magic_compile_wrapper(magic_t magic, const char *magic_file,
|
53
|
-
|
55
|
+
extern int magic_compile_wrapper(magic_t magic, const char *magic_file,
|
56
|
+
int flags);
|
57
|
+
extern int magic_check_wrapper(magic_t magic, const char *magic_file,
|
58
|
+
int flags);
|
54
59
|
|
55
|
-
extern const char*
|
60
|
+
extern const char *magic_file_wrapper(magic_t magic, const char *filename,
|
56
61
|
int flags);
|
57
|
-
extern const char*
|
62
|
+
extern const char *magic_buffer_wrapper(magic_t magic, const void *buffer,
|
58
63
|
size_t size, int flags);
|
59
|
-
extern const char*
|
64
|
+
extern const char *magic_descriptor_wrapper(magic_t magic, int fd,
|
65
|
+
int flags);
|
60
66
|
|
61
67
|
extern int magic_version_wrapper(void);
|
62
68
|
|