# All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Johnny C. Lam. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # NAME # load.subr -- load task modules # # SYNOPSIS # task_load [-s ] ... # # DESCRIPTION # The task_load function sources the module file for each specified # module. # # The module file is searched under ${TASK_MODULE_DIR} with a basename # of , where the default suffix is ".subr". # # The module file should define and set a global guard variable # __task___ to "yes". This guard variable is checked by the # task_load function to determine whether the module has been # previously loaded. # # RETURN VALUES # Returns 0 on success, and >0 if an error occurs. # # ENVIRONMENT # The following variables are used if they are set: # # TASK_MODULE_DIR # The path to the directory containing the task modules. # if [ -z "$__task_load__" ]; then __task_load__="yes" task_load() { : ${TASK_MODULE_DIR:=.} local suffix=".subr" local arg local OPTIND=1 while getopts ":s:" arg "$@"; do case $arg in s) suffix=${OPTARG} ;; *) return 127 ;; esac done shift $(( ${OPTIND} - 1 )) [ $# -gt 0 ] || return 127 local save_IFS local guard path init_fn local module for module; do save_IFS=$IFS; IFS=/ set -o noglob; set -- $1; set +o noglob IFS=$save_IFS guard="__task" path=${TASK_MODULE_DIR} for component; do case $component in "") : "skip empty path components" ;; *) guard="${guard}_$component" path="$path/$component" ;; esac done init_fn="${guard}_init__" guard="${guard}__" path="$path$suffix" if eval test -z "\$$guard"; then if [ -f "$path" ]; then . "$path" if eval test -n "\$$init_fn"; then if eval "\$$init_fn"; then : "successful initialization" else echo 1>&2 "Error: initializing $module failed" fi fi else echo 1>&2 "Error: Loading $module failed: $path" return 1 fi fi done return 0 } fi # __task_load__