]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - adduser/adduser.sh
- Act according to the documentation (man page):
[pw-darwin.git] / adduser / adduser.sh
index 188c06b3210c1331cb2e97ea54977b1deb25d277..a8622b93881fb13be346ed5110ffc463da0a8490 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 2002, 2003 Michael Telahun Makonnen. All rights reserved.
+# Copyright (c) 2002-2004 Michael Telahun Makonnen. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -77,10 +77,12 @@ show_usage() {
        echo "usage: ${THISCMD} [options]"
        echo "  options may include:"
        echo "  -C              save to the configuration file only"
+       echo "  -D              do not attempt to create the home directory"
        echo "  -E              disable this account after creation"
        echo "  -G              additional groups to add accounts to"
        echo "  -L              login class of the user"
        echo "  -N              do not read configuration file"
+       echo "  -S              a nonexistent shell is not an error"
        echo "  -d              home directory"
        echo "  -f              file from which input will be received"
        echo "  -g              default login group"
@@ -111,25 +113,38 @@ valid_shells() {
                esac
        done
 
-       # /sbin/nologin is a special case
+       # /usr/sbin/nologin is a special case
        [ -x "${NOLOGIN_PATH}" ] && echo -n " ${NOLOGIN}"
 }
 
 # fullpath_from_shell shell
-#      Given $shell, the basename component of a valid shell, get the
+#      Given $shell, which is either the full path to a shell or
+#      the basename component of a valid shell, get the
 #      full path to the shell from the /etc/shells file.
 #
 fullpath_from_shell() {
        _shell=$1
        [ -z "$_shell" ] && return 1
 
+       # /usr/sbin/nologin is a special case; it needs to be handled
+       # before the cat | while loop, since a 'return' from within
+       # a subshell will not terminate the function's execution, and
+       # the path to the nologin shell might be printed out twice.
+       #
+       if [ "$_shell" = "${NOLOGIN}" -o \
+           "$_shell" = "${NOLOGIN_PATH}" ]; then
+               echo ${NOLOGIN_PATH}
+               return 0;
+       fi
+
        cat ${ETCSHELLS} |
        while read _path _junk ; do
                case "$_path" in
                \#*|'')
                        ;;
                *)
-                       if [ "`basename $_path`" = "$_shell" ]; then
+                       if [ "$_path" = "$_shell" -o \
+                           "`basename $_path`" = "$_shell" ]; then
                                echo $_path
                                return 0
                        fi
@@ -137,12 +152,6 @@ fullpath_from_shell() {
                esac
        done
 
-       # /sbin/nologin is a special case
-       if [ "$_shell" = "${NOLOGIN}" ]; then
-               echo ${NOLOGIN_PATH}
-               return 0;
-       fi
-
        return 1
 }
 
@@ -226,12 +235,22 @@ add_user() {
        [ -n "$ulogingroup" ] && _group='-g "$ulogingroup"'
        [ -n "$ugroups" ] && _grouplist='-G "$ugroups"'
        [ -n "$ushell" ] && _shell='-s "$ushell"'
-       [ -n "$uhome" ] && _home='-m -d "$uhome"'
        [ -n "$uclass" ] && _class='-L "$uclass"'
        [ -n "$ugecos" ] && _comment='-c "$ugecos"'
        [ -n "$udotdir" ] && _dotdir='-k "$udotdir"'
        [ -n "$uexpire" ] && _expire='-e "$uexpire"'
        [ -n "$upwexpire" ] && _pwexpire='-p "$upwexpire"'
+       if [ -z "$Dflag" -a -n "$uhome" ]; then
+               # The /nonexistent home directory is special. It
+               # means the user has no home directory.
+               if [ "$uhome" = "$NOHOME" ]; then
+                       _home='-d "$uhome"'
+               else
+                       _home='-m -d "$uhome"'
+               fi
+       elif [ -n "$Dflag" -a -n "$uhome" ]; then
+               _home='-d "$uhome"'
+       fi
        case $passwdtype in
        no)
                _passwdmethod="-w no"
@@ -360,7 +379,7 @@ get_gecos() {
 
 # get_shell
 #      Get the account's shell. Works in interactive and batch mode. It
-#      accepts only the base name of the shell, NOT the full path.
+#      accepts either the base name of the shell or the full path.
 #      If an invalid shell is entered it will simply use the default shell.
 #
 get_shell() {
@@ -369,9 +388,11 @@ get_shell() {
        ushell="$defaultshell"
 
        # Make sure the current value of the shell is a valid one
-       if ! shell_exists $ushell ; then
-               info "Using default shell ${defaultshell}."
-               ushell="$defaultshell"
+       if [ -z "$Sflag" ]; then
+               if ! shell_exists $ushell ; then
+                       info "Using default shell ${defaultshell}."
+                       ushell="$defaultshell"
+               fi
        fi
 
        if [ -z "$fflag" ]; then
@@ -381,13 +402,17 @@ get_shell() {
                _input="`echo "$fileline" | cut -f9 -d:`"
        fi
        if [ -n "$_input" ]; then
-               _fullpath=`fullpath_from_shell $_input`
-               if [ -n "$_fullpath" ]; then
-                       ushell="$_fullpath"
+               if [ -n "$Sflag" ]; then
+                       ushell="$_input"
                else
-                       err "Invalid shell ($_input) for user $username."
-                       info "Using default shell ${defaultshell}."
-                       ushell="$defaultshell"
+                       _fullpath=`fullpath_from_shell $_input`
+                       if [ -n "$_fullpath" ]; then
+                               ushell="$_fullpath"
+                       else
+                               err "Invalid shell ($_input) for user $username."
+                               info "Using default shell ${defaultshell}."
+                               ushell="$defaultshell"
+                       fi
                fi
        fi
 }
@@ -563,7 +588,6 @@ input_from_file() {
        while read -r fileline ; do
                case "$fileline" in
                \#*|'')
-                       return 0
                        ;;
                esac
 
@@ -771,7 +795,7 @@ input_interactive() {
        return 0
 }
 
-#### END SUBROUTINE DEFENITION ####
+#### END SUBROUTINE DEFINITION ####
 
 THISCMD=`/usr/bin/basename $0`
 DEFAULTSHELL=/bin/sh
@@ -779,8 +803,9 @@ ADDUSERCONF="${ADDUSERCONF:-/etc/adduser.conf}"
 PWCMD="${PWCMD:-/usr/sbin/pw}"
 MAILCMD="${MAILCMD:-mail}"
 ETCSHELLS="${ETCSHELLS:-/etc/shells}"
+NOHOME="/nonexistent"
 NOLOGIN="nologin"
-NOLOGIN_PATH="/sbin/nologin"
+NOLOGIN_PATH="/usr/sbin/nologin"
 GREPCMD="/usr/bin/grep"
 DATECMD="/bin/date"
 
@@ -808,6 +833,8 @@ configflag=
 fflag=
 infile=
 disableflag=
+Dflag=
+Sflag=
 readconfig="yes"
 homeprefix="/home"
 randompass=
@@ -815,7 +842,7 @@ fileline=
 savedpwtype=
 defaultclass=
 defaultLgroup=
-defaultgoups=
+defaultgroups=
 defaultshell="${DEFAULTSHELL}"
 
 # Make sure the user running this program is root. This isn't a security
@@ -860,6 +887,10 @@ for _switch ; do
                configflag=yes
                shift
                ;;
+       -D)
+               Dflag=yes
+               shift
+               ;;
        -E)
                disableflag=yes
                shift
@@ -925,6 +956,10 @@ for _switch ; do
                defaultshell="`fullpath_from_shell $2`"
                shift; shift
                ;;
+       -S)
+               Sflag=yes
+               shift
+               ;;
        -u)
                uidstart=$2
                shift; shift