#!/bin/bash # Sample init script for the a driver module 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 # group # mode # 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