From c84cd3c8ee0c0a7a3fd0432cc50a9472862d44d0 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Wed, 4 Dec 2013 01:11:09 +0400 Subject: [PATCH] ajout de readlinkm(). support de cgiscript sur toutes les plateformes --- ulib/.ulib_version | 2 +- ulib/base | 8 ++++++++ ulib/compat | 3 +++ ulib/support/cgiscript | 33 +++++++++++++-------------------- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/ulib/.ulib_version b/ulib/.ulib_version index b1bd38b..8351c19 100644 --- a/ulib/.ulib_version +++ b/ulib/.ulib_version @@ -1 +1 @@ -13 +14 diff --git a/ulib/base b/ulib/base index ae4bd47..c3c5fc1 100644 --- a/ulib/base +++ b/ulib/base @@ -1034,10 +1034,12 @@ function splitwcs() { function deref() { # Retourner un chemin absolu vers le fichier $1, dans lequel toutes les # composantes "lien symbolique" ont été supprimées. +# DEPRECATED: Cette fonction est dépréciée. Utiliser à la place readlinkm() local OENC="$UTF8" local max_deref=50 local file="$1" + local basedir link while [ -L "$file" ]; do basedir="$(dirname "$file")" link="$(readlink "$file")" @@ -1054,6 +1056,12 @@ function deref() { done abspath "$file" } +function readlinkm() { +# Retourner un chemin absolu vers le fichier $1, dans lequel toutes les +# composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les +# composantes du chemin existent. + readlink -m "$1" +} function path_if_test() { # afficher un chemin si le fichier $2 existe (en utilisant l'opérateur $1) dans # l'un des chemins absolus $4..n. si $3==relative, afficher le chemin relatif, diff --git a/ulib/compat b/ulib/compat index a7dd865..8bc2870 100644 --- a/ulib/compat +++ b/ulib/compat @@ -7,6 +7,9 @@ uprovide compat urequire base sysinfos if check_sysinfos -s macosx; then + # implémentation en bash des variantes de readlink + function __rlnp() { local p="$1" np f; [ "${p#/}" == "$p" ] && p="$(pwd)/$p"; while [[ "$p" == *//* ]]; do p="${p//\/\///}"; done; p="${p%/}"; p="${p#/}"; np=; while [ -n "$p" ]; do if [[ "$p" == */* ]]; then f="${p%%/*}"; p="${p#*/}"; else f="$p"; p=; fi; if [ "$f" == . ]; then :; elif [ "$f" == .. ]; then if [[ "$np" == */* ]]; then np="${np%/*}"; else np=; fi; else [ -n "$np" ] && np="$np/"; np="$np$f"; fi; done; echo "/$np"; } + function readlinkm() { local p="$(__rlnp "$1")" np n; while [ -n "$p" ]; do local max=50; while [ -L "$p" -a $max -gt 0 ]; do n="$(readlink "$p")"; if [ "${n#/}" != "$n" ]; then p="$n"; else p="${p%/*}/$n"; fi; p="$(__rlnp "$p")"; max=$(($max-1)); done; [ -n "$np" ] && np="/$np"; if [[ "$p" == */* ]]; then np="${p##*/}$np"; p="${p%/*}"; else np="$p$np"; p=; fi; done; echo "/$np"; } # la version de awk livrée sur macosx est braindead function _nl2lf() { awk '{ sub(/\r$/, ""); gsub(/\r/, "\n"); print }'; } function _nl2crlf() { _nl2lf | awk '{ print $0 "\r" }'; } diff --git a/ulib/support/cgiscript b/ulib/support/cgiscript index c4bf4a9..025fc68 100644 --- a/ulib/support/cgiscript +++ b/ulib/support/cgiscript @@ -7,30 +7,23 @@ # d'origine. Ce fichier permet de s'assurer que scriptdir a la bonne valeur. # cgiscriptdir contient la valeur d'origine, c'est à dire le répertoire cgi à # partir duquel le script est lancé. -cgiscriptdir="$(dirname "$0")" +cgiscriptdir="$(cd "$(dirname -- "$0")"; pwd)" +cgiscriptname="$(basename -- "$0")" if [ "$(uname -s)" == Linux ]; then script="$(readlink -f -- "$0")" - scriptdir="$(dirname -- "$script")" - scriptname="$(basename -- "$script")" -elif [ -L "$0" ]; then - # Sur un système autre que linux, readlink -f n'existe sans doute pas. - # On ne supporte que le cas où le script lui-même est un lien symbolique, et - # on fait implémentation limitée de readlink -f: si le lien est relatif, - # l'exprimer par rapport à $scriptdir. Ne prendre qu'un seul niveau de lien - # symbolique. - script="$(readlink -- "$0")" - [ "${script#/}" != "$script" ] || script="$cgiscriptdir/$script" - scriptdir="$(dirname -- "$script")" - scriptdir="$(cd "$scriptdir"; pwd)" - scriptname="$(basename -- "$script")" - script="$scriptdir/$scriptname" else - scriptdir="$(dirname -- "$0")" - scriptdir="$(cd "$scriptdir"; pwd)" - scriptname="$(basename -- "$0")" - script="$scriptdir/$scriptname" + # Sur un système autre que linux, les options avancées (-f, -e, -m) de + # readlink n'existent sans doute pas. Implémenter en bash l'équivalent de + # readlink -m + script="$( + function __normpath() { local p="$1" np f; [ "${p#/}" == "$p" ] && p="$(pwd)/$p"; while [[ "$p" == *//* ]]; do p="${p//\/\///}"; done; p="${p%/}"; p="${p#/}"; np=; while [ -n "$p" ]; do if [[ "$p" == */* ]]; then f="${p%%/*}"; p="${p#*/}"; else f="$p"; p=; fi; if [ "$f" == . ]; then :; elif [ "$f" == .. ]; then if [[ "$np" == */* ]]; then np="${np%/*}"; else np=; fi; else [ -n "$np" ] && np="$np/"; np="$np$f"; fi; done; echo "/$np"; } + function __readlinkm() { local p="$(__normpath "$1")" np n; while [ -n "$p" ]; do local max=50; while [ -L "$p" -a $max -gt 0 ]; do n="$(readlink "$p")"; if [ "${n#/}" != "$n" ]; then p="$n"; else p="${p%/*}/$n"; fi; p="$(__normpath "$p")"; max=$(($max-1)); done; [ -n "$np" ] && np="/$np"; if [[ "$p" == */* ]]; then np="${p##*/}$np"; p="${p%/*}"; else np="$p$np"; p=; fi; done; echo "/$np"; } + __readlinkm "$0" + )" fi +scriptdir="$(dirname -- "$script")" +scriptname="$(basename -- "$script")" UTOOLS_HAVE_SCRIPTVARS=1 -# Juste après avoir inclu ce fichier, il faut rajouter une ligne comme celle-ci +# Juste après avoir inclu ce fichier, on peut rajouter une ligne comme celle-ci # pour charger ulib: #source "$scriptdir/ulib/auto"