#!/usr/pkg/bin/perl
exec ${H2O_PERL:-perl} -x $0 "$@"

use strict;
use warnings;
use POSIX qw(setuid setgid);

die "usage: share/h2o/setuidgid username child\n"
    unless @ARGV >= 2;
my $username = shift @ARGV;

# get user entry
my ($uid, @groups) = do {
    my @e = getpwnam($username)
        or die "unknown user: $username\n";
    +($e[2], $e[3]);
};

# add supp. groups to @groups
setgrent;
while (my @e = getgrent) {
    if ($e[3] && grep { $_ eq $username } split /\s+/, $e[3]) {
        push @groups, $e[2]
            unless grep { $_ == $e[2] } @groups;
    }
}
endgrent;

# setgid
setgid($groups[0])
    or die "setgid failed:$!";

# setgroups
$! = 0;
$) = join " ", $groups[0], @groups;
die "setgroups failed:$!"
    if $!;

# setuid
setuid($uid)
    or die "setuid failed:$!";

# exec
exec @ARGV
    or die "failed to exec: $ARGV[0]:$!";
