|  | #!/bin/bash | 
|  | # | 
|  | # Copyright (c) 2005-2009 Wind River Systems, Inc. | 
|  | # | 
|  | # SPDX-License-Identifier: GPL-2.0-only | 
|  | # | 
|  |  | 
|  | usage() { | 
|  | echo "Usage: $0 {start|stop|restart} <nfs-export-dir>" | 
|  | } | 
|  |  | 
|  | if [ $# != 2 ]; then | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [[ "$1" != "start" && "$1" != "stop" && "$1" != "restart" ]]; then | 
|  | echo "Unknown command '$1'" | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [ ! -d "$2" ]; then | 
|  | echo "Error: '$2' does not exist" | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  | # Ensure the nfs-export-dir is an absolute path | 
|  | NFS_EXPORT_DIR=$(cd "$2" && pwd) | 
|  |  | 
|  | SYSROOT_SETUP_SCRIPT=`which oe-find-native-sysroot 2> /dev/null` | 
|  | if [ -z "$SYSROOT_SETUP_SCRIPT" ]; then | 
|  | echo "Error: Unable to find the oe-find-native-sysroot script" | 
|  | echo "Did you forget to source your build environment setup script?" | 
|  | exit 1 | 
|  | fi | 
|  | . $SYSROOT_SETUP_SCRIPT meta-ide-support | 
|  |  | 
|  | if [ ! -e "$OECORE_NATIVE_SYSROOT/usr/bin/unfsd" ]; then | 
|  | echo "Error: Unable to find unfsd binary in $OECORE_NATIVE_SYSROOT/usr/bin/" | 
|  |  | 
|  | if [ "x$OECORE_DISTRO_VERSION" = "x" ]; then | 
|  | echo "Have you run 'bitbake meta-ide-support'?" | 
|  | else | 
|  | echo "This shouldn't happen - something is missing from your toolchain installation" | 
|  | fi | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [ ! -d ~/.runqemu-sdk ]; then | 
|  | mkdir -p ~/.runqemu-sdk | 
|  | fi | 
|  |  | 
|  | NFS_INSTANCE=${NFS_INSTANCE:=0} | 
|  | EXPORTS=~/.runqemu-sdk/exports$NFS_INSTANCE | 
|  | RMTAB=~/.runqemu-sdk/rmtab$NFS_INSTANCE | 
|  | NFSPID=~/.runqemu-sdk/nfs$NFS_INSTANCE.pid | 
|  | MOUNTPID=~/.runqemu-sdk/mount$NFS_INSTANCE.pid | 
|  |  | 
|  | PSEUDO_OPTS="-P $OECORE_NATIVE_SYSROOT/usr" | 
|  | PSEUDO_LOCALSTATEDIR="$NFS_EXPORT_DIR/../$(basename $NFS_EXPORT_DIR).pseudo_state" | 
|  | export PSEUDO_LOCALSTATEDIR | 
|  |  | 
|  | if [ ! -d "$PSEUDO_LOCALSTATEDIR" ]; then | 
|  | echo "Error: $PSEUDO_LOCALSTATEDIR does not exist." | 
|  | echo "Did you create the export directory using runqemu-extract-sdk?" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | # NFS server port number | 
|  | NFSD_PORT=${NFSD_PORT:=$[ 3049 + 2 * $NFS_INSTANCE ]} | 
|  | # mountd port number | 
|  | MOUNTD_PORT=${MOUNTD_PORT:=$[ 3048 + 2 * $NFS_INSTANCE ]} | 
|  |  | 
|  | ## For debugging you would additionally add | 
|  | ## --debug all | 
|  | UNFSD_OPTS="-p -N -i $NFSPID -e $EXPORTS -n $NFSD_PORT -m $MOUNTD_PORT" | 
|  |  | 
|  | # See how we were called. | 
|  | case "$1" in | 
|  | start) | 
|  | PORTMAP_RUNNING=`ps -ef | grep portmap | grep -v grep` | 
|  | RPCBIND_RUNNING=`ps -ef | grep rpcbind | grep -v grep` | 
|  | if [[ "x$PORTMAP_RUNNING" = "x" && "x$RPCBIND_RUNNING" = "x" ]]; then | 
|  | echo "=======================================================" | 
|  | echo "Error: neither rpcbind nor portmap appear to be running" | 
|  | echo "Please install and start one of these services first" | 
|  | echo "=======================================================" | 
|  | echo "Tip: for recent Ubuntu hosts, run:" | 
|  | echo "  sudo apt-get install rpcbind" | 
|  | echo "Then add OPTIONS=\"-i -w\"  to /etc/default/rpcbind and run" | 
|  | echo "  sudo service portmap restart" | 
|  |  | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | echo "Creating exports file..." | 
|  | echo "$NFS_EXPORT_DIR (rw,no_root_squash,no_all_squash,insecure)" > $EXPORTS | 
|  |  | 
|  | echo "Starting User Mode nfsd" | 
|  | echo "  $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS" | 
|  | $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS | 
|  | if [ ! $? = 0 ]; then | 
|  | echo "Error starting nfsd" | 
|  | exit 1 | 
|  | fi | 
|  | # Check to make sure everything started ok. | 
|  | if [ ! -f $NFSPID ]; then | 
|  | echo "rpc.nfsd did not start correctly" | 
|  | exit 1 | 
|  | fi | 
|  | ps -fp `cat $NFSPID` > /dev/null 2> /dev/null | 
|  | if [ ! $? = 0 ]; then | 
|  | echo "rpc.nfsd did not start correctly" | 
|  | exit 1 | 
|  | fi | 
|  | echo " " | 
|  | echo "On your target please remember to add the following options for NFS" | 
|  | echo "nfsroot=IP_ADDRESS:$NFS_EXPORT_DIR,nfsvers=3,port=$NFSD_PORT,udp,mountport=$MOUNTD_PORT" | 
|  | ;; | 
|  | stop) | 
|  | if [ -f "$NFSPID" ]; then | 
|  | echo "Stopping rpc.nfsd" | 
|  | kill `cat $NFSPID` | 
|  | rm -f $NFSPID | 
|  | else | 
|  | echo "No PID file, not stopping rpc.nfsd" | 
|  | fi | 
|  | if [ -f "$EXPORTS" ]; then | 
|  | echo "Removing exports file" | 
|  | rm -f $EXPORTS | 
|  | fi | 
|  | ;; | 
|  | restart) | 
|  | $0 stop $NFS_EXPORT_DIR | 
|  | $0 start $NFS_EXPORT_DIR | 
|  | if [ ! $? = 0 ]; then | 
|  | exit 1 | 
|  | fi | 
|  | ;; | 
|  | *) | 
|  | echo "$0 {start|stop|restart} <nfs-export-dir>" | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | exit 0 |