@rem = '--*-Perl-*-- @echo off if "%OS%" == "Windows_NT" goto WinNT perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 goto endofperl :WinNT perl -x -S %0 %* if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl if %errorlevel% == 9009 echo You do not have Perl in your PATH. if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul goto endofperl @rem '; #!/usr/bin/perl -w #line 15 use strict; # Since perl last read DATA w/o binmode, this value could be a byte or few # too high. So we call tell() before reading from ... (see below) my $pos= tell( DATA ) or die "Can't tell(DATA): $!\n"; my $label= .'' or die "Found no label in DATA\n"; my @env= ; my( $pid )= map { $ENV{$1}= $2 if /(\w+)=([^\r\n]*)/; /PID=(\d+)/; } @env; if( $pid && kill 0, $pid ) { for my $line ( qx< ssh-add -l > ) { if( $line =~ /^\d/ ) { printf "Using %s\n", ( split ' ', $line )[2]; } else { print $line; } } exit; } @env= grep { if( s{(\w+)=([^;]+);.*}{set $1=$2\r} ) { $ENV{$1}= $2; 1; } else { 0; } } qx< ssh-agent @ARGV >; system( "ssh-add" ); open DATA, "+<", $0 or die "Can't re-open $0: $!\n"; binmode DATA or warn "re-binmode DATA failed: $!\n"; # ...(see above) Seek to the start of the ":endofperl" label, or perhaps a few # bytes past the start of it due to non-binmode reading of DATA by perl... seek( DATA, $pos, 0 ) or die "Can't seek DATA: $!\n"; # ... read to the end of the label /in binmode/ so tell() will be exact. $label= ; seek( DATA, 0, 1 ) or die "Can't re-seek DATA: $!\n"; print DATA @env; $pos= tell( DATA ) or die "Can't re-tell(DATA): $!\n"; truncate( DATA, $pos ) or die "Can't truncate DATA: $!\n"; __END__ :endofperl