home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / lib / rpm / brp-symlink < prev    next >
Text File  |  2006-11-29  |  5KB  |  183 lines

  1. #!/bin/sh
  2.  
  3. # Task: go through the files in $RPM_BUILD_ROOT and
  4. # relink symbolic links so that:
  5. # links crossing top level directory boundaries (/usr/* -> /etc/*)
  6. #   are absolute links
  7. # links below one top level directory (/usr/bin/* -> /usr/lib/*)
  8. #   are relative links
  9. # NOTE: we're not doing this to fix a problem (as no matter how you
  10. #   do it you fix one problem by creating another). We're doing it
  11. #   so we can document this as policy - so you can rely on it
  12.  
  13. # Additional Task: check some usual errors arround symlinks e.g.
  14. #   dangling symlinks or symlinks to init scripts in wrong location
  15.  
  16. # Author: Stephan Kulow <coolo@suse.de>
  17.  
  18. # If using normal root, avoid changing anything.
  19. if [ -z "$RPM_BUILD_ROOT" ]; then
  20.     exit 0
  21. fi
  22.  
  23. LC_ALL=
  24. LANG=
  25. LC_TIME=POSIX
  26.  
  27. BASENAME=/usr/bin/basename
  28. DIRNAME=/usr/bin/dirname
  29. READLINK=/usr/bin/readlink
  30.  
  31. cd $RPM_BUILD_ROOT
  32.  
  33. had_errors=0
  34.  
  35. links=`find . -type l | sed -e "s,^./,/,"`
  36. for link in $links
  37. do
  38.     link_dest=`$READLINK ./$link`
  39.     orig_link_dest=$link_dest
  40.  
  41.     new_link_dest=NONE
  42.     link_dir=`$DIRNAME $link`
  43.  
  44.     case $link_dest in
  45.     .|..|../..) # link to current dir
  46.       continue ;;
  47.     .*) # relative links up
  48.       link_dest="$link_dir/$link_dest"
  49.       ;;
  50.         /*) # absolute links
  51.       ;;
  52.         */*) # relative links down
  53.       link_dest="$link_dir/$link_dest"
  54.       ;;
  55.     *) # the rest
  56.       continue
  57.     esac
  58.  
  59.     # cleaning out double slash
  60.     link_dest=`echo $link_dest | sed -e 's,//*,/,g; s,/\.$,/,; s,/$,,'`
  61.  
  62.     # eliminating /./ components
  63.     link_dest=`echo $link_dest | sed -e "s,/\./,/,g"`;
  64.  
  65.     counter=0
  66.     # eliminating back references
  67.     while echo $link_dest | egrep -q '/\.\.'; do
  68.        link_dest=`echo $link_dest | sed -e "s,/[^/]*/\.\.,,"`;
  69.        case $link_dest in
  70.     /..*) # this is very mean
  71.         echo "ERROR: $link points to illegal $link_dest"
  72.         exit 1
  73.         ;;
  74.     esac
  75.     counter=$((counter + 1))
  76.     if test $counter -gt 10; then
  77.         echo "ERROR: more than 10 back references in $link?"
  78.         exit 1
  79.     fi
  80.     done
  81.  
  82.     # black list
  83.     case "$link,$link_dest" in
  84.     *,/var/lib/named*)
  85.         continue;;
  86.     /usr/etc,*|/usr/tmp,*)
  87.         continue;;
  88.     */share/texmf/*|/usr/share/terminfo/*)
  89.          continue;;
  90.     *share/automake-*)
  91.          echo "ERROR: link target $link points into automake directory"
  92.          echo " You might want to add a -c to the automake call (or just"
  93.          echo " skip the files from packaging)"
  94.          exit 1
  95.          ;;
  96.     *,/opt/kde3/share/doc/HTML/*/common) # white listed for not existant
  97.          ;;
  98.     *,/proc/*) # links pointing into /proc file system
  99.          ;;
  100.     *)
  101.       if test ! -L ./$link_dest && test ! -e $link_dest && test ! -e ./$link_dest; then
  102.         echo "ERROR: link target doesn't exist (neither in build root nor in installed system):"
  103.         echo "  $link -> $link_dest"
  104.         echo "Add the package providing the target to neededforbuild and Requires"
  105.         test "$NO_BRP_STALE_LINK_ERROR" != "yes" && had_errors=1
  106.       fi
  107.       ;;
  108.     esac
  109.  
  110.     forced_absolute=0
  111.     for prefix in /usr/X11R6/lib/X11 /usr/X11R6/include/X11 /usr/X11R6/lib/X11/app-defaults ; do
  112.       if echo $link | grep -q "^$prefix/"; then
  113.      if echo $link_dest | grep -q "^$prefix/"; then
  114.         # if it's below it, it's fine
  115.         :
  116.          else
  117.         forced_absolute=1
  118.          fi
  119.       fi
  120.     done
  121.  
  122.     dest_dir=`$DIRNAME $link_dest`
  123.  
  124.     # figuring out (currently) correct destination
  125.     if test "$link_dir" = "$dest_dir" || test "$dest_dir" = "."; then
  126.     new_link_dest=`$BASENAME $link_dest`
  127.     else
  128.     # figuring out top level directory
  129.     top_link=`echo $link | sed -e 's,^\(/[^/]*\)/.*,\1,'`
  130.         top_dest=`echo $link_dest | sed -e 's,^\(/[^/]*\)/.*,\1,'`
  131.     if test "$forced_absolute" = 0 && test "$top_link" = "$top_dest"; then # supposed to be relative
  132.  
  133.         # first we need to cut out the common prefix
  134.         link_tmp=$link
  135.         while test "$top_link" = "$top_dest"; do
  136.         link_orig=$link_tmp
  137.         dest_orig=$link_dest
  138.         link_tmp=`echo $link_tmp | sed -e 's,^\(/[^/]*\)/,/,'`
  139.         link_dest=`echo $link_dest | sed -e 's,^\(/[^/]*\)/,/,'`
  140.         top_link=`echo $link_tmp | sed -e 's,^\(/[^/]*\)/.*,\1,'`
  141.         top_dest=`echo $link_dest | sed -e 's,^\(/[^/]*\)/.*,\1,'`
  142.  
  143.         if test "$top_dest" = "$dest_orig" || test "$top_link" = "$link_orig"; then
  144.             link_tmp=$link_orig
  145.             link_dest=$dest_orig
  146.             break
  147.         fi
  148.         done
  149.  
  150.         # now we add a .. for every directory component
  151.         link_tmp=`$DIRNAME $link_tmp`
  152.  
  153.         if test "$link_tmp" = "$link_dest"; then
  154.         new_link_dest=.
  155.         elif test "$link_tmp" != "/"; then # we have a directory component
  156.         link_rel=
  157.  
  158.         while test -n "$link_tmp"; do
  159.             link_tmp=`echo $link_tmp | sed -e 's,^\(/[^/]*\),,'`
  160.             link_rel="../$link_rel"
  161.         done
  162.  
  163.         new_link_dest=`echo $link_rel/$link_dest | sed -e "s,//*,/,g"`
  164.         else
  165.         # get rid of the slash
  166.         link_dest=`echo $link_dest | sed -e 's,^/,,'`
  167.         new_link_dest=$link_dest
  168.         fi
  169.     else
  170.         new_link_dest=$link_dest
  171.     fi
  172.     fi
  173.  
  174.     if test "$new_link_dest" != NONE && test "$new_link_dest" != "$orig_link_dest"; then
  175.     echo "INFO: relinking $link -> $new_link_dest (was $orig_link_dest)"
  176.     rm ./$link && ln -s $new_link_dest ./$link
  177.     fi
  178. done
  179.  
  180. if test "$had_errors" = 1; then
  181.     exit 1
  182. fi
  183.