1#!/usr/local/bin/perl 2 3use Config; 4use File::Basename qw(&basename &dirname); 5use Cwd; 6use File::Spec::Functions; 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}. 14# $perlpath 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. 18$origdir = cwd; 19chdir dirname($0); 20$file = basename($0, '.PL'); 21$file .= '.com' if $^O eq 'VMS'; 22 23open OUT, ">$file" or die "Can't create $file: $!"; 24 25# get patchlevel.h timestamp 26 27-e catfile(updir, "patchlevel.h") 28 or die "Can't find patchlevel.h: $!"; 29 30my $patchlevel_date = (stat _)[9]; 31 32# TO DO (perhaps): store/embed $Config::config_sh into perlbug. When perlbug is 33# used, compare $Config::config_sh with the stored version. If they differ then 34# append a list of individual differences to the bug report. 35 36 37print "Extracting $file (with variable substitutions)\n"; 38 39# In this section, perl variables will be expanded during extraction. 40# You can use $Config{...} to use Configure variables. 41 42my $extract_version = sprintf("%vd", $^V); 43 44print OUT <<"!GROK!THIS!"; 45$Config{startperl} 46 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}' 47 if \$running_under_some_shell; 48 49my \$config_tag1 = '$extract_version - $Config{cf_time}'; 50 51my \$patchlevel_date = $patchlevel_date; 52!GROK!THIS! 53 54# In the following, perl variables are not expanded during extraction. 55 56print OUT <<'!NO!SUBS!'; 57my @patches = Config::local_patches(); 58my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches; 59 60use warnings; 61use strict; 62use Config; 63use File::Spec; # keep perlbug Perl 5.005 compatible 64use Getopt::Std; 65use File::Basename 'basename'; 66 67sub paraprint; 68 69BEGIN { 70 eval { require Mail::Send;}; 71 $::HaveSend = ($@ eq ""); 72 eval { require Mail::Util; } ; 73 $::HaveUtil = ($@ eq ""); 74 # use secure tempfiles wherever possible 75 eval { require File::Temp; }; 76 $::HaveTemp = ($@ eq ""); 77 eval { require Module::CoreList; }; 78 $::HaveCoreList = ($@ eq ""); 79}; 80 81my $Version = "1.40"; 82 83#TODO: 84# make sure failure (transmission-wise) of Mail::Send is accounted for. 85# (This may work now. Unsure of the original author's issue -JESSE 2008-06-08) 86# - Test -b option 87 88my( $file, $usefile, $cc, $address, $bugaddress, $testaddress, $thanksaddress, 89 $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile, 90 $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname, 91 $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD, 92 $report_about_module, $category, $severity, 93 %opt, $have_attachment, $attachments, $has_patch, $mime_boundary 94); 95 96my $perl_version = $^V ? sprintf("%vd", $^V) : $]; 97 98my $config_tag2 = "$perl_version - $Config{cf_time}"; 99 100Init(); 101 102if ($opt{h}) { Help(); exit; } 103if ($opt{d}) { Dump(*STDOUT); exit; } 104if (!-t STDIN && !($ok and not $opt{n})) { 105 paraprint <<"EOF"; 106Please use $progname interactively. If you want to 107include a file, you can use the -f switch. 108EOF 109 die "\n"; 110} 111 112Query(); 113Edit() unless $usefile || ($ok and not $opt{n}); 114NowWhat(); 115if ($outfile) { 116 save_message_to_disk($outfile); 117} else { 118 Send(); 119 if ($thanks) { 120 print "\nThank you for taking the time to send a thank-you message!\n\n"; 121 122 paraprint <<EOF 123Please note that mailing lists are moderated, your message may take a while to 124show up. 125EOF 126 } else { 127 print "\nThank you for taking the time to file a bug report!\n\n"; 128 129 paraprint <<EOF 130Please note that mailing lists are moderated, your message may take a while to 131show up. If you do not receive an automated response acknowledging your message 132within a few hours (check your SPAM folder and outgoing mail) please consider 133sending an email directly from your mail client to perlbug\@perl.org. 134EOF 135 } 136 137} 138 139exit; 140 141sub ask_for_alternatives { # (category|severity) 142 my $name = shift; 143 my %alts = ( 144 'category' => { 145 'default' => 'core', 146 'ok' => 'install', 147 # Inevitably some of these will end up in RT whatever we do: 148 'thanks' => 'thanks', 149 'opts' => [qw(core docs install library utilities)], # patch, notabug 150 }, 151 'severity' => { 152 'default' => 'low', 153 'ok' => 'none', 154 'thanks' => 'none', 155 'opts' => [qw(critical high medium low wishlist none)], # zero 156 }, 157 ); 158 die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts); 159 my $alt = ""; 160 my $what = $ok || $thanks; 161 if ($what) { 162 $alt = $alts{$name}{$what}; 163 } else { 164 my @alts = @{$alts{$name}{'opts'}}; 165 print "\n\n"; 166 paraprint <<EOF; 167Please pick a $name from the following list: 168 169 @alts 170EOF 171 my $err = 0; 172 do { 173 if ($err++ > 5) { 174 die "Invalid $name: aborting.\n"; 175 } 176 $alt = _prompt('', "\u$name", $alts{$name}{'default'}); 177 $alt ||= $alts{$name}{'default'}; 178 } while !((($alt) = grep(/^$alt/i, @alts))); 179 } 180 lc $alt; 181} 182 183sub Init { 184 # -------- Setup -------- 185 186 $Is_MSWin32 = $^O eq 'MSWin32'; 187 $Is_VMS = $^O eq 'VMS'; 188 $Is_Linux = lc($^O) eq 'linux'; 189 $Is_OpenBSD = lc($^O) eq 'openbsd'; 190 191 if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T:p:", \%opt)) { Help(); exit; }; 192 193 # This comment is needed to notify metaconfig that we are 194 # using the $perladmin, $cf_by, and $cf_time definitions. 195 196 # -------- Configuration --------- 197 198 # perlbug address 199 $bugaddress = 'perlbug@perl.org'; 200 201 # Test address 202 $testaddress = 'perlbug-test@perl.org'; 203 204 # Thanks address 205 $thanksaddress = 'perl-thanks@perl.org'; 206 207 if (basename ($0) =~ /^perlthanks/i) { 208 # invoked as perlthanks 209 $opt{T} = 1; 210 $opt{C} = 1; # don't send a copy to the local admin 211 } 212 213 if ($opt{T}) { 214 $thanks = 'thanks'; 215 } 216 217 $progname = $thanks ? 'perlthanks' : 'perlbug'; 218 # Target address 219 $address = $opt{a} || ($opt{t} ? $testaddress 220 : $thanks ? $thanksaddress : $bugaddress); 221 222 # Users address, used in message and in From and Reply-To headers 223 $from = $opt{r} || ""; 224 225 # Include verbose configuration information 226 $verbose = $opt{v} || 0; 227 228 # Subject of bug-report message 229 $subject = $opt{s} || ""; 230 231 # Send a file 232 $usefile = ($opt{f} || 0); 233 234 # File to send as report 235 $file = $opt{f} || ""; 236 237 # We have one or more attachments 238 $have_attachment = ($opt{p} || 0); 239 $mime_boundary = ('-' x 12) . "$Version.perlbug" if $have_attachment; 240 241 # Comma-separated list of attachments 242 $attachments = $opt{p} || ""; 243 $has_patch = 0; # TBD based on file type 244 245 for my $attachment (split /\s*,\s*/, $attachments) { 246 unless (-f $attachment && -r $attachment) { 247 die "The attachment $attachment is not a readable file: $!\n"; 248 } 249 $has_patch = 1 if $attachment =~ m/\.(patch|diff)$/; 250 } 251 252 # File to output to 253 $outfile = $opt{F} || ""; 254 255 # Body of report 256 $body = $opt{b} || ""; 257 258 # Editor 259 $ed = $opt{e} || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} 260 || ($Is_VMS && "edit/tpu") 261 || ($Is_MSWin32 && "notepad") 262 || "vi"; 263 264 # Not OK - provide build failure template by finessing OK report 265 if ($opt{n}) { 266 if (substr($opt{n}, 0, 2) eq 'ok' ) { 267 $opt{o} = substr($opt{n}, 1); 268 } else { 269 Help(); 270 exit(); 271 } 272 } 273 274 # OK - send "OK" report for build on this system 275 $ok = ''; 276 if ($opt{o}) { 277 if ($opt{o} eq 'k' or $opt{o} eq 'kay') { 278 my $age = time - $patchlevel_date; 279 if ($opt{o} eq 'k' and $age > 60 * 24 * 60 * 60 ) { 280 my $date = localtime $patchlevel_date; 281 print <<"EOF"; 282"perlbug -ok" and "perlbug -nok" do not report on Perl versions which 283are more than 60 days old. This Perl version was constructed on 284$date. If you really want to report this, use 285"perlbug -okay" or "perlbug -nokay". 286EOF 287 exit(); 288 } 289 # force these options 290 unless ($opt{n}) { 291 $opt{S} = 1; # don't prompt for send 292 $opt{b} = 1; # we have a body 293 $body = "Perl reported to build OK on this system.\n"; 294 } 295 $opt{C} = 1; # don't send a copy to the local admin 296 $opt{s} = 1; # we have a subject line 297 $subject = ($opt{n} ? 'Not ' : '') 298 . "OK: perl $perl_version ${patch_tags}on" 299 ." $::Config{'archname'} $::Config{'osvers'} $subject"; 300 $ok = 'ok'; 301 } else { 302 Help(); 303 exit(); 304 } 305 } 306 307 # Possible administrator addresses, in order of confidence 308 # (Note that cf_email is not mentioned to metaconfig, since 309 # we don't really want it. We'll just take it if we have to.) 310 # 311 # This has to be after the $ok stuff above because of the way 312 # that $opt{C} is forced. 313 $cc = $opt{C} ? "" : ( 314 $opt{c} || $::Config{'perladmin'} 315 || $::Config{'cf_email'} || $::Config{'cf_by'} 316 ); 317 318 if ($::HaveUtil) { 319 $domain = Mail::Util::maildomain(); 320 } elsif ($Is_MSWin32) { 321 $domain = $ENV{'USERDOMAIN'}; 322 } else { 323 require Sys::Hostname; 324 $domain = Sys::Hostname::hostname(); 325 } 326 327 # Message-Id - rjsf 328 $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>"; 329 330 # My username 331 $me = $Is_MSWin32 ? $ENV{'USERNAME'} 332 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'} 333 : eval { getpwuid($<) }; # May be missing 334 335 $from = $::Config{'cf_email'} 336 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me && 337 ($me eq $::Config{'cf_by'}); 338} # sub Init 339 340sub Query { 341 # Explain what perlbug is 342 unless ($ok) { 343 if ($thanks) { 344 paraprint <<'EOF'; 345This program provides an easy way to send a thank-you message back to the 346authors and maintainers of perl. 347 348If you wish to submit a bug report, please run it without the -T flag. 349EOF 350 } else { 351 paraprint <<"EOF"; 352This program provides an easy way to create a message reporting a 353bug in the core perl distribution (along with tests or patches) 354to the volunteers who maintain perl at $address. To send a thank-you 355note to $thanksaddress instead of a bug report, please use the -T flag. 356 357Please do not use $0 to send test messages, test whether perl 358works, or to report bugs in perl modules from CPAN. 359 360Suggestions for how to find help using Perl can be found at 361http://perldoc.perl.org/perlcommunity.html 362EOF 363 } 364 } 365 366 # Prompt for subject of message, if needed 367 368 if ($subject && TrivialSubject($subject)) { 369 $subject = ''; 370 } 371 372 unless ($subject) { 373 print 374"First of all, please provide a subject for the message.\n"; 375 if ( not $thanks) { 376 paraprint <<EOF; 377This should be a concise description of your bug or problem 378which will help the volunteers working to improve perl to categorize 379and resolve the issue. Be as specific and descriptive as 380you can. A subject like "perl bug" or "perl problem" will make it 381much less likely that your issue gets the attention it deserves. 382EOF 383 } 384 385 my $err = 0; 386 do { 387 $subject = _prompt('','Subject'); 388 if ($err++ == 5) { 389 if ($thanks) { 390 $subject = 'Thanks for Perl'; 391 } else { 392 die "Aborting.\n"; 393 } 394 } 395 } while (TrivialSubject($subject)); 396 } 397 $subject = '[PATCH] ' . $subject 398 if $has_patch && ($subject !~ m/^\[PATCH/i); 399 400 # Prompt for return address, if needed 401 unless ($opt{r}) { 402 # Try and guess return address 403 my $guess; 404 405 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || $ENV{'EMAIL'} 406 || $from || ''; 407 408 unless ($guess) { 409 # move $domain to where we can use it elsewhere 410 if ($domain) { 411 if ($Is_VMS && !$::Config{'d_socket'}) { 412 $guess = "$domain\:\:$me"; 413 } else { 414 $guess = "$me\@$domain" if $domain; 415 } 416 } 417 } 418 419 if ($guess) { 420 unless ($ok) { 421 paraprint <<EOF; 422Perl's developers may need your email address to contact you for 423further information about your issue or to inform you when it is 424resolved. If the default shown is not your email address, please 425correct it. 426EOF 427 } 428 } else { 429 paraprint <<EOF; 430Please enter your full internet email address so that Perl's 431developers can contact you with questions about your issue or to 432inform you that it has been resolved. 433EOF 434 } 435 436 if ($ok && $guess) { 437 # use it 438 $from = $guess; 439 } else { 440 # verify it 441 $from = _prompt('','Your address',$guess); 442 $from = $guess if $from eq ''; 443 } 444 } 445 446 if ($from eq $cc or $me eq $cc) { 447 # Try not to copy ourselves 448 $cc = "yourself"; 449 } 450 451 # Prompt for administrator address, unless an override was given 452 if( !$opt{C} and !$opt{c} ) { 453 my $description = <<EOF; 454$0 can send a copy of this report to your local perl 455administrator. If the address below is wrong, please correct it, 456or enter 'none' or 'yourself' to not send a copy. 457EOF 458 my $entry = _prompt($description, "Local perl administrator", $cc); 459 460 if ($entry ne "") { 461 $cc = $entry; 462 $cc = '' if $me eq $cc; 463 } 464 } 465 466 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i; 467 if ($cc) { 468 $andcc = " and $cc" 469 } else { 470 $andcc = '' 471 } 472 473 # Prompt for editor, if no override is given 474editor: 475 unless ($opt{e} || $opt{f} || $opt{b}) { 476 477 my $description; 478 479 chomp (my $common_end = <<"EOF"); 480You will probably want to use a text editor to enter the body of 481your report. If "$ed" is the editor you want to use, then just press 482Enter, otherwise type in the name of the editor you would like to 483use. 484 485If you have already composed the body of your report, you may enter 486"file", and $0 will prompt you to enter the name of the file 487containing your report. 488EOF 489 490 if ($thanks) { 491 $description = <<"EOF"; 492It's now time to compose your thank-you message. 493 494Some information about your local perl configuration will automatically 495be included at the end of your message, because we're curious about 496the different ways that people build and use perl. If you'd rather 497not share this information, you're welcome to delete it. 498 499$common_end 500EOF 501 } else { 502 $description = <<"EOF"; 503It's now time to compose your bug report. Try to make the report 504concise but descriptive. Please include any detail which you think 505might be relevant or might help the volunteers working to improve 506perl. If you are reporting something that does not work as you think 507it should, please try to include examples of the actual result and of 508what you expected. 509 510Some information about your local perl configuration will automatically 511be included at the end of your report. If you are using an unusual 512version of perl, it would be useful if you could confirm that you 513can replicate the problem on a standard build of perl as well. 514 515$common_end 516EOF 517 } 518 519 my $entry = _prompt($description, "Editor", $ed); 520 $usefile = 0; 521 if ($entry eq "file") { 522 $usefile = 1; 523 } elsif ($entry ne "") { 524 $ed = $entry; 525 } 526 } 527 if ($::HaveCoreList && !$ok && !$thanks) { 528 my $description = <<EOF; 529If your bug is about a Perl module rather than a core language 530feature, please enter its name here. If it's not, just hit Enter 531to skip this question. 532EOF 533 534 my $entry = ''; 535 while ($entry eq '') { 536 $entry = _prompt($description, 'Module'); 537 my $first_release = Module::CoreList->first_release($entry); 538 if ($entry and not $first_release) { 539 paraprint <<EOF; 540$entry is not a "core" Perl module. Please check that you entered 541its name correctly. If it is correct, quit this program, try searching 542for $entry on http://rt.cpan.org, and report your issue there. 543EOF 544 545 $entry = ''; 546 } elsif (my $bug_tracker = $Module::CoreList::bug_tracker{$entry}) { 547 paraprint <<"EOF"; 548$entry included with core Perl is copied directly from the CPAN distribution. 549Please report bugs in $entry directly to its maintainers using $bug_tracker 550EOF 551 $entry = ''; 552 } elsif ($entry) { 553 $category ||= 'library'; 554 $report_about_module = $entry; 555 last; 556 } else { 557 last; 558 } 559 } 560 } 561 562 # Prompt for category of bug 563 $category ||= ask_for_alternatives('category'); 564 565 # Prompt for severity of bug 566 $severity ||= ask_for_alternatives('severity'); 567 568 # Generate scratch file to edit report in 569 $filename = filename(); 570 571 # Prompt for file to read report from, if needed 572 if ($usefile and !$file) { 573filename: 574 my $description = <<EOF; 575What is the name of the file that contains your report? 576EOF 577 my $entry = _prompt($description, "Filename"); 578 579 if ($entry eq "") { 580 paraprint <<EOF; 581It seems you didn't enter a filename. Please choose to use a text 582editor or enter a filename. 583EOF 584 goto editor; 585 } 586 587 unless (-f $entry and -r $entry) { 588 paraprint <<EOF; 589'$entry' doesn't seem to be a readable file. You may have mistyped 590its name or may not have permission to read it. 591 592If you don't want to use a file as the content of your report, just 593hit Enter and you'll be able to select a text editor instead. 594EOF 595 goto filename; 596 } 597 $file = $entry; 598 } 599 600 # Generate report 601 open(REP, '>:raw', $filename) or die "Unable to create report file '$filename': $!\n"; 602 binmode(REP, ':raw :crlf') if $Is_MSWin32; 603 604 my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug') 605 : $opt{n} ? "build failure" : "success"; 606 607 print REP <<EOF; 608This is a $reptype report for perl from $from, 609generated with the help of perlbug $Version running under perl $perl_version. 610 611EOF 612 613 if ($body) { 614 print REP $body; 615 } elsif ($usefile) { 616 open(F, '<:raw', $file) 617 or die "Unable to read report file from '$file': $!\n"; 618 binmode(F, ':raw :crlf') if $Is_MSWin32; 619 while (<F>) { 620 print REP $_ 621 } 622 close(F) or die "Error closing '$file': $!"; 623 } else { 624 if ($thanks) { 625 print REP <<'EOF'; 626 627----------------------------------------------------------------- 628[Please enter your thank-you message here] 629 630 631 632[You're welcome to delete anything below this line] 633----------------------------------------------------------------- 634EOF 635 } else { 636 print REP <<'EOF'; 637 638----------------------------------------------------------------- 639[Please describe your issue here] 640 641 642 643[Please do not change anything below this line] 644----------------------------------------------------------------- 645EOF 646 } 647 } 648 Dump(*REP); 649 close(REP) or die "Error closing report file: $!"; 650 651 # Set up an initial report fingerprint so we can compare it later 652 _fingerprint_lines_in_report(); 653 654} # sub Query 655 656sub Dump { 657 local(*OUT) = @_; 658 659 # these won't have been set if run with -d 660 $category ||= 'core'; 661 $severity ||= 'low'; 662 663 print OUT <<EFF; 664--- 665Flags: 666 category=$category 667 severity=$severity 668EFF 669 670 if ($has_patch) { 671 print OUT <<EFF; 672 Type=Patch 673 PatchStatus=HasPatch 674EFF 675 } 676 677 if ($report_about_module ) { 678 print OUT <<EFF; 679 module=$report_about_module 680EFF 681 } 682 if ($opt{A}) { 683 print OUT <<EFF; 684 ack=no 685EFF 686 } 687 print OUT <<EFF; 688--- 689EFF 690 print OUT "This perlbug was built using Perl $config_tag1\n", 691 "It is being executed now by Perl $config_tag2.\n\n" 692 if $config_tag2 ne $config_tag1; 693 694 print OUT <<EOF; 695Site configuration information for perl $perl_version: 696 697EOF 698 if ($::Config{cf_by} and $::Config{cf_time}) { 699 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n"; 700 } 701 print OUT Config::myconfig; 702 703 if (@patches) { 704 print OUT join "\n ", "Locally applied patches:", @patches; 705 print OUT "\n"; 706 }; 707 708 print OUT <<EOF; 709 710--- 711\@INC for perl $perl_version: 712EOF 713 for my $i (@INC) { 714 print OUT " $i\n"; 715 } 716 717 print OUT <<EOF; 718 719--- 720Environment for perl $perl_version: 721EOF 722 my @env = 723 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE); 724 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne ''; 725 push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV; 726 my %env; 727 @env{@env} = @env; 728 for my $env (sort keys %env) { 729 print OUT " $env", 730 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)', 731 "\n"; 732 } 733 if ($verbose) { 734 print OUT "\nComplete configuration data for perl $perl_version:\n\n"; 735 my $value; 736 foreach (sort keys %::Config) { 737 $value = $::Config{$_}; 738 $value = '' unless defined $value; 739 $value =~ s/'/\\'/g; 740 print OUT "$_='$value'\n"; 741 } 742 } 743} # sub Dump 744 745sub Edit { 746 # Edit the report 747 if ($usefile || $body) { 748 my $description = "Please make sure that the name of the editor you want to use is correct."; 749 my $entry = _prompt($description, 'Editor', $ed); 750 $ed = $entry unless $entry eq ''; 751 } 752 753 _edit_file($ed); 754} 755 756sub _edit_file { 757 my $editor = shift; 758 759 my $report_written = 0; 760 761 while ( !$report_written ) { 762 my $exit_status = system("$editor $filename"); 763 if ($exit_status) { 764 my $desc = <<EOF; 765The editor you chose ('$editor') could not be run! 766 767If you mistyped its name, please enter it now, otherwise just press Enter. 768EOF 769 my $entry = _prompt( $desc, 'Editor', $editor ); 770 if ( $entry ne "" ) { 771 $editor = $entry; 772 next; 773 } else { 774 paraprint <<EOF; 775You may want to save your report to a file, so you can edit and 776mail it later. 777EOF 778 return; 779 } 780 } 781 return if ( $ok and not $opt{n} ) || $body; 782 783 # Check that we have a report that has some, eh, report in it. 784 785 unless ( _fingerprint_lines_in_report() ) { 786 my $description = <<EOF; 787It looks like you didn't enter a report. You may [r]etry your edit 788or [c]ancel this report. 789EOF 790 my $action = _prompt( $description, "Action (Retry/Cancel) " ); 791 if ( $action =~ /^[re]/i ) { # <R>etry <E>dit 792 next; 793 } elsif ( $action =~ /^[cq]/i ) { # <C>ancel, <Q>uit 794 Cancel(); # cancel exits 795 } 796 } 797 # Ok. the user did what they needed to; 798 return; 799 800 } 801} 802 803 804sub Cancel { 805 1 while unlink($filename); # remove all versions under VMS 806 print "\nQuitting without sending your message.\n"; 807 exit(0); 808} 809 810sub NowWhat { 811 # Report is done, prompt for further action 812 if( !$opt{S} ) { 813 while(1) { 814 my $menu = <<EOF; 815 816 817You have finished composing your message. At this point, you have 818a few options. You can: 819 820 * [Se]nd the message to $address$andcc, 821 * [D]isplay the message on the screen, 822 * [R]e-edit the message 823 * Display or change the message's [su]bject 824 * Save the message to a [f]ile to mail at another time 825 * [Q]uit without sending a message 826 827EOF 828 retry: 829 print $menu; 830 my $action = _prompt('', "Action (Send/Display/Edit/Subject/Save to File)");; 831 print "\n"; 832 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve 833 if ( SaveMessage() ) { exit } 834 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow 835 # Display the message 836 open(REP, '<:raw', $filename) or die "Couldn't open file '$filename': $!\n"; 837 binmode(REP, ':raw :crlf') if $Is_MSWin32; 838 while (<REP>) { print $_ } 839 close(REP) or die "Error closing report file '$filename': $!"; 840 if ($have_attachment) { 841 print "\n\n---\nAttachment(s):\n"; 842 for my $att (split /\s*,\s*/, $attachments) { print " $att\n"; } 843 } 844 } elsif ($action =~ /^su/i) { # <Su>bject 845 my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject"); 846 if ($reply ne '') { 847 unless (TrivialSubject($reply)) { 848 $subject = $reply; 849 print "Subject: $subject\n"; 850 } 851 } 852 } elsif ($action =~ /^se/i) { # <S>end 853 # Send the message 854 my $reply = _prompt( "Are you certain you want to send this message?", 'Please type "yes" if you are','no'); 855 if ($reply =~ /^yes$/) { 856 last; 857 } else { 858 paraprint <<EOF; 859You didn't type "yes", so your message has not yet been sent. 860EOF 861 } 862 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit 863 # edit the message 864 Edit(); 865 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit 866 Cancel(); 867 } elsif ($action =~ /^s/i) { 868 paraprint <<EOF; 869The command you entered was ambiguous. Please type "send", "save" or "subject". 870EOF 871 } 872 } 873 } 874} # sub NowWhat 875 876sub TrivialSubject { 877 my $subject = shift; 878 if ($subject =~ 879 /^(y(es)?|no?|help|perl( (bug|problem))?|bug|problem)$/i || 880 length($subject) < 4 || 881 $subject !~ /\s/) { 882 print "\nThe subject you entered wasn't very descriptive. Please try again.\n\n"; 883 return 1; 884 } else { 885 return 0; 886 } 887} 888 889sub SaveMessage { 890 my $file_save = $outfile || "$progname.rep"; 891 my $file = _prompt( '', "Name of file to save message in", $file_save ); 892 save_message_to_disk($file) || return undef; 893 print "\n"; 894 paraprint <<EOF; 895A copy of your message has been saved in '$file' for you to 896send to '$address' with your normal mail client. 897EOF 898} 899 900sub Send { 901 902 # Message has been accepted for transmission -- Send the message 903 904 # on linux certain "mail" implementations won't accept the subject 905 # as "~s subject" and thus the Subject header will be corrupted 906 # so don't use Mail::Send to be safe 907 eval { 908 if ( $::HaveSend && !$Is_Linux && !$Is_OpenBSD ) { 909 _send_message_mailsend(); 910 } elsif ($Is_VMS) { 911 _send_message_vms(); 912 } else { 913 _send_message_sendmail(); 914 } 915 }; 916 917 if ( my $error = $@ ) { 918 paraprint <<EOF; 919$0 has detected an error while trying to send your message: $error. 920 921Your message may not have been sent. You will now have a chance to save a copy to disk. 922EOF 923 SaveMessage(); 924 return; 925 } 926 927 1 while unlink($filename); # remove all versions under VMS 928} # sub Send 929 930sub Help { 931 print <<EOF; 932 933This program is designed to help you generate and send bug reports 934(and thank-you notes) about perl5 and the modules which ship with it. 935 936In most cases, you can just run "$0" interactively from a command 937line without any special arguments and follow the prompts. 938 939Advanced usage: 940 941$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ] 942 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h] 943 [-p patchfile ] 944$0 [-v] [-r returnaddress] [-A] [-ok | -okay | -nok | -nokay] 945 946 947Options: 948 949 -v Include Verbose configuration data in the report 950 -f File containing the body of the report. Use this to 951 quickly send a prepared message. 952 -p File containing a patch or other text attachment. Separate 953 multiple files with commas. 954 -F File to output the resulting mail message to, instead of mailing. 955 -S Send without asking for confirmation. 956 -a Address to send the report to. Defaults to '$address'. 957 -c Address to send copy of report to. Defaults to '$cc'. 958 -C Don't send copy to administrator. 959 -s Subject to include with the message. You will be prompted 960 if you don't supply one on the command line. 961 -b Body of the report. If not included on the command line, or 962 in a file with -f, you will get a chance to edit the message. 963 -r Your return address. The program will ask you to confirm 964 this if you don't give it here. 965 -e Editor to use. 966 -t Test mode. The target address defaults to '$testaddress'. 967 -T Thank-you mode. The target address defaults to '$thanksaddress'. 968 -d Data mode. This prints out your configuration data, without mailing 969 anything. You can use this with -v to get more complete data. 970 -A Don't send a bug received acknowledgement to the return address. 971 -ok Report successful build on this system to perl porters 972 (use alone or with -v). Only use -ok if *everything* was ok: 973 if there were *any* problems at all, use -nok. 974 -okay As -ok but allow report from old builds. 975 -nok Report unsuccessful build on this system to perl porters 976 (use alone or with -v). You must describe what went wrong 977 in the body of the report which you will be asked to edit. 978 -nokay As -nok but allow report from old builds. 979 -h Print this help message. 980 981EOF 982} 983 984sub filename { 985 if ($::HaveTemp) { 986 # Good. Use a secure temp file 987 my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1); 988 close($fh); 989 return $filename; 990 } else { 991 # Bah. Fall back to doing things less securely. 992 my $dir = File::Spec->tmpdir(); 993 $filename = "bugrep0$$"; 994 $filename++ while -e File::Spec->catfile($dir, $filename); 995 $filename = File::Spec->catfile($dir, $filename); 996 } 997} 998 999sub paraprint { 1000 my @paragraphs = split /\n{2,}/, "@_"; 1001 for (@paragraphs) { # implicit local $_ 1002 s/(\S)\s*\n/$1 /g; 1003 write; 1004 print "\n"; 1005 } 1006} 1007 1008sub _prompt { 1009 my ($explanation, $prompt, $default) = (@_); 1010 if ($explanation) { 1011 print "\n\n"; 1012 paraprint $explanation; 1013 } 1014 print $prompt. ($default ? " [$default]" :''). ": "; 1015 my $result = scalar(<>); 1016 chomp($result); 1017 $result =~ s/^\s*(.*?)\s*$/$1/s; 1018 if ($default && $result eq '') { 1019 return $default; 1020 } else { 1021 return $result; 1022 } 1023} 1024 1025sub _build_header { 1026 my %attr = (@_); 1027 1028 my $head = ''; 1029 for my $header (keys %attr) { 1030 $head .= "$header: ".$attr{$header}."\n"; 1031 } 1032 return $head; 1033} 1034 1035sub _message_headers { 1036 my %headers = ( To => $address, Subject => $subject ); 1037 $headers{'Cc'} = $cc if ($cc); 1038 $headers{'Message-Id'} = $messageid if ($messageid); 1039 $headers{'Reply-To'} = $from if ($from); 1040 $headers{'From'} = $from if ($from); 1041 if ($have_attachment) { 1042 $headers{'MIME-Version'} = '1.0'; 1043 $headers{'Content-Type'} = qq{multipart/mixed; boundary=\"$mime_boundary\"}; 1044 } 1045 return \%headers; 1046} 1047 1048sub _add_body_start { 1049 my $body_start = <<"BODY_START"; 1050This is a multi-part message in MIME format. 1051--$mime_boundary 1052Content-Type: text/plain; format=fixed 1053Content-Transfer-Encoding: 8bit 1054 1055BODY_START 1056 return $body_start; 1057} 1058 1059sub _add_attachments { 1060 my $attach = ''; 1061 for my $attachment (split /\s*,\s*/, $attachments) { 1062 my $attach_file = basename($attachment); 1063 $attach .= <<"ATTACHMENT"; 1064 1065--$mime_boundary 1066Content-Type: text/x-patch; name="$attach_file" 1067Content-Transfer-Encoding: 8bit 1068Content-Disposition: attachment; filename="$attach_file" 1069 1070ATTACHMENT 1071 1072 open my $attach_fh, '<:raw', $attachment 1073 or die "Couldn't open attachment '$attachment': $!\n"; 1074 while (<$attach_fh>) { $attach .= $_; } 1075 close($attach_fh) or die "Error closing attachment '$attachment': $!"; 1076 } 1077 1078 $attach .= "\n--$mime_boundary--\n"; 1079 return $attach; 1080} 1081 1082sub build_complete_message { 1083 my $content = _build_header(%{_message_headers()}) . "\n\n"; 1084 $content .= _add_body_start() if $have_attachment; 1085 open( REP, "<:raw", $filename ) or die "Couldn't open file '$filename': $!\n"; 1086 binmode(REP, ':raw :crlf') if $Is_MSWin32; 1087 while (<REP>) { $content .= $_; } 1088 close(REP) or die "Error closing report file '$filename': $!"; 1089 $content .= _add_attachments() if $have_attachment; 1090 return $content; 1091} 1092 1093sub save_message_to_disk { 1094 my $file = shift; 1095 1096 open OUTFILE, '>:raw', $file or do { warn "Couldn't open '$file': $!\n"; return undef}; 1097 binmode(OUTFILE, ':raw :crlf') if $Is_MSWin32; 1098 1099 print OUTFILE build_complete_message(); 1100 close(OUTFILE) or do { warn "Error closing $file: $!"; return undef }; 1101 print "\nMessage saved.\n"; 1102 return 1; 1103} 1104 1105sub _send_message_vms { 1106 1107 my $mail_from = $from; 1108 my $rcpt_to_to = $address; 1109 my $rcpt_to_cc = $cc; 1110 1111 map { $_ =~ s/^[^<]*<//; 1112 $_ =~ s/>[^>]*//; } ($mail_from, $rcpt_to_to, $rcpt_to_cc); 1113 1114 if ( open my $sff_fh, '|-:raw', 'MCR TCPIP$SYSTEM:TCPIP$SMTP_SFF.EXE SYS$INPUT:' ) { 1115 print $sff_fh "MAIL FROM:<$mail_from>\n"; 1116 print $sff_fh "RCPT TO:<$rcpt_to_to>\n"; 1117 print $sff_fh "RCPT TO:<$rcpt_to_cc>\n" if $rcpt_to_cc; 1118 print $sff_fh "DATA\n"; 1119 print $sff_fh build_complete_message(); 1120 my $success = close $sff_fh; 1121 if ($success ) { 1122 print "\nMessage sent\n"; 1123 return; 1124 } 1125 } 1126 die "Mail transport failed (leaving bug report in $filename): $^E\n"; 1127} 1128 1129sub _send_message_mailsend { 1130 my $msg = Mail::Send->new(); 1131 my %headers = %{_message_headers()}; 1132 for my $key ( keys %headers) { 1133 $msg->add($key => $headers{$key}); 1134 } 1135 1136 $fh = $msg->open; 1137 binmode($fh, ':raw'); 1138 print $fh _add_body_start() if $have_attachment; 1139 open(REP, "<:raw", $filename) or die "Couldn't open '$filename': $!\n"; 1140 binmode(REP, ':raw :crlf') if $Is_MSWin32; 1141 while (<REP>) { print $fh $_ } 1142 close(REP) or die "Error closing $filename: $!"; 1143 print $fh _add_attachments() if $have_attachment; 1144 $fh->close or die "Error sending mail: $!"; 1145 1146 print "\nMessage sent.\n"; 1147} 1148 1149sub _probe_for_sendmail { 1150 my $sendmail = ""; 1151 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { 1152 $sendmail = $_, last if -e $_; 1153 } 1154 if ( $^O eq 'os2' and $sendmail eq "" ) { 1155 my $path = $ENV{PATH}; 1156 $path =~ s:\\:/:; 1157 my @path = split /$Config{'path_sep'}/, $path; 1158 for (@path) { 1159 $sendmail = "$_/sendmail", last if -e "$_/sendmail"; 1160 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe"; 1161 } 1162 } 1163 return $sendmail; 1164} 1165 1166sub _send_message_sendmail { 1167 my $sendmail = _probe_for_sendmail(); 1168 unless ($sendmail) { 1169 my $message_start = !$Is_Linux && !$Is_OpenBSD ? <<'EOT' : <<'EOT'; 1170It appears that there is no program which looks like "sendmail" on 1171your system and that the Mail::Send library from CPAN isn't available. 1172EOT 1173It appears that there is no program which looks like "sendmail" on 1174your system. 1175EOT 1176 paraprint(<<"EOF"), die "\n"; 1177$message_start 1178Because of this, there's no easy way to automatically send your 1179message. 1180 1181A copy of your message has been saved in '$filename' for you to 1182send to '$address' with your normal mail client. 1183EOF 1184 } 1185 1186 open( SENDMAIL, "|-:raw", $sendmail, "-t", "-oi", "-f", $from ) 1187 || die "'|$sendmail -t -oi -f $from' failed: $!"; 1188 print SENDMAIL build_complete_message(); 1189 if ( close(SENDMAIL) ) { 1190 print "\nMessage sent\n"; 1191 } else { 1192 warn "\nSendmail returned status '", $? >> 8, "'\n"; 1193 } 1194} 1195 1196 1197 1198# a strange way to check whether any significant editing 1199# has been done: check whether any new non-empty lines 1200# have been added. 1201 1202sub _fingerprint_lines_in_report { 1203 my $new_lines = 0; 1204 # read in the report template once so that 1205 # we can track whether the user does any editing. 1206 # yes, *all* whitespace is ignored. 1207 1208 open(REP, '<:raw', $filename) or die "Unable to open report file '$filename': $!\n"; 1209 binmode(REP, ':raw :crlf') if $Is_MSWin32; 1210 while (my $line = <REP>) { 1211 $line =~ s/\s+//g; 1212 $new_lines++ if (!$REP{$line}); 1213 1214 } 1215 close(REP) or die "Error closing report file '$filename': $!"; 1216 # returns the number of lines with content that wasn't there when last we looked 1217 return $new_lines; 1218} 1219 1220 1221 1222format STDOUT = 1223^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ 1224$_ 1225. 1226 1227__END__ 1228 1229=head1 NAME 1230 1231perlbug - how to submit bug reports on Perl 1232 1233=head1 SYNOPSIS 1234 1235B<perlbug> 1236 1237B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]> 1238S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]> 1239S<[ B<-r> I<returnaddress> ]> 1240S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]> 1241S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]> S<[ B<-T> ]> 1242 1243B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]> 1244 S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]> 1245 1246=head1 DESCRIPTION 1247 1248 1249This program is designed to help you generate and send bug reports 1250(and thank-you notes) about perl5 and the modules which ship with it. 1251 1252In most cases, you can just run it interactively from a command 1253line without any special arguments and follow the prompts. 1254 1255If you have found a bug with a non-standard port (one that was not 1256part of the I<standard distribution>), a binary distribution, or a 1257non-core module (such as Tk, DBI, etc), then please see the 1258documentation that came with that distribution to determine the 1259correct place to report bugs. 1260 1261If you are unable to send your report using B<perlbug> (most likely 1262because your system doesn't have a way to send mail that perlbug 1263recognizes), you may be able to use this tool to compose your report 1264and save it to a file which you can then send to B<perlbug@perl.org> 1265using your regular mail client. 1266 1267In extreme cases, B<perlbug> may not work well enough on your system 1268to guide you through composing a bug report. In those cases, you 1269may be able to use B<perlbug -d> to get system configuration 1270information to include in a manually composed bug report to 1271B<perlbug@perl.org>. 1272 1273 1274When reporting a bug, please run through this checklist: 1275 1276=over 4 1277 1278=item What version of Perl you are running? 1279 1280Type C<perl -v> at the command line to find out. 1281 1282=item Are you running the latest released version of perl? 1283 1284Look at http://www.perl.org/ to find out. If you are not using the 1285latest released version, please try to replicate your bug on the 1286latest stable release. 1287 1288Note that reports about bugs in old versions of Perl, especially 1289those which indicate you haven't also tested the current stable 1290release of Perl, are likely to receive less attention from the 1291volunteers who build and maintain Perl than reports about bugs in 1292the current release. 1293 1294This tool isn't appropriate for reporting bugs in any version 1295prior to Perl 5.0. 1296 1297=item Are you sure what you have is a bug? 1298 1299A significant number of the bug reports we get turn out to be 1300documented features in Perl. Make sure the issue you've run into 1301isn't intentional by glancing through the documentation that comes 1302with the Perl distribution. 1303 1304Given the sheer volume of Perl documentation, this isn't a trivial 1305undertaking, but if you can point to documentation that suggests 1306the behaviour you're seeing is I<wrong>, your issue is likely to 1307receive more attention. You may want to start with B<perldoc> 1308L<perltrap> for pointers to common traps that new (and experienced) 1309Perl programmers run into. 1310 1311If you're unsure of the meaning of an error message you've run 1312across, B<perldoc> L<perldiag> for an explanation. If the message 1313isn't in perldiag, it probably isn't generated by Perl. You may 1314have luck consulting your operating system documentation instead. 1315 1316If you are on a non-UNIX platform B<perldoc> L<perlport>, as some 1317features may be unimplemented or work differently. 1318 1319You may be able to figure out what's going wrong using the Perl 1320debugger. For information about how to use the debugger B<perldoc> 1321L<perldebug>. 1322 1323=item Do you have a proper test case? 1324 1325The easier it is to reproduce your bug, the more likely it will be 1326fixed -- if nobody can duplicate your problem, it probably won't be 1327addressed. 1328 1329A good test case has most of these attributes: short, simple code; 1330few dependencies on external commands, modules, or libraries; no 1331platform-dependent code (unless it's a platform-specific bug); 1332clear, simple documentation. 1333 1334A good test case is almost always a good candidate to be included in 1335Perl's test suite. If you have the time, consider writing your test case so 1336that it can be easily included into the standard test suite. 1337 1338=item Have you included all relevant information? 1339 1340Be sure to include the B<exact> error messages, if any. 1341"Perl gave an error" is not an exact error message. 1342 1343If you get a core dump (or equivalent), you may use a debugger 1344(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug 1345report. 1346 1347NOTE: unless your Perl has been compiled with debug info 1348(often B<-g>), the stack trace is likely to be somewhat hard to use 1349because it will most probably contain only the function names and not 1350their arguments. If possible, recompile your Perl with debug info and 1351reproduce the crash and the stack trace. 1352 1353=item Can you describe the bug in plain English? 1354 1355The easier it is to understand a reproducible bug, the more likely 1356it will be fixed. Any insight you can provide into the problem 1357will help a great deal. In other words, try to analyze the problem 1358(to the extent you can) and report your discoveries. 1359 1360=item Can you fix the bug yourself? 1361 1362If so, that's great news; bug reports with patches are likely to 1363receive significantly more attention and interest than those without 1364patches. Please attach your patch to the report using the C<-p> option. 1365When sending a patch, create it using C<git format-patch> if possible, 1366though a unified diff created with C<diff -pu> will do nearly as well. 1367 1368Your patch may be returned with requests for changes, or requests for more 1369detailed explanations about your fix. 1370 1371Here are a few hints for creating high-quality patches: 1372 1373Make sure the patch is not reversed (the first argument to diff is 1374typically the original file, the second argument your changed file). 1375Make sure you test your patch by applying it with C<git am> or the 1376C<patch> program before you send it on its way. Try to follow the 1377same style as the code you are trying to patch. Make sure your patch 1378really does work (C<make test>, if the thing you're patching is covered 1379by Perl's test suite). 1380 1381=item Can you use C<perlbug> to submit the report? 1382 1383B<perlbug> will, amongst other things, ensure your report includes 1384crucial information about your version of perl. If C<perlbug> is 1385unable to mail your report after you have typed it in, you may have 1386to compose the message yourself, add the output produced by C<perlbug 1387-d> and email it to B<perlbug@perl.org>. If, for some reason, you 1388cannot run C<perlbug> at all on your system, be sure to include the 1389entire output produced by running C<perl -V> (note the uppercase V). 1390 1391Whether you use C<perlbug> or send the email manually, please make 1392your Subject line informative. "a bug" is not informative. Neither 1393is "perl crashes" nor is "HELP!!!". These don't help. A compact 1394description of what's wrong is fine. 1395 1396=item Can you use C<perlbug> to submit a thank-you note? 1397 1398Yes, you can do this by using the C<-T> option. 1399Thank-you notes are good. It makes people 1400smile. 1401 1402=back 1403 1404Having done your bit, please be prepared to wait, to be told the 1405bug is in your code, or possibly to get no reply at all. The 1406volunteers who maintain Perl are busy folks, so if your problem is 1407an obvious bug in your own code, is difficult to understand or is 1408a duplicate of an existing report, you may not receive a personal 1409reply. 1410 1411If it is important to you that your bug be fixed, do monitor the 1412perl5-porters@perl.org mailing list (mailing lists are moderated, your 1413message may take a while to show up) and the commit logs to development 1414versions of Perl, and encourage the maintainers with kind words or 1415offers of frosty beverages. (Please do be kind to the maintainers. 1416Harassing or flaming them is likely to have the opposite effect of the 1417one you want.) 1418 1419Feel free to update the ticket about your bug on http://rt.perl.org 1420if a new version of Perl is released and your bug is still present. 1421 1422=head1 OPTIONS 1423 1424=over 8 1425 1426=item B<-a> 1427 1428Address to send the report to. Defaults to B<perlbug@perl.org>. 1429 1430=item B<-A> 1431 1432Don't send a bug received acknowledgement to the reply address. 1433Generally it is only a sensible to use this option if you are a 1434perl maintainer actively watching perl porters for your message to 1435arrive. 1436 1437=item B<-b> 1438 1439Body of the report. If not included on the command line, or 1440in a file with B<-f>, you will get a chance to edit the message. 1441 1442=item B<-C> 1443 1444Don't send copy to administrator. 1445 1446=item B<-c> 1447 1448Address to send copy of report to. Defaults to the address of the 1449local perl administrator (recorded when perl was built). 1450 1451=item B<-d> 1452 1453Data mode (the default if you redirect or pipe output). This prints out 1454your configuration data, without mailing anything. You can use this 1455with B<-v> to get more complete data. 1456 1457=item B<-e> 1458 1459Editor to use. 1460 1461=item B<-f> 1462 1463File containing the body of the report. Use this to quickly send a 1464prepared message. 1465 1466=item B<-F> 1467 1468File to output the results to instead of sending as an email. Useful 1469particularly when running perlbug on a machine with no direct internet 1470connection. 1471 1472=item B<-h> 1473 1474Prints a brief summary of the options. 1475 1476=item B<-ok> 1477 1478Report successful build on this system to perl porters. Forces B<-S> 1479and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only 1480prompts for a return address if it cannot guess it (for use with 1481B<make>). Honors return address specified with B<-r>. You can use this 1482with B<-v> to get more complete data. Only makes a report if this 1483system is less than 60 days old. 1484 1485=item B<-okay> 1486 1487As B<-ok> except it will report on older systems. 1488 1489=item B<-nok> 1490 1491Report unsuccessful build on this system. Forces B<-C>. Forces and 1492supplies a value for B<-s>, then requires you to edit the report 1493and say what went wrong. Alternatively, a prepared report may be 1494supplied using B<-f>. Only prompts for a return address if it 1495cannot guess it (for use with B<make>). Honors return address 1496specified with B<-r>. You can use this with B<-v> to get more 1497complete data. Only makes a report if this system is less than 60 1498days old. 1499 1500=item B<-nokay> 1501 1502As B<-nok> except it will report on older systems. 1503 1504=item B<-p> 1505 1506The names of one or more patch files or other text attachments to be 1507included with the report. Multiple files must be separated with commas. 1508 1509=item B<-r> 1510 1511Your return address. The program will ask you to confirm its default 1512if you don't use this option. 1513 1514=item B<-S> 1515 1516Send without asking for confirmation. 1517 1518=item B<-s> 1519 1520Subject to include with the message. You will be prompted if you don't 1521supply one on the command line. 1522 1523=item B<-t> 1524 1525Test mode. The target address defaults to B<perlbug-test@perl.org>. 1526 1527=item B<-T> 1528 1529Send a thank-you note instead of a bug report. 1530 1531=item B<-v> 1532 1533Include verbose configuration data in the report. 1534 1535=back 1536 1537=head1 AUTHORS 1538 1539Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently 1540I<doc>tored by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>), 1541Tom Christiansen (E<lt>tchrist@perl.comE<gt>), Nathan Torkington 1542(E<lt>gnat@frii.comE<gt>), Charles F. Randall (E<lt>cfr@pobox.comE<gt>), 1543Mike Guy (E<lt>mjtg@cam.ac.ukE<gt>), Dominic Dunlop 1544(E<lt>domo@computer.orgE<gt>), Hugo van der Sanden (E<lt>hv@crypt.orgE<gt>), 1545Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor 1546(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>, 1547Richard Foley (E<lt>richard.foley@rfi.netE<gt>), Jesse Vincent 1548(E<lt>jesse@bestpractical.comE<gt>), and Craig A. Berry (E<lt>craigberry@mac.comE<gt>). 1549 1550=head1 SEE ALSO 1551 1552perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1), 1553diff(1), patch(1), dbx(1), gdb(1) 1554 1555=head1 BUGS 1556 1557None known (guess what must have been used to report them?) 1558 1559=cut 1560 1561!NO!SUBS! 1562 1563close OUT or die "Can't close $file: $!"; 1564chmod 0755, $file or die "Can't reset permissions for $file: $!\n"; 1565exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':'; 1566chdir $origdir; 1567