X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fbackupninja.git;a=blobdiff_plain;f=lib%2Ftools.in;h=c14e4a25195b17e23bb09a26a97318aef1386d57;hp=2ec4da05c213df7b832006cdc6cebcc0d69cd27f;hb=2fc3bd4d5d981eb2e5b4e7f31047c8f24b877c9e;hpb=66d619bf64dec4c7472b5d4c09a964f5027fadb4 diff --git a/lib/tools.in b/lib/tools.in index 2ec4da0..c14e4a2 100644 --- a/lib/tools.in +++ b/lib/tools.in @@ -1,5 +1,6 @@ #!@BASH@ # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- +# vim: set filetype=sh sw=3 sts=3 expandtab autoindent: # This file contains functions shared between ninjahelper and backupninja. @@ -10,46 +11,104 @@ # create a temporary file in a secure way. # function maketemp() { - if [ -x /bin/mktemp ] - then - local tempfile=`mktemp /tmp/$1.XXXXXXXX` - else - DATE=`date` - sectmp=`echo $DATE | /usr/bin/md5sum | cut -d- -f1` - local tempfile=/tmp/$1.$sectmp - fi - echo $tempfile + local tempfile=`mktemp /tmp/$1.XXXXXXXX` + echo $tempfile } ##################################################### ## CONFIG-FILE RELATED FUNCTIONS function setfile() { - CURRENT_CONF_FILE=$1 + CURRENT_CONF_FILE=$1 } function setsection() { - CURRENT_SECTION=$1 + CURRENT_SECTION=$1 } # -# sets a global var with name equal to $1 -# to the value of the configuration parameter $1 -# $2 is the default. -# +# Retrieves the configuration variable named $1 from the current config +# file and section and echoes its value. If it is empty or not found, $2 +# is used. +function printconf() { + # Be careful! This function might be called with an empty IFS + + local CURRENT_PARAM=$1 + local ret=`@AWK@ -f $libdirectory/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE` + # if nothing is returned, set the default + if [ -z "$ret" -a -n "$2" ]; then + ret="$2" + fi + + echo "$ret" +} + + +# +# Retrieves the configuration variable named $1 from the current config +# file and section and assigns its value to the global variable with the +# same name. If it is empty or not found, $2 is used. +# function getconf() { - CURRENT_PARAM=$1 - ret=`awk -f $libdirectory/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE` - # if nothing is returned, set the default - if [ "$ret" == "" -a "$2" != "" ]; then - ret="$2" - fi - - # replace * with %, so that it is not globbed. - ret="${ret//\\*/__star__}" - - # this is weird, but single quotes are needed to - # allow for returned values with spaces. $ret is still expanded - # because it is in an 'eval' statement. - eval $1='$ret' + # Be careful! This function might be called with an empty IFS + + local ret=`printconf "$1" "$2"` + + # We use escape the $ in $ret to delay expansion of $ret, so when $1 + # is foo, eval sees foo=$ret and properly does the assignment + # (without the backslash, the right part of the assignment would be + # whatever is in ret and be subject to all kinds of expansion. + eval $1=\$ret +} + +# Reads the variable denoted by $1 from the current configuration file +# and section into the array variable pointed to by $1. Each line in the +# configuration file is returned as a separate element in the resulting +# array. For example, the following ini fragment results in an array +# with three values: "one", "two" and "three" +# [section] +# variable=one\ +# two +# variable=three +# $2, $3, etc. are used as the default value (e.g., each of the +# arguments are elements in the resulting array) +function getconf_lines() { + # Run getconf_words with an empty IFS, so the read in there does not + # do any word splitting. This shouldn't affect any other splitting + # (since IFS is only used to split expanded parameters, not the + # spaces that are in this file directly). + IFS='' getconf_words "$@" +} + +# Reads the variable denoted by $1 from the current configuration file +# and section into the array variable pointed to by $1. Each word in +# each line in the configuration file is returned as a separate element +# in the resulting array. Whitespace can be escaped using backslashes. For +# example, the following ini fragment results in an array with three +# values: "one one", "two" and "three" +# [section] +# variable=one\ one two +# variable=three +# $2 is used as the default value (which should be just a string, which +# will be split on newlines and whitespace) +function getconf_words() { + # Be careful! This function might be called with an empty IFS + + # Get the variable name, so $@ only contains the default elements + local varname="$1" + shift + # Get the value from the config + local value=`printconf $varname ""` + # Init the result variable to an empty array + eval "$varname=()" + if [ -z "$value" ]; then + # Use the default value, i.e., copy $@ into the result + append "$varname" "$@" + else + local tmp + # Read every line and append it to our result + while read -a tmp; do + append "$varname" "${tmp[@]}" + done <<< "$value" + fi }