#PROCD_DEBUG=1
+check_listen() {
+ local value="$1"
+ local type="$2"
+
+ local address
+ local has_proto=0
+ local one two three
+ local tmp
+
+ [ -z "$value" ] && {
+ $LOG_ERR empty $type entry
+ exit 1
+ }
+
+ # IPv6 addresses need to be enclosed in square brackets. If there are
+ # square brackets in the listen entry, just copy it.
+ echo "$value" | grep "\[[0-9:A-Fa-f]*\]" &> /dev/null && {
+ options=$options" -l $value"
+ return
+ }
+
+ # Bail if more than 2 colons.
+ [ $(echo "$value" | awk -F ":" '{print NF-1}') -gt 2 ] && {
+ $LOG_ERR init script does not understand $type entry \""$value"\"
+ exit 1
+ }
+
+ IFS=":" read one two three << EOF
+$value
+EOF
+
+ case "$one" in
+ udp|tcp|tls|sctp)
+ tmp="$two"
+ has_proto=1
+ ;;
+ *)
+ tmp="$one"
+ ;;
+ esac
+
+ if [ "$type" = "listen" ]; then
+ network_get_ipaddr address "$tmp" || address="$tmp"
+ else
+ network_get_ipaddr6 address "$tmp" && address="[$address]" || \
+ address="$tmp"
+ fi
+
+ if [ -n "$three" ]; then
+ tmp="$one:$address:$three"
+ elif [ -n "$two" ]; then
+ if [ $has_proto = 1 ]; then
+ tmp="$one:$address"
+ else
+ tmp="$address:$two"
+ fi
+ else
+ tmp="$address"
+ fi
+
+ options=$options" -l $tmp"
+}
+
start_service() {
local enabled
local user
config_get cfg_file general cfg_file /etc/$NAME/$NAME.cfg
config_get options general options
+ . /lib/functions/network.sh
+
+ config_list_foreach general listen check_listen listen
+ config_list_foreach general listen6 check_listen listen6
+
if [ ! -d $RUNDIR ]; then
mkdir -p $RUNDIR
chown "$user":"$group" $RUNDIR