package MDV::Draklive::Utils; use MDK::Common; use run_program; use IPC::Open3; use IO::Select; use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(directory_usage run_ run_foreach); sub directory_usage { first(split /\s/, `du -sb $_[0]`) } #- expand only if the pattern contains '*' #- and matches dot characters (like shell dotglob) sub glob__ { my ($pattern) = @_; $pattern =~ /\*/ ? glob_($pattern) : $pattern; } sub run_ { my $options = ref $_[0] eq 'HASH' ? shift @_ : {}; my @cmd = @_; $options->{timeout} ||= 'never'; my $setarch = delete $options->{setarch}; unshift @cmd, 'setarch', $setarch if $setarch; print STDERR "running " . (exists $options->{root} && "(in chroot) ") . join(' ', @cmd) . "\n"; run_program::raw($options, @cmd); } sub run_foreach { my ($foreach, @command) = @_; print STDERR "running " . join(' ', @command) . "\n"; my $pid = open3(my $cmd_in, my $cmd_out, undef, @command); my $selector = IO::Select->new($cmd_out); while (my @ready = $selector->can_read) { foreach my $fh (@ready) { local $_ = scalar<$fh>; return if /^open3:/; $foreach->(); $selector->remove($fh) if eof($fh); } } close($cmd_out); close($cmd_in); return waitpid($pid, 0) > 0 && !($? >> 8); } sub mtools_run_ { local $ENV{MTOOLS_SKIP_CHECK} = 1; &run_; } 1;