#! /usr/bin/ksh
#
#       @(#)cmsCreateDevice	1.9     98/12/18
#
#   Script to create a devinfo node, tag it with its CMS id,
#   assign properties to it, and bind it to a driver.
#

export PATH=${CMSHOME:+"$CMSHOME/lib:"}$PATH

usage()
{
    echo "Usage: ${0##*/} <parent-tag> <tag> <nodename> <propfile>" >&2
    exit 1
}

error()
{
    integer err=2
    if [[ "$1" = "-e" ]]
    then
        err="$2"
        shift 2
    fi
    if [[ -n "$*" ]]
    then
        echo "${0##*/}:" "$@" >&2
    fi
    if [[ -n "$mynode" ]]
    then
        u4ftctl set_tag "$mynode" '()' 2> /dev/null
        u4ftctl delete "$mynode" 2> /dev/null
    fi
    exit $err
}

if [[ $# -ne 4 ]]
then
    usage
fi

parent_tag="$1"
child_tag="$2"
nodename="$3"
propfile="$4"
mynode=""

#
#   Validate the parent tag or cookie
#
set -A parent $(u4ftctl find / "$parent_tag" 2> /dev/null)
if [[ ${#parent[@]} -eq 0 ]]
then
    error "parent node not found"
elif [[ ${#parent[@]} -gt 1 ]]
then
    error "parent tag ambiguous"
fi

#
#   Validate the child tag
#
case "$child_tag" in
\(\))
    # default tag, always permitted
    ;;
\(*([!\)])\))
    # non-default tag - must not already be in use for another node
    set -A tagnodes $(u4ftctl find / "$child_tag")
    if [[ ${#tagnodes[@]} -gt 0 ]]
    then
        error "tag already in use"
    fi
    ;;
*)
    error "invalid tag"
    ;;
esac

mynode=$(u4ftctl create "$parent" "$nodename") ||
    error "could not create device node"
u4ftctl set_tag "$mynode" "$child_tag" ||
    error "could not tag device node"
u4ftctl report_path "$mynode"
u4ftdev_setprops "$mynode" "$propfile" ||
    error
u4ftctl bind "$mynode" > /dev/null 2>&1 ||
    error -e 3 "could not bind device node to driver"
driver=$(u4ftctl get_driver "$mynode" 2> /dev/null)
u4ftctl loadonly "$driver" > /dev/null 2>&1 ||
    error -e 3 "could not load driver \"$driver\""

exit 0
