Move modules-update from baselayout to here, fix by Martin Väth for infinite recursio...
authorMike Frysinger <vapier@gentoo.org>
Thu, 14 Dec 2006 02:40:42 +0000 (02:40 +0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 14 Dec 2006 02:40:42 +0000 (02:40 +0000)
Package-Manager: portage-2.1.2_rc3

sys-apps/module-init-tools/ChangeLog
sys-apps/module-init-tools/files/digest-module-init-tools-3.2.2-r2 [new file with mode: 0644]
sys-apps/module-init-tools/files/module-init-tools-3.2.2-handle-dupliate-aliases.patch [new file with mode: 0644]
sys-apps/module-init-tools/files/modules-update [new file with mode: 0755]
sys-apps/module-init-tools/module-init-tools-3.2.2-r2.ebuild [new file with mode: 0644]

index 31812cd6575e6817c57861d627aaa001ae1902b2..1b212a4bcf641010df8c5126ed7432b59c265107 100644 (file)
@@ -1,6 +1,15 @@
 # ChangeLog for sys-apps/module-init-tools
 # Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/ChangeLog,v 1.114 2006/11/06 21:11:51 vapier Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/ChangeLog,v 1.115 2006/12/14 02:40:42 vapier Exp $
+
+*module-init-tools-3.2.2-r2 (14 Dec 2006)
+
+  14 Dec 2006; Mike Frysinger <vapier@gentoo.org>
+  +files/module-init-tools-3.2.2-handle-dupliate-aliases.patch,
+  +files/modules-update, +module-init-tools-3.2.2-r2.ebuild:
+  Move modules-update from baselayout to here, fix by Martin Väth for
+  infinite recursion troubles #149426, and make sure /etc/modprobe.d/ files
+  get added to /etc/modprobe.conf #145962 by Greg Kroah-Hartman.
 
   06 Nov 2006; Mike Frysinger <vapier@gentoo.org>
   +files/modutils-2.4.27-build.patch, module-init-tools-3.2.2-r1.ebuild:
diff --git a/sys-apps/module-init-tools/files/digest-module-init-tools-3.2.2-r2 b/sys-apps/module-init-tools/files/digest-module-init-tools-3.2.2-r2
new file mode 100644 (file)
index 0000000..9feb51a
--- /dev/null
@@ -0,0 +1,6 @@
+MD5 a1ad0a09d3231673f70d631f3f5040e9 module-init-tools-3.2.2.tar.bz2 169182
+RMD160 42abfe10709315180898106e3c7c1ce916e01166 module-init-tools-3.2.2.tar.bz2 169182
+SHA256 c080f7e42e60456eab33051026da388b5d21a360e9d2bee26ce9991427a758aa module-init-tools-3.2.2.tar.bz2 169182
+MD5 bac989c74ed10f3bf86177fc5b4b89b6 modutils-2.4.27.tar.bz2 234963
+RMD160 3179d364106859cf6dbd1fad82d8356337634735 modutils-2.4.27.tar.bz2 234963
+SHA256 ab4c9191645f9ffb455ae7c014d8c45339c13a1d0f6914817cfbf30a0bc56bf0 modutils-2.4.27.tar.bz2 234963
diff --git a/sys-apps/module-init-tools/files/module-init-tools-3.2.2-handle-dupliate-aliases.patch b/sys-apps/module-init-tools/files/module-init-tools-3.2.2-handle-dupliate-aliases.patch
new file mode 100644 (file)
index 0000000..e119ce6
--- /dev/null
@@ -0,0 +1,68 @@
+http://bugs.gentoo.org/149426
+
+keep from blowing up when people have duplicate aliases ... the grep
+ends up including new lines and with certain formed comments, hits an
+infinite loop ...
+
+for example, the following inputs illustrates the problem:
+----------------------------------------------
+# Old nvidia support ...
+alias char-major-195 NVdriver
+alias /dev/nvidiactl char-major-195
+alias char-major-195 nvidia
+alias /dev/nvidiactl char-major-195
+#   To enable Side Band Adressing:  NVreg_EnableAGPSBA=1
+#options nvidia NVreg_EnableAGPSBA=1 NVreg_EnableAGPFW=1
+#options nvidia NVreg_SoftEDIDs=0 NVreg_Mobile=3
+----------------------------------------------
+alias a b
+alias b a
+----------------------------------------------
+
+fixes from Martin Väth
+
+--- generate-modprobe.conf
++++ generate-modprobe.conf
+@@ -65,19 +65,29 @@
+ # Resolve (possibly recursive) alias: args filename alias
+ resolve_alias()
+ {
+-    RA_RESOLVE=`grep "^alias[         ][      ]*$2[   ]" -- $1 | awk '{ print $3 }'`
++    if [ 0$3 -gt 99 ]; then
++      echo "Infinite recursion detected; aborting after $3 tries (alias '$2')" 1>&2
++      return 1
++    fi
++
++    _RA_RESOLVE=`grep "^alias[        ][      ]*$2[   ]" -- $1 | awk '{ print $3 }'`
++    RA_RESOLVE=`echo "$_RA_RESOLVE" | head -n 1`
++    if [ x"$_RA_RESOLVE" != x"$RA_RESOLVE" ]; then
++      echo "Invalid dupliate alias found for '$2' (results: `echo $_RA_RESOLVE`)" 1>&2
++      return 1
++    fi
+     if [ x"$RA_RESOLVE" = x ]; then
+       echo $2
+       return
+     fi
+     # Recurse.
+-    (resolve_alias $1 "$RA_RESOLVE")
++    (resolve_alias $1 "$RA_RESOLVE" $(($3 + 1)))
+ }
+ # Parse alias: args filename modulename aliasto.
+ parse_alias()
+ {
+-    PA_ALIAS=`resolve_alias $1 $3`
++    PA_ALIAS=`resolve_alias $1 $3` || exit 1
+     NAME=`echo $2|sed -e 's/\(block\|char\)-major-\([0-9]\+\)$/\1-major-\2-*/'`
+     echo "alias $NAME $PA_ALIAS"
+@@ -180,7 +190,8 @@
+           parse_options $MODULE `grab_noninstall_options $REST`
+           INSTALL_OPTIONS=`grab_install_options $REST`
+           INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
+-          eval install_$MODNAME=\"/sbin/modprobe $INSTALL_OPTIONS --ignore-install `resolve_alias $MODPROBECONF $MODULE`\"
++          INSTALL_ALIAS=`resolve_alias $MODPROBECONF "$MODULE"` || exit 1
++          eval install_$MODNAME=\"/sbin/modprobe $INSTALL_OPTIONS --ignore-install $INSTALL_ALIAS\"
+           ;;
+       *)
+           parse_options $MODULE "$REST"
diff --git a/sys-apps/module-init-tools/files/modules-update b/sys-apps/module-init-tools/files/modules-update
new file mode 100755 (executable)
index 0000000..33e5c08
--- /dev/null
@@ -0,0 +1,415 @@
+#!/bin/bash
+# vim:ts=4
+#
+# modules-update script originally based on Debian's version.
+# This script will update all the fun config files in /etc for
+# kernel modules.
+#
+# For 2.4 (and older) kernels we have:
+# /etc/modules.conf
+# /etc/modules.d/
+# /etc/modules.devfs
+#
+# For 2.6+ kernels we have:
+# /etc/modprobe.conf
+# /etc/modprobe.d/
+# /etc/modprobe.devfs
+
+
+argv0=${0##*/}
+source /etc/init.d/functions.sh || {
+       echo "${argv0}: Could not source /etc/init.d/functions.sh!" 1>&2
+       exit 1
+}
+umask 022
+esyslog() { :; }
+
+if [[ ${EUID} != "0" ]] ; then
+       eerror "You must be root to do this" 1>&2
+       exit 2
+fi
+
+
+#
+# Setup some variables
+#
+
+CFG_OLD_FILE="/etc/modules.conf"
+CFG_OLD_DIR="/etc/modules.d"
+CFG_OLD_DEVFS="/etc/modules.devfs"
+
+CFG_NEW_FILE="/etc/modprobe.conf"
+CFG_NEW_DIR="/etc/modprobe.d"
+CFG_NEW_DEVFS="/etc/modprobe.devfs"
+
+HEADER="### This file is automatically generated by modules-update"
+FULLHEADER="${HEADER}
+#
+# Please do not edit this file directly. If you want to change or add
+# anything please take a look at the files in @MODDIR@ and read
+# the manpage for modules-update(8).
+#
+"
+
+
+#
+# Parse command-line
+#
+
+VERBOSE=0
+DEBUG=0
+FORCE="false"
+BACKUP="false"
+GENERATE_DEVFS="false"
+ASSUME_KV=
+while [[ -n $1 ]] ; do
+       case $1 in
+               -f|--force|force)  FORCE="true";;
+               -b|--backup)       BACKUP="true";;
+               -D|--devfs)        GENERATE_DEVFS="true";;
+               --assume-kernel=*) ASSUME_KV=${1#*=};;
+               -v|--verbose)      ((++VERBOSE));;
+               -d|--debug)        ((++DEBUG));;
+               -V|--version)      exec cat /etc/gentoo-release;;
+               -h|--help)
+                       cat <<-EOF
+                       Usage: modules-update [options]
+
+                       Options:
+                        --assume-kernel=KV  Assume the kernel is at least version KV
+                        -b, --backup        Backup existing config files (add .old ext)
+                        -f, --force         Force execution in face of bad things
+                        -D, --devfs         Force generation of devfs config files
+                        -v, --verbose       Be a bit more verbose in what we do
+                        -d, --debug         Helpful debug output
+                        -V, --version       Dump version info
+                        -h, --help          This help screen, duh
+                       EOF
+                       exit 0
+                       ;;
+               *)
+                       eerror "Error: I don't understand $1"
+                       exit 1
+                       ;;
+       esac
+       shift
+done
+
+[[ ${DEBUG} -gt 0 ]] && set -x
+
+vewarn() { [[ ${VERBOSE} -gt 0 ]] && ewarn "$*" ; return 0 ; }
+
+if ! ${GENERATE_DEVFS} && [[ -d /etc/devfs.d ]] ; then
+       GENERATE_DEVFS="true"
+fi
+
+if type -p modprobe.old > /dev/null || \
+   [[ $(modprobe -V 2>/dev/null) == "modprobe version"* ]]
+then
+       GENERATE_OLD="true"
+else
+       GENERATE_OLD="false"
+fi
+
+# Set kernel version, either from --assume-kernel or uname -r
+KV=${ASSUME_KV:-$(uname -r)}
+if [[ $(KV_to_int ${KV}) -ge "$(KV_to_int 2.5.48)" ]] ; then
+       KERNEL_2_6="true"
+else
+       KERNEL_2_6="false"
+fi
+
+# Reset the sorting order since we depend on it
+export LC_ALL="C"
+
+
+#
+# Build list of config files to generate and verify none
+# have been modified in any way
+#
+
+CFGFILES=""
+if ${GENERATE_OLD} ; then
+       CFGFILES="${CFGFILES} ${CFG_OLD_FILE}"
+       ${GENERATE_DEVFS} && CFGFILES="${CFGFILES} ${CFG_OLD_DEVFS}"
+fi
+if ${KERNEL_2_6} ; then
+       CFGFILES="${CFGFILES} ${CFG_NEW_FILE}"
+       ${GENERATE_DEVFS} && CFGFILES="${CFGFILES} ${CFG_NEW_DEVFS}"
+fi
+
+for x in ${CFGFILES} ; do
+       [[ -r ${x} ]] || continue
+
+       if [[ $(sed -ne 1p "${x}") != "${HEADER}" ]] ; then
+               ewarn "Warning: the current ${x} has not been automatically generated"
+
+               if ${FORCE} ; then
+                       ewarn "--force specified, (re)generating file anyway"
+               else
+                       eerror "Use \"modules-update force\" to force (re)generation"
+                       exit 1
+               fi
+       fi
+done
+
+
+#
+#  Desc: backup a config file if need be and replace with new one
+# Usage: backup <old config file to backup> <new config file to replace with>
+#    Ex: backup /etc/modules.conf /etc/modules.conf.tempfile
+#
+backup() {
+       if ${BACKUP} && [[ -e $1 ]] ; then
+               mv -f "$1" "$1".old
+       fi
+       mv -f "$2" "$1"
+}
+
+
+#
+#  Desc: Combine all config files in a dir and place output in a file
+# Usage: generate_config <output config file> <config dir> <reference config dir> <silent>
+#    Ex: generate_config /etc/modules.conf /etc/modules.d
+#
+generate_config() {
+       local config=$1
+       local moddir=$2
+       local refdir=$3
+       local silent=$4
+       local tmpfile="${config}.$$"
+
+       [[ -z ${silent} ]] && ebegin "Updating ${config}"
+
+       echo "${FULLHEADER//@MODDIR@/${refdir:-${moddir}}}" > "${tmpfile}"
+
+       for cfg in "${moddir}"/* ; do
+               [[ -d ${cfg} ]] && continue
+               [[ ! -r ${cfg} ]] && continue
+
+               # Skip backup and RCS files; fixes bug 20597 (07 May 2004 agriffis)
+               [[ ${cfg} == *~ || ${cfg} == *.bak || ${cfg} == *,v ]] && continue
+
+               # If config file is found in the reference dir, then skip it
+               [[ -n ${refdir} ]] && [[ -e ${refdir}/${cfg##*/} ]] && continue
+
+               echo "### modules-update: start processing ${cfg}" >> "${tmpfile}"
+
+               if [[ -x ${cfg} ]] ; then
+                       # $cfg can be executable; nice touch, Wichert! :)
+                       "${cfg}" >> "${tmpfile}"
+               else
+                       cat "${cfg}" >> "${tmpfile}"
+               fi
+
+               echo >> "${tmpfile}"
+               echo "### modules-update: end processing ${cfg}" >> "${tmpfile}"
+               echo >> "${tmpfile}"
+       done
+
+       backup "${config}" "${tmpfile}"
+
+       [[ -z ${silent} ]] && eend 0
+
+       return 0
+}
+
+
+#
+# Generate the old modules.conf file based upon all the snippets in
+# modules.d.  Since modprobe doesnt handle modules.d, we need to gather
+# the files together in modules.conf for it.
+#
+
+if [[ ! -d ${CFG_OLD_DIR} ]] ; then
+       vewarn "Skipping ${CFG_OLD_FILE} generation (${CFG_OLD_DIR} doesn't exist)"
+
+elif ! ${GENERATE_OLD} ; then
+       vewarn "Skipping ${CFG_OLD_FILE} generation (prerequisites not satisfied)"
+
+elif ! ( ${FORCE} || \
+     [[ ! -e ${CFG_OLD_FILE} ]] || \
+     is_older_than ${CFG_OLD_FILE} ${CFG_OLD_DIR} )
+then
+       vewarn "Skipping ${CFG_OLD_FILE} generation (file is newer than dependencies)"
+
+else
+       generate_config ${CFG_OLD_FILE} ${CFG_OLD_DIR}
+fi
+
+
+#
+# Generate the new modprobe.conf file if possible.  What this entails is
+# grabbing details from the old modprobe via the -c option and sticking
+# it in the newer config file.  This is useful for backwards compat support
+# and for packages that provide older style /etc/modules.d/ files but not
+# newer style /etc/modprobe.d/ files.
+#
+# First we try to use the script `generate-modprobe.conf` from the
+# module-init-tools and if that fails us, we try and generate modprobe.conf
+# ourselves from the /etc/modules.d/ files.
+#
+
+if ! ${KERNEL_2_6} ; then
+       vewarn "Skipping ${CFG_NEW_FILE} generation (not needed for 2.4 kernels)"
+
+elif ! type -p generate-modprobe.conf > /dev/null ; then
+       vewarn "Skipping ${CFG_NEW_FILE} generation (generate-modprobe.conf doesn't exist)"
+
+elif ! ( ${FORCE} || \
+     [[ ! -e ${CFG_NEW_FILE} ]] || \
+     is_older_than ${CFG_NEW_FILE} ${CFG_OLD_DIR} ${CFG_NEW_DIR} )
+then
+       vewarn "Skipping ${CFG_NEW_FILE} generation (file is newer than dependencies)"
+
+else
+
+       generated_ok=0
+       tmpfile="${CFG_NEW_FILE}.$$"
+
+       #
+       # First we try to use regular generate-modprobe.conf
+       #
+       if ${GENERATE_OLD} ; then
+               # Make sure that generate-modprobe.conf can handle --assume-kernel
+               # if we were called with it.
+               if [[ -n ${ASSUME_KV} ]] && \
+                       ! grep -qe --assume-kernel /sbin/generate-modprobe.conf ; then
+                       eerror "Error: modules-update called with --assume-kernel flag, but"
+                       eerror "generate-modprobe.conf doesn't understand it.  You need to"
+                       eerror "install >=module-init-tools-3.0-r2"
+                       exit 3
+               fi
+
+               ebegin "Updating ${CFG_NEW_FILE}"
+               echo "${FULLHEADER//@MODDIR@/${CFG_NEW_DIR}}" > "${tmpfile}"
+               if generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \
+                  >> "${tmpfile}" 2> "${tmpfile}.err"
+               then
+                       backup "${CFG_NEW_FILE}" "${tmpfile}"
+                       eend 0
+                       generated_ok=1
+               else
+                       [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err"
+                       eend 1 "Warning: could not generate ${CFG_NEW_FILE}!"
+               fi
+       fi
+
+       #
+       # If the helper script failed, we fall back to doing it by hand
+       #
+       if [[ ${generated_ok} -eq 0 ]] ; then
+               ebegin "Updating ${CFG_NEW_FILE} by hand"
+
+               generate_config "${CFG_NEW_FILE}" "${CFG_OLD_DIR}" "${CFG_NEW_DIR}" 0
+               echo "${FULLHEADER//@MODDIR@/${CFG_NEW_DIR}}" > "${tmpfile}"
+
+               # Just use generate-modprobe.conf to filter compatible syntax
+               if TESTING_MODPROBE_CONF=${CFG_NEW_FILE} \
+                  generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \
+                  >> "${tmpfile}" 2> "${tmpfile}.err"
+               then
+                       # we use mv here instead of backup_config() as the call to
+                       # generate_config() above already took care of the backup
+                       mv -f "${tmpfile}" "${CFG_NEW_FILE}"
+                       eend $?
+               else
+                       [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err"
+                       eend 1 "Warning: could not generate ${CFG_NEW_FILE}!"
+               fi
+       fi
+
+       #
+       # Now append all the new files ... modprobe will not scan /etc/modprobe.d/
+       # if /etc/modprobe.conf exists, so we need to append /etc/modprobe.conf with
+       # /etc/modprobe.d/* ... http://bugs.gentoo.org/145962
+       #
+       if [[ -e ${CFG_NEW_FILE} ]] ; then
+               for cfg in "${CFG_NEW_DIR}"/* ; do
+                       [[ -d ${cfg} ]] && continue
+                       [[ ! -r ${cfg} ]] && continue
+
+                       # Skip backup and RCS files; fixes bug 20597 (07 May 2004 agriffis)
+                       [[ ${cfg} == *~ || ${cfg} == *.bak || ${cfg} == *,v ]] && continue
+
+                       echo >> "${CFG_NEW_FILE}"
+                       echo "### modules-update: start processing ${cfg}" >> "${CFG_NEW_FILE}"
+                       cat "${cfg}" >> "${CFG_NEW_FILE}"
+                       echo "### modules-update: end processing ${cfg}" >> "${CFG_NEW_FILE}"
+               done
+       fi
+
+       rm -f "${tmpfile}" "${tmpfile}.err"
+
+       #
+       # Take care of generating /etc/modprobe.devfs if need be.
+       #
+       if ${GENERATE_DEVFS} && [[ -f ${CFG_OLD_DEVFS} ]] && \
+          ( [[ ! -e ${CFG_NEW_DEVFS} ]] || [[ ${CFG_OLD_DEVFS} -nt ${CFG_NEW_DEVFS} ]] || ${FORCE} )
+       then
+               ebegin "Updating ${CFG_NEW_DEVFS}"
+
+               tmpfile="${CFG_NEW_DEVFS}.$$"
+               tmpfile_old="${CFG_OLD_DEVFS}.$$"
+
+               echo "${FULLHEADER/@MODDIR@/${CFG_NEW_DIR}}" > "${tmpfile_old}"
+               cp -f "${tmpfile_old}" "${tmpfile}"
+               gawk '$0 !~ /^[[:space:]]*include/ { print $0 }' \
+                       "${CFG_OLD_DEVFS}" >> "${tmpfile_old}"
+
+               if TESTING_MODPROBE_CONF=${tmpfile_old} \
+                  generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \
+                  >> "${tmpfile}" 2> "${tmpfile}.err"
+               then
+                       echo >> "${tmpfile}"
+                       echo "include /etc/modprobe.conf" >> "${tmpfile}"
+                       backup "${CFG_NEW_DEVFS}" "${tmpfile}"
+                       eend 0
+               else
+                       [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err"
+                       eend 1 "Warning: could not generate ${CFG_NEW_DEVFS}!"
+                       rm -f "${tmpfile}"
+               fi
+
+               backup "${CFG_OLD_DEVFS}" "${tmpfile_old}"
+
+               rm -f "${tmpfile_old}" "${tmpfile}" "${tmpfile}.err"
+       fi
+fi
+
+
+#
+# Call depmod to keep insmod from complaining that modules.conf is more
+# recent then the modules.dep file.
+#
+
+grab_depfile() {
+       # the modules.conf file has optional syntax:
+       # depfile=/path/to/modules.dep
+       local ret=""
+       if [[ -e ${CFG_OLD_FILE} ]] ; then
+               ret=$(sed -n -e '/^[[:space:]]*depfile=/s:.*=::p' ${CFG_OLD_FILE})
+       fi
+       [[ -z ${ret} ]] && ret="/lib/modules/${KV}/modules.dep"
+       eval echo "${ret}"
+}
+depfile=$(grab_depfile)
+
+if [[ -d ${depfile%/*} ]] ; then
+       if [[ ${CFG_NEW_FILE} -nt ${depfile} ]] ; then
+               ebegin "Updating modules.dep"
+               for cfg in /lib/modules/${KV}/build /usr/src/linux-${KV} \
+                          /boot /usr/src/linux ""
+               do
+                       cfg="${cfg}/System.map"
+                       [[ -f ${cfg} ]] && break
+               done
+               [[ -n ${cfg} ]] && cfg="-F ${cfg}"
+               depmod -a ${cfg} ${KV}
+               eend $?
+       fi
+else
+       vewarn "The dir '${depfile}' does not exist, skipping call to depmod"
+fi
+
+exit 0
diff --git a/sys-apps/module-init-tools/module-init-tools-3.2.2-r2.ebuild b/sys-apps/module-init-tools/module-init-tools-3.2.2-r2.ebuild
new file mode 100644 (file)
index 0000000..ed0ad3c
--- /dev/null
@@ -0,0 +1,158 @@
+# Copyright 1999-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/module-init-tools-3.2.2-r2.ebuild,v 1.1 2006/12/14 02:40:42 vapier Exp $
+
+inherit flag-o-matic eutils toolchain-funcs fixheadtails
+
+MODUTILS_PV="2.4.27"
+
+MY_P="${P/_pre/-pre}"
+DESCRIPTION="Kernel module tools for the 2.6 kernel"
+HOMEPAGE="http://www.kernel.org/pub/linux/kernel/people/rusty/modules"
+SRC_URI="mirror://kernel/linux/kernel/people/rusty/modules/${MY_P}.tar.bz2
+       mirror://kernel/linux/kernel/people/rusty/modules/old/${MY_P}.tar.bz2
+       !no-old-linux? ( mirror://kernel/linux/utils/kernel/modutils/v2.4/modutils-${MODUTILS_PV}.tar.bz2 )"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
+IUSE="no-old-linux"
+# The test code runs `make clean && configure` and screws up src_compile()
+RESTRICT="test"
+
+DEPEND="sys-libs/zlib
+       >=sys-apps/baselayout-1.12.7-r2
+       !virtual/modutils"
+PROVIDE="virtual/modutils"
+
+S=${WORKDIR}/${MY_P}
+
+src_unpack() {
+       unpack ${A}
+
+       # Patches for old modutils
+       if ! use no-old-linux ; then
+               cd "${WORKDIR}"/modutils-${MODUTILS_PV}
+               epatch "${FILESDIR}"/modutils-2.4.27-alias.patch
+               epatch "${FILESDIR}"/modutils-2.4.27-gcc.patch
+               epatch "${FILESDIR}"/modutils-2.4.27-flex.patch
+               epatch "${FILESDIR}"/modutils-2.4.27-no-nested-function.patch
+               epatch "${FILESDIR}"/modutils-2.4.27-hppa.patch
+               epatch "${FILESDIR}"/modutils-2.4.27-build.patch #154281
+       fi
+
+       # Fixes for new module-init-tools
+       cd "${S}"
+       ht_fix_file tests/test-depmod/10badcommand.sh
+       # Test fails due since it needs to write to /lib/modules so disable it
+       rm -f tests/test-depmod/01backcompat.sh
+
+       # Fix bug 49926: This patch allows generate-modprobe.conf to
+       # accept the --assume-kernel=x.x.x option for generating livecds.
+       # This is a companion to a patch in baselayout-1.9.0 which allows
+       # the same flag to modules-update.
+       epatch "${FILESDIR}"/${PN}-3.1_generate-modprobe-assume-kernel.patch
+
+       # Abort if we fail to run modprobe, bug #68689
+       epatch "${FILESDIR}"/${PN}-3.2_pre7-abort-on-modprobe-failure.patch
+
+       epatch "${FILESDIR}"/${PN}-3.2.2-handle-dupliate-aliases.patch #149426
+
+       # make sure we link dynamically with zlib; our zlib.so is in /lib vs
+       # /usr/lib so it's safe to link with.  fixes ugly textrels as well.
+       sed -i \
+               -e 's:-Wl,-Bstatic -lz -Wl,-Bdynamic:-lz:' \
+               configure || die
+
+       # make sure we don't try to regen the manpages
+       touch *.5
+}
+
+src_compile() {
+       # Configure script uses BUILDCFLAGS for cross-compiles but this
+       # defaults to CFLAGS which can be bad mojo
+       export BUILDCFLAGS=-pipe
+       export BUILDCC="$(tc-getBUILD_CC)"
+
+       if ! use no-old-linux ; then
+               einfo "Building modutils ..."
+               cd "${WORKDIR}"/modutils-${MODUTILS_PV}
+               econf \
+                       --disable-strip \
+                       --prefix=/ \
+                       --enable-insmod-static \
+                       --disable-zlib \
+                       || die "econf failed"
+               emake || die "emake modutils failed"
+
+               einfo "Building module-init-tools ..."
+               cd "${S}"
+       fi
+
+       econf \
+               --prefix=/ \
+               --enable-zlib \
+               || die "econf failed"
+       emake || die "emake module-init-tools failed"
+}
+
+modutils_src_install() {
+       cd "${WORKDIR}"/modutils-${MODUTILS_PV}
+       einstall prefix="${D}" || die
+       docinto modutils-${MODUTILS_PV}
+       dodoc CREDITS ChangeLog NEWS README TODO
+
+       # remove man pages provided by the man-pages package now #124127
+       rm -r "${D}"/usr/share/man/man2
+
+       cd "${S}"
+       # This copies the old version of modutils to *.old so it still works
+       # with kernels <= 2.4; new versions will execve() the .old version if
+       # a 2.4 kernel is running...
+       # This code was borrowed from the module-init-tools Makefile
+       local runme f
+       for f in lsmod modprobe rmmod depmod insmod insmod.static modinfo ; do
+               if [[ -L ${D}/sbin/${f} ]] ; then
+                       einfo "Moving symlink $f to ${f}.old"
+                       #runme = the target of the symlink with a .old tagged on.
+                       runme=$(ls -l "${D}"/sbin/${f} | sed 's/.* -> //').old
+                       [[ ! -e ${D}/sbin/${runme} ]] || einfo "${D}/sbin/${runme} not found"
+                       dosym ${runme} /sbin/${f} || die
+               elif [[ -e ${D}/sbin/${f} ]] ; then
+                       einfo "Moving executable $f to ${f}.old"
+               fi
+               mv -f "${D}"/sbin/${f} "${D}"/sbin/${f}.old
+       done
+       # Move the man pages as well.  We only do this for the man pages of the
+       # tools that module-init-tools will replace.
+       for f in "${D}"/usr/share/man/man8/{lsmod,modprobe,rmmod,depmod,insmod}.8
+       do
+               mv -f ${f} ${f%\.*}.old.${f##*\.}
+       done
+       # Fix the ksyms links #35601
+       for f in ksyms kallsyms ; do
+               dosym insmod.old /sbin/${f}
+               dosym insmod.static.old /sbin/${f}.static
+       done
+}
+
+src_install() {
+       use no-old-linux || modutils_src_install
+
+       cd "${S}"
+       emake install DESTDIR="${D}" || die
+       dosym modprobe.conf.5 /usr/share/man/man5/modprobe.d.5
+
+       # Install compat symlink
+       dosym ../bin/lsmod /sbin/lsmod
+       use no-old-linux || dosym ../sbin/insmod.old /bin/lsmod.old
+       # Install the modules.conf2modprobe.conf tool, so we can update
+       # modprobe.conf.
+       into /
+       dosbin "${S}"/generate-modprobe.conf "${FILESDIR}"/modules-update || die
+       dosym modules-update /sbin/update-modules
+
+       doman *.[1-8]
+       docinto /
+       dodoc AUTHORS ChangeLog INSTALL NEWS README TODO
+}