| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | #!/bin/sh -eRULES_FILE="/etc/udev/rules.d/82-persistent-cd.rules"##############################################################################lock_rules_file() {  RULES_LOCK="/dev/.udev/.lock-${RULES_FILE##*/}"  retry=30  while ! mkdir $RULES_LOCK 2> /dev/null; do    if [ $retry -eq 0 ]; then       echo "Cannot lock $RULES_FILE!" >&2       exit 2    fi    sleep 1    retry=$(($retry - 1))  done}unlock_rules_file() {  rmdir $RULES_LOCK || true}##############################################################################find_next_available() {  # use echo to convert newlines to spaces  local links=`echo $(find_all_symlinks $1)`  local basename=${links%%[ 0-9]*}  local max=-1  for name in $links; do    local num=${name#$basename}    [ "$num" ] || num=0    [ $num -gt $max ] && max=$num  done  max=$(($max + 1))  # "name0" actually is just "name"  [ $max -eq 0 ] && return  echo "$max"}find_all_symlinks() {  local linkre="$1"  local match="$2"  [ -e $RULES_FILE ] || return  local search='.*[[:space:],]SYMLINK+="\('"$linkre"'\)"[[:space:]]*\(,.*\|\\\|\)$'  sed -n -e "${match}s/${search}/\1/p" $RULES_FILE}write_rule() {  local match="$1"  local link="$2"  local comment="$3"  [ -e "$RULES_FILE" ] || PRINT_HEADER=1  {  if [ "$PRINT_HEADER" ]; then    PRINT_HEADER=    echo "# This file was automatically generated by the $0"    echo "# program, probably run by the 83-cdrom.rules rules file."    echo "#"    echo "# You can modify it, as long as you keep each rule on a single line"    echo "# and set the \$GENERATED variable."    echo ""  fi  [ "$comment" ] && echo "# $comment"  echo "ACTION==\"add\", SUBSYSTEM==\"block\", $match, ENV{ID_CDROM}==\"1\", SYMLINK+=\"$link\", ENV{GENERATED}=\"1\""  } >> $RULES_FILE  SYMLINKS="$SYMLINKS $link"}##############################################################################if [ -z "$DEVPATH" ]; then  echo "Missing \$DEVPATH." >&2  exit 1fiif [ -z "$ID_CDROM" ]; then  echo "$DEVPATH is not a CD reader." >&2  exit 1fi# Prevent parallel processes from modifying the file at the same time.lock_rules_filelink_num=$(find_next_available 'cdrom[0-9]*')#match="ENV{ID_PATH}==\"$ID_PATH\""#kernel=${DEVPATH##*/}#match="KERNEL==\"$kernel\""id=${PHYSDEVPATH##*/}match="BUS==\"$PHYSDEVBUS\", ID==\"$id\""comment="$ID_MODEL ($ID_PATH)"			  write_rule "$match" "cdrom$link_num" "$comment"[ "$ID_CDROM_CD_RW" ]  && write_rule "$match" "cdrw$link_num"[ "$ID_CDROM_DVD" ]    && write_rule "$match" "dvd$link_num"[ "$ID_CDROM_DVD_RW" ] && write_rule "$match" "dvdrw$link_num"unlock_rules_fileecho $SYMLINKSexit 0
 |