#!/bin/sh if [ -z "$SUBSYSTEM" ]; then echo "SUBSYSTEM not defined, exiting" exit -1 fi MAX_LOOPS=1024 UDEV_RULES_FILE=/etc/udev/rules.d/61-${SUBSYSTEM}_config.rules if [ $SUBSYSTEM = "net" ]; then TARGET="NAME" ADD="" SKIP=" ENV{INTERFACE}!=\"*.*\"," else TARGET="SYMLINK" ADD="+" SKIP="" fi # returns true if a directory is writeable writeable() { if ln -s check $1/.is-writeable--${UDEV_RULES_FILE##*/} 2> /dev/null; then rm -f $1/.is-writeable--${UDEV_RULES_FILE##*/} return 0 else return 1 fi } choose_rules_file() { TEMP_RULES_FILE="/dev/.udev/tmp--${UDEV_RULES_FILE##*/}" if writeable ${UDEV_RULES_FILE%/*}; then RO_RULES_FILE= else RO_RULES_FILE=$UDEV_RULES_FILE UDEV_RULES_FILE="$TEMP_RULES_FILE" touch "$UDEV_RULES_FILE" fi if [ ! -f $UDEV_RULES_FILE ]; then cat > $UDEV_RULES_FILE <<EOF # udev persistent rules for $SUBSYSTEM subsystem # Generated by Mandriva udev rules # See /etc/udev/rules.d/62-create_persistent.rules EOF fi } read_rules() { choose_rules_file EXISTING=`sed -ne "/^[[:space:]]*#.*/b; s/.*$TARGET$ADD=\"\([^\"]*\)\".*/\1/; T; p" $UDEV_RULES_FILE $RO_RULES_FILE | sort -u` } already_exists() { echo $EXISTING | grep -q "\b$1\b" } add_result() { if [ -z "$RESULTS" ]; then RESULTS=$1 else RESULTS="$RESULTS $1" fi } add_first_available() { BASE=$1 [ -z "$ADD" ] || already_exists $BASE || add_result $BASE i=0 while [ $MAX_LOOPS -gt $i ] && already_exists "$BASE$i"; do : $((i++)) done add_result "$BASE$i" } write_rule() { MATCH=$1 echo "SUBSYSTEM==\"$SUBSYSTEM\", ACTION==\"add\",$SKIP $MATCH, $TARGET$ADD=\"$RESULTS\", ENV{MDV_CONFIGURED}=\"yes\"" >> $UDEV_RULES_FILE }