#!/usr/local/bin/perl use Config; use File::Basename qw(&basename &dirname); # List explicitly here the variables you want Configure to # generate. Metaconfig only looks for shell variables, so you # have to mention them as if they were shell variables, not # %Config entries. Thus you write # $startperl # to ensure Configure will look for $Config{startperl}. # This forces PL files to create target in same directory as PL file. # This is so that make depend always knows where to find PL derivatives. chdir(dirname($0)); ($file = basename($0)) =~ s/\.PL$//; $file =~ s/\.pl$// if ($Config{'osname'} eq 'VMS' or $Config{'osname'} eq 'OS2'); # "case-forgiving" open OUT,">$file" or die "Can't create $file: $!"; print "Extracting $file (with variable substitutions)\n"; # In this section, perl variables will be expanded during extraction. # You can use $Config{...} to use Configure variables. print OUT <<"!GROK!THIS!"; $Config{'startperl'} eval 'exec perl -S \$0 "\$@"' if 0; !GROK!THIS! # In the following, perl variables are not expanded during extraction. print OUT <<'!NO!SUBS!'; use Config; use Getopt::Std; BEGIN { eval "use Mail::Send;"; $::HaveSend = ($@ eq ""); eval "use Mail::Util;"; $::HaveUtil = ($@ eq ""); }; use strict; sub paraprint; my($Version) = "1.12"; # Changed in 1.06 to skip Mail::Send and Mail::Util if not available. # Changed in 1.07 to see more sendmail execs, and added pipe output. # Changed in 1.08 to use correct address for sendmail. # Changed in 1.09 to close the REP file before calling it up in the editor. # Also removed some old comments duplicated elsewhere. # Changed in 1.10 to run under VMS without Mail::Send; also fixed # temp filename generation. # Changed in 1.11 to clean up some text and removed Mail::Send deactivator. # Changed in 1.12 to check for editor errors, make save/send distinction # clearer and add $ENV{REPLYTO}. # TODO: Allow the user to re-name the file on mail failure, and # make sure failure (transmission-wise) of Mail::Send is # accounted for. my( $file, $cc, $address, $perlbug, $testaddress, $filename, $subject, $from, $verbose, $ed, $fh, $me, $Is_VMS, $msg, $body, $andcc ); Init(); if($::opt_h) { Help(); exit; } if($::opt_d or !-t STDOUT) { Dump(*STDOUT); exit; } Query(); Edit(); NowWhat(); Send(); exit; sub Init { # -------- Setup -------- $Is_VMS = $::Config{'osname'} eq 'VMS'; getopts("dhva:s:b:f:r:e:SCc:t"); # This comment is needed to notify metaconfig that we are # using the $perladmin, $cf_by, and $cf_time definitions. # -------- Configuration --------- # perlbug address $perlbug = 'perlbug@perl.com'; # Test address $testaddress = 'perlbug-test@perl.com'; # Target address $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug); # Possible administrator addresses, in order of confidence # (Note that cf_email is not mentioned to metaconfig, since # we don't really want it. We'll just take it if we have to.) $cc = ($::opt_C ? "" : ( $::opt_c || $::Config{perladmin} || $::Config{cf_email} || $::Config{cf_by} )); # Users address, used in message and in Reply-To header $from = $::opt_r || ""; # Include verbose configuration information $verbose = $::opt_v || 0; # Subject of bug-report message $subject = $::opt_s || ""; # File to send as report $file = $::opt_f || ""; # Body of report $body = $::opt_b || ""; # Editor $ed = ($::opt_f ? "file" : ( $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} || ($Is_VMS ? "edit/tpu" : "vi") )); # My username $me = getpwuid($<); } sub Query { # Explain what perlbug is paraprint <; chop $subject; my($err)=0; while( $subject =~ /^\s*$/ ) { print "\nPlease enter a subject: "; $subject = <>; chop $subject; if($err++>5) { die "Aborting.\n"; } } } # Prompt for return address, if needed if( !$from) { # Try and guess return address my($domain); if($::HaveUtil) { $domain = Mail::Util::maildomain(); } elsif ($Is_VMS) { require Sys::Hostname; $domain = Sys::Hostname::hostname(); } else { $domain = `hostname`.".".`domainname`; $domain =~ s/[\r\n]+//g; } my($guess); if( !$domain) { $guess = ""; } elsif ($Is_VMS && !$::Config{'d_has_sockets'}) { $guess = "$domain\:\:$me"; } else { $guess = "$me\@$domain" if $domain; $guess = "$me\@unknown.addresss" unless $domain; } $guess = $ENV{'REPLYTO'} if defined($ENV{'REPLYTO'}); $guess = $ENV{"REPLY-TO"} if defined($ENV{'REPLY-TO'}); if( $guess ) { paraprint <; chop $from; if($from eq "") { $from = $guess } } #if( $from =~ /^(.*)\@(.*)$/ ) { # $mailname = $1; # $maildomain = $2; #} if( $from eq $cc or $me eq $cc ) { # Try not to copy ourselves $cc = "yourself"; } # Prompt for administrator address, unless an override was given if( !$::opt_C and !$::opt_c ) { paraprint <); chop $entry; if($entry ne "") { $cc = $entry; if($me eq $cc) { $cc = "" } } } if($cc =~ /^(none|yourself|myself|ourselves)$/i) { $cc = "" } $andcc = " and $cc" if $cc; # Prompt for editor, if no override is given if(! $::opt_e and ! $::opt_f and ! $::opt_b) { paraprint <); chop $entry; if($entry ne "") { $ed = $entry; } } # Generate scratch file to edit report in { my($dir) = $Is_VMS ? 'sys$scratch:' : '/tmp/'; $filename = "bugrep0$$"; $filename++ while -e "$dir$filename"; $filename = "$dir$filename"; } # Prompt for file to read report from, if needed if( $ed eq "file" and ! $file) { paraprint <); chop($entry); if(!-f $entry or !-r $entry) { print "\n\nUnable to read from `$entry'.\nExiting.\n"; exit; } $file = $entry; } # Generate report open(REP,">$filename"); print REP <) { print REP $_ } close(F); } else { print REP "[Please enter your report here]\n"; } Dump(*REP); close(REP); } sub Dump { local(*OUT) = @_; print OUT <); chop $entry; if($entry ne "") { $ed = $entry; goto tryagain; } else { paraprint <); chop $action; if( $action =~ /^(f|sa)/i ) { # ile/ve print "\n\nName of file to save message in [perlbug.rep]: "; my($file) = scalar(<>); chop $file; if($file eq "") { $file = "perlbug.rep" } open(FILE,">$file"); open(REP,"<$filename"); print FILE "To: $address\nSubject: $subject\n"; print FILE "Cc: $cc\n" if $cc; print FILE "Reply-To: $from\n" if $from; print FILE "\n"; while() { print FILE } close(REP); close(FILE); print "\nMessage saved in `$file'.\n"; exit; } elsif( $action =~ /^(d|l|sh)/i ) { # isplay, ist, ow # Display the message open(REP,"<$filename"); while() { print $_ } close(REP); } elsif( $action =~ /^s/i ) { # end # Send the message last; } elsif( $action =~ /^[er]/i ) { # dit, e-edit # edit the message Edit(); #system("$ed $filename"); } elsif( $action =~ /^[qc]/i ) { # ancel, uit 1 while unlink($filename); # remove all versions under VMS print "\nCancelling.\n"; exit(0); } } } } sub Send { # Message has been accepted for transmission -- Send the message if($::HaveSend) { $msg = new Mail::Send Subject => $subject, To => $address; $msg->cc($cc) if $cc; $msg->add("Reply-To",$from) if $from; $fh = $msg->open; open(REP,"<$filename"); while() { print $fh $_ } close(REP); $fh->close; } else { if ($Is_VMS) { if ( ($address =~ /@/ and $address !~ /^\w+%"/) or ($cc =~ /@/ and $cc !~ /^\w+%"/) ){ my($prefix); foreach (qw[ IN MX SMTP UCX PONY WINS ],'') { $prefix = "$_%",last if $ENV{"MAIL\$PROTOCOL_$_"}; } $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; } $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g; my($sts) = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); if (!($sts & 1)) { die "Can't spawn off mail\n\t(leaving bug report in $filename): $sts\n;" } } else { my($sendmail) = ""; foreach (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { $sendmail = $_, last if -e $_; } paraprint <<"EOF" and die "\n" if $sendmail eq ""; I am terribly sorry, but I cannot find sendmail, or a close equivalent, and the perl package Mail::Send has not been installed, so I can't send your bug report. We apologize for the inconveniencence. So you may attempt to find some way of sending your message, it has been left in the file `$filename'. EOF open(SENDMAIL,"|$sendmail -t"); print SENDMAIL "To: $address\n"; print SENDMAIL "Subject: $subject\n"; print SENDMAIL "Cc: $cc\n" if $cc; print SENDMAIL "Reply-To: $from\n" if $from; print SENDMAIL "\n\n"; open(REP,"<$filename"); while() { print SENDMAIL $_ } close(REP); close(SENDMAIL); } } print "\nMessage sent.\n"; 1 while unlink($filename); # remove all versions under VMS } sub Help { print <