1#!/bin/sh -e 2 3# This script is run if an optical drive lacks a rule for persistent naming. 4# 5# It adds symlinks for optical drives based on the device class determined 6# by cdrom_id and used ID_PATH to identify the device. 7# 8# (C) 2006 Marco d'Itri <md@Linux.IT> 9# 10# This program is free software; you can redistribute it and/or modify it 11# under the terms of the GNU General Public License as published by the 12# Free Software Foundation version 2 of the License. 13 14RULES_FILE="/etc/udev/rules.d/70-persistent-cd.rules" 15 16. /lib/udev/rule_generator.functions 17 18find_next_available() { 19 raw_find_next_available "$(find_all_rules 'SYMLINK+=' $1)" 20} 21 22write_rule() { 23 local match="$1" 24 local link="$2" 25 local comment="$3" 26 27 { 28 if [ "$PRINT_HEADER" ]; then 29 PRINT_HEADER= 30 echo "# This file was automatically generated by the $0" 31 echo "# program, probably run by the cd-aliases-generator.rules rules file." 32 echo "#" 33 echo "# You can modify it, as long as you keep each rule on a single line" 34 echo "# and set the \$GENERATED variable." 35 echo "" 36 fi 37 38 [ "$comment" ] && echo "# $comment" 39 echo "$match, SYMLINK+=\"$link\", ENV{GENERATED}=\"1\"" 40 } >> $RULES_FILE 41 SYMLINKS="$SYMLINKS $link" 42} 43 44if [ -z "$DEVPATH" ]; then 45 echo "Missing \$DEVPATH." >&2 46 exit 1 47fi 48if [ -z "$ID_CDROM" ]; then 49 echo "$DEVPATH is not a CD reader." >&2 50 exit 1 51fi 52 53if [ "$1" ]; then 54 METHOD="$1" 55else 56 case "$ID_BUS" in 57 usb|ieee1394) 58 METHOD='by-id' 59 ;; 60 61 *) 62 METHOD='by-path' 63 ;; 64 esac 65fi 66 67case "$METHOD" in 68 by-path) 69 if [ -z "$ID_PATH" ]; then 70 echo "$DEVPATH not supported by path_id. by-id may work." >&2 71 exit 1 72 fi 73 RULE="ENV{ID_PATH}==\"$ID_PATH\"" 74 ;; 75 76 by-id) 77 if [ "$ID_SERIAL" ]; then 78 RULE="ENV{ID_SERIAL}==\"$ID_SERIAL\"" 79 elif [ "$ID_MODEL" -a "$ID_REVISION" ]; then 80 RULE="ENV{ID_MODEL}==\"$ID_MODEL\", ENV{ID_REVISION}==\"$ID_REVISION\"" 81 else 82 echo "$DEVPATH not supported by ata_id. by-path may work." >&2 83 exit 1 84 fi 85 ;; 86 87 *) 88 echo "Invalid argument (must be either by-path or by-id)." >&2 89 exit 1 90 ;; 91esac 92 93# Prevent concurrent processes from modifying the file at the same time. 94lock_rules_file 95 96# Check if the rules file is writeable. 97choose_rules_file 98 99link_num=$(find_next_available 'cdrom[0-9]*') 100 101match="ENV{ID_CDROM}==\"?*\", $RULE" 102 103comment="$ID_MODEL ($ID_PATH)" 104 105 write_rule "$match" "cdrom$link_num" "$comment" 106[ "$ID_CDROM_CD_R" -o "$ID_CDROM_CD_RW" ] && \ 107 write_rule "$match" "cdrw$link_num" 108[ "$ID_CDROM_DVD" ] && \ 109 write_rule "$match" "dvd$link_num" 110[ "$ID_CDROM_DVD_R" -o "$ID_CDROM_DVD_RW" -o "$ID_CDROM_DVD_RAM" ] && \ 111 write_rule "$match" "dvdrw$link_num" 112 113unlock_rules_file 114 115echo $SYMLINKS 116 117exit 0 118 119