summaryrefslogtreecommitdiff
path: root/community/virtualbox/vboxbuild
blob: e6fb94edd66a924117d9f57420d02fea873b7dad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash

. /etc/rc.conf
. /etc/rc.d/functions
. /etc/vbox/vbox.cfg

MODLIST=()
LOG="/var/log/vbox-install.log"
>| "$LOG"

if [[ $INSTALL_DIR ]]; then
  VBOXMANAGE=$INSTALL_DIR/VBoxManage
  BUILDVBOXDRV=$INSTALL_DIR/src/vboxdrv/build_in_tmp
  BUILDVBOXNETFLT=$INSTALL_DIR/src/vboxnetflt/build_in_tmp
  BUILDVBOXNETADP=$INSTALL_DIR/src/vboxnetadp/build_in_tmp
  BUILDVBOXPCI=$INSTALL_DIR/src/vboxpci/build_in_tmp
else
  echo "error: missing vbox.cfg"
  exit 1
fi

if [[ -f /proc/modules ]]; then
  IFS=$'\n' read -r -d '' -a MODLIST < \
    <(grep -oE '^vbox(pci|netflt|netadp|drv)' /proc/modules)
fi

if (( ${#MODLIST[*]} )); then
  stat_busy "Unloading VirtualBox kernel modules"
  modprobe -ar "${MODLIST[@]}" && stat_done || stat_fail
fi

for kdir in /lib/modules/[2-3]*; do
  if [[ ! -d $kdir/kernel ]]; then
    # found a stale kernel
    mods=("$kdir/extramodules"{drv,netadp,netflt,pci}.ko*)
    if (( ${#mods[@]} )); then
      stat_busy "Removing all old VirtualBox kernel modules"
      if rm -f "${mods[@]}" &&
          rmdir -p --ignore-fail-on-non-empty "$kdir/extramodules" 2>/dev/null; then
        stat_done
      else
        stat_fail
      fi
    fi
  fi
done

# default to the currently running kernel
if (( ! $# )); then
  set -- $(uname -r)
fi

for kernver; do
  export KERN_DIR=/lib/modules/$kernver/build
  export MODULE_DIR=/lib/modules/$kernver/extramodules
  if [[ ! -d $KERN_DIR ]]; then
    printf "error: \`%s' does not appear to be a valid kernel build directory.\n" \
        "$KERN_DIR"
    continue
  fi

  stat_busy "Recompiling VirtualBox kernel modules ($kernver)"
    if ! $BUILDVBOXDRV \
      --save-module-symvers /tmp/vboxdrv-Module.symvers \
      --no-print-directory install >> $LOG 2>&1; then
      echo  "Look at $LOG to find out what went wrong"
      stat_fail
    fi
    for build in BUILDVBOX{NETFLT,NETADP,PCI}; do
      if ! ${!build} \
        --use-module-symvers /tmp/vboxdrv-Module.symvers \
        --no-print-directory install >> $LOG 2>&1; then
        echo  "Look at $LOG to find out what went wrong"
        stat_fail
      fi
    done
    gzip -f9 "$MODULE_DIR"/*.ko
    depmod "$kernver"
  stat_done
done

if (( ${#MODLIST[*]} )); then
  stat_busy "Reloading VirtualBox kernel modules"
  modprobe -a "${MODLIST[@]}" && stat_done || stat_fail
fi