| #!/bin/sh |
| |
| # 20050524 Thomas Hood: Cleaned up; added --dev-dir option |
| |
| DEV_DIR="/dev" |
| MAJOR=116 |
| OSSMAJOR=14 |
| DSP_MINOR="" |
| MAX_CARDS=4 |
| OWNER=root.root |
| PERM=666 |
| DIR_PERM=755 |
| WIPE_OLD=yes |
| |
| if [ "`grep "^audio:" /etc/group`x" != x ]; then |
| OWNER=root.audio |
| fi |
| |
| echo_usage () { |
| echo "Usage: snddevices [-h|--help] [max] [--no-wipe] [--dev-dir=PATHNAME] [--owner=USER:GROUP]" |
| } |
| |
| report_error () { |
| echo "${0}: Error: $*" >&2 |
| } |
| |
| while [ "$1" ] ; do |
| case "$1" in |
| "-?"|-h|--help) echo_usage ; exit 0 ;; |
| max) DSP_MINOR=19 ;; |
| --no-wipe) WIPE_OLD="" ;; |
| --dev-dir) DEV_DIR="$2" ; shift ;; |
| --dev-dir=*) DEV_DIR="${1#--dev-dir=}" ;; |
| --owner) OWNER="$2" ; shift ;; |
| --owner=*) OWNER="${1#--owner=}" ;; |
| *) echo_usage >&2 ; exit 1 ;; |
| esac |
| shift |
| done |
| |
| if [ "$OWNER" = "root.audio" ] ; then |
| PERM=660 |
| DIR_PERM=750 |
| fi |
| |
| # Meant to be called from assert_*_args only |
| report_args_error () { |
| # report_error "Incorrect call: ${FUNCNAME[2]}() takes $* arguments" |
| report_error "Incorrect call: needs $* arguments" |
| } |
| |
| assert_one_arg () { |
| { [ "$1" ] && [ -z "$2" ] ; } || { report_args_error "one" ; exit 99 ; } |
| } |
| |
| assert_two_args () { |
| { [ "$2" ] && [ -z "$3" ] ; } || { report_args_error "two" ; exit 99 ; } |
| } |
| |
| assert_three_args () { |
| { [ "$3" ] && [ -z "$4" ] ; } || { report_args_error "three" ; exit 99 ; } |
| } |
| |
| assert_three_or_four_args () { |
| { [ "$3" ] && [ -z "$5" ] ; } || { report_args_error "three or four" ; exit 99 ; } |
| } |
| |
| # $1 destination-relative pathname of source |
| # $2 DEV_DIR-relative pathname of destination |
| link_file () { |
| assert_two_args "$@" |
| ln -sf "$1" "$DEV_DIR/$2" |
| } |
| |
| # $1 DEV_DIR-relative pathname of source |
| # $2 DEV_DIR-relative pathname of destination |
| move_file () { |
| assert_two_args "$@" |
| mv -f "$DEV_DIR/$1" "$DEV_DIR/$2" |
| } |
| |
| # $1 DEV_DIR-relative shell glob pattern of files to delete |
| del_file_pattern () { |
| assert_one_arg "$@" |
| eval rm -f "$DEV_DIR/$1" |
| } |
| |
| # $1 DEV_DIR-relative pathname to make |
| make_dir () { |
| assert_one_arg "$@" |
| mkdir -p "$DEV_DIR/$1" |
| } |
| |
| # $1 DEV_DIR-relative pathname to delete |
| del_dir () { |
| assert_one_arg "$@" |
| rmdir "$DEV_DIR/$1" |
| } |
| |
| # $1 DEV_DIR-relative pathname to test |
| is_dir () { |
| assert_one_arg "$@" |
| [ -d "$DEV_DIR/$1" ] |
| } |
| |
| # $1 owner:group |
| # $2 DEV_DIR-relative pathname whose owner will be changed |
| change_owner () { |
| assert_two_args "$@" |
| chown "$1" "$DEV_DIR/$2" |
| } |
| |
| # $1 perms |
| # $2 DEV_DIR-relative pathname whose perms will be changed |
| change_perms () { |
| assert_two_args "$@" |
| chmod "$1" "$DEV_DIR/$2" |
| } |
| |
| # $1 DEV_DIR-relative pathname of node to make |
| # $2 major |
| # $3 minor |
| make_char_node () { |
| assert_three_args "$@" |
| rm -f "$DEV_DIR/$1" |
| mknod "$DEV_DIR/$1" c "$2" "$3" |
| } |
| |
| |
| # $1 DEV_DIR-relative pathname of device to create |
| # $2 minor number of device to create |
| create_oss_dev () { |
| assert_two_args "$@" |
| del_file_pattern "$1" |
| echo -n "Creating $1..." |
| make_char_node "$1" "$OSSMAJOR" "$2" |
| change_owner "$OWNER" "$1" |
| change_perms "$PERM" "$1" |
| echo "done." |
| } |
| |
| # $1 DEV_DIR-relative base pathname of devices to create |
| # $2 minor number offset of devices to create |
| create_oss_dev_range () { |
| assert_two_args "$@" |
| tmp=0 |
| tmp1=0 |
| del_file_pattern "$1" |
| del_file_pattern "${1}?" |
| echo -n "Creating $1?..." |
| while [ "$tmp1" -lt "$MAX_CARDS" ]; do |
| minor=`expr $2 + $tmp` |
| make_char_node "$1$tmp1" "$OSSMAJOR" "$minor" |
| change_owner "$OWNER" "$1$tmp1" |
| change_perms "$PERM" "$1$tmp1" |
| tmp=`expr $tmp + 16` |
| tmp1=`expr $tmp1 + 1` |
| done |
| echo "done." |
| } |
| |
| # $1 DEV_DIR-relative pathname of device to create |
| # $2 minor number of device to create |
| create_single_dev () { |
| assert_two_args "$@" |
| del_file_pattern "$1" |
| echo -n "Creating $1..." |
| make_char_node "$1" "$MAJOR" "$2" |
| change_owner "$OWNER" "$1" |
| change_perms "$PERM" "$1" |
| echo "done." |
| } |
| |
| # $1 DEV_DIR-relative base pathname of devices to create |
| # $2 minor number offset of devices to create |
| create_card_dev_range () { |
| assert_two_args "$@" |
| tmp=0 |
| del_file_pattern "$1" |
| del_file_pattern "${1}?" |
| echo -n "Creating $1?..." |
| while [ "$tmp" -lt "$MAX_CARDS" ]; do |
| minor=`expr $tmp \* 32` |
| minor=`expr $2 + $minor` |
| make_char_node "${1}C${tmp}" "$MAJOR" "$minor" |
| change_owner "$OWNER" "${1}C${tmp}" |
| change_perms "$PERM" "${1}C${tmp}" |
| tmp=`expr $tmp + 1` |
| done |
| echo "done." |
| } |
| |
| # $1 DEV_DIR-relative base pathname of devices to create |
| # $2 minor number offset of devices to create |
| # $3 number of devices to create |
| # [$4 device name suffix] |
| create_device_dev_range () { |
| assert_three_or_four_args "$@" |
| tmp=0 |
| del_file_pattern "$1" |
| del_file_pattern "${1}?" |
| echo -n "Creating $1??$4..." |
| while [ "$tmp" -lt "$MAX_CARDS" ]; do |
| tmp1=0 |
| while [ "$tmp1" -lt "$3" ]; do |
| minor=`expr $tmp \* 32` |
| minor=`expr $2 + $minor + $tmp1` |
| make_char_node "${1}C${tmp}D${tmp1}${4}" "$MAJOR" "$minor" |
| change_owner "$OWNER" "${1}C${tmp}D${tmp1}${4}" |
| change_perms "$PERM" "${1}C${tmp}D${tmp1}${4}" |
| tmp1=`expr $tmp1 + 1` |
| done |
| tmp=`expr $tmp + 1` |
| done |
| echo "done." |
| } |
| |
| # OSS (Lite) compatible devices... |
| |
| if test "$OSSMAJOR" -eq 14; then |
| create_oss_dev_range mixer 0 |
| create_oss_dev sequencer 1 |
| create_oss_dev_range midi0 2 # /dev/midi is for tclmidi |
| create_oss_dev_range dsp 3 |
| create_oss_dev_range audio 4 |
| create_oss_dev sndstat 6 |
| create_oss_dev music 8 |
| create_oss_dev_range dmmidi 9 |
| create_oss_dev_range dmfm 10 |
| create_oss_dev_range amixer 11 # alternate mixer |
| create_oss_dev_range adsp 12 # alternate dsp |
| create_oss_dev_range amidi 13 # alternate midi |
| create_oss_dev_range admmidi 14 # alternate direct midi |
| # create symlinks |
| link_file mixer0 mixer |
| link_file midi00 midi # /dev/midi0 is for tclmidi |
| link_file dsp0 dsp |
| link_file audio0 audio |
| link_file music sequencer2 |
| link_file adsp0 adsp |
| link_file amidi0 amidi |
| fi |
| |
| # Remove old devices |
| |
| if [ "$WIPE_OLD" = yes ] ; then |
| move_file sndstat 1sndstat |
| del_file_pattern 'snd*' |
| move_file 1sndstat sndstat |
| |
| if is_dir snd ; then |
| del_file_pattern 'snd/*' |
| del_dir snd |
| fi |
| fi |
| |
| # Create new ones |
| |
| make_dir snd |
| change_owner "$OWNER" snd |
| change_perms "$DIR_PERM" snd |
| create_card_dev_range snd/control 0 |
| create_single_dev snd/seq 1 |
| create_single_dev snd/timer 33 |
| create_device_dev_range snd/hw 4 4 |
| create_device_dev_range snd/midi 8 8 |
| create_device_dev_range snd/pcm 16 8 p |
| create_device_dev_range snd/pcm 24 8 c |
| |
| # Create loader devices |
| |
| del_file_pattern 'aload*' |
| create_card_dev_range aload 0 |
| create_single_dev aloadSEQ 1 |
| |