From 21186444cd1411fbba30bbf274a3c8aaf6b060da Mon Sep 17 00:00:00 2001 From: Andrew Gaffney Date: Sun, 6 Jan 2008 08:09:17 +0000 Subject: fill out run() a bit more svn path=/branches/new-fu/; revision=333 --- client/Scire.pm | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/client/Scire.pm b/client/Scire.pm index 455c8b1..deedcb6 100644 --- a/client/Scire.pm +++ b/client/Scire.pm @@ -1,5 +1,8 @@ package Scire::Job; +use POSIX qw/WEXITSTATUS WIFEXITED waitpid/; +use IPC::Open3 (open3); + sub new { my $proto = shift; my $class = ref($proto) || $proto; @@ -33,9 +36,50 @@ sub load_jobfile { } } +sub set_stdout_file { + my ($self, $outfile) = @_; + if(defined $outfile && $outfile) { + $self->{stdout_filename} = $outfile; + } +} + +sub set_stderr_file { + my ($self, $errfile) = @_; + if(defined $errfile && $errfile) { + $self->{stderr_filename} = $errfile; + } +} + sub run { - my ($self, $outfile, $errfile) = @_; + my $self = shift; + # XXX: write $self->{script_data} out to a file and mark it +x. We'll need + # to find a good location for this, since it can't be noexec. Perhaps the + # queue dir in the job directory will do, or maybe it will be configurable + + my $pid = fork(); + if($fork) { + # XXX: eventually, we'll move the waitpid() call to another function + # called something like is_running() and use WNOHANG instead of blocking + waitpid($pid, 0); + my $status = $?; + my $exitcode = -1; + if(WIFEXITED($status)) { + my $exitcode = WEXITSTATUS($status); + } + return $exitcode; + } else { + # XXX: we'll use setuid to drop privileges here + if(defined $self->{stdout_filename}) { + open STDOUT, '>', $self->{stdout_filename}; + } + if(defined $self->{stderr_filename}) { + open STDERR, '>', $self->{stderr_filename}; + } + # XXX: exec() to run our command. our STDOUT and STDERR have been + # redirected to the files specified, and the exit code is returned + # to the main process when we're done executing + } } package Scire::Communicator; -- cgit v1.2.3-65-gdbad