Update of /cvsroot/fink/fink/perlmod/Fink
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16019

Modified Files:
        CLI.pm ChangeLog 
Log Message:
fix open-modes issue

Index: CLI.pm
===================================================================
RCS file: /cvsroot/fink/fink/perlmod/Fink/CLI.pm,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- CLI.pm      21 Mar 2006 20:53:26 -0000      1.41
+++ CLI.pm      23 Mar 2006 03:52:47 -0000      1.42
@@ -24,7 +24,8 @@
 package Fink::CLI;
 
 use Carp;
-use Fcntl qw(:seek);
+use File::Temp qw(tempfile);
+use Fcntl qw(:seek :DEFAULT);
 use IO::Handle;
 
 use strict;
@@ -667,35 +668,56 @@
 
 =cut
 
+{ # Simple logging, for when normal out/err aren't available
+       my $capterr_dir = '/tmp'; # set to undef for production, path for debug
+       my $capterr;
+       if (defined $capterr_dir) {
+               ($capterr) = tempfile("capture.XXXXX", DIR => $capterr_dir,
+                       UNLINK => 0);
+               $capterr->autoflush(1);
+       }
+       sub _fh_log { print $capterr @_, "\n\n" if defined $capterr }
+}
+       
+# Die, printing to a log FH (in addition to stderr)
+sub _fh_die {
+       my $msg = shift;
+       _fh_log(Carp::longmess($msg));
+       die $msg;
+}
+
+# Save a filehandle
 # my $saved = _fh_save \*FH;
 sub _fh_save {
        my ($fh, $scalar) = @_;
-       die "Argument must be a scalar ref"
+       _fh_die "Argument must be a scalar ref"
                unless ref($scalar) && ref($scalar) eq 'SCALAR';
-       open my $save, '>&', $fh or die "Can't save filehandle: $!";
-       close $fh or die "Can't temporarily close filehandle: $!";
+       open my $save, '>&', $fh or _fh_die "Can't save filehandle: $!";
+       close $fh or _fh_die "Can't temporarily close filehandle: $!";
        return $save;
 }
 
+# Reading a filehandle, then restore to the saved FH 
 # _fh_restore \*FH, $save, \$read_into;  Last arg optional
 sub _fh_restore {
        my ($fh, $save, $into) = @_;
        if (defined $into) {
-               $fh->flush or die "Can't flush: $!";
-               seek $fh, 0, SEEK_SET or die "Can't seek: $!";
+               $fh->flush or _fh_die "Can't flush: $!";
+               seek $fh, 0, SEEK_SET or _fh_die "Can't seek: $!";
                $$into = join('', <$fh>);
-               die "Can't read filehandle: $!" if $fh->error;
+               _fh_die "Can't read filehandle: $!" if $fh->error;
        }
-       close $fh or die "Can't close filehandle: $!";
+       close $fh or _fh_die "Can't close filehandle: $!";
        
-       # It appears perl ignores more permissive modes for STD*, so '+>&' is ok
-       open $fh, '+>&', $save or die "Can't reopen filehandle: $!";
-       close $save or die "Can't close saved filehandle: $!";
+       # Try not to use an excessive open mode
+       my $mode = (fcntl($save, F_GETFL, 0) & O_RDWR) ? '+>&' : '>&';
+       open $fh, $mode, $save or _fh_die "Can't reopen filehandle: $!";
+       close $save or _fh_die "Can't close saved filehandle: $!";
 }      
 
 sub capture (&$;$) {
        my ($code, $out, $err, @toomany) = @_;
-       die "Too many arguments!" if @toomany;
+       _fh_die "Too many arguments!" if @toomany;
        my ($die, $ret, $setupok);
        my $array = wantarray;
        
@@ -703,15 +725,15 @@
        my ($savout, $saverr);
        if (defined $out) {
                $savout = _fh_save(*STDOUT{IO}, $out); # ok to die
-               open STDOUT, '+>', undef or die "Can't reopen STDOUT: $!";
+               open STDOUT, '+>', undef or _fh_die "Can't reopen STDOUT: $!";
        }
        eval { # cleanup stdout if error within this block
                if (defined $err) {
                        $saverr = _fh_save(*STDERR{IO}, $err);
                        if ($out eq $err) {
-                               open STDERR, '>&', STDOUT or die "Can't merge 
STDERR: $!";
+                               open STDERR, '>&', STDOUT or _fh_die "Can't 
merge STDERR: $!";
                        } else {
-                               open STDERR, '+>', undef or die "Can't reopen 
STDERR: $!";
+                               open STDERR, '+>', undef or _fh_die "Can't 
reopen STDERR: $!";
                        }
                }
                $setupok = 1; # Now ok to save output
@@ -728,7 +750,7 @@
        _fh_restore(*STDOUT{IO}, $savout, $setupok ? $out : ()) if defined 
$savout;
        
        # Finish up
-       die $die if $die;
+       _fh_die $die if $die;
        return $array ? @$ret : $ret;
 }
 

Index: ChangeLog
===================================================================
RCS file: /cvsroot/fink/fink/perlmod/Fink/ChangeLog,v
retrieving revision 1.1297
retrieving revision 1.1298
diff -u -d -r1.1297 -r1.1298
--- ChangeLog   22 Mar 2006 23:25:24 -0000      1.1297
+++ ChangeLog   23 Mar 2006 03:52:47 -0000      1.1298
@@ -1,3 +1,7 @@
+2006-03-22  Dave Vasilevsky  <[EMAIL PROTECTED]>
+
+       * CLI.pm: Add logging to &capture, fix open-modes problem. 
+
 2006-03-22  Benjamin Reed  <[EMAIL PROTECTED]>
 
        * VirtPackage.pm: fix cctools-single-module to use a check against the



-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Fink-commits mailing list
Fink-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fink-commits

Reply via email to