Skip to contentSkip to conversation

dracut-functions: additional symlinks for library files

PATCH In review Amadeusz Żołnowski 2 participants 2 messages Jul 7, 2010 – Jul 21, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 dracut-functions: additional symlinks for library files

rev_lib_symlinks: it's new
inst_library: creating additional symlinks for installed library files

---
 dracut-functions |   35 ++++++++++++++++++++++++++++++++++-
 1 files changed, 34 insertions(+), 1 deletions(-)
dracut-functions +34 -1
index 1f2528e..b9b4d43 100755
@@ -226,11 +226,36 @@ inst_simple() {
     cp -pfL "$src" "${initdir}$target"
 }
 
+# find symlinks linked to given library file
+# $1 = library file
+# Function searches for symlinks by stripping version numbers appended to
+# library filename, checks if it points to the same target and finally
+# prints the list of symlinks to stdout.
+#
+# Example:
+# rev_lib_symlinks libfoo.so.8.1
+# output: libfoo.so.8 libfoo.so
+# (Only if libfoo.so.8 and libfoo.so exists on host system.)
+rev_lib_symlinks() {
+    [[ ! $1 ]] && return 0
+
+    local fn="$1" orig="$(readlink -f "$1")" links=''
+
+    [[ ${fn} =~ .*\.so\..* ]] || return 1
+
+    until [[ ${fn##*.} == so ]]; do
+        fn="${fn%.*}"
+        [[ -L ${fn} && $(readlink -f "${fn}") == ${orig} ]] && links+=" ${fn}"
+    done
+
+    echo ${links}
+}
+
 # Same as above, but specialized to handle dynamic libraries.
 # It handles making symlinks according to how the original library
 # is referenced.
 inst_library() {
-    local src=$1 dest=${2:-$1}
+    local src=$1 dest=${2:-$1} lib reallib symlink
     [[ -e $initdir$dest ]] && return 0
     if [[ -L $src ]]; then
 	reallib=$(readlink -f "$src")
@@ -241,6 +266,14 @@ inst_library() {
     else
 	inst_simple "$src" "$dest"
     fi
+
+    # Create additional symlinks.  See rev_symlinks description.
+    for symlink in $(rev_lib_symlinks $src) $(rev_lib_symlinks $reallib); do
+        [[ ! -e $initdir$symlink ]] && {
+            dinfo "Creating extra symlink: $symlink"
+            inst_symlink $symlink
+        }
+    done
 }
 
 # find a binary.  If we were not passed the full path directly,
Signature · 1 line
1.7.1
#1 lore raw

pushed

Quoted 63 lines · Amadeusz Żołnowski

rev_lib_symlinks: it's new
inst_library: creating additional symlinks for installed library files

---
  dracut-functions |   35 ++++++++++++++++++++++++++++++++++-
  1 files changed, 34 insertions(+), 1 deletions(-)
dracut-functions +34 -1
index 1f2528e..b9b4d43 100755
@@ -226,11 +226,36 @@ inst_simple() {
      cp -pfL "$src" "${initdir}$target"
  }
 
+# find symlinks linked to given library file
+# $1 = library file
+# Function searches for symlinks by stripping version numbers appended to
+# library filename, checks if it points to the same target and finally
+# prints the list of symlinks to stdout.
+#
+# Example:
+# rev_lib_symlinks libfoo.so.8.1
+# output: libfoo.so.8 libfoo.so
+# (Only if libfoo.so.8 and libfoo.so exists on host system.)
+rev_lib_symlinks() {
+    [[ ! $1 ]]&&  return 0
+
+    local fn="$1" orig="$(readlink -f "$1")" links=''
+
+    [[ ${fn} =~ .*\.so\..* ]] || return 1
+
+    until [[ ${fn##*.} == so ]]; do
+        fn="${fn%.*}"
+        [[ -L ${fn}&&  $(readlink -f "${fn}") == ${orig} ]]&&  links+=" ${fn}"
+    done
+
+    echo ${links}
+}
+
  # Same as above, but specialized to handle dynamic libraries.
  # It handles making symlinks according to how the original library
  # is referenced.
  inst_library() {
-    local src=$1 dest=${2:-$1}
+    local src=$1 dest=${2:-$1} lib reallib symlink
      [[ -e $initdir$dest ]]&&  return 0
      if [[ -L $src ]]; then
  	reallib=$(readlink -f "$src")
@@ -241,6 +266,14 @@ inst_library() {
      else
  	inst_simple "$src" "$dest"
      fi
+
+    # Create additional symlinks.  See rev_symlinks description.
+    for symlink in $(rev_lib_symlinks $src) $(rev_lib_symlinks $reallib); do
+        [[ ! -e $initdir$symlink ]]&&  {
+            dinfo "Creating extra symlink: $symlink"
+            inst_symlink $symlink
+        }
+    done
  }
 
  # find a binary.  If we were not passed the full path directly,