#!/bin/bash ## @file # For development. # # # Copyright (C) 2006-2023 Oracle and/or its affiliates. # # This file is part of VirtualBox base platform packages, as # available from https://www.virtualbox.org. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation, in version 3 of the # License. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # The contents of this file may alternatively be used under the terms # of the Common Development and Distribution License Version 1.0 # (CDDL), a copy of it is provided in the "COPYING.CDDL" file included # in the VirtualBox distribution, in which case the provisions of the # CDDL are applicable instead of those of the GPL. # # You may elect to license modified versions of this file under the # terms and conditions of either the GPL or the CDDL or both. # # SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0 # SCRIPT_NAME="loadnetflt" XNU_VERSION=`LC_ALL=C uname -r | LC_ALL=C cut -d . -f 1` DRVNAME="VBoxNetFlt.kext" BUNDLE="org.virtualbox.kext.VBoxNetFlt" DEP_DRVNAME="VBoxDrv.kext" DEP_BUNDLE="org.virtualbox.kext.VBoxDrv" DIR=`dirname "$0"` DIR=`cd "$DIR" && pwd` DEP_DIR="$DIR/$DEP_DRVNAME" DIR="$DIR/$DRVNAME" if [ ! -d "$DIR" ]; then echo "Cannot find $DIR or it's not a directory..." exit 1; fi if [ ! -d "$DEP_DIR" ]; then echo "Cannot find $DEP_DIR or it's not a directory... (dependency)" exit 1; fi if [ -n "$*" ]; then OPTS="$*" else OPTS="-t" fi trap "sudo chown -R `whoami` $DIR $DEP_DIR; exit 1" INT # Try unload any existing instance first. LOADED=`kextstat -b $BUNDLE -l` if test -n "$LOADED"; then echo "${SCRIPT_NAME}.sh: Unloading $BUNDLE..." sudo kextunload -v 6 -b $BUNDLE LOADED=`kextstat -b $BUNDLE -l` if test -n "$LOADED"; then echo "${SCRIPT_NAME}.sh: failed to unload $BUNDLE, see above..." exit 1; fi echo "${SCRIPT_NAME}.sh: Successfully unloaded $BUNDLE" fi set -e # Copy the .kext to the symbols directory and tweak the kextload options. if test -n "$VBOX_DARWIN_SYMS"; then echo "${SCRIPT_NAME}.sh: copying the extension the symbol area..." rm -Rf "$VBOX_DARWIN_SYMS/$DRVNAME" mkdir -p "$VBOX_DARWIN_SYMS" cp -R "$DIR" "$VBOX_DARWIN_SYMS/" OPTS="$OPTS -s $VBOX_DARWIN_SYMS/ " sync fi # On smbfs, this might succeed just fine but make no actual changes, # so we might have to temporarily copy the driver to a local directory. if sudo chown -R root:wheel "$DIR" "$DEP_DIR"; then OWNER=`/usr/bin/stat -f "%u" "$DIR"` else OWNER=1000 fi if test "$OWNER" -ne 0; then TMP_DIR=/tmp/${SCRIPT_NAME}.tmp echo "${SCRIPT_NAME}.sh: chown didn't work on $DIR, using temp location $TMP_DIR/$DRVNAME" # clean up first (no sudo rm) if test -e "$TMP_DIR"; then sudo chown -R `whoami` "$TMP_DIR" rm -Rf "$TMP_DIR" fi # make a copy and switch over DIR mkdir -p "$TMP_DIR/" sudo cp -Rp "$DIR" "$TMP_DIR/" DIR="$TMP_DIR/$DRVNAME" # load.sh puts it here. DEP_DIR="/tmp/loaddrv.tmp/$DEP_DRVNAME" # retry sudo chown -R root:wheel "$DIR" "$DEP_DIR" fi sudo chmod -R o-rwx "$DIR" sync if [ "$XNU_VERSION" -ge "10" ]; then echo "${SCRIPT_NAME}.sh: loading $DIR... (kextutil $OPTS -d \"$DEP_DIR\" \"$DIR\")" sudo kextutil $OPTS -d "$DEP_DIR" "$DIR" else echo "${SCRIPT_NAME}.sh: loading $DIR... (kextload $OPTS -d \"$DEP_DIR\" \"$DIR\")" sudo kextload $OPTS -d "$DEP_DIR" "$DIR" fi sync sudo chown -R `whoami` "$DIR" "$DEP_DIR" kextstat | grep org.virtualbox.kext