summaryrefslogtreecommitdiffstats
path: root/scull/SCULL~1.INI
diff options
context:
space:
mode:
authorJavier Martinez Canillas <martinez.javier@gmail.com>2010-11-27 07:49:17 +0100
committerJavier Martinez Canillas <martinez.javier@gmail.com>2010-11-27 07:49:17 +0100
commitab121f379a3cff458c90e6f480ba4bb68c8733dd (patch)
treea9851af109ee83646d108bc247d03b131461b764 /scull/SCULL~1.INI
downloadldd3-ab121f379a3cff458c90e6f480ba4bb68c8733dd.tar.gz
Linux Device Drivers 3 examples
Diffstat (limited to 'scull/SCULL~1.INI')
-rwxr-xr-xscull/SCULL~1.INI142
1 files changed, 142 insertions, 0 deletions
diff --git a/scull/SCULL~1.INI b/scull/SCULL~1.INI
new file mode 100755
index 0000000..e0523ce
--- /dev/null
+++ b/scull/SCULL~1.INI
@@ -0,0 +1,142 @@
+#!/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