- $pwd = $cwd;
- }
- 1;
-}) { # (Socket::MsgHdr|Inline::C), $sock, $pwd are all available:
- $ENV{PWD} = $pwd;
- my $buf = join("\0", scalar(@ARGV), @ARGV);
- while (my ($k, $v) = each %ENV) { $buf .= "\0$k=$v" }
- $buf .= "\0\0";
- $send_cmd->($sock, [ 0, 1, 2 ], $buf, MSG_EOR);
- $SIG{TERM} = $SIG{INT} = $SIG{QUIT} = sub {
- my ($sig) = @_; # 'TERM', not an integer :<
- $SIG{$sig} = 'DEFAULT';
- kill($sig, $$); # exit($signo + 128)
- };
- my $x_it_code = 0;
- while (1) {
- my (@fds) = $recv_cmd->($sock, $buf, 4096 * 33);
- if (scalar(@fds) == 1 && !defined($fds[0])) {
- last if $! == ECONNRESET;
- next if $! == EINTR;
- die "recvmsg: $!";
- }
- last if $buf eq '';
- if ($buf =~ /\Ax_it ([0-9]+)\z/) {
- $x_it_code = $1 + 0;
- last;
- } elsif ($buf =~ /\Aexec (.+)\z/) {
- exec_cmd(\@fds, split(/\0/, $1));
- } else {
- sigchld();
- die $buf;
- }