CLONE_NEWPID => 0x20000000,
CLONE_NEWNET => 0x40000000};
+use constant O_PATH => 0x10000000;
+
sub run_with_timeout {
my ($timeout, $code, @param) = @_;
my $lock_func = sub {
if (!$lock_handles->{$$}->{$filename}) {
- $lock_handles->{$$}->{$filename} = new IO::File (">>$filename") ||
- die "can't open file - $!\n";
+ my $fh = new IO::File(">>$filename") ||
+ die "can't open file - $!\n";
+ $lock_handles->{$$}->{$filename} = { fh => $fh, refcount => 0};
}
- if (!flock ($lock_handles->{$$}->{$filename}, $mode|LOCK_NB)) {
+ if (!flock($lock_handles->{$$}->{$filename}->{fh}, $mode|LOCK_NB)) {
print STDERR "trying to acquire lock...";
my $success;
while(1) {
- $success = flock($lock_handles->{$$}->{$filename}, $mode);
+ $success = flock($lock_handles->{$$}->{$filename}->{fh}, $mode);
# try again on EINTR (see bug #273)
if ($success || ($! != EINTR)) {
last;
}
print STDERR " OK\n";
}
+ $lock_handles->{$$}->{$filename}->{refcount}++;
};
my $res;
$err = $@;
}
- if (my $fh = $lock_handles->{$$}->{$filename}) {
- $lock_handles->{$$}->{$filename} = undef;
- close ($fh);
+ if (my $fh = $lock_handles->{$$}->{$filename}->{fh}) {
+ my $refcount = --$lock_handles->{$$}->{$filename}->{refcount};
+ if ($refcount <= 0) {
+ $lock_handles->{$$}->{$filename} = undef;
+ close ($fh);
+ }
}
if ($err) {
}
sub dump_journal {
- my ($start, $limit, $filter) = @_;
+ my ($start, $limit, $since, $until) = @_;
my $lines = [];
my $count = 0;
};
my $cmd = ['journalctl', '-o', 'short', '--no-pager'];
+
+ push @$cmd, '--since', $since if $since;
+ push @$cmd, '--until', $until if $until;
run_command($cmd, outfunc => $parser);
# HACK: ExtJS store.guaranteeRange() does not like empty array
return 0 == syscall(308, $fileno, $nstype);
}
+sub syncfs($) {
+ my ($fileno) = @_;
+ return 0 == syscall(306, $fileno);
+}
+
+sub sync_mountpoint {
+ my ($path) = @_;
+ sysopen my $fd, $path, O_PATH or die "failed to open $path: $!\n";
+ my $result = syncfs(fileno($fd));
+ close($fd);
+ return $result;
+}
+
1;