$OpenBSD: patch-src_ejabberdctl_template,v 1.2 2009/02/12 09:58:11 sthen Exp $
--- src/ejabberdctl.template.orig	Sun Oct 19 22:00:39 2008
+++ src/ejabberdctl.template	Sun Oct 19 22:05:49 2008
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 # define default configuration
-POLL=true
+POLL=false
 SMP=auto
 ERL_MAX_PORTS=32000
 ERL_PROCESSES=250000
@@ -9,16 +9,18 @@ ERL_MAX_ETS_TABLES=1400
 
 # define default environment variables
 NODE=ejabberd
-HOST=localhost
+HOST=`hostname -s`
 ERLANG_NODE=$NODE@$HOST
 ERL=@erl@
 ROOTDIR=@rootdir@
-EJABBERD_CONFIG_PATH=$ROOTDIR/etc/ejabberd/ejabberd.cfg
-LOGS_DIR=$ROOTDIR/var/log/ejabberd/
-EJABBERD_DB=$ROOTDIR/var/lib/ejabberd/db/$NODE
+EJABBERD_CONFIG_PATH=${SYSCONFDIR}/ejabberd/ejabberd.cfg
+LOGS_DIR=${EJLOGDIR}
+EJABBERD_DB=${EJDBDIR}/${NODE}
+ID=`id -g`
+EJID=`id -g ${JABBERDUSER}`
 
 # read custom configuration
-CONFIG=$ROOTDIR/etc/ejabberd/ejabberdctl.cfg
+CONFIG=${SYSCONFDIR}/ejabberd/ejabberdctl.cfg
 [ -f "$CONFIG" ] && . "$CONFIG"
 
 # parse command line parameters
@@ -37,23 +39,33 @@ while [ $# -ne 0 ] ; do
     esac
 done
 
+NODE="${ERLANG_NODE%@*}"
+EJABBERD_DB=${EJDBDIR}/$NODE
+
 NAME=-name
 [ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && NAME=-sname
 
 ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES"
 
 # define additional environment variables
-EJABBERD_EBIN=$ROOTDIR/var/lib/ejabberd/ebin
-EJABBERD_MSGS_PATH=$ROOTDIR/var/lib/ejabberd/priv/msgs
-EJABBERD_SO_PATH=$ROOTDIR/var/lib/ejabberd/priv/lib
-EJABBERD_BIN_PATH=$ROOTDIR/var/lib/ejabberd/priv/bin
-EJABBERD_LOG_PATH=$LOGS_DIR/ejabberd.log
-SASL_LOG_PATH=$LOGS_DIR/sasl.log
+EJABBERD_EBIN=${LOCALBASE}/lib/ejabberd/ebin
+EJABBERD_MSGS_PATH=${LOCALBASE}/lib/ejabberd/priv/msgs
+EJABBERD_SO_PATH=${LOCALBASE}/lib/ejabberd/priv/lib
+EJABBERD_BIN_PATH=${LOCALBASE}/lib/ejabberd/priv/bin
+EJABBERD_LOG_PATH=${LOGS_DIR}/${NODE}.log
+SASL_LOG_PATH=${LOGS_DIR}/${NODE}_sasl.log
 DATETIME=`date "+%Y%m%d-%H%M%S"`
-ERL_CRASH_DUMP=$LOGS_DIR/erl_crash_$DATETIME.dump
-ERL_INETRC=$ROOTDIR/etc/ejabberd/inetrc
-HOME=$ROOTDIR/var/lib/ejabberd
+ERL_CRASH_DUMP=${LOGS_DIR}/erl_crash_${DATETIME}.dump
+ERL_INETRC=${SYSCONFDIR}/ejabberd/inetrc
+HOME=${EJDBDIR}
 
+# make sure we execute commands as proper user
+if [ $ID -eq 0 ]; then
+	EXEC_CMD='sudo -c - -u ${JABBERDUSER}'
+else
+	EXEC_CMD=''
+fi
+
 # export global variables
 export EJABBERD_CONFIG_PATH
 export EJABBERD_MSGS_PATH
@@ -64,23 +76,24 @@ export ERL_CRASH_DUMP
 export ERL_INETRC
 export ERL_MAX_PORTS
 export ERL_MAX_ETS_TABLES
+export EXEC_CMD
 export HOME
 
-[ -d $EJABBERD_DB ] || mkdir -p $EJABBERD_DB
-[ -d $LOGS_DIR ] || mkdir -p $LOGS_DIR
-
 # Compatibility in ZSH
 #setopt shwordsplit 2>/dev/null
 
 # start server
 start ()
 {
-    $ERL \
+    ${EXEC_CMD} $ERL \
       $NAME $ERLANG_NODE \
       -noinput -detached \
       -pa $EJABBERD_EBIN \
+      -kernel inetrc \"${ERL_INETRC}\" \
       -mnesia dir "\"$EJABBERD_DB\"" \
       -s ejabberd \
+      -ejabberd config \"${EJABBERD_CONFIG_PATH}\" \
+      log_path \"${EJABBERD_LOG_PATH}\" \
       -sasl sasl_error_logger \{file,\"$SASL_LOG_PATH\"\} \
       $ERLANG_OPTS $ARGS "$@"
 }
@@ -104,7 +117,7 @@ debug ()
     echo "Press any key to continue"
     read foo
     echo ""
-    $ERL \
+    ${EXEC_CMD} $ERL \
       $NAME ${NODE}debug \
       -remsh $ERLANG_NODE \
       $ERLANG_OPTS $ARGS "$@"
@@ -128,18 +141,21 @@ live ()
     echo "Press any key to continue"
     read foo
     echo ""
-    $ERL \
+    ${EXEC_CMD} $ERL \
       $NAME $ERLANG_NODE \
       -pa $EJABBERD_EBIN \
+      -kernel inetrc \"${ERL_INETRC}\" \
       -mnesia dir "\"$EJABBERD_DB\"" \
       -s ejabberd \
+      -ejabberd config \"${EJABBERD_CONFIG_PATH}\" \
+      log_path \"${EJABBERD_LOG_PATH}\" \
       $ERLANG_OPTS $ARGS "$@"
 }
 
 # common control function
 ctl ()
 {
-    $ERL \
+    ${EXEC_CMD} $ERL \
       $NAME ejabberdctl \
       -noinput \
       -pa $EJABBERD_EBIN \
@@ -171,6 +187,20 @@ usage ()
     ctl
     exit
 }
+
+# check if we're a user that can execute commands
+if [ "$ID" -ne 0 -a "$ID" -ne "$EJID" ]; then
+	echo "this command can only be run by root or the _ejabberd user" >&2
+	EXEC_CMD='false'
+	usage
+fi
+
+if [ ! -d $EJABBERD_DB -o ! -w $EJABBERD_DB ] ; then
+	if [ ! -d ${EJABBERD_DB%/*} -o ! -w ${EJABBERD_DB%/*} ] ; then
+		echo "${EJABBERD_DB} does not exist and I can't create it!"
+		exit 1
+	fi
+fi
 
 case $ARGS in
     ' start') start;;
