diff --git a/lib/Sys/Linux/Unshare.pm b/lib/Sys/Linux/Unshare.pm index a1b48d5..c829649 100644 --- a/lib/Sys/Linux/Unshare.pm +++ b/lib/Sys/Linux/Unshare.pm @@ -20,10 +20,21 @@ our %EXPORT_TAGS = ( 'all' => [@unshare_consts, qw/unshare/], ); +sub clone { + my ($flags) = @_; + local $! = 0; + my $ret_pid = _clone_sys($flags); + + if ($ret_pid < 0) { + croak "Clone call failed: $ret_pid $!"; + } + + return $ret_pid; +} + sub unshare { my ($flags) = @_; - local $! = 0; my $ret = _unshare_sys($flags); diff --git a/lib/Sys/Linux/Unshare.xs b/lib/Sys/Linux/Unshare.xs index 3379b3e..315c1bc 100644 --- a/lib/Sys/Linux/Unshare.xs +++ b/lib/Sys/Linux/Unshare.xs @@ -20,3 +20,7 @@ SV * _unshare_sys(int flags) ST(0) = sv_newmortal(); sv_setiv(ST(0), unshare(flags)); +SV * _clone_sys(int flags) + CODE: + ST(0) = sv_newmortal(); + sv_setiv(ST(0), clone(NULL, NULL, CLONE_CHILD_CLEARTID|SIGCHLD|flags, NULL));