--- /dev/null
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2008 OpenWrt.org
+
+START=90
+STOP=10
+
+MAIL_ROOT=
+DAEMON=/usr/bin/XMail
+NAME=XMail
+
+append_bool() {
+ local section="$1"
+ local option="$2"
+ local value="$3"
+ local _loctmp
+ config_get_bool _loctmp "$section" "$option"
+ [ "$_loctmp" -le 0 ] && return 0
+ append args "$value"
+}
+
+append_parm() {
+ local section="$1"
+ local option="$2"
+ local switch="$3"
+ local _loctmp
+ config_get _loctmp "$section" "$option"
+ [ -z "$_loctmp" ] && return 0
+ append args "$switch $_loctmp"
+}
+
+xmail() {
+ local cfg="$1"
+
+ append_parm "$cfg" mail_root "-Ms"
+ append_bool "$cfg" debug "-Md"
+ append_parm "$cfg" log_rotate "-Mr"
+ append_parm "$cfg" split_level "-Mx"
+ append_parm "$cfg" rx_buffer "-MR"
+ append_parm "$cfg" tx_buffer "-MS"
+ append_bool "$cfg" maildir_delivery "-MM"
+ append_bool "$cfg" mailbox_delivery "-Mm"
+ append_parm "$cfg" dns_cache_dirs "-MD"
+ append_bool "$cfg" ipv4_only "-M4"
+ append_bool "$cfg" ipv6_only "-M6"
+ append_bool "$cfg" ipv4_then_ipv6 "-M5"
+ append_bool "$cfg" ipv6_then_ipv4 "-M7"
+
+ config_get mail_root $cfg mail_root
+ [ -n "$mail_root" ] || return 0
+ MAIL_ROOT=$mail_root
+}
+
+pop3() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-P-"
+ append_bool "$cfg" ipv6 "-P6"
+ append_parm "$cfg" server_port "-Pp"
+ append_parm "$cfg" session_timeout "-Pt"
+ append_bool "$cfg" log "-Pl"
+ append_parm "$cfg" delay_timeout "-Pw"
+ append_bool "$cfg" bad_login_hang "-Ph"
+ append_parm "$cfg" local_address "-PI"
+ append_parm "$cfg" num_threads "-PX"
+}
+
+pop3s() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-B-"
+ append_bool "$cfg" ipv6 "-B6"
+ append_parm "$cfg" server_port "-Bp"
+ append_parm "$cfg" local_address "-BI"
+}
+
+smtp() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-S-"
+ append_bool "$cfg" ipv6 "-S6"
+ append_parm "$cfg" server_port "-Sp"
+ append_parm "$cfg" session_timeout "-St"
+ append_bool "$cfg" log "-Sl"
+ append_parm "$cfg" local_address "-SI"
+ append_parm "$cfg" num_threads "-SX"
+ append_parm "$cfg" max_recipients "-Sr"
+ append_parm "$cfg" expire_timeout "-Se"
+}
+
+smtps() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-X-"
+ append_bool "$cfg" ipv6 "-X6"
+ append_parm "$cfg" server_port "-Xp"
+ append_parm "$cfg" local_address "-XI"
+}
+
+smail() {
+ local cfg="$1"
+
+ append_parm "$cfg" num_threads "-Qn"
+ append_parm "$cfg" next_try_timeout "-Qt"
+ append_parm "$cfg" ratio "-Qi"
+ append_parm "$cfg" retries "-Qr"
+ append_bool "$cfg" log "-Ql"
+ append_parm "$cfg" filters_timeout "-QT"
+ append_bool "$cfg" filter_log "-Qg"
+}
+
+psync() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-Y-"
+ append_parm "$cfg" interval "-Yi"
+ append_parm "$cfg" num_threads "-Yt"
+ append_parm "$cfg" timeout "-Yi"
+ append_bool "$cfg" log "-Yl"
+}
+
+finger() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-F-"
+ append_bool "$cfg" ipv6 "-F6"
+ append_parm "$cfg" server_port "-Fp"
+ append_bool "$cfg" log "-Fl"
+ append_parm "$cfg" local_address "-FI"
+}
+
+ctrl() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-C-"
+ append_bool "$cfg" ipv6 "-C6"
+ append_parm "$cfg" server_port "-Cp"
+ append_parm "$cfg" session_timeout "-Ct"
+ append_bool "$cfg" log "-Cl"
+ append_parm "$cfg" local_address "-CI"
+ append_parm "$cfg" num_threads "-CX"
+}
+
+ctrls() {
+ local cfg="$1"
+
+ append_bool "$cfg" disable "-W-"
+ append_bool "$cfg" ipv6 "-W6"
+ append_parm "$cfg" server_port "-Wp"
+ append_parm "$cfg" session_timeout "-Wt"
+}
+
+lmail() {
+ local cfg="$1"
+
+ append_parm "$cfg" num_threads "-Ln"
+ append_parm "$cfg" sleep_timeout "-Lt"
+ append_bool "$cfg" log "-Ll"
+}
+
+start() {
+ test -f $DAEMON || exit 0
+
+ set -e
+ ulimit -c 10000
+ ulimit -s 128
+
+ config_load xmail
+
+ args=""
+
+ config_foreach xmail xmail
+ config_foreach pop3 pop3
+ config_foreach pop3s pop3s
+ config_foreach smtp smtp
+ config_foreach smtps smtps
+ config_foreach smail smail
+ config_foreach psync psync
+ config_foreach finger finger
+ config_foreach ctrl ctrl
+ config_foreach ctrls ctrls
+ config_foreach lmail lmail
+
+ [ -z "$MAIL_ROOT" ] && exit 0
+ [ -d $MAIL_ROOT ] || exit 0
+
+ export MAIL_ROOT
+
+ rm -f /var/run/$NAME.pid
+
+ $DAEMON $args
+
+ MAX_WAIT=20
+ while [ ! -f /var/run/$NAME.pid -a $MAX_WAIT -gt 0 ]
+ do
+ sleep 1
+ MAX_WAIT=`expr $MAX_WAIT - 1`
+ done
+}
+
+stop() {
+ if [ -f /var/run/$NAME.pid ]
+ then
+ config_load xmail
+ config_foreach xmail xmail
+ [ -z "$MAIL_ROOT" ] || echo `date` > $MAIL_ROOT/.shutdown
+ kill -INT `cat /var/run/$NAME.pid`
+
+ MAX_WAIT=20
+ while [ -f $MAIL_ROOT/.shutdown -a $MAX_WAIT -gt 0 ]
+ do
+ sleep 1
+ MAX_WAIT=`expr $MAX_WAIT - 1`
+ done
+ fi
+}
+
+restart() {
+ stop
+ sleep 1
+ start
+}