From 711c46457ae9fef52c7c529d89c67d0d526f73ef Mon Sep 17 00:00:00 2001 From: Jouke Witteveen Date: Mon, 6 May 2013 19:20:25 +0200 Subject: Improve array handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When interpreted as an array, the empty string represents a 1-element array consisting of the empty string. This is actually very reasonable. Reported by: Thomas Bächler --- src/lib/connections/bond | 2 +- src/lib/connections/bridge | 2 +- src/lib/connections/tunnel | 2 +- src/lib/connections/tuntap | 2 +- src/lib/globals | 2 +- src/lib/ip | 58 ++++++++++++++++++++-------------------------- src/netctl.in | 5 ++-- 7 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/lib/connections/bond b/src/lib/connections/bond index 099e44c..ea56f3b 100644 --- a/src/lib/connections/bond +++ b/src/lib/connections/bond @@ -3,7 +3,7 @@ . "$SUBR_DIR/ip" : ${IFENSLAVE:=ifenslave} -: ${BindsToInterfaces=} +declare -a BindsToInterfaces bond_up() { if is_interface "$Interface"; then diff --git a/src/lib/connections/bridge b/src/lib/connections/bridge index 5ad380d..56e2c84 100644 --- a/src/lib/connections/bridge +++ b/src/lib/connections/bridge @@ -3,7 +3,7 @@ . "$SUBR_DIR/ip" : ${BRCTL:=brctl} -: ${BindsToInterfaces=} +declare -a BindsToInterfaces bridge_up() { if is_interface "$Interface"; then diff --git a/src/lib/connections/tunnel b/src/lib/connections/tunnel index fd8dee3..34882b2 100644 --- a/src/lib/connections/tunnel +++ b/src/lib/connections/tunnel @@ -2,7 +2,7 @@ . "$SUBR_DIR/ip" -: ${BindsToInterfaces=} +declare -a BindsToInterfaces tunnel_up() { if is_interface "$Interface"; then diff --git a/src/lib/connections/tuntap b/src/lib/connections/tuntap index d035262..71a8259 100644 --- a/src/lib/connections/tuntap +++ b/src/lib/connections/tuntap @@ -2,7 +2,7 @@ . "$SUBR_DIR/ip" -: ${BindsToInterfaces=} +declare -a BindsToInterfaces tuntap_up() { if is_interface "$Interface"; then diff --git a/src/lib/globals b/src/lib/globals index 94c2ac7..1d7feea 100644 --- a/src/lib/globals +++ b/src/lib/globals @@ -78,7 +78,7 @@ timeout_wait() { local timeout=$1 (( timeout *= 5 )) shift - while ! eval "$*"; do + until eval "$*"; do (( timeout-- > 0 )) || return 1 sleep 0.2 done diff --git a/src/lib/ip b/src/lib/ip index 8af7069..2a84c0d 100644 --- a/src/lib/ip +++ b/src/lib/ip @@ -51,14 +51,12 @@ ip_set() { esac ;; static) - if [[ $Address ]]; then - for addr in "${Address[@]}"; do - if ! do_debug ip addr add "$addr" brd + dev "$Interface"; then - report_error "Could not add address '$addr' to interface '$Interface'" - return 1 - fi - done - fi + for addr in "${Address[@]}"; do + if ! do_debug ip addr add "$addr" brd + dev "$Interface"; then + report_error "Could not add address '$addr' to interface '$Interface'" + return 1 + fi + done if [[ $Gateway ]]; then if ! do_debug ip route add default via "$Gateway" dev "$Interface"; then report_error "Could not set gateway '$Gateway' on interface '$Interface'" @@ -74,8 +72,8 @@ ip_set() { ;; esac - # Add static IP routes - if [[ $IP && $Routes ]]; then + if [[ $IP ]]; then + # Add static IP routes for route in "${Routes[@]}"; do if ! do_debug ip route add $route dev "$Interface"; then report_error "Could not add route '$route' to interface '$Interface'" @@ -121,13 +119,11 @@ ip_set() { sysctl -q -w "net.ipv6.conf.$interface_sysctl.accept_ra=0" ;;& stateless|static) - if [[ -n $Address6 ]]; then - for addr in "${Address6[@]}"; do - if ! do_debug ip -6 addr add $addr dev "$Interface"; then - report_error "Could not add address '$addr' to interface '$Interface'" - fi - done - fi + for addr in "${Address6[@]}"; do + if ! do_debug ip -6 addr add $addr dev "$Interface"; then + report_error "Could not add address '$addr' to interface '$Interface'" + fi + done ;; esac @@ -139,14 +135,12 @@ ip_set() { fi # Add static IPv6 routes - if [[ $Routes6 ]]; then - for route in "${Routes6[@]}"; do - if ! do_debug ip -6 route add $route dev "$Interface"; then - report_error "Could not add route '$route' to interface '$Interface'" - return 1 - fi - done - fi + for route in "${Routes6[@]}"; do + if ! do_debug ip -6 route add $route dev "$Interface"; then + report_error "Could not add route '$route' to interface '$Interface'" + return 1 + fi + done # Set a custom gateway after DAD has finished if [[ $IP6 == @(stateless|static) && $Gateway6 ]]; then @@ -157,14 +151,12 @@ ip_set() { fi fi - if [[ $IPCustom ]]; then - for line in "${IPCustom[@]}"; do - if ! do_debug ip $line; then - report_error "Could not configure interface ($line)" - return 1 - fi - done - fi + for line in "${IPCustom[@]}"; do + if ! do_debug ip $line; then + report_error "Could not configure interface ($line)" + return 1 + fi + done if [[ $Hostname ]]; then if ! do_debug hostnamectl set-hostname "$Hostname"; then diff --git a/src/netctl.in b/src/netctl.in index 2d04d28..e9325e3 100644 --- a/src/netctl.in +++ b/src/netctl.in @@ -109,14 +109,15 @@ unit_enable() { echo ".include @systemdsystemunitdir@/netctl@.service" > "$unit" echo -e "\n[Unit]" >> "$unit" [[ -n $Description ]] && echo "Description=$Description" >> "$unit" - if [[ -n ${BindsToInterfaces=$Interface} ]]; then + [[ -v BindsToInterfaces ]] || BindsToInterfaces=$Interface + if (( ${#BindsToInterfaces[@]} )); then : ${InterfaceRoot=sys/subsystem/net/devices/} printf "BindsTo=$(sd_escape "$InterfaceRoot")%s.device\n" \ $(sd_escape "${BindsToInterfaces[@]}") >> "$unit" printf "After=$(sd_escape "$InterfaceRoot")%s.device\n" \ $(sd_escape "${BindsToInterfaces[@]}") >> "$unit" fi - if [[ -n $After ]]; then + if (( ${#After[@]} )); then printf 'After="netctl@%s.service"\n' \ $(sd_escape "${After[@]}") >> "$unit" fi -- cgit v1.2.3-24-g4f1b