summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/Scire.pm46
1 files changed, 45 insertions, 1 deletions
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;