| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736 |
- #! /bin/sh
- #
- # modconfig
- #
- # Copyright (C) 2000, 2001, 2002 Eggheads Development Team
- # Written by Fabian Knittel
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- mc_pn=`echo $0 | sed -e 's/^.*\///'`
- mc_top_srcdir=
- mc_srcdir=
- mc_bindir=.
- mc_flag_quiet=yes
- mc_flag_onlynew=no
- # Read options
- while true; do
- case ${1} in
- --top_srcdir=*)
- mc_top_srcdir=`echo ${1} | sed -e 's/^--top_srcdir=//'`
- ;;
- --top_srcdir)
- shift
- mc_top_srcdir=${1}
- ;;
- --srcdir=*)
- mc_srcdir=`echo ${1} | sed -e 's/^--srcdir=//'`
- ;;
- --srcdir)
- shift
- mc_srcdir=${1}
- ;;
- --bindir=*)
- mc_bindir=`echo ${1} | sed -e 's/^--bindir=//'`
- ;;
- --bindir)
- shift
- mc_bindir=${1}
- ;;
- --quiet|-q)
- mc_flag_quiet=yes
- ;;
- --only-new|-n)
- mc_flag_onlynew=yes
- ;;
- --*)
- echo "${mc_pn}: warning: unknown option \`${1}'." 2>&1
- ;;
- *)
- # Non-option parameter.
- break
- ;;
- esac
- # Break out of loop if there are no more arguments to process.
- if shift; then
- :
- else
- break;
- fi
- done
- # Find srcdir and top_srcdir
- if test "x${mc_srcdir}" = x; then
- if test "x${mc_top_srcdir}" != x; then
- mc_srcdir=${mc_top_srcdir}/src
- else
- echo "${mc_pn}: error: could not find src directory." 2>&1
- exit 1
- fi
- fi
- if test "x${mc_top_srcdir}" = x; then
- if test "x${mc_srcdir}" != x; then
- mc_top_srcdir=${mc_srcdir}/..
- else
- echo "${mc_pn}: error: could not find top src directory." 2>&1
- exit 1
- fi
- fi
- #
- # Files
- #
- # List of all selected modules (including the `.mod' at the end)
- mc_fmodules=${mc_bindir}/.modules
- # List of all modules we have detected so far.
- mc_fknownmods=${mc_bindir}/.known_modules
- mc_mod_dir=${mc_srcdir}/mod
- mc_mod_bin_dir=${mc_bindir}/src/mod
- mc_fMakefile=${mc_mod_bin_dir}/Makefile
- mc_fstatic_h=${mc_mod_dir}/static.h
- # File descriptor usage:
- # 1 Standard output
- # 2 Errors
- #
- # 6 Misc messages and warnings
- # 7 Goes to /dev/null
- exec 7>/dev/null
- if test "${mc_flag_quiet}" = yes; then
- exec 6>&7
- else
- exec 6>&1
- fi
- # Detect flags needed to achieve 'echo -n' (originally from GNU autoconf) ...
- if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null
- then
- mc_n= mc_c='
- ' mc_t=' '
- else
- mc_n=-n mc_c= mc_t=
- fi
- else
- mc_n= mc_c='\c' mc_t=
- fi
- # This helps us call ourself.
- mc_self_call="$0 --srcdir=${mc_srcdir} --top_srcdir=${mc_topsrcdir}"
- # Assign parameters
- mc_cmd=$1
- if test "x${mc_cmd}" != x; then
- shift
- mc_paras=$*
- fi
- case x${mc_cmd} in
- xhelp)
- #
- # Display help
- #
- cat 1>&6 <<EOF
- Usage: ${mc_pn} [OPTIONS] COMMAND
- Commands:
- add Add a module to the list of active eggdrop modules.
- del Remove a module from that list.
- clear Clear the list.
- static.h Create \`src/mod/static.h'.
- Makefile Create \`src/mod/Makefile'.
- configure Interactively select modules.
- is-configured Exits 0/1 depending on wether modules where
- configured or not.
- update-depends Check all module dependencies and add modules missing.
- help Displays this information.
- detect-modules Find all available modules.
- modules-still-exist Check wether all known modules still exist.
- eggautoconf Recreate the configure scripts in every module dir.
- Options:
- --top_srcdir=DIR Top directory (At least one of these two
- --srcdir=DIR Source directory directories MUST be supplied.)
- --bindir=DIR Binary directory
- --quiet [-q] Quiet mode. Only show errors.
- Options specific to the \`configure' command:
- --only-new [-n] Only query new modules.
- EOF
- ;;
- xis-configured)
- #
- # Determine wether the modules were configured yet.
- #
- if test -r "${mc_fmodules}"; then
- exit 0
- else
- exit 1
- fi
- ;;
- xmodules-still-exist)
- #
- # Check wether all known modules still exist.
- #
- if ${mc_self_call} -q is-configured; then
- mc_known_mods=`cat ${mc_fknownmods}`
- echo ${mc_n} "checking for removed modules...${mc_c}" 1>&6
- # Check wether all known mods still exist
- for mc_mod in ${mc_known_mods}; do
- echo ${mc_n} ".${mc_c}" >&6
- if test ! -d ${mc_mod_dir}/${mc_mod}; then
- grep -v "^${mc_mod}$" ${mc_fknownmods} > ${mc_fknownmods}_new
- mv ${mc_fknownmods}_new ${mc_fknownmods}
- fi
- done
- echo " done." 1>&6
- fi
- ;;
- xdetect-modules)
- #
- # Detect modules. Active modules will be added to the `.modules' file. The
- # behaviour changes as soon as `.modules' already exists.
- #
- echo ${mc_n} "detecting modules...${mc_c}" >&6
- if ${mc_self_call} -q is-configured; then
- mc_mods_configured=yes
- mv ${mc_fmodules} ${mc_fmodules}_old
- mc_fmodules_old=${mc_fmodules}
- mc_fmodules=${mc_fmodules}_old
- else
- mc_mods_configured=no
- mc_fmodules_old=
- fi
- mc_mods=`echo ${mc_srcdir}/mod/*.mod | sed -e 's/\.mod//g'`
- if test "${mc_mods}" = "${mc_srcdir}/mod/*"; then
- echo "${mc_pn}: error: no modules detected." >&2
- exit 1
- fi
- # Add them again.
- mc_mods=`echo ${mc_mods} | sed -e 's/\.mod//g'`
- for mc_mod in ${mc_mods}; do
- mc_mod=`echo ${mc_mod} | sed -e 's/.*\///g'`
- mc_new_mod_state=disabled
- echo ${mc_n} ".${mc_c}" >&6
- # Do we have an existing configuration?
- if (test "${mc_mods_configured}" = yes); then
- # Is the module active?
- if (grep "^${mc_mod}\.mod\$" ${mc_fmodules} 1>&7 2>&1)
- then
- mc_new_mod_state=enabled
- else
- # Was it configured before?
- if (grep "^${mc_mod}\.mod\$" ${mc_fknownmods} 1>&7 2>&1); then
- :
- else
- mc_new_mod_state=enabled
- fi
- fi
- else
- mc_new_mod_state=enabled
- fi
- if test "${mc_new_mod_state}" = enabled; then
- ${mc_self_call} -q add ${mc_mod}
- else
- ${mc_self_call} -q del ${mc_mod}
- fi
- done
- if test "x${mc_fmodules_old}" != x; then
- # mc_fmodules actually points to the .modules_old file.
- rm -f ${mc_fmodules}
- touch ${mc_fmodules_old}
- fi
- echo " done." >&6
- ;;
- xMakefile)
- #
- # Build `src/mod/Makefile'
- #
- echo ${mc_n} "building ${mc_fMakefile}... ${mc_c}" 1>&6
- # Check for selected modules
- if test -r ${mc_fmodules}; then
- # Convert newlines to spaces.
- mc_sel_modules=`cat ${mc_fmodules} | \
- awk '{ printf("%s ", $0); }'`
- else
- echo "${mc_pn}: error: no modules selected. You did not run \`make config' yet." 1>&2;
- exit 1
- fi
- mc_mod_objs=`echo ${mc_sel_modules} | sed -e 's/\.mod/.mod_o/g'`
- if test ! -f ${mc_fMakefile}; then
- echo "failed." 1>&6
- echo "${mc_pn}: error: make file template not found." 1>&2
- exit 1
- fi
- # The following sed expression modifies src/mod/Makefile to
- # hold the new module names.
- if (cat "${mc_fMakefile}" | \
- sed -e "s/^\(mods =\).*$/\1 ${mc_sel_modules}/g" \
- -e "s/^\(mod_objs =\).*$/\1 ${mc_mod_objs}/g" \
- 1> "${mc_fMakefile}_new"); then
- mv "${mc_fMakefile}_new" "${mc_fMakefile}"
- else
- echo "failed." 1>&6
- echo "${mc_pn}: sed failed to build ${mc_fMakefile}." 1>&2
- exit 1
- fi
- echo "done." 1>&6
- ;;
- xstatic.h)
- #
- # Build `static.h'
- #
- echo ${mc_n} "building static.h..." 1>&6
- # Check for selected modules
- if test ! -r ${mc_fmodules}; then
- echo " failed." 1>&6
- echo "${mc_pn}: error: no modules selected. You did not run \`make config' yet." 1>&2;
- exit 1
- fi
- mc_sel_modules=`cat ${mc_fmodules} | sed -e 's/\.mod//g'`
- # Note: All data is written to `src/mod/static.h' which is
- # later included into `src/main.c'.
- # Remove old static.h
- rm -f ${mc_fstatic_h}
- # Header
- cat 1>> ${mc_fstatic_h} << EOF
- /* src/mod/static.h -- header file for static compiles.
- *
- * NOTE: Do not edit directly. Instead, re-run \`make config'.
- */
- #ifndef _EGG_MOD_STATIC_H
- #define _EGG_MOD_STATIC_H
- EOF
- # Create declarations for module _start functions
- for mc_mod in ${mc_sel_modules}; do
- echo ${mc_n} ".${mc_c}" 1>&6
- if test ${mc_mod} = "server" || test ${mc_mod} = "irc";then echo "#ifdef LEAF" 1>> ${mc_fstatic_h};fi
- echo "char *${mc_mod}_start();" 1>> ${mc_fstatic_h}
- if test ${mc_mod} = "server" || test ${mc_mod} = "irc";then echo "#endif" 1>> ${mc_fstatic_h};fi
- done
- echo 1>> ${mc_fstatic_h}
- # The link_statics() function ...
- echo "static void link_statics()" 1>> ${mc_fstatic_h}
- echo "{" 1>> ${mc_fstatic_h}
- for mc_mod in ${mc_sel_modules}; do
- if test ${mc_mod} = "server" || test ${mc_mod} = "irc";then echo "#ifdef LEAF" 1>> ${mc_fstatic_h};fi
- echo " check_static(\"${mc_mod}\", ${mc_mod}_start);" 1>> ${mc_fstatic_h}
- if test ${mc_mod} = "server" || test ${mc_mod} = "irc";then echo "#endif" 1>> ${mc_fstatic_h};fi
- done
- cat 1>> ${mc_fstatic_h} << EOF
- }
- #endif /* _EGG_MOD_STATIC_H */
- EOF
- echo " done." 1>&6
- ;;
- xdel)
- #
- # Remove a module from the list
- #
- if test "x${mc_paras}" = x; then
- echo "${mc_pn}: error: no modules specified." 2>&1
- exit 1
- fi
- mc_nfmodules="${mc_fmodules}_new"
- # Remove trailing `.mod'
- mc_mods=`echo ${mc_paras} | sed -e 's/\.mod//g'`
- for mc_mod in ${mc_mods}; do
- # Remove any path information
- mc_mod=`echo ${mc_mod} | sed -e 's/.*\///'`
- echo "${mc_pn}: disabling eggdrop module: ${mc_mod}" 1>&6
- # Add module to the list of known modules.
- if grep "^${mc_mod}\.mod$" ${mc_fknownmods} 1>&7 2>&7; then
- if test ! -d ${mc_mod_dir}/${mc_mod}.mod; then
- grep -v "^${mc_mod}\.mod$" ${mc_fknownmods} \
- > ${mc_fknownmods}_new
- mv ${mc_fknownmods}_new ${mc_fknownmods}
- fi
- else
- if test ! -d ${mc_mod_dir}/${mc_mod}.mod; then
- :
- else
- echo ${mc_mod}.mod 1>> ${mc_fknownmods}
- fi
- fi
- # In case there are any active modules ...
- if test -r ${mc_fmodules}; then
- # Remove module from list of active modules.
- if grep -v "^${mc_mod}\.mod$" ${mc_fmodules} \
- 1> ${mc_nfmodules}
- then
- :
- else
- echo "${mc_pn}: error: building new module file failed" 1>&2
- echo "grepping for ${mc_mod}.mod in ${mc_fmodules} and writing to ${mc_nfmodules}"
- kill -STOP $$
- exit 1
- fi
- mv ${mc_nfmodules} ${mc_fmodules}
- fi
- done
- ;;
- xadd)
- #
- # Add a module to the list
- #
- if test "x${mc_paras}" = x; then
- echo "${mc_pn}: error: no modules specified." 2>&1
- exit 1
- fi
- # Remove trailing `.mod'
- mc_mods=`echo ${mc_paras} | sed -e 's/\.mod//g'`
- for mc_mod in ${mc_mods}; do
- # Remove any path information
- mc_mod=`echo ${mc_mod} | sed -e 's/.*\///'`
- # Add module to the list of known modules.
- if grep "^${mc_mod}\.mod$" ${mc_fknownmods} 1>&7 2>&7; then
- if test ! -d ${mc_mod_dir}/${mc_mod}.mod; then
- grep -v "^${mc_mod}\.mod$" ${mc_fknownmods} \
- > ${mc_fknownmods}_new
- mv ${mc_fknownmods}_new ${mc_fknownmods}
- fi
- else
- if test ! -d ${mc_mod_dir}/${mc_mod}.mod; then
- :
- else
- echo ${mc_mod}.mod 1>> ${mc_fknownmods}
- fi
- fi
- # Add module to the list of active modules.
- if grep "^${mc_mod}\.mod$" ${mc_fmodules} 1>&7 2>&7; then
- :
- else
- if test ! -d ${mc_mod_dir}/${mc_mod}.mod; then
- echo "${mc_pn}: warning: module does not exist: \`${mc_mod}', ignoring." 1>&2
- else
- echo "${mc_pn}: enabling eggdrop module: ${mc_mod}" 1>&6
- # Add it to the file
- echo ${mc_mod}.mod 1>> ${mc_fmodules}
- fi
- fi
- done
- ;;
- xclear)
- #
- # Clear list of modules
- #
- echo "${mc_pn}: cleared list of eggdrop modules." 1>&6
- rm -f ${mc_fmodules}
- touch ${mc_fmodules}
- ;;
- xupdate-depends)
- #
- # Check the dependencies and add modules which are depended on, but
- # aren't enabled.
- #
- mc_all_depends=
- mc_missing=
- echo ${mc_n} "calculating dependencies...${mc_c}" 1>&6
- # Check for selected modules
- if test ! -r ${mc_fmodules}; then
- echo " failed." 1>&6
- echo "${mc_pn}: error: no modules selected. You did not run configure yet." 1>&2
- exit 1
- fi
- mc_sel_modules=`cat ${mc_fmodules}`
- mc_new_mods="${mc_sel_modules}"
- while (test "x${mc_new_mods}" != x); do
- mc_mod_list="${mc_new_mods}"
- mc_new_mods=
- # Go through every module in the list
- for mc_mod in ${mc_mod_list}; do
- echo ${mc_n} ".${mc_c}" 1>&6
- # We have an info file, don't we?
- if (test ! -f ${mc_mod_dir}/${mc_mod}/modinfo); then
- continue
- fi
- # Figure out the module's dependencies
- mc_mod_depends=`grep "^DEPENDS:" ${mc_mod_dir}/${mc_mod}/modinfo | sed -e 's/^DEPENDS://'`
- # Check wether the dependencies are fulfilled
- for mc_m_depend in ${mc_mod_depends}; do
- if (echo ${mc_sel_modules} | \
- grep " ${mc_m_depend}" 1>&7 2>&7) || \
- (echo ${mc_sel_modules} | \
- grep "^${mc_m_depend}" 1>&7 2>&7)
- then
- :
- else
- # Does the module actually exist?
- if test ! -d ${mc_mod_dir}/${mc_m_depend}.mod
- then
- mc_missing="${mc_missing} ${mc_m_depend}"
- continue
- fi
- # This one is missing. Add it to the
- # list.
- mc_all_depends="${mc_all_depends} ${mc_m_depend}"
- mc_sel_modules="${mc_sel_modules} ${mc_m_depend}"
- # Add to list of modules to check in
- # next dependency cycle.
- mc_new_mods="${mc_new_mods} ${mc_m_depend}.mod"
- fi
- done
- done
- done
- echo " done." 1>&6
- # Warn about missing modules.
- if test "x${mc_missing}" != x; then
- cat 1>&2 <<EOF
- ${mc_pn}: warning:
- The following modules were not found but are needed:
- `echo ${mc_missing} | sed -e 's/ /, /g'`
- EOF
- echo ${mc_n} "Press enter to continue... ${mc_c}"
- read mc_ask_response
- fi
- if test "x${mc_all_depends}" != x; then
- echo ${mc_n} "adding modules needed to match dependencies... ${mc_c}" 1>&6
- echo ${mc_all_depends} | sed -e 's/ /, /g' 1>&6
- # Add the modules
- ${mc_self_call} -q add ${mc_all_depends}
- # Update the makefile
- ${mc_self_call} -q Makefile
- fi
- ;;
- xconfigure)
- #
- # Interactive module selection
- #
- cat 1>&6 <<EOF
- -*- Eggdrop Interactive Module Selection -*-
- EOF
- # Check for selected modules
- if test ! -r ${mc_fmodules}; then
- echo "${mc_pn}: error: no modules selected. You did not run configure yet." 1>&2
- exit 1
- fi
- # Read current list
- mc_sel_modules=`cat ${mc_fmodules}`
- # Detect available modules
- mc_mods=`echo ${mc_mod_dir}/*.mod`
- # Error out if we have no available modules
- if test "${mc_mods}" = "echo ${mc_mod_dir}/*.mod"; then
- echo "${mc_pn}: error: no modules found." 1>&2
- exit 1
- fi
- # Loop through each available module
- for mc_mod in ${mc_mods}; do
- # Remove directory information from name
- mc_mod=`echo ${mc_mod} | sed -e 's/.*\///'`
- # Only ask for new modules?
- if test "${mc_flag_onlynew}" = yes; then
- # Did we already query for that module?
- if grep "^${mc_mod}$" ${mc_fknownmods} 1>&7 2>&7; then
- continue
- fi
- fi
- # Remove .mod ending
- mc_modname=`echo ${mc_mod} | sed -e 's/\.mod//g'`
- # Note: We need to make sure that we only catch module names
- # that match _exactly_. e.g. don't mix bseen and seen.
- if (echo ${mc_sel_modules} | grep " ${mc_mod}" 1>&7 2>&7) ||
- (echo ${mc_sel_modules} | grep "^${mc_mod}" 1>&7 2>&7)
- then
- # The module is selected.
- mc_mstate="enabled"
- mc_mdisp="(E)nable / (d)isable [E/d]"
- else
- # The module is NOT selected.
- mc_mstate="disabled"
- mc_mdisp="(e)nable / (D)isable [e/D]"
- fi
- # Display description
- if test -r ${mc_mod_dir}/${mc_mod}/modinfo; then
- echo "" 1>&6
- grep "^DESC:" ${mc_mod_dir}/${mc_mod}/modinfo | \
- sed -e 's/^DESC:/ /' 1>&6
- echo "" 1>&6
- fi
- while true; do
- echo ${mc_n} "\`${mc_modname}' is ${mc_mstate}, ${mc_mdisp} ${mc_c}" 1>&6
- read mc_ask_response;
- if (test "${mc_ask_response}" = D); then
- mc_ask_response=d;
- fi
- if (test "${mc_ask_response}" = E); then
- mc_ask_response=e;
- fi
- # If the user just presses [return] or
- # if the selected state matches the old state,
- # then we change nothing.
- if test "x${mc_ask_response}" = x || \
- (test "${mc_ask_response}" = d && \
- test "${mc_mstate}" = disabled) || \
- (test "${mc_ask_response}" = e && \
- test "${mc_mstate}" = enabled); then
- echo "Changing nothing." 1>&6
- break;
- fi
- if (test "${mc_ask_response}" = e); then
- # Add it to the list.
- mc_sel_modules="${mc_sel_modules} ${mc_mod}"
- echo "Enabled module ${mc_modname}." 1>&6
- break;
- fi
- if (test "${mc_ask_response}" = d); then
- # Remove module from list.
- mc_sel_modules=`echo ${mc_sel_modules} | sed -e "s/ ${mc_mod}//g" -e "s/^${mc_mod}//g"`
- echo "Disabled module ${mc_modname}." 1>&6
- break;
- fi
- done
- echo "" 1>&6
- done
- echo ${mc_n} "recreating list of active modules... ${mc_c}" 1>&6
- ${mc_self_call} -q clear
- if (${mc_self_call} -q add ${mc_sel_modules}); then
- echo "done." 1>&6
- else
- echo "failed!" 1>&6
- exit 1
- fi
- ;;
- xeggautoconf)
- #
- # Recreate the eggdrop specific configure scripts for every module.
- #
- # Detect available modules
- mc_mods=`echo ${mc_mod_dir}/*.mod`
- # Error out if we have no available modules
- if test "${mc_mods}" = "echo ${mc_mod_dir}/*.mod"; then
- echo "${mc_pn}: error: no modules found." 1>&2
- exit 1
- fi
- # Loop through each available module
- for mc_modd in ${mc_mods}; do
- # Skip modules without their own configure script.
- if test ! -r "${mc_modd}/configure.in"; then
- continue
- fi
- # Remove directory information from name
- mc_mod=`echo ${mc_modd} | sed -e 's/.*\///'`
- echo "creating configure for module \`${mc_mod}'."
- (cd ${mc_modd} && ../eggautoconf)
- done
- ;;
- *)
- if test "x${mc_cmd}" = x; then
- echo "${mc_pn}: error: no command supplied." 1>&2
- else
- echo "${mc_pn}: error: ${mc_cmd}: unknown command." 1>&2
- fi
- ${mc_self_call} help
- ;;
- esac
- exit 0
|