diff options
Diffstat (limited to 'sys-kernel/dracut/files/dracut-002-dir-symlinks.patch')
-rw-r--r-- | sys-kernel/dracut/files/dracut-002-dir-symlinks.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/sys-kernel/dracut/files/dracut-002-dir-symlinks.patch b/sys-kernel/dracut/files/dracut-002-dir-symlinks.patch new file mode 100644 index 000000000000..9106e3719259 --- /dev/null +++ b/sys-kernel/dracut/files/dracut-002-dir-symlinks.patch @@ -0,0 +1,102 @@ +From 044fbc9ed51e4df819ee5710ed519c566579ff59 Mon Sep 17 00:00:00 2001 +From: Lance Albertson <lance@osuosl.org> +Date: Sat, 26 Sep 2009 21:33:41 -0700 +Subject: [PATCH 3/3] dir symlinks + +--- + dracut | 2 +- + dracut-functions | 43 +++++++++++++++++++++++++++++++++++++------ + 2 files changed, 38 insertions(+), 7 deletions(-) + +diff --git a/dracut b/dracut +index b96ad5e..0518969 100755 +--- a/dracut ++++ b/dracut +@@ -174,7 +174,7 @@ export initdir hookdirs dsrc dracutmodules drivers \ + if [[ $kernel_only != yes ]]; then + # Create some directory structure first + for d in bin sbin usr/bin usr/sbin usr/lib etc proc sys sysroot tmp dev/pts var/run; do +- mkdir -p "$initdir/$d"; ++ inst_dir "/$d"; + done + fi + +diff --git a/dracut-functions b/dracut-functions +index 2abd6f2..1f2d1e6 100755 +--- a/dracut-functions ++++ b/dracut-functions +@@ -131,6 +131,36 @@ check_vol_slaves() { + return 1 + } + ++# Install a directory, keeping symlinks as on the original system. ++# Example: if /lib64 points to /lib on the host, "inst_dir /lib/file" ++# will create ${initdir}/lib64, ${initdir}/lib64/file, ++# and a symlink ${initdir}/lib -> lib64. ++inst_dir() { ++ local dir="$1" ++ [[ -e "${initdir}$dir" ]] && return 0 ++ ++ # iterate over parent directories ++ local file="" ++ local IFS="/" ++ for part in $dir; do ++ [ -z "$part" ] && continue ++ file="$file/$part" ++ [[ -e "${initdir}$file" ]] && continue ++ ++ 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 destionation ++ [[ "$target" = "${target##*/}" ]] && target="${file%/*}/$target" ++ inst_dir "$target" ++ else ++ # create directory ++ mkdir -p "${initdir}$file" || return 1 ++ fi ++ done ++} ++ + # $1 = file to copy to ramdisk + # $2 (optional) Name for the file on the ramdisk + # Location of the image dir is assumed to be $initdir +@@ -138,11 +168,11 @@ check_vol_slaves() { + inst_simple() { + local src target + [[ -f $1 ]] || return 1 +- src=$1 target=${initdir}${2:-$1} +- [[ -f $target ]] && return 0 +- mkdir -p "${target%/*}" ++ src=$1 target="${2:-$1}" ++ [[ -f ${initdir}$target ]] && return 0 ++ inst_dir "${target%/*}" + dinfo "Installing $src" +- cp -pfL "$src" "$target" ++ cp -fL "$src" "${initdir}$target" + } + + # Same as above, but specialzed to handle dynamic libraries. +@@ -155,7 +185,7 @@ inst_library() { + reallib=$(readlink -f "$src") + lib=${src##*/} + inst_simple "$reallib" "$reallib" +- mkdir -p "${initdir}${dest%/*}" ++ inst_dir "${dest%/*}" + (cd "${initdir}${dest%/*}" && ln -s "$reallib" "$lib") + else + inst_simple "$src" "$dest" +@@ -250,7 +280,8 @@ find_rule() { + # create a function to install them to make life simpler. + inst_rules() { + local target=/etc/udev/rules.d +- mkdir -p "$initdir/lib/udev/rules.d" "$initdir$target" ++ inst_dir "/lib/udev/rules.d" ++ inst_dir "$target" + for rule in "$@"; do + rule=$(find_rule "$rule") && \ + inst_simple "$rule" "$target/${rule##*/}" +-- +1.6.3.3 + |