From 2f158c7e68d7c113076460080c50ff183dc334ef99546e70750366a845a1fb04 Mon Sep 17 00:00:00 2001
From: Olaf Hering <ohering@suse.com>
Date: Mon, 20 Jan 2014 16:32:24 +0000
Subject: [PATCH] - Resolve also library dependencies of libnss in mkinitrd
 (bnc#847785) - BuildRequire nfs-utils to get mount.nfs, for virt-rescue

OBS-URL: https://build.opensuse.org/package/show/Virtualization/libguestfs?expand=0&rev=254
---
 libguestfs.changes             |   6 ++
 libguestfs.mkinitrd.1110.patch | 105 ++++++++++++++++++++++++++++++++-
 libguestfs.mkinitrd.1210.patch | 105 ++++++++++++++++++++++++++++++++-
 libguestfs.mkinitrd.1220.patch | 105 ++++++++++++++++++++++++++++++++-
 libguestfs.mkinitrd.setup.sh   |   5 ++
 libguestfs.spec                |   1 +
 6 files changed, 318 insertions(+), 9 deletions(-)

diff --git a/libguestfs.changes b/libguestfs.changes
index b7331da..daee332 100644
--- a/libguestfs.changes
+++ b/libguestfs.changes
@@ -1,3 +1,9 @@
+-------------------------------------------------------------------
+Mon Jan 20 11:34:25 CET 2014 - ohering@suse.de
+
+- Resolve also library dependencies of libnss in mkinitrd (bnc#847785)
+- BuildRequire nfs-utils to get mount.nfs, for virt-rescue
+
 -------------------------------------------------------------------
 Thu Jan 16 21:29:47 CET 2014 - ohering@suse.de
 
diff --git a/libguestfs.mkinitrd.1110.patch b/libguestfs.mkinitrd.1110.patch
index 6819fae..0a77b89 100644
--- a/libguestfs.mkinitrd.1110.patch
+++ b/libguestfs.mkinitrd.1110.patch
@@ -1,7 +1,8 @@
 ---
- mkinitrd/scripts/setup-prepare.sh |   94 +++++++++++++++++++++++++++++++-------
- mkinitrd/scripts/setup-progs.sh   |    4 -
- 2 files changed, 79 insertions(+), 19 deletions(-)
+ mkinitrd/scripts/setup-prepare.sh    |   94 ++++++++++++++++++++++++++++-------
+ mkinitrd/scripts/setup-progs.sh      |    4 -
+ mkinitrd/scripts/setup-sharedlibs.sh |   60 +++++++++++++---------
+ 3 files changed, 114 insertions(+), 44 deletions(-)
 
 Index: 1110/mkinitrd/scripts/setup-prepare.sh
 ===================================================================
@@ -192,3 +193,101 @@ Index: 1110/mkinitrd/scripts/setup-progs.sh
  
  [ -e "bin/sh" ] || ln -s /bin/bash bin/sh
  
+Index: 1110/mkinitrd/scripts/setup-sharedlibs.sh
+===================================================================
+--- 1110.orig/mkinitrd/scripts/setup-sharedlibs.sh
++++ 1110/mkinitrd/scripts/setup-sharedlibs.sh
+@@ -54,58 +54,68 @@ shared_object_files() {
+         while [ -L "/$lib" ]; do
+             echo $lib
+             link="$(readlink "/$lib")"
+             if [ x"${link:0:1}" == x"/" ]; then
+                 lib=${link#/}
+             else
+                 lib="${lib%/*}/$link"
+             fi
+         done
+         echo $lib
+     done
+ }
+ 
+-verbose -ne "Shared libs:\t"
+-# Copy all required shared libraries and the symlinks that
+-# refer to them.
+-lib_files=$(shared_object_files "${initrd_bins[@]}")
+-[ $? -eq 0 ] || return 1
+-if [ -n "$lib_files" ]; then
+-    for lib in $lib_files; do
+-        [ -L $root_dir/$lib ] || verbose -n "$lib "
+-        ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
+-    done
+-    lib_files=
++copy_shared_libs() {
++    local bins=( "$@" )
++    local extra_lib_files lib_files lib i
++
++    # First see what nss and other libs are required. This can be 64bit or 32bit,
++    # depending on the host and the already copied binaries.
+     case "$(uname -m)" in
+         alpha|ia64)
++            # this is a known location
+             mkdir -p $tmp_mnt/lib
+-            lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
++            extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
+             ;;
+         *)
+-            # no symlinks, most point into the running system
+-            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
++            # Skip symlinks, they may point into the running system instead of $tmp_mnt
++            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
+             do
+                 case "$i" in
+                     32-bit)
+                         mkdir -p $tmp_mnt/lib
+-                        lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
+                         ;;
+                     64-bit)
+                         mkdir -p $tmp_mnt/lib64
+-                        lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
+                         ;;
+                 esac
+             done
+             ;;
+     esac
+ 
+-    for lib in $lib_files ; do
+-        if [ -f $lib ] ; then
+-            verbose -n "${lib##$root_dir/} "
+-            cp -dp --parents $lib $tmp_mnt
++    verbose -ne "Shared libs:\t"
++
++    # Now collect a list of libraries on which the binaries and extra libs depend on
++    lib_files=$( shared_object_files ${bins[@]} $extra_lib_files )
++    if [ $? -eq 0 ]
++    then
++        if [ -n "$lib_files" ]
++        then
++            # Finally copy dependencies and extra libs
++            for lib in $lib_files $extra_lib_files
++            do
++                [ -L $root_dir/$lib ] || verbose -n "$lib "
++                ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
++            done
++            verbose
++        else
++            verbose "none"
+         fi
+-    done
+-    verbose
+-else
+-    verbose "none"
+-fi
++    else
++        return 1
++    fi
++}
+ 
++# Copy all required shared libraries and the symlinks that refer to them.
++copy_shared_libs "${initrd_bins[@]}"
diff --git a/libguestfs.mkinitrd.1210.patch b/libguestfs.mkinitrd.1210.patch
index 180b961..657ace1 100644
--- a/libguestfs.mkinitrd.1210.patch
+++ b/libguestfs.mkinitrd.1210.patch
@@ -1,7 +1,8 @@
 ---
- mkinitrd/scripts/setup-prepare.sh |   94 +++++++++++++++++++++++++++++++-------
- mkinitrd/scripts/setup-progs.sh   |   17 +-----
- 2 files changed, 80 insertions(+), 31 deletions(-)
+ mkinitrd/scripts/setup-prepare.sh    |   94 ++++++++++++++++++++++++++++-------
+ mkinitrd/scripts/setup-progs.sh      |   17 +-----
+ mkinitrd/scripts/setup-sharedlibs.sh |   60 +++++++++++++---------
+ 3 files changed, 115 insertions(+), 56 deletions(-)
 
 Index: 1210/mkinitrd/scripts/setup-prepare.sh
 ===================================================================
@@ -212,3 +213,101 @@ Index: 1210/mkinitrd/scripts/setup-progs.sh
  
  [ -e "bin/sh" ] || ln -s /bin/bash bin/sh
  
+Index: 1210/mkinitrd/scripts/setup-sharedlibs.sh
+===================================================================
+--- 1210.orig/mkinitrd/scripts/setup-sharedlibs.sh
++++ 1210/mkinitrd/scripts/setup-sharedlibs.sh
+@@ -54,58 +54,68 @@ shared_object_files() {
+         while [ -L "/$lib" ]; do
+             echo $lib
+             link="$(readlink "/$lib")"
+             if [ x"${link:0:1}" == x"/" ]; then
+                 lib=${link#/}
+             else
+                 lib="${lib%/*}/$link"
+             fi
+         done
+         echo $lib
+     done
+ }
+ 
+-verbose -ne "Shared libs:\t"
+-# Copy all required shared libraries and the symlinks that
+-# refer to them.
+-lib_files=$(shared_object_files "${initrd_bins[@]}")
+-[ $? -eq 0 ] || return 1
+-if [ -n "$lib_files" ]; then
+-    for lib in $lib_files; do
+-        [ -L $root_dir/$lib ] || verbose -n "$lib "
+-        ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
+-    done
+-    lib_files=
++copy_shared_libs() {
++    local bins=( "$@" )
++    local extra_lib_files lib_files lib i
++
++    # First see what nss and other libs are required. This can be 64bit or 32bit,
++    # depending on the host and the already copied binaries.
+     case "$(uname -m)" in
+         ia64)
++            # this is a known location
+             mkdir -p $tmp_mnt/lib
+-            lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
++            extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
+             ;;
+         *)
+-            # no symlinks, most point into the running system
+-            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
++            # Skip symlinks, they may point into the running system instead of $tmp_mnt
++            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
+             do
+                 case "$i" in
+                     32-bit)
+                         mkdir -p $tmp_mnt/lib
+-                        lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
+                         ;;
+                     64-bit)
+                         mkdir -p $tmp_mnt/lib64
+-                        lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
+                         ;;
+                 esac
+             done
+             ;;
+     esac
+ 
+-    for lib in $lib_files ; do
+-        if [ -f $lib ] ; then
+-            verbose -n "${lib##$root_dir/} "
+-            cp -dp --parents $lib $tmp_mnt
++    verbose -ne "Shared libs:\t"
++
++    # Now collect a list of libraries on which the binaries and extra libs depend on
++    lib_files=$( shared_object_files ${bins[@]} $extra_lib_files )
++    if [ $? -eq 0 ]
++    then
++        if [ -n "$lib_files" ]
++        then
++            # Finally copy dependencies and extra libs
++            for lib in $lib_files $extra_lib_files
++            do
++                [ -L $root_dir/$lib ] || verbose -n "$lib "
++                ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
++            done
++            verbose
++        else
++            verbose "none"
+         fi
+-    done
+-    verbose
+-else
+-    verbose "none"
+-fi
++    else
++        return 1
++    fi
++}
+ 
++# Copy all required shared libraries and the symlinks that refer to them.
++copy_shared_libs "${initrd_bins[@]}"
diff --git a/libguestfs.mkinitrd.1220.patch b/libguestfs.mkinitrd.1220.patch
index 18fb8c3..a22ff10 100644
--- a/libguestfs.mkinitrd.1220.patch
+++ b/libguestfs.mkinitrd.1220.patch
@@ -1,7 +1,8 @@
 ---
- mkinitrd/scripts/setup-prepare.sh |  126 ++++++++++++++++++++++----------------
- mkinitrd/scripts/setup-progs.sh   |   17 -----
- 2 files changed, 79 insertions(+), 64 deletions(-)
+ mkinitrd/scripts/setup-prepare.sh    |  126 +++++++++++++++++++++--------------
+ mkinitrd/scripts/setup-progs.sh      |   17 ----
+ mkinitrd/scripts/setup-sharedlibs.sh |   60 +++++++++-------
+ 3 files changed, 114 insertions(+), 89 deletions(-)
 
 Index: 1220/mkinitrd/scripts/setup-prepare.sh
 ===================================================================
@@ -217,3 +218,101 @@ Index: 1220/mkinitrd/scripts/setup-progs.sh
  
  [ -e "bin/sh" ] || ln -s /bin/bash bin/sh
  
+Index: 1220/mkinitrd/scripts/setup-sharedlibs.sh
+===================================================================
+--- 1220.orig/mkinitrd/scripts/setup-sharedlibs.sh
++++ 1220/mkinitrd/scripts/setup-sharedlibs.sh
+@@ -54,58 +54,68 @@ shared_object_files() {
+         while [ -L "/$lib" ]; do
+             echo $lib
+             link="$(readlink "/$lib")"
+             if [ x"${link:0:1}" == x"/" ]; then
+                 lib=${link#/}
+             else
+                 lib="${lib%/*}/$link"
+             fi
+         done
+         echo $lib
+     done
+ }
+ 
+-verbose -ne "Shared libs:\t"
+-# Copy all required shared libraries and the symlinks that
+-# refer to them.
+-lib_files=$(shared_object_files "${initrd_bins[@]}")
+-[ $? -eq 0 ] || return 1
+-if [ -n "$lib_files" ]; then
+-    for lib in $lib_files; do
+-        [ -L $root_dir/$lib ] || verbose -n "$lib "
+-        ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
+-    done
+-    lib_files=
++copy_shared_libs() {
++    local bins=( "$@" )
++    local extra_lib_files lib_files lib i
++
++    # First see what nss and other libs are required. This can be 64bit or 32bit,
++    # depending on the host and the already copied binaries.
+     case "$(uname -m)" in
+         ia64)
++            # this is a known location
+             mkdir -p $tmp_mnt/lib
+-            lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
++            extra_lib_files="`echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/lib{gcc_s,unwind}.so*`"
+             ;;
+         *)
+-            # no symlinks, most point into the running system
+-            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
++            # Skip symlinks, they may point into the running system instead of $tmp_mnt
++            for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev,{,s}bin}/* | sed -n 's/^ELF \([0-9][0-9]-bit\) .*/\1/p' | sort -u`
+             do
+                 case "$i" in
+                     32-bit)
+                         mkdir -p $tmp_mnt/lib
+-                        lib_files="$lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib/libnss_{dns,files}* $root_dir/lib/libgcc_s.so*`"
+                         ;;
+                     64-bit)
+                         mkdir -p $tmp_mnt/lib64
+-                        lib_files="$lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
++                        extra_lib_files="$extra_lib_files `echo $root_dir/lib64/libnss_{dns,files}* $root_dir/lib64/libgcc_s.so*`"
+                         ;;
+                 esac
+             done
+             ;;
+     esac
+ 
+-    for lib in $lib_files ; do
+-        if [ -f $lib ] ; then
+-            verbose -n "${lib##$root_dir/} "
+-            cp -dp --parents $lib $tmp_mnt
++    verbose -ne "Shared libs:\t"
++
++    # Now collect a list of libraries on which the binaries and extra libs depend on
++    lib_files=$( shared_object_files ${bins[@]} $extra_lib_files )
++    if [ $? -eq 0 ]
++    then
++        if [ -n "$lib_files" ]
++        then
++            # Finally copy dependencies and extra libs
++            for lib in $lib_files $extra_lib_files
++            do
++                [ -L $root_dir/$lib ] || verbose -n "$lib "
++                ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
++            done
++            verbose
++        else
++            verbose "none"
+         fi
+-    done
+-    verbose
+-else
+-    verbose "none"
+-fi
++    else
++        return 1
++    fi
++}
+ 
++# Copy all required shared libraries and the symlinks that refer to them.
++copy_shared_libs "${initrd_bins[@]}"
diff --git a/libguestfs.mkinitrd.setup.sh b/libguestfs.mkinitrd.setup.sh
index 36779da..6a43584 100644
--- a/libguestfs.mkinitrd.setup.sh
+++ b/libguestfs.mkinitrd.setup.sh
@@ -5,6 +5,11 @@
 # copy daemon manually because it is located in RPM_BUILD_ROOT
 mkdir -vp $tmp_mnt/usr/sbin
 cp_bin $(type -p guestfsd) $tmp_mnt/usr/sbin
+# required for mount.nfs inside the appliance
+for i in /etc/netconfig /etc/protocols /etc/rpc /etc/services
+do
+	cp $i $tmp_mnt$i
+done
 
 # many guestfish commands need a mount point
 # in guestfsd the mount point defaults to /sysroot
diff --git a/libguestfs.spec b/libguestfs.spec
index 696a950..51ef249 100644
--- a/libguestfs.spec
+++ b/libguestfs.spec
@@ -363,6 +363,7 @@ BuildRequires:  mdadm
 BuildRequires:  mkinitrd
 %endif
 BuildRequires:  module-init-tools
+BuildRequires:  nfs-client
 BuildRequires:  ntfs-3g
 BuildRequires:  ntfsprogs
 BuildRequires:  parted