#! /bin/bash # # @configure_input@ # on @DATE@ # export LANG=C PIDOF=@PIDOF@ CheckKernel() { case "@KERNEL_VERS@" in "") ;; *) if [ `uname -r` != "@KERNEL_VERS@" ]; then cat 1>&2 << EOF RTAPI requires the real-time kernel @KERNEL_VERS@ to run. Before running this realtime application, reboot and choose this kernel at the boot menu. EOF exit 1 fi esac } RUN_IN_PLACE=@RUN_IN_PLACE@ if [ $RUN_IN_PLACE = yes ]; then # When using RIP make sure PATH includes the directory where rtapi_app # resides PATH=@EMC2_HOME@/bin:$PATH; export PATH fi CheckConfig(){ prefix=@prefix@ exec_prefix=@exec_prefix@ sysconfdir=@sysconfdir@ if [ $RUN_IN_PLACE = yes ]; then RTAPICONF= # check in the LinuxCNC scripts directory # $0 is the command to run this script # strip the script name to leave the path SCRIPT_DIR=${0%/*} # the path might be relative # convert it to an absolute path SCRIPT_DIR=$(cd $SCRIPT_DIR ; pwd -P) # now look for rtapi.conf there if [ -f $SCRIPT_DIR/rtapi.conf ] ; then RTAPICONF=$SCRIPT_DIR/rtapi.conf fi else if [ -f $sysconfdir/linuxcnc/rtapi.conf ]; then RTAPICONF=$sysconfdir/linuxcnc/rtapi.conf fi fi if [ -z "$RTAPICONF" ] ; then echo "Missing rtapi.conf. Check your installation." 1>&2 exit 1 fi INSMOD="@INSMOD@" RMMOD="@RMMOD@" LSMOD="@LSMOD@" FUSER="@FUSER@" # Import the config source $RTAPICONF if [ ! -e $RTLIB_DIR/.runinfo -a -e $RTLIB_DIR/emc2/.runinfo ]; then # installed system: we don't want our modules mixed up with rtai RTLIB_DIR=$RTLIB_DIR/emc2 fi # Export the module path specified in the config. export MODPATH # Generate module lists for loading and unloading # lists contain RTOS modules plus RTAPI and HAL # unload list is in reverse order # any module names that are symlinks are resolved to their real names MODULES_LOAD= MODULES_UNLOAD= case $RTPREFIX in sim) SHM_DEV=/dev/zero;; *) for MOD in $MODULES ; do eval MOD=\${MODPATH_$MOD} if [ -z "$MOD" ]; then continue; fi if [ -L $MOD ]; then MOD=${MOD%/*}/$(readlink $MOD) fi MODULES_LOAD="$MODULES_LOAD $MOD" MOD="${MOD##*/}" MOD="${MOD%$MODULE_EXT}" MODULES_UNLOAD="$MOD $MODULES_UNLOAD" done MODULES_LOAD="$MODULES_LOAD $RTLIB_DIR/rtapi$MODULE_EXT $RTLIB_DIR/hal_lib$MODULE_EXT" MODULES_UNLOAD="hal_lib rtapi $MODULES_UNLOAD" case "$MODULES" in *rtai_shm*) SHM_DEV=/dev/rtai_shm ;; *mbuff*) SHM_DEV=/dev/mbuff ;; esac esac } CheckStatus(){ case $RTPREFIX in sim) if [ -z "$($PIDOF rtapi_app)" ]; then exit 1 else exit 0 fi ;; *) # check loaded/unloaded status of modules unset NOTLOADED for MOD in $MODULES_UNLOAD ; do if @LSMOD@ | awk '{print $1}' | grep -x $MOD >/dev/null ; then echo "$MOD is loaded" else echo "$MOD is not loaded" NOTLOADED=NOT fi done if [ -z $NOTLOADED ]; then exit 0 else exit 1 fi esac } CheckMem(){ # check for user space processes using shared memory if [ -e /dev/mbuff ] ; then # device file exists, check for processes using it if $FUSER -s /dev/mbuff 2>/dev/null; then # at least one process is using it echo "ERROR: Can't remove RTLinux modules, kill the following process(es) first" $FUSER -v /dev/mbuff exit 1 fi elif [ -e /dev/rtai_shm ] ; then # device file exists, check for processes using it if $FUSER -s /dev/rtai_shm 2>/dev/null; then # at least one process is using it echo "ERROR: Can't remove RTAI modules, kill the following process(es) first" $FUSER -v /dev/rtai_shm exit 1 fi fi } Load(){ CheckKernel case $RTPREFIX in sim) ;; *) for MOD in $MODULES_LOAD ; do $INSMOD $MOD || return $? done if [ "$DEBUG" != "" ] && [ -w /proc/rtapi/debug ] ; then echo "$DEBUG" > /proc/rtapi/debug fi esac } CheckLoaded(){ # this abomination is needed because udev sometimes doesn't # have the device ready for us in time. n=0 while [ $n -lt 100 ]; do [ -w $SHM_DEV ] && return 0 echo "." 1>&2 sleep .1 n=$(($n+1)) done echo "Can't write to $SHM_DEV - aborting" 1>&2 exit 1 } Unload(){ CheckKernel case $RTPREFIX in sim) rtapi_app exit ipcrm -M 0x48414c32 2>/dev/null ;# HAL_KEY ipcrm -M 0x90280A48 2>/dev/null ;# RTAPI_KEY ipcrm -M 0x48484c34 2>/dev/null ;# UUID_KEY ;; *) for module in $MODULES_UNLOAD ; do $RMMOD $module done esac } CheckUnloaded(){ # checks to see if all modules were unloaded STATUS= for module in $MODULES_UNLOAD ; do # check to see if the module is installed if @LSMOD@ | awk '{print $1}' | grep -x $module >/dev/null ; then echo "ERROR: Could not unload '$module'" STATUS=error fi done if [ -n "$STATUS" ] ; then exit 1 fi } CMD=$1 case "$CMD" in start|load) CheckConfig Load || exit $? CheckLoaded ;; restart|force-reload) CheckConfig CheckMem Unload CheckUnloaded Load || exit $? CheckLoaded ;; stop|unload) CheckConfig CheckMem Unload || exit $? ;; status) CheckConfig CheckStatus ;; *) echo "Usage: $0 {start|load|stop|unload|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0