]> code.ossystems Code Review - openembedded-core.git/commitdiff
runqemu: Fix TAP='TUNSETGROUP: Invalid argument' by falling back to tunctl -u
authorJason Wessel <jason.wessel@windriver.com>
Wed, 2 May 2012 11:30:46 +0000 (06:30 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 3 May 2012 14:38:07 +0000 (15:38 +0100)
By default the runqemu script tries to set the group permissions on any
tap device it creates.  The TUNSETGROUP ioctl is not implemented on some
popular host enterprise linux distributions.

Internally the script will exit as follows:

++ /opt/qemux86/bitbake_build/tmp/sysroots/x86_64-linux/usr/bin/tunctl -b -g 100
+ TAP='TUNSETGROUP: Invalid argument'
+ STATUS=1
+ '[' 1 -ne 0 ']'
+ echo 'tunctl failed:'
tunctl failed:
+ echo TUNSETGROUP: Invalid argument

This patch implements a fallback to using the userid as the owner of
the tap device which is supported by all 2.6 kernels, the default remains
to try and use the groupid first.

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
scripts/runqemu-ifup
scripts/runqemu-internal

index f80538f53c0016383511b3290fdc172af4362a27..e4c3dafeef0be4157941dfa94d4be97f27d2397f 100755 (executable)
@@ -34,7 +34,7 @@
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 usage() {
-       echo "sudo $(basename $0) <gid> <native-sysroot-basedir>"
+       echo "sudo $(basename $0) <uid> <gid> <native-sysroot-basedir>"
 }
 
 if [ $EUID -ne 0 ]; then
@@ -42,13 +42,14 @@ if [ $EUID -ne 0 ]; then
        exit 1
 fi
 
-if [ $# -ne 2 ]; then
+if [ $# -ne 3 ]; then
        usage
        exit 1
 fi
 
-GROUP="-g $1"
-NATIVE_SYSROOT_DIR=$2
+USERID="-u $1"
+GROUP="-g $2"
+NATIVE_SYSROOT_DIR=$3
 
 TUNCTL=$NATIVE_SYSROOT_DIR/usr/bin/tunctl
 if [ ! -x "$TUNCTL" ]; then
@@ -59,9 +60,14 @@ fi
 TAP=`$TUNCTL -b $GROUP 2>&1`
 STATUS=$?
 if [ $STATUS -ne 0 ]; then
-       echo "tunctl failed:"
-       echo $TAP
-       exit 1
+# If tunctl -g fails, try using tunctl -u, for older host kernels 
+# which do not support the TUNSETGROUP ioctl
+       TAP=`$TUNCTL -b $USERID 2>&1`
+       STATUS=$?
+       if [ $STATUS -ne 0 ]; then
+               echo "tunctl failed:"
+               exit 1
+       fi
 fi
 
 IFCONFIG=`which ifconfig 2> /dev/null`
index 1831a098c60c0b0dffd3b6ae557285538005dcdf..fb0d80660f41e53beaa4c4729c125078f44fe2b0 100755 (executable)
@@ -173,13 +173,14 @@ if [ "$TAP" = "" ]; then
     fi
 
     GROUPID=`id -g`
+    USERID=`id -u`
     echo "Setting up tap interface under sudo"
     # Redirect stderr since we could see a LD_PRELOAD warning here if pseudo is loaded
     # but inactive. This looks scary but is harmless
-    tap=`sudo $QEMUIFUP $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
+    tap=`sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT 2> /dev/null`
     if [ $? -ne 0 ]; then
         # Re-run standalone to see verbose errors
-        sudo $QEMUIFUP $GROUPID $OECORE_NATIVE_SYSROOT
+        sudo $QEMUIFUP $USERID $GROUPID $OECORE_NATIVE_SYSROOT
         return
     fi
     LOCKFILE="$LOCKDIR/$tap"