pf2 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -2
  3. data/Cargo.lock +650 -0
  4. data/Cargo.toml +3 -0
  5. data/README.md +110 -13
  6. data/Rakefile +8 -0
  7. data/crates/backtrace-sys2/.gitignore +1 -0
  8. data/crates/backtrace-sys2/Cargo.toml +9 -0
  9. data/crates/backtrace-sys2/build.rs +48 -0
  10. data/crates/backtrace-sys2/src/lib.rs +5 -0
  11. data/crates/backtrace-sys2/src/libbacktrace/.gitignore +15 -0
  12. data/crates/backtrace-sys2/src/libbacktrace/Isaac.Newton-Opticks.txt +9286 -0
  13. data/crates/backtrace-sys2/src/libbacktrace/LICENSE +29 -0
  14. data/crates/backtrace-sys2/src/libbacktrace/Makefile.am +623 -0
  15. data/crates/backtrace-sys2/src/libbacktrace/Makefile.in +2666 -0
  16. data/crates/backtrace-sys2/src/libbacktrace/README.md +36 -0
  17. data/crates/backtrace-sys2/src/libbacktrace/aclocal.m4 +864 -0
  18. data/crates/backtrace-sys2/src/libbacktrace/alloc.c +167 -0
  19. data/crates/backtrace-sys2/src/libbacktrace/allocfail.c +136 -0
  20. data/crates/backtrace-sys2/src/libbacktrace/allocfail.sh +104 -0
  21. data/crates/backtrace-sys2/src/libbacktrace/atomic.c +113 -0
  22. data/crates/backtrace-sys2/src/libbacktrace/backtrace-supported.h.in +66 -0
  23. data/crates/backtrace-sys2/src/libbacktrace/backtrace.c +129 -0
  24. data/crates/backtrace-sys2/src/libbacktrace/backtrace.h +189 -0
  25. data/crates/backtrace-sys2/src/libbacktrace/btest.c +501 -0
  26. data/crates/backtrace-sys2/src/libbacktrace/compile +348 -0
  27. data/crates/backtrace-sys2/src/libbacktrace/config/enable.m4 +38 -0
  28. data/crates/backtrace-sys2/src/libbacktrace/config/lead-dot.m4 +31 -0
  29. data/crates/backtrace-sys2/src/libbacktrace/config/libtool.m4 +7436 -0
  30. data/crates/backtrace-sys2/src/libbacktrace/config/ltoptions.m4 +369 -0
  31. data/crates/backtrace-sys2/src/libbacktrace/config/ltsugar.m4 +123 -0
  32. data/crates/backtrace-sys2/src/libbacktrace/config/ltversion.m4 +23 -0
  33. data/crates/backtrace-sys2/src/libbacktrace/config/lt~obsolete.m4 +98 -0
  34. data/crates/backtrace-sys2/src/libbacktrace/config/multi.m4 +68 -0
  35. data/crates/backtrace-sys2/src/libbacktrace/config/override.m4 +117 -0
  36. data/crates/backtrace-sys2/src/libbacktrace/config/unwind_ipinfo.m4 +37 -0
  37. data/crates/backtrace-sys2/src/libbacktrace/config/warnings.m4 +227 -0
  38. data/crates/backtrace-sys2/src/libbacktrace/config.guess +1700 -0
  39. data/crates/backtrace-sys2/src/libbacktrace/config.h.in +182 -0
  40. data/crates/backtrace-sys2/src/libbacktrace/config.sub +1885 -0
  41. data/crates/backtrace-sys2/src/libbacktrace/configure +15740 -0
  42. data/crates/backtrace-sys2/src/libbacktrace/configure.ac +613 -0
  43. data/crates/backtrace-sys2/src/libbacktrace/dwarf.c +4402 -0
  44. data/crates/backtrace-sys2/src/libbacktrace/edtest.c +120 -0
  45. data/crates/backtrace-sys2/src/libbacktrace/edtest2.c +43 -0
  46. data/crates/backtrace-sys2/src/libbacktrace/elf.c +7443 -0
  47. data/crates/backtrace-sys2/src/libbacktrace/fileline.c +407 -0
  48. data/crates/backtrace-sys2/src/libbacktrace/filenames.h +52 -0
  49. data/crates/backtrace-sys2/src/libbacktrace/filetype.awk +13 -0
  50. data/crates/backtrace-sys2/src/libbacktrace/install-debuginfo-for-buildid.sh.in +65 -0
  51. data/crates/backtrace-sys2/src/libbacktrace/install-sh +501 -0
  52. data/crates/backtrace-sys2/src/libbacktrace/instrumented_alloc.c +114 -0
  53. data/crates/backtrace-sys2/src/libbacktrace/internal.h +389 -0
  54. data/crates/backtrace-sys2/src/libbacktrace/libtool.m4 +7436 -0
  55. data/crates/backtrace-sys2/src/libbacktrace/ltmain.sh +8636 -0
  56. data/crates/backtrace-sys2/src/libbacktrace/ltoptions.m4 +369 -0
  57. data/crates/backtrace-sys2/src/libbacktrace/ltsugar.m4 +123 -0
  58. data/crates/backtrace-sys2/src/libbacktrace/ltversion.m4 +23 -0
  59. data/crates/backtrace-sys2/src/libbacktrace/lt~obsolete.m4 +98 -0
  60. data/crates/backtrace-sys2/src/libbacktrace/macho.c +1355 -0
  61. data/crates/backtrace-sys2/src/libbacktrace/missing +215 -0
  62. data/crates/backtrace-sys2/src/libbacktrace/mmap.c +331 -0
  63. data/crates/backtrace-sys2/src/libbacktrace/mmapio.c +110 -0
  64. data/crates/backtrace-sys2/src/libbacktrace/move-if-change +83 -0
  65. data/crates/backtrace-sys2/src/libbacktrace/mtest.c +410 -0
  66. data/crates/backtrace-sys2/src/libbacktrace/nounwind.c +66 -0
  67. data/crates/backtrace-sys2/src/libbacktrace/pecoff.c +957 -0
  68. data/crates/backtrace-sys2/src/libbacktrace/posix.c +104 -0
  69. data/crates/backtrace-sys2/src/libbacktrace/print.c +92 -0
  70. data/crates/backtrace-sys2/src/libbacktrace/read.c +110 -0
  71. data/crates/backtrace-sys2/src/libbacktrace/simple.c +108 -0
  72. data/crates/backtrace-sys2/src/libbacktrace/sort.c +108 -0
  73. data/crates/backtrace-sys2/src/libbacktrace/state.c +72 -0
  74. data/crates/backtrace-sys2/src/libbacktrace/stest.c +137 -0
  75. data/crates/backtrace-sys2/src/libbacktrace/test-driver +148 -0
  76. data/crates/backtrace-sys2/src/libbacktrace/test_format.c +55 -0
  77. data/crates/backtrace-sys2/src/libbacktrace/testlib.c +234 -0
  78. data/crates/backtrace-sys2/src/libbacktrace/testlib.h +110 -0
  79. data/crates/backtrace-sys2/src/libbacktrace/ttest.c +161 -0
  80. data/crates/backtrace-sys2/src/libbacktrace/unittest.c +92 -0
  81. data/crates/backtrace-sys2/src/libbacktrace/unknown.c +65 -0
  82. data/crates/backtrace-sys2/src/libbacktrace/xcoff.c +1606 -0
  83. data/crates/backtrace-sys2/src/libbacktrace/xztest.c +508 -0
  84. data/crates/backtrace-sys2/src/libbacktrace/zstdtest.c +523 -0
  85. data/crates/backtrace-sys2/src/libbacktrace/ztest.c +541 -0
  86. data/ext/pf2/Cargo.toml +25 -0
  87. data/ext/pf2/build.rs +3 -0
  88. data/ext/pf2/extconf.rb +6 -1
  89. data/ext/pf2/src/backtrace.rs +126 -0
  90. data/ext/pf2/src/lib.rs +15 -0
  91. data/ext/pf2/src/profile.rs +65 -0
  92. data/ext/pf2/src/profile_serializer.rs +204 -0
  93. data/ext/pf2/src/ringbuffer.rs +152 -0
  94. data/ext/pf2/src/ruby_init.rs +74 -0
  95. data/ext/pf2/src/sample.rs +66 -0
  96. data/ext/pf2/src/siginfo_t.c +5 -0
  97. data/ext/pf2/src/signal_scheduler/configuration.rs +31 -0
  98. data/ext/pf2/src/signal_scheduler/timer_installer.rs +199 -0
  99. data/ext/pf2/src/signal_scheduler.rs +311 -0
  100. data/ext/pf2/src/timer_thread_scheduler.rs +319 -0
  101. data/ext/pf2/src/util.rs +30 -0
  102. data/lib/pf2/cli.rb +1 -1
  103. data/lib/pf2/reporter.rb +48 -16
  104. data/lib/pf2/version.rb +1 -1
  105. data/lib/pf2.rb +20 -5
  106. metadata +128 -5
  107. data/ext/pf2/pf2.c +0 -246
@@ -0,0 +1,501 @@
1
+ #!/bin/sh
2
+ # install - install a program, script, or datafile
3
+
4
+ scriptversion=2013-12-25.23; # UTC
5
+
6
+ # This originates from X11R5 (mit/util/scripts/install.sh), which was
7
+ # later released in X11R6 (xc/config/util/install.sh) with the
8
+ # following copyright and license.
9
+ #
10
+ # Copyright (C) 1994 X Consortium
11
+ #
12
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ # of this software and associated documentation files (the "Software"), to
14
+ # deal in the Software without restriction, including without limitation the
15
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16
+ # sell copies of the Software, and to permit persons to whom the Software is
17
+ # furnished to do so, subject to the following conditions:
18
+ #
19
+ # The above copyright notice and this permission notice shall be included in
20
+ # all copies or substantial portions of the Software.
21
+ #
22
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26
+ # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27
+ # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ #
29
+ # Except as contained in this notice, the name of the X Consortium shall not
30
+ # be used in advertising or otherwise to promote the sale, use or other deal-
31
+ # ings in this Software without prior written authorization from the X Consor-
32
+ # tium.
33
+ #
34
+ #
35
+ # FSF changes to this file are in the public domain.
36
+ #
37
+ # Calling this script install-sh is preferred over install.sh, to prevent
38
+ # 'make' implicit rules from creating a file called install from it
39
+ # when there is no Makefile.
40
+ #
41
+ # This script is compatible with the BSD install script, but was written
42
+ # from scratch.
43
+
44
+ tab=' '
45
+ nl='
46
+ '
47
+ IFS=" $tab$nl"
48
+
49
+ # Set DOITPROG to "echo" to test this script.
50
+
51
+ doit=${DOITPROG-}
52
+ doit_exec=${doit:-exec}
53
+
54
+ # Put in absolute file names if you don't have them in your path;
55
+ # or use environment vars.
56
+
57
+ chgrpprog=${CHGRPPROG-chgrp}
58
+ chmodprog=${CHMODPROG-chmod}
59
+ chownprog=${CHOWNPROG-chown}
60
+ cmpprog=${CMPPROG-cmp}
61
+ cpprog=${CPPROG-cp}
62
+ mkdirprog=${MKDIRPROG-mkdir}
63
+ mvprog=${MVPROG-mv}
64
+ rmprog=${RMPROG-rm}
65
+ stripprog=${STRIPPROG-strip}
66
+
67
+ posix_mkdir=
68
+
69
+ # Desired mode of installed file.
70
+ mode=0755
71
+
72
+ chgrpcmd=
73
+ chmodcmd=$chmodprog
74
+ chowncmd=
75
+ mvcmd=$mvprog
76
+ rmcmd="$rmprog -f"
77
+ stripcmd=
78
+
79
+ src=
80
+ dst=
81
+ dir_arg=
82
+ dst_arg=
83
+
84
+ copy_on_change=false
85
+ is_target_a_directory=possibly
86
+
87
+ usage="\
88
+ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
90
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91
+ or: $0 [OPTION]... -d DIRECTORIES...
92
+
93
+ In the 1st form, copy SRCFILE to DSTFILE.
94
+ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95
+ In the 4th, create DIRECTORIES.
96
+
97
+ Options:
98
+ --help display this help and exit.
99
+ --version display version info and exit.
100
+
101
+ -c (ignored)
102
+ -C install only if different (preserve the last data modification time)
103
+ -d create directories instead of installing files.
104
+ -g GROUP $chgrpprog installed files to GROUP.
105
+ -m MODE $chmodprog installed files to MODE.
106
+ -o USER $chownprog installed files to USER.
107
+ -s $stripprog installed files.
108
+ -t DIRECTORY install into DIRECTORY.
109
+ -T report an error if DSTFILE is a directory.
110
+
111
+ Environment variables override the default commands:
112
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113
+ RMPROG STRIPPROG
114
+ "
115
+
116
+ while test $# -ne 0; do
117
+ case $1 in
118
+ -c) ;;
119
+
120
+ -C) copy_on_change=true;;
121
+
122
+ -d) dir_arg=true;;
123
+
124
+ -g) chgrpcmd="$chgrpprog $2"
125
+ shift;;
126
+
127
+ --help) echo "$usage"; exit $?;;
128
+
129
+ -m) mode=$2
130
+ case $mode in
131
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
132
+ echo "$0: invalid mode: $mode" >&2
133
+ exit 1;;
134
+ esac
135
+ shift;;
136
+
137
+ -o) chowncmd="$chownprog $2"
138
+ shift;;
139
+
140
+ -s) stripcmd=$stripprog;;
141
+
142
+ -t)
143
+ is_target_a_directory=always
144
+ dst_arg=$2
145
+ # Protect names problematic for 'test' and other utilities.
146
+ case $dst_arg in
147
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
148
+ esac
149
+ shift;;
150
+
151
+ -T) is_target_a_directory=never;;
152
+
153
+ --version) echo "$0 $scriptversion"; exit $?;;
154
+
155
+ --) shift
156
+ break;;
157
+
158
+ -*) echo "$0: invalid option: $1" >&2
159
+ exit 1;;
160
+
161
+ *) break;;
162
+ esac
163
+ shift
164
+ done
165
+
166
+ # We allow the use of options -d and -T together, by making -d
167
+ # take the precedence; this is for compatibility with GNU install.
168
+
169
+ if test -n "$dir_arg"; then
170
+ if test -n "$dst_arg"; then
171
+ echo "$0: target directory not allowed when installing a directory." >&2
172
+ exit 1
173
+ fi
174
+ fi
175
+
176
+ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177
+ # When -d is used, all remaining arguments are directories to create.
178
+ # When -t is used, the destination is already specified.
179
+ # Otherwise, the last argument is the destination. Remove it from $@.
180
+ for arg
181
+ do
182
+ if test -n "$dst_arg"; then
183
+ # $@ is not empty: it contains at least $arg.
184
+ set fnord "$@" "$dst_arg"
185
+ shift # fnord
186
+ fi
187
+ shift # arg
188
+ dst_arg=$arg
189
+ # Protect names problematic for 'test' and other utilities.
190
+ case $dst_arg in
191
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
192
+ esac
193
+ done
194
+ fi
195
+
196
+ if test $# -eq 0; then
197
+ if test -z "$dir_arg"; then
198
+ echo "$0: no input file specified." >&2
199
+ exit 1
200
+ fi
201
+ # It's OK to call 'install-sh -d' without argument.
202
+ # This can happen when creating conditional directories.
203
+ exit 0
204
+ fi
205
+
206
+ if test -z "$dir_arg"; then
207
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
208
+ if test ! -d "$dst_arg"; then
209
+ echo "$0: $dst_arg: Is not a directory." >&2
210
+ exit 1
211
+ fi
212
+ fi
213
+ fi
214
+
215
+ if test -z "$dir_arg"; then
216
+ do_exit='(exit $ret); exit $ret'
217
+ trap "ret=129; $do_exit" 1
218
+ trap "ret=130; $do_exit" 2
219
+ trap "ret=141; $do_exit" 13
220
+ trap "ret=143; $do_exit" 15
221
+
222
+ # Set umask so as not to create temps with too-generous modes.
223
+ # However, 'strip' requires both read and write access to temps.
224
+ case $mode in
225
+ # Optimize common cases.
226
+ *644) cp_umask=133;;
227
+ *755) cp_umask=22;;
228
+
229
+ *[0-7])
230
+ if test -z "$stripcmd"; then
231
+ u_plus_rw=
232
+ else
233
+ u_plus_rw='% 200'
234
+ fi
235
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236
+ *)
237
+ if test -z "$stripcmd"; then
238
+ u_plus_rw=
239
+ else
240
+ u_plus_rw=,u+rw
241
+ fi
242
+ cp_umask=$mode$u_plus_rw;;
243
+ esac
244
+ fi
245
+
246
+ for src
247
+ do
248
+ # Protect names problematic for 'test' and other utilities.
249
+ case $src in
250
+ -* | [=\(\)!]) src=./$src;;
251
+ esac
252
+
253
+ if test -n "$dir_arg"; then
254
+ dst=$src
255
+ dstdir=$dst
256
+ test -d "$dstdir"
257
+ dstdir_status=$?
258
+ else
259
+
260
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
261
+ # might cause directories to be created, which would be especially bad
262
+ # if $src (and thus $dsttmp) contains '*'.
263
+ if test ! -f "$src" && test ! -d "$src"; then
264
+ echo "$0: $src does not exist." >&2
265
+ exit 1
266
+ fi
267
+
268
+ if test -z "$dst_arg"; then
269
+ echo "$0: no destination specified." >&2
270
+ exit 1
271
+ fi
272
+ dst=$dst_arg
273
+
274
+ # If destination is a directory, append the input filename; won't work
275
+ # if double slashes aren't ignored.
276
+ if test -d "$dst"; then
277
+ if test "$is_target_a_directory" = never; then
278
+ echo "$0: $dst_arg: Is a directory" >&2
279
+ exit 1
280
+ fi
281
+ dstdir=$dst
282
+ dst=$dstdir/`basename "$src"`
283
+ dstdir_status=0
284
+ else
285
+ dstdir=`dirname "$dst"`
286
+ test -d "$dstdir"
287
+ dstdir_status=$?
288
+ fi
289
+ fi
290
+
291
+ obsolete_mkdir_used=false
292
+
293
+ if test $dstdir_status != 0; then
294
+ case $posix_mkdir in
295
+ '')
296
+ # Create intermediate dirs using mode 755 as modified by the umask.
297
+ # This is like FreeBSD 'install' as of 1997-10-28.
298
+ umask=`umask`
299
+ case $stripcmd.$umask in
300
+ # Optimize common cases.
301
+ *[2367][2367]) mkdir_umask=$umask;;
302
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
303
+
304
+ *[0-7])
305
+ mkdir_umask=`expr $umask + 22 \
306
+ - $umask % 100 % 40 + $umask % 20 \
307
+ - $umask % 10 % 4 + $umask % 2
308
+ `;;
309
+ *) mkdir_umask=$umask,go-w;;
310
+ esac
311
+
312
+ # With -d, create the new directory with the user-specified mode.
313
+ # Otherwise, rely on $mkdir_umask.
314
+ if test -n "$dir_arg"; then
315
+ mkdir_mode=-m$mode
316
+ else
317
+ mkdir_mode=
318
+ fi
319
+
320
+ posix_mkdir=false
321
+ case $umask in
322
+ *[123567][0-7][0-7])
323
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
324
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
325
+ ;;
326
+ *)
327
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329
+
330
+ if (umask $mkdir_umask &&
331
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332
+ then
333
+ if test -z "$dir_arg" || {
334
+ # Check for POSIX incompatibilities with -m.
335
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336
+ # other-writable bit of parent directory when it shouldn't.
337
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
339
+ case $ls_ld_tmpdir in
340
+ d????-?r-*) different_mode=700;;
341
+ d????-?--*) different_mode=755;;
342
+ *) false;;
343
+ esac &&
344
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347
+ }
348
+ }
349
+ then posix_mkdir=:
350
+ fi
351
+ rmdir "$tmpdir/d" "$tmpdir"
352
+ else
353
+ # Remove any dirs left behind by ancient mkdir implementations.
354
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355
+ fi
356
+ trap '' 0;;
357
+ esac;;
358
+ esac
359
+
360
+ if
361
+ $posix_mkdir && (
362
+ umask $mkdir_umask &&
363
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364
+ )
365
+ then :
366
+ else
367
+
368
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
369
+ # or it failed possibly due to a race condition. Create the
370
+ # directory the slow way, step by step, checking for races as we go.
371
+
372
+ case $dstdir in
373
+ /*) prefix='/';;
374
+ [-=\(\)!]*) prefix='./';;
375
+ *) prefix='';;
376
+ esac
377
+
378
+ oIFS=$IFS
379
+ IFS=/
380
+ set -f
381
+ set fnord $dstdir
382
+ shift
383
+ set +f
384
+ IFS=$oIFS
385
+
386
+ prefixes=
387
+
388
+ for d
389
+ do
390
+ test X"$d" = X && continue
391
+
392
+ prefix=$prefix$d
393
+ if test -d "$prefix"; then
394
+ prefixes=
395
+ else
396
+ if $posix_mkdir; then
397
+ (umask=$mkdir_umask &&
398
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399
+ # Don't fail if two instances are running concurrently.
400
+ test -d "$prefix" || exit 1
401
+ else
402
+ case $prefix in
403
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404
+ *) qprefix=$prefix;;
405
+ esac
406
+ prefixes="$prefixes '$qprefix'"
407
+ fi
408
+ fi
409
+ prefix=$prefix/
410
+ done
411
+
412
+ if test -n "$prefixes"; then
413
+ # Don't fail if two instances are running concurrently.
414
+ (umask $mkdir_umask &&
415
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
416
+ test -d "$dstdir" || exit 1
417
+ obsolete_mkdir_used=true
418
+ fi
419
+ fi
420
+ fi
421
+
422
+ if test -n "$dir_arg"; then
423
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
424
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
425
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
426
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
427
+ else
428
+
429
+ # Make a couple of temp file names in the proper directory.
430
+ dsttmp=$dstdir/_inst.$$_
431
+ rmtmp=$dstdir/_rm.$$_
432
+
433
+ # Trap to clean up those temp files at exit.
434
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
435
+
436
+ # Copy the file name to the temp name.
437
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
438
+
439
+ # and set any options; do chmod last to preserve setuid bits.
440
+ #
441
+ # If any of these fail, we abort the whole thing. If we want to
442
+ # ignore errors from any of these, just make sure not to ignore
443
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
444
+ #
445
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
446
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
447
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
448
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
449
+
450
+ # If -C, don't bother to copy if it wouldn't change the file.
451
+ if $copy_on_change &&
452
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
453
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
454
+ set -f &&
455
+ set X $old && old=:$2:$4:$5:$6 &&
456
+ set X $new && new=:$2:$4:$5:$6 &&
457
+ set +f &&
458
+ test "$old" = "$new" &&
459
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460
+ then
461
+ rm -f "$dsttmp"
462
+ else
463
+ # Rename the file to the real destination.
464
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
465
+
466
+ # The rename failed, perhaps because mv can't rename something else
467
+ # to itself, or perhaps because mv is so ancient that it does not
468
+ # support -f.
469
+ {
470
+ # Now remove or move aside any old file at destination location.
471
+ # We try this two ways since rm can't unlink itself on some
472
+ # systems and the destination file might be busy for other
473
+ # reasons. In this case, the final cleanup might fail but the new
474
+ # file should still install successfully.
475
+ {
476
+ test ! -f "$dst" ||
477
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
478
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480
+ } ||
481
+ { echo "$0: cannot unlink or rename $dst" >&2
482
+ (exit 1); exit 1
483
+ }
484
+ } &&
485
+
486
+ # Now rename the file to the real destination.
487
+ $doit $mvcmd "$dsttmp" "$dst"
488
+ }
489
+ fi || exit 1
490
+
491
+ trap '' 0
492
+ fi
493
+ done
494
+
495
+ # Local variables:
496
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
497
+ # time-stamp-start: "scriptversion="
498
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
499
+ # time-stamp-time-zone: "UTC"
500
+ # time-stamp-end: "; # UTC"
501
+ # End:
@@ -0,0 +1,114 @@
1
+ /* instrumented_alloc.c -- Memory allocation instrumented to fail when
2
+ requested, for testing purposes.
3
+ Copyright (C) 2018-2021 Free Software Foundation, Inc.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are
7
+ met:
8
+
9
+ (1) Redistributions of source code must retain the above copyright
10
+ notice, this list of conditions and the following disclaimer.
11
+
12
+ (2) Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in
14
+ the documentation and/or other materials provided with the
15
+ distribution.
16
+
17
+ (3) The name of the author may not be used to
18
+ endorse or promote products derived from this software without
19
+ specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
+ POSSIBILITY OF SUCH DAMAGE. */
32
+
33
+ /* Include all the header files of alloc here, to make sure they're not
34
+ processed when including alloc.c below, such that the redefinitions of malloc
35
+ and realloc are only effective in alloc.c itself. This does not work for
36
+ config.h, because it's not wrapped in "#ifndef CONFIG_H\n#define CONFIG_H"
37
+ and "#endif" but that does not seem to be harmful. */
38
+
39
+ #include "config.h"
40
+
41
+ #include <errno.h>
42
+ #include <stdlib.h>
43
+ #include <sys/types.h>
44
+ #include <inttypes.h>
45
+
46
+ #include "backtrace.h"
47
+ #include "internal.h"
48
+
49
+ extern void *instrumented_malloc (size_t size);
50
+ extern void *instrumented_realloc (void *ptr, size_t size);
51
+
52
+ #define malloc instrumented_malloc
53
+ #define realloc instrumented_realloc
54
+ #include "alloc.c"
55
+ #undef malloc
56
+ #undef realloc
57
+
58
+ static uint64_t nr_allocs = 0;
59
+ static uint64_t fail_at_alloc = 0;
60
+
61
+ extern int at_fail_alloc_p (void);
62
+ extern uint64_t get_nr_allocs (void);
63
+ extern void set_fail_at_alloc (uint64_t);
64
+
65
+ void *
66
+ instrumented_malloc (size_t size)
67
+ {
68
+ void *res;
69
+
70
+ if (at_fail_alloc_p ())
71
+ return NULL;
72
+
73
+ res = malloc (size);
74
+ if (res != NULL)
75
+ nr_allocs++;
76
+
77
+ return res;
78
+ }
79
+
80
+ void *
81
+ instrumented_realloc (void *ptr, size_t size)
82
+ {
83
+ void *res;
84
+
85
+ if (size != 0)
86
+ {
87
+ if (at_fail_alloc_p ())
88
+ return NULL;
89
+ }
90
+
91
+ res = realloc (ptr, size);
92
+ if (res != NULL)
93
+ nr_allocs++;
94
+
95
+ return res;
96
+ }
97
+
98
+ int
99
+ at_fail_alloc_p (void)
100
+ {
101
+ return fail_at_alloc == nr_allocs + 1;
102
+ }
103
+
104
+ uint64_t
105
+ get_nr_allocs (void)
106
+ {
107
+ return nr_allocs;
108
+ }
109
+
110
+ void
111
+ set_fail_at_alloc (uint64_t nr)
112
+ {
113
+ fail_at_alloc = nr;
114
+ }