Blob Blame History Raw
diff --git a/dkms b/dkms
index abb01a4..5b02e85 100644
--- a/dkms
+++ b/dkms
@@ -69,14 +69,16 @@ invoke_command()
     local exitval=0
     [[ $verbose ]] && echo -e "$1" || echo -en "$2..."
     if [[ $3 = background && ! $verbose ]]; then
-	local exitval_file=$(mktemp_or_die $tmp_location/dkms.XXXXXX)
-	(eval "$1" >/dev/null 2>&1; echo "exitval=$?" >> "$exitval_file") &
-	while [[ -e $exitval_file && ! -s $exitval_file ]]; do
-	    sleep 3
-	    echo -en "."
-	done
-	. "$exitval_file"
-	rm -f "$exitval_file"
+	local pid progresspid
+	(eval "$1" >/dev/null 2>&1) & pid=$!
+	while [ -d /proc/$pid ]; do
+		sleep 3
+		echo -en "."
+	done & progresspid=$!
+	wait $pid 2>/dev/null
+	exitval=$?
+	kill $progresspid 2>/dev/null
+	wait $progresspid 2>/dev/null
     else
 	eval "$1"; exitval=$?
     fi
@@ -126,6 +128,7 @@ show_usage()
     echo $"              [--kernelsourcedir=source-location] [--no-prepare-kernel] [--no-initrd]"
     echo $"              [--binaries-only] [--source-only] [-r release (SuSE)] [--verbose]"
     echo $"              [--size] [--spec=specfile] [--media=floppy|iso|tar] [--legacy-postinst=0|1]"
+    echo $"              [--no-depmod]"
 }
 
 VER()
@@ -162,11 +165,14 @@ set_kernel_source_dir()
 
 # A little test function for DKMS commands that only work on one kernel.
 have_one_kernel() {
-    (( ${#kernelver[@]} > 1 )) && \
-	die 4 $"The action $1 does not support multiple kernel version" \
-	$"parameters on the command line."
-    [[ $all ]] && die 5 $"The action $1 does not support the --all" \
-	$"parameter."
+       if (( ${#kernelver[@]} != 1 )); then
+	  die 4 $"The action $1 does not support multiple kernel version" \
+	  $"parameters on the command line."
+       fi
+       if [[ $all ]]; then
+           die 5 $"The action $1 does not support the --all" \
+	   $"parameter."
+       fi
 }
 
 # Set up the kernelver and arch arrays.  You must have a 1:1 correspondence --
@@ -230,14 +236,17 @@ setup_kernels_arches()
 
 do_depmod()
 {
+    if [[ $no_depmod ]]; then
+        return
+    fi
     # $1 = kernel version
     if [ "${current_os}" != "Linux" ] ; then
         return
     fi
     if [[ -f /boot/System.map-$1 ]]; then
-	/sbin/depmod -a "$1" -F "/boot/System.map-$1"
+	depmod -a "$1" -F "/boot/System.map-$1"
     else
-	/sbin/depmod -a "$1"
+	depmod -a "$1"
     fi
 }
 
@@ -276,7 +285,7 @@ make_initrd()
     echo $"(If next boot fails, revert to $initrd.old-dkms image)"
 
     if [[ $mkinitrd = dracut ]]; then
-	invoke_command "$mkinitrd $1" "$mkinitrd" background
+	invoke_command "$mkinitrd -f $initrd_dir/$initrd $1" "$mkinitrd" background
     elif [[ $mkinitrd = update-initramfs ]]; then
 	invoke_command "$mkinitrd -u" "$mkinitrd" background
     elif $mkinitrd --version >/dev/null 2>&1; then
@@ -646,6 +655,7 @@ read_conf()
 
 # Little helper function for parsing the output of modinfo.
 get_module_verinfo(){
+    unset res
     local vals=
     while read -a vals; do
 	case ${vals[0]} in
@@ -1270,6 +1280,28 @@ build_module()
     echo $"DKMS: build completed."
 }
 
+# Force the installation of a module if this is listed
+# in the files in $forced_modules_dir, if any
+force_installation()
+{
+    forced_modules_dir="/usr/share/dkms/modules_to_force_install"
+    to_force=""
+    if [ -d $forced_modules_dir ]; then
+        for elem in $forced_modules_dir/*; do
+            if [ -e $elem ]; then
+                to_force="$to_force $(cat $elem)"
+            fi
+        done
+
+        for elem in $to_force; do
+            if [ "${1}" = "${elem}" ]; then
+                return 0
+            fi
+        done
+    fi
+    return 1
+}
+
 # Install a previously built module
 # There are huge swaths of code here that special-case for various distros.
 # They should be split into their own functions.
@@ -1280,6 +1312,13 @@ install_module()
     local base_dir="$dkms_tree/$module/$module_version/$kernelver/$arch"
     check_module_args install
 
+    # Save the status of $force
+    tmp_force="$force"
+
+    # If the module is set to be force-installed
+    force_installation $module && echo "Forcing installation of $module" \
+        && force="true"
+
     # Make sure that kernel exists to install into
     [[ -e $install_tree/$kernelver ]] || die 6 \
 	$"The directory $install_tree/$kernelver doesn't exist." \
@@ -1417,6 +1456,9 @@ install_module()
     }
     echo $""
     echo $"DKMS: install completed."
+
+    # Restore the status of $force
+    force="$tmp_force"
 }
 
 # List each kernel object that has been installed for a particular module.
@@ -1769,7 +1811,7 @@ module_status_weak() {
     # $1 = module, $2 = module version, $3 = kernel version weak installed to,
     # $4 = kernel arch, $5 = kernel version built for
     [[ $weak_modules ]] || return 1
-    local weak_ko mod installed_ko f ret=1 oifs=$IFS
+    local m v k a weak_ko mod installed_ko f ret=1 oifs=$IFS
     local -a already_found
     for weak_ko in "$install_tree/"*/weak-updates/*; do
 	[[ -e $weak_ko ]] || continue
@@ -3392,6 +3434,7 @@ try_source_tree=''
 die_is_fatal="yes"
 [ -x /sbin/weak-modules ] && weak_modules='/sbin/weak-modules'
 [ -x /usr/lib/module-init-tools/weak-modules ] && weak_modules='/usr/lib/module-init-tools/weak-modules'
+no_depmod=""
 
 action_re='^(remove|(auto|un)?install|match|mk(driverdisk|tarball|rpm|deb|dsc|kmp)|build|add|status|ldtarball)$'
 
@@ -3437,6 +3480,7 @@ while (($# > 0)); do
 	--directive*)        read_arg _da "$1" "$2" || shift
 			     directive_array[${#directive_array[@]}]="$_da";;
 	--spec*)             read_arg specfile "$1" "$2" || shift;;
+	--no-depmod)         no_depmod="true";;
 	--debug)
 	    export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): '
 	    set -x;;
@@ -3488,6 +3532,11 @@ if [[ $arch && $all ]]; then
 fi
 
 # Run the specified action
+if [ -z "$action" ]; then
+    show_usage
+    die 4 $"No action was specified."
+fi
+
 for action_to_run in $action; do
     setup_kernels_arches "$action_to_run"
     case "$action_to_run" in
diff --git a/dkms.8 b/dkms.8
index 908d9db..e782d53 100644
--- a/dkms.8
+++ b/dkms.8
@@ -464,6 +464,13 @@ ensure that modules are compiled correctly.
 This option keeps DKMS from cleaning your kernel source tree after a
 build.
 .TP
+.B \-\-no\-depmod
+This option prevents DKMS from running the depmod command during
+.B install
+and
+.B uninstall
+which will avoid (re)calculating module dependencies and thereby save time.
+.TP
 .B \-\-kernelsourcedir <kernel\-source\-directory\-location>
 Using this option you can specify the location of your kernel source
 directory.  Most likely you will not need to set this if your kernel
diff --git a/dkms.spec b/dkms.spec
index 49717aa..aba685d 100644
--- a/dkms.spec
+++ b/dkms.spec
@@ -5,7 +5,7 @@ Release: 1%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 BuildArch: noarch
-Requires: sed gawk findutils modutils tar cpio gzip grep mktemp
+Requires: sed gawk findutils modutils tar cpio gzip grep coreutils
 Requires: bash > 1.99
 # because Mandriva calls this package dkms-minimal
 Provides: dkms-minimal = %{version}
@@ -113,7 +113,6 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %post
-[ -e /sbin/dkms ] && mv -f /sbin/dkms /sbin/dkms.old 2>/dev/null
 # enable on initial install
 [ $1 -lt 2 ] && /sbin/chkconfig dkms_autoinstaller on ||: