Subversion Repositories svn LFS-FR

Compare Revisions

Ignore whitespace Rev 606 → Rev 607

/trunk/lfs/udev-config/contrib/debian/write_cd_aliases
0,0 → 1,111
#!/bin/sh -e
 
RULES_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 1
fi
if [ -z "$ID_CDROM" ]; then
echo "$DEVPATH is not a CD reader." >&2
exit 1
fi
 
# Prevent parallel processes from modifying the file at the same time.
lock_rules_file
 
link_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_file
 
echo $SYMLINKS
 
exit 0
 
/trunk/lfs/udev-config/contrib/debian/81-cdrom.rules
0,0 → 1,3
# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions and get device capabilities
 
ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom"
/trunk/lfs/udev-config/contrib/debian/83-cdrom-symlinks.rules
0,0 → 1,12
# /etc/udev/rules.d/83-cdrom-symlinks.rules: Determine CD drive capability.
 
ACTION!="add", GOTO="cd_aliases_generator_end"
SUBSYSTEM!="block", GOTO="cd_aliases_generator_end"
ENV{GENERATED}=="?*", GOTO="cd_aliases_generator_end"
 
# Fail the uevent if the autogenerated rules cannot be saved
ENV{ID_CDROM}=="?*", PROGRAM="/bin/grep -c ' / [^[:space:]]* rw' /proc/mounts", RESULT!="2", RUN+="/bin/false", GOTO="cd_aliases_generator_end"
 
ENV{ID_CDROM}=="?*", PROGRAM="write_cd_aliases", SYMLINK+="%c"
 
LABEL="cd_aliases_generator_end"
/trunk/lfs/udev-config/doc/95-udev-late.txt
0,0 → 1,18
Purpose of rules file:
 
Sends all uevents to a Unix-domain socket, where they can be monitored by other
programs.
 
 
Description of rules:
 
There is only one rule, which matches all uevents. It uses Udev's RUN key to
specify a socket to send each uevent to. Normally RUN is used to start up a
process, but if the pathname starts with "socket:", Udev instead interprets
the rest of the name as a Unix-domain socket to send the uevent to. In this
case, we send send the uevent to the socket named /org/kernel/udev/monitor,
which is created by the udevmonitor program. Udevmonitor is used to watch
uevents as they come to Udev. Its only purpose is for debugging, but sending
the uevent to a socket that doesn't exist is a very cheap operation, so we
enable this rule for all uevents.