Browse Source

dracut-functions: convert absolute symlinks to relative

master
Harald Hoyer 14 years ago
parent
commit
d4bb431621
  1. 59
      dracut-functions

59
dracut-functions

@ -82,6 +82,55 @@ print_vars() { @@ -82,6 +82,55 @@ print_vars() {
done
}


convert_abs_rel() {
local __current __absolute __abssize __cursize __i __level __newpath
# PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';

if [[ "$1" == "$2" ]]
then
echo "."
return
fi

IFS="/"

__current=($1)
__absolute=($2)

__abssize=${#__absolute[@]}
__cursize=${#__current[@]}

while [[ ${__absolute[__level]} == ${__current[__level]} ]]
do
(( __level++ ))
if (( __level > __abssize || __level > __cursize ))
then
break
fi
done

for ((__i = __level; __i < __cursize-1; __i++))
do
if ((__i > __level))
then
__newpath=$__newpath"/"
fi
__newpath=$__newpath".."
done

for ((__i = __level; __i < __abssize; __i++))
do
if [[ -n $__newpath ]]
then
__newpath=$__newpath"/"
fi
__newpath=$__newpath${__absolute[__i]}
done

echo "$__newpath"
}

get_fs_env() {
[[ $1 ]] || return
unset ID_FS_TYPE
@ -228,10 +277,12 @@ inst_dir() { @@ -228,10 +277,12 @@ inst_dir() {
if [[ -L $_file ]]; then
# create link as the original
local target=$(readlink "$_file")
ln -sfn "$target" "${initdir}$_file" || return 1
# resolve relative path and recursively install destination
[[ $target == ${target#/} ]] && target="$(dirname "$_file")/$target"
inst_dir "$target"
inst_symlink "$_file"
#ln -sfn "$target" "${initdir}$_file" || return 1
# resolve relative path and recursively install destination
#[[ $target == ${target#/} ]] && target="$(dirname "$_file")/$target"
#inst_dir "$target"
else
[[ -h ${initdir}$_file ]] && _file=$(readlink "${initdir}$_file")
# create directory
@ -409,7 +460,7 @@ inst_symlink() { @@ -409,7 +460,7 @@ inst_symlink() {
inst "$_realsrc" && mkdir -m 0755 -p "${_target%/*}"
fi
if [[ -e "${_src}" ]]; then
cp -aP "${_src}" "$_target"
ln -sfn $(convert_abs_rel "${_src}" "${_realsrc}") "$_target"
else
ln -sfn "$_realsrc" "$_target"
fi

Loading…
Cancel
Save