--- deliantra/Deliantra-Client/DC.pm 2006/10/09 01:06:36 1.123 +++ deliantra/Deliantra-Client/DC.pm 2006/11/07 22:41:27 1.126 @@ -17,7 +17,7 @@ use Carp (); BEGIN { - $VERSION = '0.52'; + $VERSION = '0.95'; use XSLoader; XSLoader::load "CFPlus", $VERSION; @@ -79,12 +79,7 @@ my $pid = fork; if (defined $pid && !$pid) { - $SIG{__DIE__} = sub { - my $msg = $_[0]; - $msg =~ s/\n+/\n/; - warn "FATAL: $msg"; - CFPlus::_exit 99; - }; + local $SIG{__DIE__}; open STDOUT, ">&", $fh_w; open STDERR, ">&", $fh_w; @@ -93,26 +88,34 @@ $| = 1; - $cb->(); + eval { $cb->() }; + + if ($@) { + my $msg = $@; + $msg =~ s/\n+/\n/; + warn "FATAL: $msg"; + CFPlus::_exit 1; + } # win32 is fucked up, of course. exit will clean stuff up, # which destroys our database etc. _exit will exit ALL # forked processes, because of the dreaded fork emulation. - CFPlus::_exit 0; + CFPlus::_exit 0; } close $fh_w; my $buffer; - Event->io (fd => $fh_r, poll => 'r', cb => sub { + my $w; $w = AnyEvent->io (fh => $fh_r, poll => 'r', cb => sub { unless (sysread $fh_r, $buffer, 4096, length $buffer) { - $_[0]->w->cancel; + undef $w; $buffer .= "done\n"; } while ($buffer =~ s/^(.*)\n//) { my $line = $1; + $line =~ s/\s+$//; utf8::decode $line; ::message ({ markup => "editor($pid): " . CFPlus::asxml $line,