Re: Array vs. List context
[p5sagit/p5-mst-13.2.git] / utils / perlbug.PL
CommitLineData
37fa004c 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
1948c06a 6use File::Spec::Functions;
37fa004c 7
8# List explicitly here the variables you want Configure to
9# generate. Metaconfig only looks for shell variables, so you
10# have to mention them as if they were shell variables, not
11# %Config entries. Thus you write
12# $startperl
13# to ensure Configure will look for $Config{startperl}.
84902520 14# $perlpath
37fa004c 15
16# This forces PL files to create target in same directory as PL file.
17# This is so that make depend always knows where to find PL derivatives.
8a5546a1 18$origdir = cwd;
44a8e56a 19chdir dirname($0);
20$file = basename($0, '.PL');
774d564b 21$file .= '.com' if $^O eq 'VMS';
37fa004c 22
55d729e4 23open OUT, ">$file" or die "Can't create $file: $!";
37fa004c 24
84902520 25# extract patchlevel.h information
26
1948c06a 27open PATCH_LEVEL, "<" . catfile(updir, "patchlevel.h")
28 or die "Can't open patchlevel.h: $!";
84902520 29
30my $patchlevel_date = (stat PATCH_LEVEL)[9];
31
32while (<PATCH_LEVEL>) {
fb73857a 33 last if $_ =~ /^\s*static\s+char.*?local_patches\[\]\s*=\s*{\s*$/;
55d729e4 34}
84902520 35
fb73857a 36my @patches;
84902520 37while (<PATCH_LEVEL>) {
fb73857a 38 last if /^\s*}/;
84902520 39 chomp;
5963b987 40 s/^\s+,?\s*"?//;
41 s/"?\s*,?$//;
84902520 42 s/(['\\])/\\$1/g;
fb73857a 43 push @patches, $_ unless $_ eq 'NULL';
55d729e4 44}
45my $patch_desc = "'" . join("',\n '", @patches) . "'";
46my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
84902520 47
c0a6bf09 48close(PATCH_LEVEL) or die "Error closing patchlevel.h: $!";
84902520 49
5edeba26 50# TO DO (prehaps): store/embed $Config::config_sh into perlbug. When perlbug is
51# used, compare $Config::config_sh with the stored version. If they differ then
52# append a list of individual differences to the bug report.
53
84902520 54
37fa004c 55print "Extracting $file (with variable substitutions)\n";
56
57# In this section, perl variables will be expanded during extraction.
58# You can use $Config{...} to use Configure variables.
59
b22c7a20 60my $extract_version = sprintf("v%vd", $^V);
1ec03f31 61
37fa004c 62print OUT <<"!GROK!THIS!";
5f05dabc 63$Config{startperl}
64 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
65 if \$running_under_some_shell;
84902520 66
1ec03f31 67my \$config_tag1 = '$extract_version - $Config{cf_time}';
fb73857a 68
84902520 69my \$patchlevel_date = $patchlevel_date;
fb73857a 70my \$patch_tags = '$patch_tags';
71my \@patches = (
55d729e4 72 $patch_desc
fb73857a 73);
37fa004c 74!GROK!THIS!
75
76# In the following, perl variables are not expanded during extraction.
77
78print OUT <<'!NO!SUBS!';
79
80use Config;
1ec03f31 81use File::Spec; # keep perlbug Perl 5.005 compatible
37fa004c 82use Getopt::Std;
37fa004c 83use strict;
84
85sub paraprint;
86
55d729e4 87BEGIN {
88 eval "use Mail::Send;";
89 $::HaveSend = ($@ eq "");
90 eval "use Mail::Util;";
91 $::HaveUtil = ($@ eq "");
92};
c07a80fd 93
c0a6bf09 94my $Version = "1.31";
c07a80fd 95
96# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
a5f75d66 97# Changed in 1.07 to see more sendmail execs, and added pipe output.
98# Changed in 1.08 to use correct address for sendmail.
c07a80fd 99# Changed in 1.09 to close the REP file before calling it up in the editor.
100# Also removed some old comments duplicated elsewhere.
101# Changed in 1.10 to run under VMS without Mail::Send; also fixed
a5f75d66 102# temp filename generation.
c07a80fd 103# Changed in 1.11 to clean up some text and removed Mail::Send deactivator.
a5f75d66 104# Changed in 1.12 to check for editor errors, make save/send distinction
105# clearer and add $ENV{REPLYTO}.
84478119 106# Changed in 1.13 to hopefully make it more difficult to accidentally
107# send mail
ab3ef367 108# Changed in 1.14 to make the prompts a little more clear on providing
109# helpful information. Also let file read fail gracefully.
8ecf1a0c 110# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs.
111# Also report selected environment variables.
774d564b 112# Changed in 1.16 to include @INC, and allow user to re-edit if no changes.
137443ea 113# Changed in 1.17 Win32 support added. GSAR 97-04-12
1b0e3b9e 114# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18
84902520 115# Changed in 1.19 '-ok' default not '-v'
116# add local patch information
117# warn on '-ok' if this is an old system; add '-okay'
fb73857a 118# Changed in 1.20 Added patchlevel.h reading and version/config checks
55d729e4 119# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05
120# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10
cca87523 121# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt
105f9295 122# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01
8b49bb9a 123# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12
eedd3c36 124# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15
1948c06a 125# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27
50d3c28b 126# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000
975b416b 127# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000
b0c10877 128# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000
c0a6bf09 129# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000
c07a80fd 130
1b0e3b9e 131# TODO: - Allow the user to re-name the file on mail failure, and
55d729e4 132# make sure failure (transmission-wise) of Mail::Send is
c07a80fd 133# accounted for.
1b0e3b9e 134# - Test -b option
37fa004c 135
ab3ef367 136my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename,
50d3c28b 137 $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity,
1b0e3b9e 138 $fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok);
37fa004c 139
b22c7a20 140my $perl_version = $^V ? sprintf("v%vd", $^V) : $];
1ec03f31 141
142my $config_tag2 = "$perl_version - $Config{cf_time}";
fb73857a 143
37fa004c 144Init();
145
55d729e4 146if ($::opt_h) { Help(); exit; }
147if ($::opt_d) { Dump(*STDOUT); exit; }
eedd3c36 148if (!-t STDIN && !($ok and not $::opt_n)) {
55d729e4 149 paraprint <<EOF;
150Please use perlbug interactively. If you want to
84478119 151include a file, you can use the -f switch.
152EOF
55d729e4 153 die "\n";
84478119 154}
105f9295 155if (!-t STDOUT && !$outfile) { Dump(*STDOUT); exit; }
c07a80fd 156
37fa004c 157Query();
cca87523 158Edit() unless $usefile || ($ok and not $::opt_n);
37fa004c 159NowWhat();
160Send();
161
162exit;
163
975b416b 164sub ask_for_alternatives { # (category|severity)
50d3c28b 165 my $name = shift;
975b416b 166 my %alts = (
167 'category' => {
168 'default' => 'core',
169 'ok' => 'install',
170 'opts' => [qw(core docs install library utilities)], # patch, notabug
171 },
172 'severity' => {
173 'default' => 'low',
174 'ok' => 'none',
175 'opts' => [qw(critical high medium low wishlist none)], # zero
176 },
177 );
178 die "Invalid alternative($name) requested\n" unless grep(/^$name$/, keys %alts);
50d3c28b 179 my $alt = "";
975b416b 180 if ($ok) {
181 $alt = $alts{$name}{'ok'};
182 } else {
183 my @alts = @{$alts{$name}{'opts'}};
184 paraprint <<EOF;
50d3c28b 185Please pick a \u$name from the following:
186
187 @alts
188
189EOF
975b416b 190 my $err = 0;
191 do {
192 if ($err++ > 5) {
193 die "Invalid $name: aborting.\n";
194 }
195 print "Please enter a \u$name [$alts{$name}{'default'}]: ";
196 $alt = <>;
197 chomp $alt;
198 if ($alt =~ /^\s*$/) {
199 $alt = $alts{$name}{'default'};
200 }
201 } while !((($alt) = grep(/^$alt/i, @alts)));
202 }
50d3c28b 203 lc $alt;
204}
205
37fa004c 206sub Init {
55d729e4 207 # -------- Setup --------
208
209 $Is_MSWin32 = $^O eq 'MSWin32';
210 $Is_VMS = $^O eq 'VMS';
1948c06a 211 $Is_MacOS = $^O eq 'MacOS';
212
213 @ARGV = split m/\s+/,
214 MacPerl::Ask('Provide command-line args here (-h for help):')
215 if $Is_MacOS && $MacPerl::Version =~ /App/;
55d729e4 216
f3260bf1 217 if (!getopts("dhva:s:b:f:F:r:e:SCc:to:n:")) { Help(); exit; };
55d729e4 218
219 # This comment is needed to notify metaconfig that we are
220 # using the $perladmin, $cf_by, and $cf_time definitions.
221
222 # -------- Configuration ---------
223
224 # perlbug address
225 $perlbug = 'perlbug@perl.com';
226
227 # Test address
228 $testaddress = 'perlbug-test@perl.com';
229
230 # Target address
231 $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug);
232
233 # Users address, used in message and in Reply-To header
234 $from = $::opt_r || "";
235
236 # Include verbose configuration information
237 $verbose = $::opt_v || 0;
238
239 # Subject of bug-report message
240 $subject = $::opt_s || "";
241
242 # Send a file
243 $usefile = ($::opt_f || 0);
244
245 # File to send as report
246 $file = $::opt_f || "";
247
105f9295 248 # File to output to
249 $outfile = $::opt_F || "";
250
55d729e4 251 # Body of report
252 $body = $::opt_b || "";
253
254 # Editor
255 $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
256 || ($Is_VMS && "edit/tpu")
257 || ($Is_MSWin32 && "notepad")
1948c06a 258 || ($Is_MacOS && '')
55d729e4 259 || "vi";
260
261 # Not OK - provide build failure template by finessing OK report
262 if ($::opt_n) {
263 if (substr($::opt_n, 0, 2) eq 'ok' ) {
264 $::opt_o = substr($::opt_n, 1);
265 } else {
266 Help();
267 exit();
268 }
269 }
270
271 # OK - send "OK" report for build on this system
272 $ok = 0;
273 if ($::opt_o) {
274 if ($::opt_o eq 'k' or $::opt_o eq 'kay') {
275 my $age = time - $patchlevel_date;
276 if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
277 my $date = localtime $patchlevel_date;
278 print <<"EOF";
279"perlbug -ok" and "perlbug -nok" do not report on Perl versions which
280are more than 60 days old. This Perl version was constructed on
281$date. If you really want to report this, use
282"perlbug -okay" or "perlbug -nokay".
84902520 283EOF
1b0e3b9e 284 exit();
285 }
55d729e4 286 # force these options
287 unless ($::opt_n) {
288 $::opt_S = 1; # don't prompt for send
289 $::opt_b = 1; # we have a body
290 $body = "Perl reported to build OK on this system.\n";
291 }
292 $::opt_C = 1; # don't send a copy to the local admin
293 $::opt_s = 1; # we have a subject line
294 $subject = ($::opt_n ? 'Not ' : '')
1ec03f31 295 . "OK: perl $perl_version ${patch_tags}on"
55d729e4 296 ." $::Config{'archname'} $::Config{'osvers'} $subject";
297 $ok = 1;
298 } else {
299 Help();
300 exit();
1b0e3b9e 301 }
55d729e4 302 }
37fa004c 303
55d729e4 304 # Possible administrator addresses, in order of confidence
305 # (Note that cf_email is not mentioned to metaconfig, since
306 # we don't really want it. We'll just take it if we have to.)
307 #
308 # This has to be after the $ok stuff above because of the way
309 # that $::opt_C is forced.
310 $cc = $::opt_C ? "" : (
311 $::opt_c || $::Config{'perladmin'}
312 || $::Config{'cf_email'} || $::Config{'cf_by'}
313 );
314
315 # My username
316 $me = $Is_MSWin32 ? $ENV{'USERNAME'}
317 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
1948c06a 318 : $Is_MacOS ? $ENV{'USER'}
55d729e4 319 : eval { getpwuid($<) }; # May be missing
c0830f08 320
321 $from = $::Config{'cf_email'}
322 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me &&
323 ($me eq $::Config{'cf_by'});
55d729e4 324} # sub Init
37fa004c 325
326sub Query {
55d729e4 327 # Explain what perlbug is
328 unless ($ok) {
37fa004c 329 paraprint <<EOF;
8ecf1a0c 330This program provides an easy way to create a message reporting a bug
331in perl, and e-mail it to $address. It is *NOT* intended for
54310121 332sending test messages or simply verifying that perl works, *NOR* is it
333intended for reporting bugs in third-party perl modules. It is *ONLY*
334a means of reporting verifiable problems with the core perl distribution,
335and any solutions to such problems, to the people who maintain perl.
336
337If you're just looking for help with perl, try posting to the Usenet
338newsgroup comp.lang.perl.misc. If you're looking for help with using
339perl with CGI, try posting to comp.infosystems.www.programming.cgi.
37fa004c 340EOF
1b0e3b9e 341 }
37fa004c 342
55d729e4 343 # Prompt for subject of message, if needed
344 unless ($subject) {
345 paraprint <<EOF;
346First of all, please provide a subject for the
347message. It should be a concise description of
774d564b 348the bug or problem. "perl bug" or "perl problem"
349is not a concise description.
37fa004c 350EOF
55d729e4 351 print "Subject: ";
352 $subject = <>;
353
354 my $err = 0;
355 while ($subject !~ /\S/) {
356 print "\nPlease enter a subject: ";
357 $subject = <>;
358 if ($err++ > 5) {
359 die "Aborting.\n";
360 }
37fa004c 361 }
55d729e4 362 chop $subject;
363 }
364
365 # Prompt for return address, if needed
366 unless ($from) {
367 # Try and guess return address
368 my $guess;
369
370 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
1948c06a 371 if ($Is_MacOS) {
372 require Mac::InternetConfig;
373 $guess = $Mac::InternetConfig::InternetConfig{
374 Mac::InternetConfig::kICEmail()
375 };
376 }
377
55d729e4 378 unless ($guess) {
379 my $domain;
380 if ($::HaveUtil) {
381 $domain = Mail::Util::maildomain();
382 } elsif ($Is_MSWin32) {
383 $domain = $ENV{'USERDOMAIN'};
384 } else {
385 require Sys::Hostname;
386 $domain = Sys::Hostname::hostname();
387 }
388 if ($domain) {
389 if ($Is_VMS && !$::Config{'d_socket'}) {
390 $guess = "$domain\:\:$me";
41f926b8 391 } else {
55d729e4 392 $guess = "$me\@$domain" if $domain;
c07a80fd 393 }
55d729e4 394 }
395 }
37fa004c 396
55d729e4 397 if ($guess) {
398 unless ($ok) {
399 paraprint <<EOF;
a5f75d66 400Your e-mail address will be useful if you need to be contacted. If the
401default shown is not your full internet e-mail address, please correct it.
37fa004c 402EOF
55d729e4 403 }
404 } else {
405 paraprint <<EOF;
406So that you may be contacted if necessary, please enter
a5f75d66 407your full internet e-mail address here.
37fa004c 408EOF
37fa004c 409 }
37fa004c 410
55d729e4 411 if ($ok && $guess) {
412 # use it
413 $from = $guess;
414 } else {
415 # verify it
416 print "Your address [$guess]: ";
417 $from = <>;
418 chop $from;
419 $from = $guess if $from eq '';
420 }
421 }
37fa004c 422
55d729e4 423 if ($from eq $cc or $me eq $cc) {
424 # Try not to copy ourselves
425 $cc = "yourself";
426 }
37fa004c 427
55d729e4 428 # Prompt for administrator address, unless an override was given
429 if( !$::opt_C and !$::opt_c ) {
430 paraprint <<EOF;
37fa004c 431A copy of this report can be sent to your local
55d729e4 432perl administrator. If the address is wrong, please
c07a80fd 433correct it, or enter 'none' or 'yourself' to not send
434a copy.
37fa004c 435EOF
55d729e4 436 print "Local perl administrator [$cc]: ";
437 my $entry = scalar <>;
438 chop $entry;
37fa004c 439
55d729e4 440 if ($entry ne "") {
441 $cc = $entry;
442 $cc = '' if $me eq $cc;
37fa004c 443 }
55d729e4 444 }
37fa004c 445
55d729e4 446 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
447 $andcc = " and $cc" if $cc;
37fa004c 448
55d729e4 449 # Prompt for editor, if no override is given
ab3ef367 450editor:
55d729e4 451 unless ($::opt_e || $::opt_f || $::opt_b) {
452 paraprint <<EOF;
c07a80fd 453Now you need to supply the bug report. Try to make
55d729e4 454the report concise but descriptive. Include any
ab3ef367 455relevant detail. If you are reporting something
456that does not work as you think it should, please
55d729e4 457try to include example of both the actual
ab3ef367 458result, and what you expected.
459
460Some information about your local
55d729e4 461perl configuration will automatically be included
ab3ef367 462at the end of the report. If you are using any
463unusual version of perl, please try and confirm
464exactly which versions are relevant.
37fa004c 465
466You will probably want to use an editor to enter
467the report. If "$ed" is the editor you want
468to use, then just press Enter, otherwise type in
469the name of the editor you would like to use.
470
c07a80fd 471If you would like to use a prepared file, type
37fa004c 472"file", and you will be asked for the filename.
37fa004c 473EOF
55d729e4 474 print "Editor [$ed]: ";
475 my $entry =scalar <>;
476 chop $entry;
477
478 $usefile = 0;
479 if ($entry eq "file") {
480 $usefile = 1;
481 } elsif ($entry ne "") {
482 $ed = $entry;
37fa004c 483 }
55d729e4 484 }
37fa004c 485
50d3c28b 486 # Prompt for category of bug
975b416b 487 $category ||= ask_for_alternatives('category');
50d3c28b 488
489 # Prompt for severity of bug
975b416b 490 $severity ||= ask_for_alternatives('severity');
50d3c28b 491
55d729e4 492 # Generate scratch file to edit report in
493 $filename = filename();
37fa004c 494
55d729e4 495 # Prompt for file to read report from, if needed
496 if ($usefile and !$file) {
ab3ef367 497filename:
55d729e4 498 paraprint <<EOF;
37fa004c 499What is the name of the file that contains your report?
37fa004c 500EOF
55d729e4 501 print "Filename: ";
502 my $entry = scalar <>;
503 chop $entry;
37fa004c 504
55d729e4 505 if ($entry eq "") {
506 paraprint <<EOF;
507No filename? I'll let you go back and choose an editor again.
ab3ef367 508EOF
55d729e4 509 goto editor;
510 }
511
512 unless (-f $entry and -r $entry) {
513 paraprint <<EOF;
ab3ef367 514I'm sorry, but I can't read from `$entry'. Maybe you mistyped the name of
515the file? If you don't want to send a file, just enter a blank line and you
516can get back to the editor selection.
ab3ef367 517EOF
55d729e4 518 goto filename;
37fa004c 519 }
55d729e4 520 $file = $entry;
521 }
37fa004c 522
55d729e4 523 # Generate report
b0c10877 524 open(REP,">$filename") or die "Unable to create report file `$filename': $!\n";
cca87523 525 my $reptype = !$ok ? "bug" : $::opt_n ? "build failure" : "success";
37fa004c 526
55d729e4 527 print REP <<EOF;
84902520 528This is a $reptype report for perl from $from,
1ec03f31 529generated with the help of perlbug $Version running under perl $perl_version.
37fa004c 530
531EOF
532
55d729e4 533 if ($body) {
534 print REP $body;
535 } elsif ($usefile) {
536 open(F, "<$file")
537 or die "Unable to read report file from `$file': $!\n";
538 while (<F>) {
539 print REP $_
540 }
c0a6bf09 541 close(F) or die "Error closing `$file': $!";
55d729e4 542 } else {
543 print REP <<EOF;
774d564b 544
545-----------------------------------------------------------------
546[Please enter your report here]
547
548
549
550[Please do not change anything below this line]
551-----------------------------------------------------------------
552EOF
55d729e4 553 }
554 Dump(*REP);
c0a6bf09 555 close(REP) or die "Error closing report file: $!";
55d729e4 556
557 # read in the report template once so that
558 # we can track whether the user does any editing.
559 # yes, *all* whitespace is ignored.
b0c10877 560 open(REP, "<$filename") or die "Unable to open report file `$filename': $!\n";
55d729e4 561 while (<REP>) {
562 s/\s+//g;
563 $REP{$_}++;
564 }
c0a6bf09 565 close(REP) or die "Error closing report file `$filename': $!";
55d729e4 566} # sub Query
c07a80fd 567
568sub Dump {
55d729e4 569 local(*OUT) = @_;
37fa004c 570
50d3c28b 571 print OUT <<EFF;
572---
573Flags:
574 category=$category
575 severity=$severity
576---
577EFF
578 print OUT "This perlbug was built using Perl $config_tag1\n",
1ec03f31 579 "It is being executed now by Perl $config_tag2.\n\n"
55d729e4 580 if $config_tag2 ne $config_tag1;
fb73857a 581
55d729e4 582 print OUT <<EOF;
1ec03f31 583Site configuration information for perl $perl_version:
37fa004c 584
585EOF
55d729e4 586 if ($::Config{cf_by} and $::Config{cf_time}) {
587 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
588 }
589 print OUT Config::myconfig;
37fa004c 590
55d729e4 591 if (@patches) {
592 print OUT join "\n ", "Locally applied patches:", @patches;
593 print OUT "\n";
594 };
84902520 595
55d729e4 596 print OUT <<EOF;
8ecf1a0c 597
774d564b 598---
1ec03f31 599\@INC for perl $perl_version:
774d564b 600EOF
55d729e4 601 for my $i (@INC) {
602 print OUT " $i\n";
603 }
774d564b 604
55d729e4 605 print OUT <<EOF;
8ecf1a0c 606
774d564b 607---
1ec03f31 608Environment for perl $perl_version:
8ecf1a0c 609EOF
5cf1d1f1 610 my @env =
611 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
612 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
8876aa85 613 push @env, grep /^(?:PERL|LC_|LANG)/, keys %ENV;
614 my %env;
615 @env{@env} = @env;
616 for my $env (sort keys %env) {
55d729e4 617 print OUT " $env",
618 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
619 "\n";
620 }
621 if ($verbose) {
1ec03f31 622 print OUT "\nComplete configuration data for perl $perl_version:\n\n";
55d729e4 623 my $value;
624 foreach (sort keys %::Config) {
625 $value = $::Config{$_};
626 $value =~ s/'/\\'/g;
627 print OUT "$_='$value'\n";
84902520 628 }
55d729e4 629 }
630} # sub Dump
37fa004c 631
632sub Edit {
55d729e4 633 # Edit the report
634 if ($usefile || $body) {
635 paraprint <<EOF;
ab3ef367 636Please make sure that the name of the editor you want to use is correct.
ab3ef367 637EOF
55d729e4 638 print "Editor [$ed]: ";
639 my $entry =scalar <>;
640 chop $entry;
641 $ed = $entry unless $entry eq '';
642 }
a5f75d66 643
55d729e4 644tryagain:
c0a6bf09 645 my $sts;
646 $sts = system("$ed $filename") unless $Is_MacOS;
1948c06a 647 if ($Is_MacOS) {
648 require ExtUtils::MakeMaker;
649 ExtUtils::MM_MacOS::launch_file($filename);
650 paraprint <<EOF;
651Press Enter when done.
652EOF
653 scalar <>;
654 }
55d729e4 655 if ($sts) {
656 paraprint <<EOF;
a5f75d66 657The editor you chose (`$ed') could apparently not be run!
658Did you mistype the name of your editor? If so, please
55d729e4 659correct it here, otherwise just press Enter.
a5f75d66 660EOF
55d729e4 661 print "Editor [$ed]: ";
662 my $entry =scalar <>;
663 chop $entry;
a5f75d66 664
55d729e4 665 if ($entry ne "") {
666 $ed = $entry;
667 goto tryagain;
668 } else {
669 paraprint <<EOF;
a5f75d66 670You may want to save your report to a file, so you can edit and mail it
671yourself.
672EOF
774d564b 673 }
55d729e4 674 }
774d564b 675
55d729e4 676 return if ($ok and not $::opt_n) || $body;
677 # Check that we have a report that has some, eh, report in it.
678 my $unseen = 0;
679
b0c10877 680 open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
55d729e4 681 # a strange way to check whether any significant editing
682 # have been done: check whether any new non-empty lines
683 # have been added. Yes, the below code ignores *any* space
684 # in *any* line.
685 while (<REP>) {
686 s/\s+//g;
687 $unseen++ if $_ ne '' and not exists $REP{$_};
688 }
774d564b 689
55d729e4 690 while ($unseen == 0) {
691 paraprint <<EOF;
774d564b 692I am sorry but it looks like you did not report anything.
774d564b 693EOF
55d729e4 694 print "Action (Retry Edit/Cancel) ";
695 my ($action) = scalar(<>);
696 if ($action =~ /^[re]/i) { # <R>etry <E>dit
697 goto tryagain;
698 } elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
699 Cancel();
700 }
701 }
702} # sub Edit
774d564b 703
704sub Cancel {
705 1 while unlink($filename); # remove all versions under VMS
706 print "\nCancelling.\n";
707 exit(0);
37fa004c 708}
709
710sub NowWhat {
55d729e4 711 # Report is done, prompt for further action
712 if( !$::opt_S ) {
713 while(1) {
714 paraprint <<EOF;
715Now that you have completed your report, would you like to send
716the message to $address$andcc, display the message on
37fa004c 717the screen, re-edit it, or cancel without sending anything?
718You may also save the message as a file to mail at another time.
37fa004c 719EOF
8b49bb9a 720 retry:
55d729e4 721 print "Action (Send/Display/Edit/Cancel/Save to File): ";
722 my $action = scalar <>;
723 chop $action;
724
725 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
726 print "\n\nName of file to save message in [perlbug.rep]: ";
727 my $file = scalar <>;
728 chop $file;
729 $file = "perlbug.rep" if $file eq "";
730
8b49bb9a 731 unless (open(FILE, ">$file")) {
732 print "\nError opening $file: $!\n\n";
733 goto retry;
734 }
b0c10877 735 open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n";
55d729e4 736 print FILE "To: $address\nSubject: $subject\n";
737 print FILE "Cc: $cc\n" if $cc;
738 print FILE "Reply-To: $from\n" if $from;
739 print FILE "\n";
740 while (<REP>) { print FILE }
c0a6bf09 741 close(REP) or die "Error closing report file `$filename': $!";
742 close(FILE) or die "Error closing $file: $!";
55d729e4 743
744 print "\nMessage saved in `$file'.\n";
745 exit;
746 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
747 # Display the message
b0c10877 748 open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n";
55d729e4 749 while (<REP>) { print $_ }
c0a6bf09 750 close(REP) or die "Error closing report file `$filename': $!";
55d729e4 751 } elsif ($action =~ /^se/i) { # <S>end
752 # Send the message
753 print "Are you certain you want to send this message?\n"
754 . 'Please type "yes" if you are: ';
755 my $reply = scalar <STDIN>;
756 chop $reply;
757 if ($reply eq "yes") {
758 last;
759 } else {
760 paraprint <<EOF;
ab3ef367 761That wasn't a clear "yes", so I won't send your message. If you are sure
762your message should be sent, type in "yes" (without the quotes) at the
763confirmation prompt.
ab3ef367 764EOF
55d729e4 765 }
766 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
767 # edit the message
768 Edit();
769 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
770 Cancel();
771 } elsif ($action =~ /^s/) {
772 paraprint <<EOF;
84478119 773I'm sorry, but I didn't understand that. Please type "send" or "save".
774EOF
55d729e4 775 }
37fa004c 776 }
55d729e4 777 }
778} # sub NowWhat
37fa004c 779
780sub Send {
55d729e4 781 # Message has been accepted for transmission -- Send the message
105f9295 782 if ($outfile) {
783 open SENDMAIL, ">$outfile" or die "Couldn't open '$outfile': $!\n";
784 goto sendout;
785 }
55d729e4 786 if ($::HaveSend) {
787 $msg = new Mail::Send Subject => $subject, To => $address;
788 $msg->cc($cc) if $cc;
789 $msg->add("Reply-To",$from) if $from;
790
791 $fh = $msg->open;
b0c10877 792 open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
55d729e4 793 while (<REP>) { print $fh $_ }
c0a6bf09 794 close(REP) or die "Error closing $filename: $!";
55d729e4 795 $fh->close;
796
797 print "\nMessage sent.\n";
798 } elsif ($Is_VMS) {
799 if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
800 ($cc =~ /@/ and $cc !~ /^\w+%"/) ) {
801 my $prefix;
802 foreach (qw[ IN MX SMTP UCX PONY WINS ], '') {
803 $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
804 }
805 $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
806 $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
807 }
808 $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
809 my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
810 if ($sts) {
811 die <<EOF;
812Can't spawn off mail
813 (leaving bug report in $filename): $sts
814EOF
815 }
816 } else {
817 my $sendmail = "";
818 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
819 $sendmail = $_, last if -e $_;
820 }
821 if ($^O eq 'os2' and $sendmail eq "") {
822 my $path = $ENV{PATH};
823 $path =~ s:\\:/: ;
824 my @path = split /$Config{'path_sep'}/, $path;
825 for (@path) {
826 $sendmail = "$_/sendmail", last if -e "$_/sendmail";
827 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
828 }
829 }
37fa004c 830
55d729e4 831 paraprint(<<"EOF"), die "\n" if $sendmail eq "";
c07a80fd 832I am terribly sorry, but I cannot find sendmail, or a close equivalent, and
833the perl package Mail::Send has not been installed, so I can't send your bug
d121ca8c 834report. We apologize for the inconvenience.
c07a80fd 835
836So you may attempt to find some way of sending your message, it has
837been left in the file `$filename'.
c07a80fd 838EOF
55d729e4 839 open(SENDMAIL, "|$sendmail -t") || die "'|$sendmail -t' failed: $!";
105f9295 840sendout:
55d729e4 841 print SENDMAIL "To: $address\n";
842 print SENDMAIL "Subject: $subject\n";
843 print SENDMAIL "Cc: $cc\n" if $cc;
844 print SENDMAIL "Reply-To: $from\n" if $from;
845 print SENDMAIL "\n\n";
b0c10877 846 open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
55d729e4 847 while (<REP>) { print SENDMAIL $_ }
c0a6bf09 848 close(REP) or die "Error closing $filename: $!";
37fa004c 849
55d729e4 850 if (close(SENDMAIL)) {
105f9295 851 printf "\nMessage %s.\n", $outfile ? "saved" : "sent";
55d729e4 852 } else {
853 warn "\nSendmail returned status '", $? >> 8, "'\n";
854 }
855 }
856 1 while unlink($filename); # remove all versions under VMS
857} # sub Send
37fa004c 858
859sub Help {
55d729e4 860 print <<EOF;
37fa004c 861
55d729e4 862A program to help generate bug reports about perl5, and mail them.
37fa004c 863It is designed to be used interactively. Normally no arguments will
864be needed.
55d729e4 865
37fa004c 866Usage:
105f9295 867$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
d121ca8c 868 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
55d729e4 869$0 [-v] [-r returnaddress] [-ok | -okay | -nok | -nokay]
870
c07a80fd 871Simplest usage: run "$0", and follow the prompts.
37fa004c 872
873Options:
874
875 -v Include Verbose configuration data in the report
55d729e4 876 -f File containing the body of the report. Use this to
37fa004c 877 quickly send a prepared message.
1948c06a 878 -F File to output the resulting mail message to, instead of mailing.
37fa004c 879 -S Send without asking for confirmation.
880 -a Address to send the report to. Defaults to `$address'.
881 -c Address to send copy of report to. Defaults to `$cc'.
882 -C Don't send copy to administrator.
55d729e4 883 -s Subject to include with the message. You will be prompted
37fa004c 884 if you don't supply one on the command line.
885 -b Body of the report. If not included on the command line, or
886 in a file with -f, you will get a chance to edit the message.
887 -r Your return address. The program will ask you to confirm
888 this if you don't give it here.
55d729e4 889 -e Editor to use.
37fa004c 890 -t Test mode. The target address defaults to `$testaddress'.
1948c06a 891 -d Data mode (the default if you redirect or pipe output.)
c07a80fd 892 This prints out your configuration data, without mailing
893 anything. You can use this with -v to get more complete data.
84902520 894 -ok Report successful build on this system to perl porters
55d729e4 895 (use alone or with -v). Only use -ok if *everything* was ok:
896 if there were *any* problems at all, use -nok.
fb73857a 897 -okay As -ok but allow report from old builds.
55d729e4 898 -nok Report unsuccessful build on this system to perl porters
899 (use alone or with -v). You must describe what went wrong
900 in the body of the report which you will be asked to edit.
901 -nokay As -nok but allow report from old builds.
902 -h Print this help message.
903
37fa004c 904EOF
905}
906
55d729e4 907sub filename {
908 my $dir = $Is_VMS ? 'sys$scratch:'
909 : ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
1948c06a 910 : $Is_MacOS ? $ENV{'TMPDIR'}
911 : '/tmp';
55d729e4 912 $filename = "bugrep0$$";
1948c06a 913# $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
1ec03f31 914 $filename++ while -e File::Spec->catfile($dir, $filename);
915 $filename = File::Spec->catfile($dir, $filename);
55d729e4 916}
917
37fa004c 918sub paraprint {
919 my @paragraphs = split /\n{2,}/, "@_";
c07a80fd 920 print "\n\n";
37fa004c 921 for (@paragraphs) { # implicit local $_
55d729e4 922 s/(\S)\s*\n/$1 /g;
923 write;
924 print "\n";
37fa004c 925 }
37fa004c 926}
37fa004c 927
928format STDOUT =
929^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
930$_
931.
d121ca8c 932
933__END__
934
935=head1 NAME
936
937perlbug - how to submit bug reports on Perl
938
939=head1 SYNOPSIS
940
941B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
105f9295 942S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
943S<[ B<-r> I<returnaddress> ]>
d121ca8c 944S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
945S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-h> ]>
946
55d729e4 947B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
948S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
1b0e3b9e 949
d121ca8c 950=head1 DESCRIPTION
951
952A program to help generate bug reports about perl or the modules that
55d729e4 953come with it, and mail them.
d121ca8c 954
955If you have found a bug with a non-standard port (one that was not part
956of the I<standard distribution>), a binary distribution, or a
957non-standard module (such as Tk, CGI, etc), then please see the
958documentation that came with that distribution to determine the correct
959place to report bugs.
960
961C<perlbug> is designed to be used interactively. Normally no arguments
962will be needed. Simply run it, and follow the prompts.
963
964If you are unable to run B<perlbug> (most likely because you don't have
965a working setup to send mail that perlbug recognizes), you may have to
966compose your own report, and email it to B<perlbug@perl.com>. You might
967find the B<-d> option useful to get summary information in that case.
968
969In any case, when reporting a bug, please make sure you have run through
970this checklist:
971
972=over 4
973
884baa66 974=item What version of Perl you are running?
d121ca8c 975
976Type C<perl -v> at the command line to find out.
977
978=item Are you running the latest released version of perl?
979
980Look at http://www.perl.com/ to find out. If it is not the latest
981released version, get that one and see whether your bug has been
884baa66 982fixed. Note that bug reports about old versions of Perl, especially
d121ca8c 983those prior to the 5.0 release, are likely to fall upon deaf ears.
984You are on your own if you continue to use perl1 .. perl4.
985
986=item Are you sure what you have is a bug?
987
988A significant number of the bug reports we get turn out to be documented
884baa66 989features in Perl. Make sure the behavior you are witnessing doesn't fall
d121ca8c 990under that category, by glancing through the documentation that comes
884baa66 991with Perl (we'll admit this is no mean task, given the sheer volume of
d121ca8c 992it all, but at least have a look at the sections that I<seem> relevant).
993
994Be aware of the familiar traps that perl programmers of various hues
995fall into. See L<perltrap>.
996
f27fa58d 997Check in L<perldiag> to see what any Perl error message(s) mean.
998If message isn't in perldiag, it probably isn't generated by Perl.
999Consult your operating system documentation instead.
bdcdfa19 1000
1948c06a 1001If you are on a non-UNIX platform check also L<perlport>, as some
1002features may be unimplemented or work differently.
bdcdfa19 1003
884baa66 1004Try to study the problem under the Perl debugger, if necessary.
d121ca8c 1005See L<perldebug>.
1006
1007=item Do you have a proper test case?
1008
1009The easier it is to reproduce your bug, the more likely it will be
1010fixed, because if no one can duplicate the problem, no one can fix it.
1011A good test case has most of these attributes: fewest possible number
1012of lines; few dependencies on external commands, modules, or
1013libraries; runs on most platforms unimpeded; and is self-documenting.
1014
1015A good test case is almost always a good candidate to be on the perl
1016test suite. If you have the time, consider making your test case so
1017that it will readily fit into the standard test suite.
1018
bdcdfa19 1019Remember also to include the B<exact> error messages, if any.
1020"Perl complained something" is not an exact error message.
1021
1022If you get a core dump (or equivalent), you may use a debugger
1023(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
1024report. NOTE: unless your Perl has been compiled with debug info
1025(often B<-g>), the stack trace is likely to be somewhat hard to use
884baa66 1026because it will most probably contain only the function names and not
bdcdfa19 1027their arguments. If possible, recompile your Perl with debug info and
1028reproduce the dump and the stack trace.
1029
d121ca8c 1030=item Can you describe the bug in plain English?
1031
1032The easier it is to understand a reproducible bug, the more likely it
1033will be fixed. Anything you can provide by way of insight into the
884baa66 1034problem helps a great deal. In other words, try to analyze the
1035problem (to the extent you can) and report your discoveries.
d121ca8c 1036
1037=item Can you fix the bug yourself?
1038
1039A bug report which I<includes a patch to fix it> will almost
1040definitely be fixed. Use the C<diff> program to generate your patches
1041(C<diff> is being maintained by the GNU folks as part of the B<diffutils>
1042package, so you should be able to get it from any of the GNU software
1043repositories). If you do submit a patch, the cool-dude counter at
1044perlbug@perl.com will register you as a savior of the world. Your
1045patch may be returned with requests for changes, or requests for more
1046detailed explanations about your fix.
1047
1048Here are some clues for creating quality patches: Use the B<-c> or
1049B<-u> switches to the diff program (to create a so-called context or
1050unified diff). Make sure the patch is not reversed (the first
1051argument to diff is typically the original file, the second argument
1052your changed file). Make sure you test your patch by applying it with
1053the C<patch> program before you send it on its way. Try to follow the
1054same style as the code you are trying to patch. Make sure your patch
1055really does work (C<make test>, if the thing you're patching supports
1056it).
1057
1058=item Can you use C<perlbug> to submit the report?
1059
1060B<perlbug> will, amongst other things, ensure your report includes
1061crucial information about your version of perl. If C<perlbug> is unable
1062to mail your report after you have typed it in, you may have to compose
1063the message yourself, add the output produced by C<perlbug -d> and email
1064it to B<perlbug@perl.com>. If, for some reason, you cannot run
1065C<perlbug> at all on your system, be sure to include the entire output
1066produced by running C<perl -V> (note the uppercase V).
1067
bdcdfa19 1068Whether you use C<perlbug> or send the email manually, please make
884baa66 1069your Subject line informative. "a bug" not informative. Neither is
1070"perl crashes" nor "HELP!!!". These don't help.
1071A compact description of what's wrong is fine.
bdcdfa19 1072
d121ca8c 1073=back
1074
1075Having done your bit, please be prepared to wait, to be told the bug
884baa66 1076is in your code, or even to get no reply at all. The Perl maintainers
84902520 1077are busy folks, so if your problem is a small one or if it is difficult
1078to understand or already known, they may not respond with a personal reply.
d121ca8c 1079If it is important to you that your bug be fixed, do monitor the
1080C<Changes> file in any development releases since the time you submitted
1081the bug, and encourage the maintainers with kind words (but never any
1082flames!). Feel free to resend your bug report if the next released
1083version of perl comes out and your bug is still present.
1084
1085=head1 OPTIONS
1086
1087=over 8
1088
1089=item B<-a>
1090
1091Address to send the report to. Defaults to `perlbug@perl.com'.
1092
1093=item B<-b>
1094
1095Body of the report. If not included on the command line, or
1096in a file with B<-f>, you will get a chance to edit the message.
1097
1098=item B<-C>
1099
1100Don't send copy to administrator.
1101
1102=item B<-c>
1103
1104Address to send copy of report to. Defaults to the address of the
1105local perl administrator (recorded when perl was built).
1106
1107=item B<-d>
1108
1109Data mode (the default if you redirect or pipe output). This prints out
1110your configuration data, without mailing anything. You can use this
1111with B<-v> to get more complete data.
1112
1113=item B<-e>
1114
55d729e4 1115Editor to use.
d121ca8c 1116
1117=item B<-f>
1118
1119File containing the body of the report. Use this to quickly send a
1120prepared message.
1121
105f9295 1122=item B<-F>
1123
1124File to output the results to instead of sending as an email. Useful
1125particularly when running perlbug on a machine with no direct internet
1126connection.
1127
d121ca8c 1128=item B<-h>
1129
1130Prints a brief summary of the options.
1131
1b0e3b9e 1132=item B<-ok>
1133
84902520 1134Report successful build on this system to perl porters. Forces B<-S>
1135and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
1b0e3b9e 1136prompts for a return address if it cannot guess it (for use with
84902520 1137B<make>). Honors return address specified with B<-r>. You can use this
1138with B<-v> to get more complete data. Only makes a report if this
1139system is less than 60 days old.
1140
1141=item B<-okay>
1142
1143As B<-ok> except it will report on older systems.
1b0e3b9e 1144
55d729e4 1145=item B<-nok>
1146
1147Report unsuccessful build on this system. Forces B<-C>. Forces and
1148supplies a value for B<-s>, then requires you to edit the report
1149and say what went wrong. Alternatively, a prepared report may be
1150supplied using B<-f>. Only prompts for a return address if it
1151cannot guess it (for use with B<make>). Honors return address
1152specified with B<-r>. You can use this with B<-v> to get more
1153complete data. Only makes a report if this system is less than 60
1154days old.
1155
1156=item B<-nokay>
1157
1158As B<-nok> except it will report on older systems.
1159
d121ca8c 1160=item B<-r>
1161
1162Your return address. The program will ask you to confirm its default
1163if you don't use this option.
1164
1165=item B<-S>
1166
1167Send without asking for confirmation.
1168
1169=item B<-s>
1170
1171Subject to include with the message. You will be prompted if you don't
1172supply one on the command line.
1173
1174=item B<-t>
1175
1176Test mode. The target address defaults to `perlbug-test@perl.com'.
1177
1178=item B<-v>
1179
1180Include verbose configuration data in the report.
1181
1182=back
1183
1184=head1 AUTHORS
1185
1186Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
6e238990 1187by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>), Tom Christiansen
1b0e3b9e 1188(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
55d729e4 1189Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
bdcdfa19 1190(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>),
1948c06a 1191Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>),
50d3c28b 1192Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor
1193(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>,
1194and Richard Foley (E<lt>richard@rfi.netE<gt>).
d121ca8c 1195
1196=head1 SEE ALSO
1197
bdcdfa19 1198perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
1199diff(1), patch(1), dbx(1), gdb(1)
d121ca8c 1200
1201=head1 BUGS
1202
1203None known (guess what must have been used to report them?)
1204
1205=cut
1206
37fa004c 1207!NO!SUBS!
1208
1209close OUT or die "Can't close $file: $!";
1210chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1211exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1212chdir $origdir;