143 lines
3.2 KiB
Plaintext
143 lines
3.2 KiB
Plaintext
|
#!/bin/bash
|
||
|
# Sample init script for the a driver module <rubini@linux.it>
|
||
|
|
||
|
DEVICE="scull"
|
||
|
SECTION="misc"
|
||
|
|
||
|
# The list of filenames and minor numbers: $PREFIX is prefixed to all names
|
||
|
PREFIX="scull"
|
||
|
FILES=" 0 0 1 1 2 2 3 3 priv 16
|
||
|
pipe0 32 pipe1 33 pipe2 34 pipe3 35
|
||
|
single 48 uid 64 wuid 80"
|
||
|
|
||
|
INSMOD=/sbin/insmod; # use /sbin/modprobe if you prefer
|
||
|
|
||
|
function device_specific_post_load () {
|
||
|
true; # fill at will
|
||
|
}
|
||
|
function device_specific_pre_unload () {
|
||
|
true; # fill at will
|
||
|
}
|
||
|
|
||
|
# Everything below this line should work unchanged for any char device.
|
||
|
# Obviously, however, no options on the command line: either in
|
||
|
# /etc/${DEVICE}.conf or /etc/modules.conf (if modprobe is used)
|
||
|
|
||
|
# Optional configuration file: format is
|
||
|
# owner <ownername>
|
||
|
# group <groupname>
|
||
|
# mode <modename>
|
||
|
# options <insmod options>
|
||
|
CFG=/etc/${DEVICE}.conf
|
||
|
|
||
|
# kernel version, used to look for modules
|
||
|
KERNEL=`uname -r`
|
||
|
|
||
|
#FIXME: it looks like there is no misc section. Where should it be?
|
||
|
MODDIR="/lib/modules/${KERNEL}/kernel/drivers/${SECTION}"
|
||
|
if [ ! -d $MODDIR ]; then MODDIR="/lib/modules/${KERNEL}/${SECTION}"; fi
|
||
|
|
||
|
# Root or die
|
||
|
if [ "$(id -u)" != "0" ]
|
||
|
then
|
||
|
echo "You must be root to load or unload kernel modules"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Read configuration file
|
||
|
if [ -r $CFG ]; then
|
||
|
OWNER=`awk "\\$1==\"owner\" {print \\$2}" $CFG`
|
||
|
GROUP=`awk "\\$1==\"group\" {print \\$2}" $CFG`
|
||
|
MODE=`awk "\\$1==\"mode\" {print \\$2}" $CFG`
|
||
|
# The options string may include extra blanks or only blanks
|
||
|
OPTIONS=`sed -n '/^options / s/options //p' $CFG`
|
||
|
fi
|
||
|
|
||
|
|
||
|
# Create device files
|
||
|
function create_files () {
|
||
|
cd /dev
|
||
|
local devlist=""
|
||
|
local file
|
||
|
while true; do
|
||
|
if [ $# -lt 2 ]; then break; fi
|
||
|
file="${DEVICE}$1"
|
||
|
mknod $file c $MAJOR $2
|
||
|
devlist="$devlist $file"
|
||
|
shift 2
|
||
|
done
|
||
|
if [ -n "$OWNER" ]; then chown $OWNER $devlist; fi
|
||
|
if [ -n "$GROUP" ]; then chgrp $GROUP $devlist; fi
|
||
|
if [ -n "$MODE" ]; then chmod $MODE $devlist; fi
|
||
|
}
|
||
|
|
||
|
# Remove device files
|
||
|
function remove_files () {
|
||
|
cd /dev
|
||
|
local devlist=""
|
||
|
local file
|
||
|
while true; do
|
||
|
if [ $# -lt 2 ]; then break; fi
|
||
|
file="${DEVICE}$1"
|
||
|
devlist="$devlist $file"
|
||
|
shift 2
|
||
|
done
|
||
|
rm -f $devlist
|
||
|
}
|
||
|
|
||
|
# Load and create files
|
||
|
function load_device () {
|
||
|
|
||
|
if [ -f $MODDIR/$DEVICE.o ]; then
|
||
|
devpath=$MODDIR/$DEVICE.o
|
||
|
else if [ -f ./$DEVICE.o ]; then
|
||
|
devpath=./$DEVICE.o
|
||
|
else
|
||
|
devpath=$DEVICE; # let insmod/modprobe guess
|
||
|
fi; fi
|
||
|
if [ "$devpath" != "$DEVICE" ]; then
|
||
|
echo -n " (loading file $devpath)"
|
||
|
fi
|
||
|
|
||
|
if $INSMOD $devpath $OPTIONS; then
|
||
|
MAJOR=`awk "\\$2==\"$DEVICE\" {print \\$1}" /proc/devices`
|
||
|
remove_files $FILES
|
||
|
create_files $FILES
|
||
|
device_specific_post_load
|
||
|
else
|
||
|
echo " FAILED!"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Unload and remove files
|
||
|
function unload_device () {
|
||
|
device_specific_pre_unload
|
||
|
/sbin/rmmod $DEVICE
|
||
|
remove_files $FILES
|
||
|
}
|
||
|
|
||
|
|
||
|
case "$1" in
|
||
|
start)
|
||
|
echo -n "Loading $DEVICE"
|
||
|
load_device
|
||
|
echo "."
|
||
|
;;
|
||
|
stop)
|
||
|
echo -n "Unloading $DEVICE"
|
||
|
unload_device
|
||
|
echo "."
|
||
|
;;
|
||
|
force-reload|restart)
|
||
|
echo -n "Reloading $DEVICE"
|
||
|
unload_device
|
||
|
load_device
|
||
|
echo "."
|
||
|
;;
|
||
|
*)
|
||
|
echo "Usage: $0 {start|stop|restart|force-reload}"
|
||
|
exit 1
|
||
|
esac
|
||
|
|
||
|
exit 0
|