From 14b903b747bc375312a38ef3b52092e8206c8332 Mon Sep 17 00:00:00 2001 From: Mike Staszel Date: Sat, 6 Feb 2010 23:38:13 -0600 Subject: [PATCH] udev needs a modded PKGBUILD --- core/udev/81-arch.rules | 151 ++++++++++++++++++++++++++++++++ core/udev/PKGBUILD | 123 ++++++++++++++++++++++++++ core/udev/arch-udev-rules.patch | 78 +++++++++++++++++ core/udev/cdsymlinks.sh | 44 ++++++++++ core/udev/ignore-remove.sh | 13 +++ core/udev/load-modules.sh | 80 +++++++++++++++++ core/udev/resolve-modalias.c | 73 +++++++++++++++ core/udev/root-link.sh | 7 ++ core/udev/udev.install | 29 ++++++ 9 files changed, 598 insertions(+) create mode 100644 core/udev/81-arch.rules create mode 100644 core/udev/PKGBUILD create mode 100644 core/udev/arch-udev-rules.patch create mode 100755 core/udev/cdsymlinks.sh create mode 100755 core/udev/ignore-remove.sh create mode 100755 core/udev/load-modules.sh create mode 100644 core/udev/resolve-modalias.c create mode 100755 core/udev/root-link.sh create mode 100644 core/udev/udev.install diff --git a/core/udev/81-arch.rules b/core/udev/81-arch.rules new file mode 100644 index 000000000..51f2c1aae --- /dev/null +++ b/core/udev/81-arch.rules @@ -0,0 +1,151 @@ +# Udev rules for Archlinux by Tobias Powalowski +# do not edit this file, it will be overwritten on update +# +# This ruleset should provide a DevFS-compatible device tree. +# +# There are a number of modifiers that are allowed to be used in some +# of the different fields. They provide the following subsitutions: +# +# %n the "kernel number" of the device. +# For example, 'sda3' has a "kernel number" of '3' +# %k the kernel name for the device. +# %M the kernel major number for the device +# %m the kernel minor number for the device +# %b the bus id for the device +# %c the string returned by the PROGRAM +# %s{filename} the content of a sysfs attribute. +# %% the '%' char itself. +# +# There are a number of modifiers that are allowed to be used in some of the +# fields. See the udev man page for a full description of them. +# global stuff +# + +##################################### +###### Hotplug rules - begin +# Only additional modules, +# which are not detectable, +# are loaded here! +##################################### +# check if the device has already been claimed by a driver +ACTION!="add", GOTO="drivers_end" + +# SOUND addon modules +SUBSYSTEM=="sound", RUN+="/lib/udev/load-modules.sh snd-pcm-oss" +SUBSYSTEM=="sound", RUN+="/lib/udev/load-modules.sh snd-seq-oss" + +#PNP addon modules +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="PNP0800", RUN+="/lib/udev/load-modules.sh pcspkr" +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="*PNP0510*", RUN+="/lib/udev/load-modules.sh irtty-sir" +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="*PNP0511*", RUN+="/lib/udev/load-modules.sh irtty-sir" +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="PNPb02f", RUN+="/lib/udev/load-modules.sh analog" + +# PARPORT addon modules +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="PNP040*", RUN+="/lib/udev/load-modules.sh lp" +SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", ATTRS{id}=="PNP040*", RUN+="/lib/udev/load-modules.sh ppdev" + +# fix ide cdrom detection on old proliant servers +SUBSYSTEM=="pci", ENV{MODALIAS}=="pci:v00000E11d00000001sv00000000sd00000000bc06sc02i00", RUN+="/lib/udev/load-modules.sh ide-generic" + +LABEL="drivers_end" +##################################### +##### Hotplug rules - end +##################################### + +##################################### +###### CD/DVD symlinks - begin +##################################### +ACTION=="add|change", SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", IMPORT="cdrom_id --export $tempnode" +ACTION=="add|change", SUBSYSTEMS=="scsi", KERNEL=="sr[0-9]*", IMPORT="cdrom_id --export $tempnode" +ACTION=="add|change", SUBSYSTEMS=="scsi", KERNEL=="scd[a-z]", IMPORT="cdrom_id --export $tempnode" +ENV{ID_CDROM}=="?*", SYMLINK+="cd/cdrom-%b" +ENV{ID_CDROM_CD_RW}=="?*", SYMLINK+="cd/cdrw-%b" +ENV{ID_CDROM_DVD}=="?*", SYMLINK+="cd/dvd-%b" +ENV{ID_CDROM_DVD_R}=="?*", SYMLINK+="cd/dvdrw-%b" +ACTION=="add|change", SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTR{removable}=="1", ATTRS{media}=="cdrom*", RUN+="cdsymlinks.sh" +ACTION=="add|change", SUBSYSTEMS=="scsi", KERNEL=="sr[0-9]*", ATTRS{type}=="5", RUN+="cdsymlinks.sh" +ACTION=="add|change", SUBSYSTEMS=="scsi", KERNEL=="sg[0-9]*", ATTRS{type}=="5", RUN+="cdsymlinks.sh" +ACTION=="remove", SUBSYSTEMS=="block", KERNEL=="hd[a-z]", RUN+="cdsymlinks.sh" +ACTION=="remove", SUBSYSTEMS=="block", KERNEL=="sr[0-9]*", RUN+="cdsymlinks.sh" +ACTION=="remove", SUBSYSTEMS=="block", KERNEL=="sg[0-9]*", RUN+="cdsymlinks.sh" +##################################### +###### CD/DVD symlinks - end +##################################### + +##################################### +# Additional Archlinux +# Permissions and Symlinks - begin +##################################### +# fix /dev/root symlink +SUBSYSTEM=="block", RUN+="root-link.sh" + +# permission for sg devices +KERNEL=="sg[0-9]*", ATTRS{type}!="3|6", GROUP="disk", MODE="0660" + +# permissions for IDE CD devices +SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTR{removable}=="1", ATTRS{media}=="cdrom*", GROUP="optical" + +# permissions for SCSI CD devices +SUBSYSTEMS=="scsi", KERNEL=="sr[0-9]*", ATTRS{type}=="5", SYMLINK+="scd%n", GROUP="optical" +SUBSYSTEMS=="scsi", KERNEL=="sg[0-9]*", ATTRS{type}=="5", GROUP="optical" + +# permissions for removable devices like cardreaders or sticks +KERNEL=="sd*", ATTRS{scsi_level}=="3", ATTRS{type}=="0", GROUP="storage" + +# permissions for firewire external drives +KERNEL=="sd*", ATTRS{scsi_level}=="5", GROUP="storage" + +# permissions for usb to scsi external adapters +KERNEL=="sd*", ATTRS{scsi_level}=="3", ATTRS{type}=="7", GROUP="storage" + +# permissions for ide storage like pcmcia card readers +ACTION!="add", GOTO="pcmcia_end" +SUBSYSTEM!="block", GOTO="pcmcia_end" +KERNEL=="hd*[!0-9]", IMPORT{program}="ata_id --export $tempnode" +KERNEL=="hd*", IMPORT{parent}=="ID_*" +KERNEL=="hd*", ENV{ID_TYPE}=="generic", GROUP="storage" +LABEL="pcmcia_end" + +# permissions for SCSI scanners +SUBSYSTEMS=="scsi", KERNEL=="sg[0-9]*", ATTRS{type}=="6", GROUP="scanner" + +# mem +KERNEL=="ram0", SYMLINK+="ramdisk" +KERNEL=="ram1", SYMLINK+="ram" + +# video4linux + +KERNEL=="vbi0", SYMLINK+="vbi" +KERNEL=="radio0", SYMLINK+="radio" +KERNEL=="radio[0-9]*", GROUP="video" +KERNEL=="video0", SYMLINK+="video" +KERNEL=="vtx0", SYMLINK+="vtx" + +# video devices +### xorg resets those permissions, adjust your xorg.conf! +KERNEL=="3dfx*", GROUP="video" +KERNEL=="fb[0-9]*", GROUP="video" + +# misc +KERNEL=="uinput", SYMLINK+="%k" +KERNEL=="sgi_fetchop", MODE="0666" +KERNEL=="sonypi", MODE="0666" + +# USB devices +KERNEL=="legousbtower*", MODE="0666" + +# IEEE1394 (firewire) devices +KERNEL=="raw1394", GROUP="video" + +# kbd devices +KERNEL=="kbd", MODE="0664" + +# CPU +KERNEL=="cpu[0-9]*", SYMLINK="%k" +KERNEL=="msr[0-9]*", SYMLINK="%k" + +# miscellaneous +KERNEL=="rtc|rtc0", GROUP="audio", MODE="0664" +####################################### +# Permissions and Symlinks - end +####################################### diff --git a/core/udev/PKGBUILD b/core/udev/PKGBUILD new file mode 100644 index 000000000..3b828118f --- /dev/null +++ b/core/udev/PKGBUILD @@ -0,0 +1,123 @@ +# $Id: PKGBUILD 48501 2009-08-02 16:29:45Z tpowa $ +# Maintainer: Aaron Griffin +# Maintainer: Tobias Powalowski +# Maintainer: Thomas Bächler +# arm Maintainer: Philipp Scholl +pkgname=udev +pkgver=145 +pkgrel=1 +pkgdesc="The userspace dev tools (udev)" +arch=(arm) +url="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html" +license=('GPL') +groups=('base') +depends=('glibc' 'coreutils' 'util-linux' 'libusb' 'glib2') +makedepends=('kernel26' 'gperf' 'libxslt' 'pciutils' 'usbutils') #kernel26 needed to build framebuffer blacklist +install=udev.install +backup=(etc/udev/udev.conf + etc/scsi_id.config + etc/udev/cdsymlinks.conf + etc/modprobe.d/framebuffer_blacklist.conf) +conflicts=('pcmcia-cs' 'hotplug') +replaces=('devfsd') +# older initscripts versions required start_udev +conflicts=('initscripts<2009.07') +options=(!makeflags !libtool) +source=(http://www.kernel.org/pub/linux/utils/kernel/hotplug/$pkgname-$pkgver.tar.bz2 + 81-arch.rules load-modules.sh resolve-modalias.c cdsymlinks.sh root-link.sh + arch-udev-rules.patch ignore-remove.sh) +md5sums=('b3d3b5f88c7b81e7615700a04db685e1' + 'cc6406e8b67b2b8711942098a66cde6b' + 'f4951f61438d69894b728212dac7318b' + '64a0169dc9d883a63ff9f8f491fdc34a' + '2e808ee78d237c478b57af2a68d43769' + '2d6dc6842464f107bccc68cd505a6c31' + 'aa51fa1925d70f63ee4ad4958eb7a861' + '35fa97500243a79b2370fa4684828e69') + +build() { + cd $srcdir/$pkgname-$pkgver + ./configure --prefix="" --mandir=/usr/share/man\ + --includedir=/usr/include\ + --libexecdir=/lib/udev\ + --datarootdir=/usr/share + make || return 1 + make DESTDIR=$startdir/pkg install + # Fix pkgconfig path + install -d -m755 $pkgdir/usr/lib + mv $pkgdir/lib/pkgconfig $pkgdir/usr/lib + + # Non-stock rules still go in /etc + install -D -m644 $srcdir/81-arch.rules $pkgdir/lib/udev/rules.d/81-arch.rules + + # install our module loading subsystem + install -D -m755 $srcdir/load-modules.sh $pkgdir/lib/udev/load-modules.sh + install -d -m755 $pkgdir/bin + gcc -Wall $CFLAGS -o $pkgdir/bin/resolve-modalias $srcdir/resolve-modalias.c || return 1 + # install cdsymlinks.sh + install -D -m755 $srcdir/cdsymlinks.sh $pkgdir/lib/udev/cdsymlinks.sh + # install root-link.sh + install -D -m755 $srcdir/root-link.sh $pkgdir/lib/udev/root-link.sh + # install ignore-remove.sh + install -D -m755 $srcdir/ignore-remove.sh $pkgdir/lib/udev/ignore-remove.sh + # disable error logging to prevent startup failures printed to vc on boot + sed -i -e 's|udev_log="err"|udev_log="0"|g' $pkgdir/etc/udev/udev.conf + # install additional standard rules files + for rule in $srcdir/$pkgname-$pkgver/rules/packages/*.rules; do + install -D -m 644 $rule $pkgdir/lib/udev/rules.d/ + done + # fix standard udev rules to fit to arch + cd $pkgdir/lib/udev/rules.d/ + patch -Np1 -i $srcdir/arch-udev-rules.patch || return 1 + # remove .orig files + rm -f pkgdir/lib/udev/rules.d/*.orig + # disable persistent cdromsymlinks and network by default + # and move it to /etc/udev/rules.d + mv $pkgdir/lib/udev/rules.d/75-persistent-net-generator.rules \ + $pkgdir/etc/udev/rules.d/75-persistent-net-generator.rules.optional + mv $pkgdir/lib/udev/rules.d/75-cd-aliases-generator.rules \ + $pkgdir/etc/udev/rules.d/75-cd-aliases-generator.rules.optional + # remove not needed rules + rm $pkgdir/lib/udev/rules.d/40-ia64.rules + rm $pkgdir/lib/udev/rules.d/40-ppc.rules + rm $pkgdir/lib/udev/rules.d/40-s390.rules + + # create framebuffer blacklist + mkdir -p $pkgdir/etc/modprobe.d/ + for mod in $(find /lib/modules/*/kernel/drivers/video -name '*fb.ko' -exec basename {} .ko \;); do + echo "blacklist $mod" >> $pkgdir/etc/modprobe.d/framebuffer_blacklist.conf + done + + # create static devices in /lib/udev/devices/ + mkdir ${pkgdir}/lib/udev/devices + mkdir ${pkgdir}/lib/udev/devices/pts + mkdir ${pkgdir}/lib/udev/devices/shm + + mknod -m 0600 ${pkgdir}/lib/udev/devices/console c 5 1 || return 1 + mknod -m 0666 ${pkgdir}/lib/udev/devices/null c 1 3 || return 1 + mknod -m 0660 ${pkgdir}/lib/udev/devices/zero c 1 5 || return 1 + mknod -m 0666 ${pkgdir}/lib/udev/devices/kmsg c 1 11 || return 1 + + ln -snf /proc/self/fd ${pkgdir}/lib/udev/devices/fd || return 1 + ln -snf /proc/self/fd/0 ${pkgdir}/lib/udev/devices/stdin || return 1 + ln -snf /proc/self/fd/1 ${pkgdir}/lib/udev/devices/stdout || return 1 + ln -snf /proc/self/fd/2 ${pkgdir}/lib/udev/devices/stderr || return 1 + ln -snf /proc/kcore ${pkgdir}/lib/udev/devices/core || return 1 + + # these static devices are created for convenience, to autoload the modules if necessary + # /dev/loop0 + mknod -m 0660 ${pkgdir}/lib/udev/devices/loop0 b 7 0 || return 1 + chgrp disk ${pkgdir}/lib/udev/devices/loop0 || return 1 + # /dev/net/tun + mkdir ${pkgdir}/lib/udev/devices/net + mknod -m 0666 ${pkgdir}/lib/udev/devices/net/tun c 10 200 || return 1 + # /dev/fuse + mknod -m 0666 ${pkgdir}/lib/udev/devices/fuse c 10 229 || return 1 + # /dev/ppp + mknod -m 0600 ${pkgdir}/lib/udev/devices/ppp c 108 0 || return 1 + + # Replace dialout group in rules with uucp group + for i in $pkgdir/lib/udev/rules.d/*.rules; do + sed -i -e 's#GROUP="dialout"#GROUP="uucp"#g' $i + done +} diff --git a/core/udev/arch-udev-rules.patch b/core/udev/arch-udev-rules.patch new file mode 100644 index 000000000..828203997 --- /dev/null +++ b/core/udev/arch-udev-rules.patch @@ -0,0 +1,78 @@ +diff -Nur rules.d/50-udev-default.rules rules.d.arch/50-udev-default.rules +--- rules.d/50-udev-default.rules 2009-03-07 22:22:48.200242883 +0100 ++++ rules.d.arch/50-udev-default.rules 2009-03-07 22:23:26.134434516 +0100 +@@ -64,20 +64,20 @@ + + # floppy + KERNEL=="fd[0-9]", GROUP="floppy" +-KERNEL=="fd[0-9]", ACTION=="add", ATTRS{cmos}=="?*", RUN+="create_floppy_devices -c -t $attr{cmos} -m %M -M 0640 -G floppy $root/%k" +-KERNEL=="hd*", SUBSYSTEMS=="ide", ATTRS{media}=="floppy", OPTIONS+="all_partitions" ++KERNEL=="fd[0-9]", ACTION=="add", ATTRS{cmos}=="?*", RUN+="create_floppy_devices -c -t $attr{cmos} -m %M -M 0660 -G floppy $root/%k" ++KERNEL=="hd*", SUBSYSTEMS=="ide", ATTRS{media}=="floppy", OPTIONS+="all_partitions", GROUP="floppy" + + # cdrom +-SUBSYSTEM=="block", KERNEL=="sr[0-9]*", SYMLINK+="scd%n", GROUP="cdrom" +-SUBSYSTEM=="block", KERNEL=="hd*", SUBSYSTEMS=="ide", ATTRS{media}=="cdrom", GROUP="cdrom" +-SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="cdrom" +-KERNEL=="pktcdvd[0-9]*", NAME="pktcdvd/%k", GROUP="cdrom" +-KERNEL=="pktcdvd", NAME="pktcdvd/control", GROUP="cdrom" ++SUBSYSTEM=="block", KERNEL=="sr[0-9]*", SYMLINK+="scd%n", GROUP="optical", MODE="0660" ++SUBSYSTEM=="block", KERNEL=="hd*", SUBSYSTEMS=="ide", ATTRS{media}=="cdrom", GROUP="optical", MODE="0660" ++SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="optical", MODE="0660" ++KERNEL=="pktcdvd[0-9]*", NAME="pktcdvd/%k", GROUP="optical", MODE="0660" ++KERNEL=="pktcdvd", NAME="pktcdvd/control", GROUP="optical", MODE="0660" + + # tape +-KERNEL=="ht[0-9]*|nht[0-9]*", GROUP="tape" +-KERNEL=="pt[0-9]*|npt[0-9]*|pht[0-9]*", GROUP="tape" +-SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="tape" ++KERNEL=="ht[0-9]*|nht[0-9]*", GROUP="storage", MODE="0660" ++KERNEL=="pt[0-9]*|npt[0-9]*|pht[0-9]*", GROUP="storage", MODE="0660" ++SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="storage", MODE="0660" + + # block-releated + KERNEL=="sch[0-9]*", GROUP="disk" +@@ -116,5 +116,4 @@ + KERNEL=="cpad[0-9]*", NAME="usb/%k" + + # do not delete static device nodes +-ACTION=="remove", NAME=="?*", TEST=="/lib/udev/devices/$name", OPTIONS+="ignore_remove" +-ACTION=="remove", NAME=="", TEST=="/lib/udev/devices/%k", OPTIONS+="ignore_remove" ++ACTION=="remove", PROGRAM="ignore-remove.sh %r", OPTIONS+="ignore_remove" +diff -Nur rules.d/60-persistent-storage.rules rules.d.arch/60-persistent-storage.rules +--- rules.d/60-persistent-storage.rules 2009-03-07 22:22:48.200242883 +0100 ++++ rules.d.arch/60-persistent-storage.rules 2009-03-07 22:22:54.757744454 +0100 +@@ -10,7 +10,7 @@ + SUBSYSTEM!="block", GOTO="persistent_storage_end" + + # skip rules for inappropriate block devices +-KERNEL=="fd*|mtd*|nbd*|gnbd*|btibm*|dm-*|md*", GOTO="persistent_storage_end" ++KERNEL=="fd*|mtd*|nbd*|gnbd*|md*|btibm*", GOTO="persistent_storage_end" + + # never access non-cdrom removable ide devices, the drivers are causing event loops on open() + KERNEL=="hd*[!0-9]", ATTR{removable}=="1", SUBSYSTEMS=="ide", ATTRS{media}=="disk|floppy", GOTO="persistent_storage_end" +diff -Nur rules.d/80-drivers.rules rules.d.arch/80-drivers.rules +--- rules.d/80-drivers.rules 2009-03-07 22:22:48.200242883 +0100 ++++ rules.d.arch/80-drivers.rules 2009-03-07 22:22:54.757744454 +0100 +@@ -2,13 +2,14 @@ + + ACTION!="add", GOTO="drivers_end" + +-DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{ignore_error}+="/sbin/modprobe -b $env{MODALIAS}" +-SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/sbin/modprobe -b tifm_sd" +-SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN+="/sbin/modprobe -b tifm_ms" +-SUBSYSTEM=="memstick", RUN+="/sbin/modprobe -b --all ms_block mspro_block" +-SUBSYSTEM=="i2o", RUN+="/sbin/modprobe -b i2o_block" +-SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST!="[module/sg]", RUN+="/sbin/modprobe -b sg" +-SUBSYSTEM=="module", KERNEL=="parport_pc", RUN+="/sbin/modprobe -b ppdev" ++DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{ignore_error}+="/lib/udev/load-modules.sh $env{MODALIAS}" ++SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/lib/udev/load-modules.sh tifm_sd" ++SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN+="/lib/udev/load-modules.sh tifm_ms" ++SUBSYSTEM=="memstick", RUN+="/lib/udev/load-modules.sh ms_block" ++SUBSYSTEM=="memstick", RUN+="/lib/udev/load-modules.sh mspro_block" ++SUBSYSTEM=="i2o", RUN+="/lib/udev/load-modules.sh i2o_block" ++SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST!="[module/sg]", RUN+="/lib/udev/load-modules.sh sg" ++SUBSYSTEM=="module", KERNEL=="parport_pc", RUN+="/lib/udev/load-modules.sh ppdev" + + LABEL="drivers_end" + diff --git a/core/udev/cdsymlinks.sh b/core/udev/cdsymlinks.sh new file mode 100755 index 000000000..498abda4a --- /dev/null +++ b/core/udev/cdsymlinks.sh @@ -0,0 +1,44 @@ +#! /bin/sh +# Creates cdsymlinks in /dev +# for Archlinux by Tobias Powalowski + +# check on cd/dvd drives and if persistant rules file is used +if [ -d /dev/cd -a ! -e /etc/udev/rules.d/75-persistent-cd.rules ]; then + # remove existing device files + rm /dev/cdrom* + rm /dev/cdrw* + rm /dev/dvd* + rm /dev/dvdrw* + # start creating symlinks + for i in /dev/cd/cdrom-*; do + if [ -h $i ]; then + [ "$CD_NUMBER" = "" ] && ln -s $i /dev/cdrom + [ "$CD_NUMBER" = "" ] && CD_NUMBER="-1" + ! [ "$CD_NUMBER" = "" ] && CD_NUMBER="$((CD_NUMBER+1))" && ln -s $i /dev/cdrom$CD_NUMBER + fi + done + + for i in /dev/cd/cdrw-*; do + if [ -h $i ]; then + [ "$CDRW_NUMBER" = "" ] && ln -s $i /dev/cdrw + [ "$CDRW_NUMBER" = "" ] && CDRW_NUMBER="-1" + ! [ "$CDRW_NUMBER" = "" ] && CDRW_NUMBER="$((CDRW_NUMBER+1))" && ln -s $i /dev/cdrw$CDRW_NUMBER + fi + done + + for i in /dev/cd/dvd-*; do + if [ -h $i ]; then + [ "$DVD_NUMBER" = "" ] && ln -s $i /dev/dvd + [ "$DVD_NUMBER" = "" ] && DVD_NUMBER="-1" + ! [ "$DVD_NUMBER" = "" ] && DVD_NUMBER="$((DVD_NUMBER+1))" && ln -s $i /dev/dvd$DVD_NUMBER + fi + done + + for i in /dev/cd/dvdrw-*; do + if [ -h $i ]; then + [ "$DVDRW_NUMBER" = "" ] && ln -s $i /dev/dvdrw + [ "$DVDRW_NUMBER" = "" ] && DVDRW_NUMBER="-1" + ! [ "$DVDRW_NUMBER" = "" ] && DVDRW_NUMBER="$((DVDRW_NUMBER+1))" && ln -s $i /dev/dvdrw$DVDRW_NUMBER + fi + done +fi diff --git a/core/udev/ignore-remove.sh b/core/udev/ignore-remove.sh new file mode 100755 index 000000000..be9bf664b --- /dev/null +++ b/core/udev/ignore-remove.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +if [ -z "$1" ]; then + exit 1 +fi + +for f in ${DEVNAME} ${DEVLINKS}; do + if [ -e "/lib/udev/devices/${f#$1}" ]; then + exit 0 + fi +done + +exit 1 diff --git a/core/udev/load-modules.sh b/core/udev/load-modules.sh new file mode 100755 index 000000000..a42d37633 --- /dev/null +++ b/core/udev/load-modules.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# Implement blacklisting for udev-loaded modules + +[ $# -ne 1 ] && exit 1 + +. /etc/rc.conf + +# grab modules from rc.conf +BLACKLIST="${MOD_BLACKLIST[@]}" +MODPROBE="/sbin/modprobe" +LOGGER="/usr/bin/logger" +RESOLVEALIAS="/bin/resolve-modalias" +USEBLACKLIST="--use-blacklist" + +if [ -f /proc/cmdline ]; then + for cmd in $(cat /proc/cmdline); do + case $cmd in + disablemodules=*) eval $cmd ;; + load_modules=off) exit ;; + esac + done + #parse cmdline entries of the form "disablemodules=x,y,z" + if [ -n "$disablemodules" ]; then + BLACKLIST="$BLACKLIST $(echo $disablemodules | sed 's|,| |g')" + fi +fi + +#MODULES entries in rc.conf that begin with ! are blacklisted +for mod in ${MODULES[@]}; do + if [ "${mod}" != "${mod#!}" ]; then + BLACKLIST="$BLACKLIST ${mod#!}" + fi +done + +if [ "$MOD_AUTOLOAD" = "yes" -o "$MOD_AUTOLOAD" = "YES" ]; then + if [ -n "${BLACKLIST}" ]; then + # If an alias name is on the blacklist, load no modules for this device + if echo "${BLACKLIST}" | /bin/grep -q -e " $1 " -e "^$1 " -e " $1\$"; then + $LOGGER -p info -t "$(basename $0)" "Not loading module alias '$1' because it is blacklisted" + exit + fi + #sanitize the blacklist + BLACKLIST="$(echo "$BLACKLIST" | sed -e 's|-|_|g')" + # Try to find all modules for the alias + mods=$($RESOLVEALIAS /lib/modules/$(uname -r)/modules.alias $1) + # If no modules could be found, try if the alias name is a module name + # In that case, omit the --use-blacklist parameter to imitate normal modprobe behaviour + [ -z "${mods}" ] && $MODPROBE -qni $1 && mods="$1" && USEBLACKLIST="" + [ -z "${mods}" ] && $LOGGER -p info -t "$(basename $0)" "'$1' is not a valid module or alias name" + for mod in ${mods}; do + # Find the module and all its dependencies + deps="$($MODPROBE -i --show-depends ${mod})" + [ $? -ne 0 ] && continue + + #sanitize the module names + deps="$(echo "$deps" | sed \ + -e "s#^insmod /lib.*/\(.*\)\.ko.*#\1#g" \ + -e 's|-|_|g')" + + # If the module or any of its dependencies is blacklisted, don't load it + for dep in $deps; do + if echo "${BLACKLIST}" | /bin/grep -q -e " ${dep} " -e "^${dep} " -e " ${dep}\$"; then + if [ "${dep}" = "${mod}" ]; then + $LOGGER -p info -t "$(basename $0)" "Not loading module '${mod}' for alias '$1' because it is blacklisted" + else + $LOGGER -p info -t "$(basename $0)" "Not loading module '${mod}' for alias '$1' because its dependency '${dep}' is blacklisted" + fi + continue 2 + fi + done + # modprobe usually uses the "blacklist" statements from modprobe.conf only to blacklist all aliases + # of a module, but not the module itself. We use --use-blacklist here so that modprobe also blacklists + # module names if we resolved alias names manually above + $MODPROBE $USEBLACKLIST ${mod} + done + else + $MODPROBE $1 + fi +fi +# vim: set et ts=4: diff --git a/core/udev/resolve-modalias.c b/core/udev/resolve-modalias.c new file mode 100644 index 000000000..d2a40ead7 --- /dev/null +++ b/core/udev/resolve-modalias.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +static char *my_getline(FILE *file) { + static size_t size = 1024; + static char *buf = NULL; + static unsigned int i = 0, r = 0;; + + if(buf == NULL) + buf = (char*)malloc(size); + + if(i) { + memmove(buf, buf+i, size-i); + r -= i; + i = 0; + } + + while(1) { + if(i == size) { + size *= 2; + buf = (char*)realloc(buf, size); + } + + if(i==r) + r += fread(buf+i, 1, size-i, file); + + if(i==r && i == 0) { + free(buf); + buf = NULL; + r = 0; + return NULL; + } + + if(i==r || buf[i] == '\n') { + buf[i++] = '\0'; + return buf; + } + i++; + } +} + +int main(int argc, char *argv[]) { + char *line, *pattern, *module; + char *pos1, *pos2; + + if(argc != 3) { + fprintf(stderr, "usage: resolve-modalias \n"); + return 1; + } + + FILE *f=fopen(argv[1], "r"); + if(!f) { + perror("error opening alias file"); + return 1; + } + + while((line=my_getline(f))!=NULL) { + if(!strncmp(line, "alias", strlen("alias"))) { + pos1 = index(line, ' '); + pos2 = index(pos1+1, ' '); + pattern = pos1+1; + *pos2 = '\0'; + module = pos2+1; + + if(!fnmatch(pattern, argv[2], 0)) + printf("%s\n", module); + } + } + return 0; +} +//vim: set ts=2 sw=2 et: diff --git a/core/udev/root-link.sh b/core/udev/root-link.sh new file mode 100755 index 000000000..05273fe7c --- /dev/null +++ b/core/udev/root-link.sh @@ -0,0 +1,7 @@ +#! /bin/sh +# Creates root symlink in /dev +# for Arch Linux by Roman Kyrylych + +if ! [ -L /dev/root ]; then +ln -s $(cat /proc/cmdline | sed "s: :\n:g" | grep root= | sed "s:root=::") /dev/root +fi \ No newline at end of file diff --git a/core/udev/udev.install b/core/udev/udev.install new file mode 100644 index 000000000..b4ce3c81b --- /dev/null +++ b/core/udev/udev.install @@ -0,0 +1,29 @@ +# arg 1: the new package version +# arg 2: the old package version + +post_upgrade() { + if [ "$(vercmp $2 100)" -lt 0 ]; then + echo "ATTENTION UDEV:" + echo "----------" + echo "udev >=098 rules syntax has changed, please update your own rules." + echo "udev >=099 Added persistent network and CD/DVD Symlink generator rules." + echo "Please read the instructions carefully before reboot." + echo "They are located in /etc/udev/readme-udev-arch.txt" + echo "----------" + fi +} + +post_install() { + # If a ramfs is mounted, we still need to make sure that /dev/{console,null,zero} exist + # The Archlinux installer bind-mounts /dev to /mnt/dev, thus making the real /dev invisible + ROOTDIR="" + [ "$(stat -c %D /)" != "$(stat -c %D /dev)" ] && ROOTDIR=$(mktemp -d /tmp/udevinstall.XXXXXX) + [ -n "${ROOTDIR}" ] && mount --bind / ${ROOTDIR} + [ -c ${ROOTDIR}/dev/console ] || mknod -m600 ${ROOTDIR}/dev/console c 5 1 + [ -c ${ROOTDIR}/dev/null ] || mknod -m644 ${ROOTDIR}/dev/null c 1 3 + [ -c ${ROOTDIR}/dev/zero ] || mknod -m644 ${ROOTDIR}/dev/zero c 1 5 + if [ -n "${ROOTDIR}" ]; then + umount ${ROOTDIR} + rmdir ${ROOTDIR} + fi +}