#!/usr/bin/env perl
# vi: set ts=4 sw=4 :

use warnings;
use strict;

my $lockfile;
my $wait = 1;
my $timeout;

use Getopt::Long;
GetOptions(
    "lockfile|f=s"              => \$lockfile,
    "wait|w"                    => sub { $wait = 1 },
    "nowait|no-wait|n"  => sub { $wait = 0 },
    "timeout|t=i"               => \$timeout,
) or exit 2;

defined($lockfile) or die "No lockfile defined\n";

use Fcntl qw( LOCK_EX LOCK_NB );
open(my $fh, ">", $lockfile) or die $!;

$SIG{ALRM} = sub {};
alarm($timeout) if $timeout;

unless (flock($fh, LOCK_EX | ($wait ? 0 : LOCK_NB)))
{
    exit 100 if $!{EWOULDBLOCK};
    die $! unless $!{EINTR};
}

alarm(0);
$SIG{ALRM} = 'DEFAULT';

system @ARGV;
exit($? >> 8);

# eof
