chiark / gitweb /
Merge branch 'master' of git+ssh://master.kernel.org/pub/scm/linux/hotplug/udev
[elogind.git] / extras / rule_generator / write_cd_rules
index 232daeb86b11ad2ae1de8beb256775e21fbe3434..0d16fe6effaea9b744e3cd2397bdb7b49380064c 100644 (file)
 # under the terms of the GNU General Public License as published by the
 # Free Software Foundation version 2 of the License.
 
+# debug, if UDEV_LOG=<debug>
+if [ -n "$UDEV_LOG" ]; then
+       if [ "$UDEV_LOG" -ge 7 ]; then
+               set -x
+       fi
+fi
+
 RULES_FILE="/etc/udev/rules.d/70-persistent-cd.rules"
 
 . /lib/udev/rule_generator.functions
 
 find_next_available() {
-       raw_find_next_available "$(find_all_rules 'SYMLINK+=' $1)"
+       raw_find_next_available "$(find_all_rules 'SYMLINK\+=' "$1")"
 }
 
 write_rule() {
@@ -28,10 +35,10 @@ write_rule() {
        if [ "$PRINT_HEADER" ]; then
                PRINT_HEADER=
                echo "# This file was automatically generated by the $0"
-               echo "# program, probably run by the cd-aliases-generator.rules rules file."
+               echo "# program, run by the cd-aliases-generator.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 "# You can modify it, as long as you keep each rule on a single"
+               echo "# line, and set the \$GENERATED variable."
                echo ""
        fi
 
@@ -50,6 +57,38 @@ if [ -z "$ID_CDROM" ]; then
        exit 1
 fi
 
+if [ "$1" ]; then
+       METHOD="$1"
+else
+       METHOD='by-path'
+fi
+
+case "$METHOD" in
+       by-path)
+       if [ -z "$ID_PATH" ]; then
+               echo "$DEVPATH not supported by path_id. by-id may work." >&2
+               exit 1
+       fi
+       RULE="ENV{ID_PATH}==\"$ID_PATH\""
+       ;;
+
+       by-id)
+       if [ "$ID_SERIAL" ]; then
+               RULE="ENV{ID_SERIAL}==\"$ID_SERIAL\""
+       elif [ "$ID_MODEL" -a "$ID_REVISION" ]; then
+               RULE="ENV{ID_MODEL}==\"$ID_MODEL\", ENV{ID_REVISION}==\"$ID_REVISION\""
+       else
+               echo "$DEVPATH not supported by ata_id. by-path may work." >&2
+               exit 1
+       fi
+       ;;
+
+       *)
+       echo "Invalid argument (must be either by-path or by-id)." >&2
+       exit 1
+       ;;
+esac
+
 # Prevent concurrent processes from modifying the file at the same time.
 lock_rules_file
 
@@ -58,7 +97,7 @@ choose_rules_file
 
 link_num=$(find_next_available 'cdrom[0-9]*')
 
-match="ENV{ID_CDROM}==\"?*\", ENV{ID_PATH}==\"$ID_PATH\""
+match="SUBSYSTEM==\"block\", ENV{ID_CDROM}==\"?*\", $RULE"
 
 comment="$ID_MODEL ($ID_PATH)"
 
@@ -69,6 +108,7 @@ comment="$ID_MODEL ($ID_PATH)"
        write_rule "$match" "dvd$link_num"
 [ "$ID_CDROM_DVD_R" -o "$ID_CDROM_DVD_RW" -o "$ID_CDROM_DVD_RAM" ] && \
        write_rule "$match" "dvdrw$link_num"
+echo >> $RULES_FILE
 
 unlock_rules_file