Author: hrs
Date: Mon Oct 21 08:49:46 2013
New Revision: 256835
URL: http://svnweb.freebsd.org/changeset/base/256835

Log:
  - Fix jail_parallel_start="YES".
  - Fix ip[46].addr when interface parameter is not defined.
  
  Spotted by:   rpaulo

Modified:
  head/etc/rc.d/jail

Modified: head/etc/rc.d/jail
==============================================================================
--- head/etc/rc.d/jail  Mon Oct 21 08:37:17 2013        (r256834)
+++ head/etc/rc.d/jail  Mon Oct 21 08:49:46 2013        (r256835)
@@ -132,7 +132,9 @@ parse_options()
        #
        _confwarn=1
        if [ -r "$jail_conf" -o -r "$_jconf" ]; then
-               warn "$_conf is created and used for jail $_j."
+               if ! checkyesno jail_parallel_start; then
+                       warn "$_conf is created and used for jail $_j."
+               fi
        fi
        /usr/bin/install -m 0644 -o root -g wheel /dev/null $_conf || return 1
 
@@ -367,10 +369,10 @@ jail_handle_ips_option()
                # Append address to list of addresses for the jail command.
                case $_type in
                inet)
-                       echo "  ip4.addr += \"${_iface}|${_addr}${_mask}\";"
+                       echo "  ip4.addr += 
\"${_iface:+${_iface}|}${_addr}${_mask}\";"
                ;;
                inet6)
-                       echo "  ip6.addr += \"${_iface}|${_addr}${_mask}\";"
+                       echo "  ip6.addr += 
\"${_iface:+${_iface}|}${_addr}${_mask}\";"
                        need_dad_wait=1
                ;;
                esac
@@ -418,7 +420,7 @@ jail_status()
 
 jail_start()
 {
-       local _j _jid _jn
+       local _j _jid _jn _jl
 
        if [ $# = 0 ]; then
                return
@@ -446,30 +448,62 @@ jail_start()
                return
        ;;
        esac
-       for _j in $@; do
-               _j=$(echo $_j | tr /. _)
-               parse_options $_j || continue
-
-               eval rc_flags=\${jail_${_j}_flags:-$jail_flags}
-               eval command=\${jail_${_j}_program:-$jail_program}
-               if checkyesno jail_parallel_start; then
-                       command_args="-i -f $_conf -c $_j &"
-               else
+       if checkyesno jail_parallel_start; then
+               #
+               # Start jails in parallel and then check jail id when
+               # jail_parallel_start is YES.
+               #
+               _jl=
+               for _j in $@; do
+                       _j=$(echo $_j | tr /. _)
+                       parse_options $_j || continue
+
+                       _jl="$_jl $_j"
+                       eval rc_flags=\${jail_${_j}_flags:-$jail_flags}
+                       eval command=\${jail_${_j}_program:-$jail_program}
                        command_args="-i -f $_conf -c $_j"
-               fi
-               _tmp=`mktemp -t jail` || exit 3
-               if $command $rc_flags $command_args \
-                   >> $_tmp 2>&1 </dev/null; then
+                       $command $rc_flags $command_args \
+                           >/dev/null 2>&1 </dev/null &
+               done
+               sleep 1
+               for _j in $_jl; do
                        echo -n " ${_hostname:-${_j}}"
-                       _jid=$($jail_jls -n -j $_j | tr " " "\n" | grep ^jid=)
-                       echo "${_jid#jid=}" > /var/run/jail_${_j}.id
-               else
-                       rm -f /var/run/jail_${_j}.id
-                       echo " cannot start jail \"${_hostname:-${_j}}\": "
-                       cat $_tmp
-               fi
-               rm -f $_tmp
-       done
+                       if _jid=$($jail_jls -n -j $_j | tr " " "\n" | \
+                           grep ^jid=); then
+                               echo "${_jid#jid=}" > /var/run/jail_${_j}.id
+                       else
+                               rm -f /var/run/jail_${_j}.id
+                               echo " cannot start jail " \
+                                   "\"${_hostname:-${_j}}\": "
+                       fi
+               done
+       else
+               #
+               # Start jails one-by-one when jail_parallel_start is NO.
+               #
+               for _j in $@; do
+                       _j=$(echo $_j | tr /. _)
+                       parse_options $_j || continue
+
+                       eval rc_flags=\${jail_${_j}_flags:-$jail_flags}
+                       eval command=\${jail_${_j}_program:-$jail_program}
+                       command_args="-i -f $_conf -c $_j"
+                       _tmp=`mktemp -t jail` || exit 3
+                       if $command $rc_flags $command_args \
+                           >> $_tmp 2>&1 </dev/null; then
+                               echo -n " ${_hostname:-${_j}}"
+                               _jid=$($jail_jls -n -j $_j | \
+                                   tr " " "\n" | grep ^jid=)
+                               echo "${_jid#jid=}" > /var/run/jail_${_j}.id
+                       else
+                               rm -f /var/run/jail_${_j}.id
+                               echo " cannot start jail " \
+                                   "\"${_hostname:-${_j}}\": "
+                               cat $_tmp
+                       fi
+                       rm -f $_tmp
+               done
+       fi
        echo '.'
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to