Blob Blame History Raw
From d4bb4316214022ae7902c5c45ab557f7ea8a5c39 Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@redhat.com>
Date: Mon, 25 Jul 2011 10:25:44 +0200
Subject: [PATCH] dracut-functions: convert absolute symlinks to relative

---
 dracut-functions |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/dracut-functions b/dracut-functions
index cdb1964..2a45419 100755
--- a/dracut-functions
+++ b/dracut-functions
@@ -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() {
         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() {
         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