#!/usr/bin/perl
##
## util-linux setsid(1) clone
## Copyright (c) 2011-2012 SATOH Fumiyasu @ OSS Technology Corp., Japan
##               <http://www.osstech.co.jp/>
##
## License: GNU General Public License version 3 or later
## Date: 2012-06-26, since 2011-12-17
##

use strict;
use warnings;
use POSIX;

sub perr {
  print STDERR "$0: ERROR: $_[0]\n";
}

sub pdie {
  perr($_[0]);
  exit(defined($_[1]) ? $_[1] : 1);
}

## ======================================================================

if (@ARGV < 1) {
  print "Usage: $0 COMMAND [ARG ...]\n";
  exit(1);
}

my $prog = shift(@ARGV);

if (POSIX::getpgrp == $$) {
  my $pid = fork;
  if (!defined($pid)) {
    pdie "fork() failed: $!";
  }
  if ($pid > 0) {
    ## parent
    exit(0);
  }
  ## child
}

if (POSIX::setsid == -1) {
  pdie "setsid() failed: $!";
}

{
  local $SIG{'__WARN__'} = sub {}; ## Suppress Perl's warning on exec failed
  if (!exec {$prog} $prog, @ARGV) {
    pdie "exec() failed: $prog: $!";
  }
}

