X-Git-Url: http://git.ieval.ro/?p=gruntmaster-daemon.git;a=blobdiff_plain;f=lib%2FGruntmaster%2FDaemon%2FFormat%2FCPP.pm;fp=lib%2FGruntmaster%2FDaemon%2FFormat%2FCPP.pm;h=0000000000000000000000000000000000000000;hp=96e9ddabcd4670979e4410ce54c6fee1f5ee3952;hb=ddceb393c90f620dd194c22e5e85d8c9fe87ee34;hpb=e3a3697ae29ae07d285d138b382c364136de0999 diff --git a/lib/Gruntmaster/Daemon/Format/CPP.pm b/lib/Gruntmaster/Daemon/Format/CPP.pm deleted file mode 100644 index 96e9dda..0000000 --- a/lib/Gruntmaster/Daemon/Format/CPP.pm +++ /dev/null @@ -1,69 +0,0 @@ -package Gruntmaster::Daemon::Format::CPP; - -use 5.014000; -use strict; -use warnings; - -use POSIX qw//; -use File::Basename qw/fileparse/; -use Gruntmaster::Daemon::Constants qw/TLE OLE DIED NZX/; -use Log::Log4perl qw/get_logger/; -use Time::HiRes qw/alarm/; -use List::MoreUtils qw/natatime/; -use IPC::Signal qw/sig_name sig_num/; -use IPC::Open3 qw/open3/; -use File::Spec::Functions qw/devnull/; -use Fcntl qw/F_GETFD F_SETFD FD_CLOEXEC/; - -our $VERSION = '0.001'; - -################################################## - -sub prepare{ - my $name = $_[0]; - my $basename = fileparse $name, qr/\.[^.]*/; - get_logger->trace("Preparing file $name..."); - - open my $devnull, devnull; - open my $errors, '>>compile-error'; - my $ret = open3 $devnull, $errors, undef, 'gruntmaster-compile', CPP => $basename, $name; - waitpid $ret, 0; - close $devnull; - close $errors; - die 'Compile error' if $? -} - -sub run{ - my ($name, %args) = @_; - my $basename = fileparse $name, qr/\.[^.]*/; - my $ret = fork // die 'Cannot fork'; - if ($ret) { - my $tle; - local $SIG{ALRM} = sub { kill KILL => $ret; $tle = 1}; - alarm $args{timeout} if exists $args{timeout}; - wait; - alarm 0; - my $sig = $? & 127; - my $signame = sig_name $sig; - die [TLE, "Time Limit Exceeded"] if $tle; - die [OLE, 'Output Limit Exceeded'] if $sig && $signame eq 'XFSZ'; - die [DIED, "Crash (SIG$signame)"] if $sig; - die [NZX, "Non-zero exit status: " . ($? >> 8)] if $?; - } else { - my @fds = exists $args{fds} ? @{$args{fds}} : (); - $^F = 50; - POSIX::close $_ for 0 .. $^F; - my $it = natatime 2, @fds; - while (my ($fd, $file) = $it->()) { - open my $fh, $file or die $!; - my $oldfd = fileno $fh; - if ($oldfd != $fd) { - POSIX::dup2 $oldfd, $fd or die $!; - POSIX::close $oldfd or die $!; - } - } - exec 'gruntmaster-exec', $args{mlimit} // 0, $args{olimit} // 0, "./$basename", exists $args{args} ? @{$args{args}} : (); - } -} - -1