xref: /openbsd/gnu/usr.bin/perl/utils/perlbug.PL (revision 5af055cd)
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