#!/bin/sh
##
## groupadd(8) wrapper to emulate Red Hat Linux
## Copyright (c) 2008-2009 SATOH Fumiyasu @ OSS Technology Corp.
##               <http://www.osstech.co.jp>
##
## License: GNU General Public License version 2 or later
## Date: 2009-01-14, since 2008-06-10
##

set -u

pinfo()                                                                                                         
{
  echo "$0: INFO: $*" 1>&2
}

perr()
{
  echo "$0: ERROR: $*" 1>&2
}

pdie()
{
  perr "$*"
  exit 1
}

run()
{
  if [ -n "${no_run_f:-}" ]; then
    pinfo "run: $*"
  else
    ${1+"$@"}
  fi
}

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

groupadd_cmd="/usr/sbin/groupadd"

no_run_f=""

gid=""
no_uniq_gid_f=""
system_group_f=""

os=unknown
case "`uname`" in
Linux)
  if [ -f /etc/redhat-release ]; then
    exec "$groupadd_cmd" ${1+"$@"}
    exit 1
  elif [ -f /etc/debian_version ]; then
    os="debian"
  fi
  gid_reserved_min="200"
  gid_reserved_max="299"
  gid_system_min="300"
  gid_system_max="399"
  gid_user_min="400"
  gid_user_max="499"
  ;;
SunOS)
  os="solaris"
  gid_reserved_min="200"
  gid_reserved_max="299"
  gid_system_min="300"
  gid_system_max="399"
  gid_user_min="400"
  gid_user_max="499"
  ;;
AIX)
  os="aix"
  gid_reserved_min="300"
  gid_reserved_max="399"
  gid_system_min="400"
  gid_system_max="449"
  gid_user_min="450"
  gid_user_max="499"
  ;;
esac

cmd_usage="Usage: $0 [OPTIONS] GROUP"

## ----------------------------------------------------------------------

while getopts zg:or opt; do
  case "$opt" in
  z)
    no_run_f="yes"
    ;;
  g)
    gid="$OPTARG"
    ;;
  o)
    if [ x"$os" = x"aix" ]; then
      pdie "-$opt option not supported"
    fi
    no_uniq_gid_f="yes"
    ;;
  r)
    system_group_f="yes"
    ;;
  *)
    exit 1
    ;;
  esac
done
shift `expr $OPTIND - 1 || :`

if [ $# -ne 1 ]; then
  echo "$cmd_usage"
  exit 1
fi

group="$1"; shift

## ----------------------------------------------------------------------

if [ -n "$system_group_f" ]; then
  if [ -n "$gid" ]; then
    gid_min="$gid_reserved_min"
    gid_max="$gid_reserved_max"
  else
    gid_min="$gid_system_min"
    gid_max="$gid_system_max"
  fi
else
  gid_min="$gid_user_min"
  gid_max="$gid_user_max"
fi

if [ -n "$gid" ]; then
  if [ -n "$system_group_f" ]; then
    gid=`expr "$gid" + "$gid_reserved_min"`
  fi
  if [ "$gid" -lt "$gid_min" ] || [ "$gid" -gt "$gid_max" ]; then
    pdie "Out of GID range (min. $gid_min - max. $gid_max)"
  fi
else
  gid_test="$gid_min"
  while [ "$gid_test" -le "$gid_max" ]; do
    if getent group "$gid_test" >/dev/null; then
      gid_test=`expr "$gid_test" + 1`
      continue
    fi
    gid="$gid_test"
    break
  done
  if [ -z "$gid" ]; then
    pdie "No free GID (min. $gid_min - max. $gid_max)"
  fi
fi

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

if [ x"$os" = x"aix" ]; then
  run exec "/usr/bin/mkgroup" \
    ${gid:+"id=$gid"} \
    "$group"
else
  run exec "$groupadd_cmd" \
    ${gid:+-g} ${gid:+"$gid"} \
    ${no_uniq_gid_f:+-o} \
    ${1+"$@"} \
    "$group"
fi

exit 1

