From ee3afcda723f16630bbe4b2f4c5c0d93c587dd88 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Fri, 7 Jan 2011 11:36:47 +0100 Subject: udev: import 165 from OE Signed-off-by: Koen Kooi --- recipes-core/udev/udev-165/akita/default | 4 + recipes-core/udev/udev-165/bug/10-mx31.rules | 49 ++ recipes-core/udev/udev-165/bug/30-BUG.rules | 26 + recipes-core/udev/udev-165/bug/bmi_eventpipe.sh | 8 + recipes-core/udev/udev-165/c7x0/default | 4 + recipes-core/udev/udev-165/cache | 22 + recipes-core/udev/udev-165/default | 4 + recipes-core/udev/udev-165/init | 73 ++ recipes-core/udev/udev-165/local.rules | 35 + .../udev/udev-165/omap3-pandora/local.rules | 40 ++ recipes-core/udev/udev-165/permissions.rules | 110 +++ recipes-core/udev/udev-165/run.rules | 14 + recipes-core/udev/udev-165/spitz/default | 4 + recipes-core/udev/udev-165/tosa/default | 4 + .../udev/udev-165/udev-replace-le16toh.patch | 21 + .../udev/udev-165/udev-replace-lutimes.patch | 25 + recipes-core/udev/udev-165/udev.rules | 116 +++ recipes-core/udev/udev.inc | 101 +++ recipes-core/udev/udev/50-hostap_cs.rules | 4 + recipes-core/udev/udev/akita/mount.blacklist | 6 + recipes-core/udev/udev/angstrom/mount.sh | 72 ++ recipes-core/udev/udev/c7x0/mount.blacklist | 6 + recipes-core/udev/udev/devfs-udev.rules | 108 +++ recipes-core/udev/udev/init | 212 ++++++ recipes-core/udev/udev/links.conf | 24 + recipes-core/udev/udev/local.rules | 22 + recipes-core/udev/udev/mount.blacklist | 3 + recipes-core/udev/udev/mount.sh | 72 ++ recipes-core/udev/udev/network.sh | 58 ++ recipes-core/udev/udev/noasmlinkage.patch | 38 + .../udev/udev/nokia900/10-cmt_speech.rules | 1 + .../udev/udev/nokia900/70-persistent-net.rules | 9 + .../udev/udev/nokia900/nokia-n900-mac-hack.sh | 23 + .../nokia900/udev-rules-nokia-n900-hacks.rules | 8 + .../udev/nokia900/udev-rules-nokia-n900-snd.rules | 10 + recipes-core/udev/udev/omap3-pandora/local.rules | 27 + recipes-core/udev/udev/permissions.rules | 79 +++ recipes-core/udev/udev/shr/mount.blacklist | 4 + recipes-core/udev/udev/slugos/mount.blacklist | 5 + recipes-core/udev/udev/slugos/mount.sh | 83 +++ recipes-core/udev/udev/spitz/mount.blacklist | 7 + recipes-core/udev/udev/tosa/mount.blacklist | 6 + recipes-core/udev/udev/udev-compat-wrapper-patch | 37 + recipes-core/udev/udev/udev.rules | 98 +++ recipes-core/udev/udev/udev_network_queue.sh | 35 + recipes-core/udev/udev/udevsynthesize.patch | 776 +++++++++++++++++++++ recipes-core/udev/udev/udevsynthesize.sh | 51 ++ recipes-core/udev/udev_165.bb | 181 +++++ 48 files changed, 2725 insertions(+) create mode 100644 recipes-core/udev/udev-165/akita/default create mode 100644 recipes-core/udev/udev-165/bug/10-mx31.rules create mode 100644 recipes-core/udev/udev-165/bug/30-BUG.rules create mode 100644 recipes-core/udev/udev-165/bug/bmi_eventpipe.sh create mode 100644 recipes-core/udev/udev-165/c7x0/default create mode 100644 recipes-core/udev/udev-165/cache create mode 100644 recipes-core/udev/udev-165/default create mode 100644 recipes-core/udev/udev-165/init create mode 100644 recipes-core/udev/udev-165/local.rules create mode 100644 recipes-core/udev/udev-165/omap3-pandora/local.rules create mode 100644 recipes-core/udev/udev-165/permissions.rules create mode 100644 recipes-core/udev/udev-165/run.rules create mode 100644 recipes-core/udev/udev-165/spitz/default create mode 100644 recipes-core/udev/udev-165/tosa/default create mode 100644 recipes-core/udev/udev-165/udev-replace-le16toh.patch create mode 100644 recipes-core/udev/udev-165/udev-replace-lutimes.patch create mode 100644 recipes-core/udev/udev-165/udev.rules create mode 100644 recipes-core/udev/udev.inc create mode 100644 recipes-core/udev/udev/50-hostap_cs.rules create mode 100644 recipes-core/udev/udev/akita/mount.blacklist create mode 100644 recipes-core/udev/udev/angstrom/mount.sh create mode 100644 recipes-core/udev/udev/c7x0/mount.blacklist create mode 100644 recipes-core/udev/udev/devfs-udev.rules create mode 100755 recipes-core/udev/udev/init create mode 100644 recipes-core/udev/udev/links.conf create mode 100644 recipes-core/udev/udev/local.rules create mode 100644 recipes-core/udev/udev/mount.blacklist create mode 100644 recipes-core/udev/udev/mount.sh create mode 100644 recipes-core/udev/udev/network.sh create mode 100644 recipes-core/udev/udev/noasmlinkage.patch create mode 100644 recipes-core/udev/udev/nokia900/10-cmt_speech.rules create mode 100644 recipes-core/udev/udev/nokia900/70-persistent-net.rules create mode 100644 recipes-core/udev/udev/nokia900/nokia-n900-mac-hack.sh create mode 100644 recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-hacks.rules create mode 100644 recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-snd.rules create mode 100644 recipes-core/udev/udev/omap3-pandora/local.rules create mode 100644 recipes-core/udev/udev/permissions.rules create mode 100644 recipes-core/udev/udev/shr/mount.blacklist create mode 100644 recipes-core/udev/udev/slugos/mount.blacklist create mode 100644 recipes-core/udev/udev/slugos/mount.sh create mode 100644 recipes-core/udev/udev/spitz/mount.blacklist create mode 100644 recipes-core/udev/udev/tosa/mount.blacklist create mode 100644 recipes-core/udev/udev/udev-compat-wrapper-patch create mode 100644 recipes-core/udev/udev/udev.rules create mode 100644 recipes-core/udev/udev/udev_network_queue.sh create mode 100644 recipes-core/udev/udev/udevsynthesize.patch create mode 100644 recipes-core/udev/udev/udevsynthesize.sh create mode 100644 recipes-core/udev/udev_165.bb (limited to 'recipes-core') diff --git a/recipes-core/udev/udev-165/akita/default b/recipes-core/udev/udev-165/akita/default new file mode 100644 index 0000000000..d0050b873c --- /dev/null +++ b/recipes-core/udev/udev-165/akita/default @@ -0,0 +1,4 @@ +# Default for /etc/init.d/udev + +# Comment this out to disable device cache +#DEVCACHE="/etc/dev.tar" diff --git a/recipes-core/udev/udev-165/bug/10-mx31.rules b/recipes-core/udev/udev-165/bug/10-mx31.rules new file mode 100644 index 0000000000..de427fc8b2 --- /dev/null +++ b/recipes-core/udev/udev-165/bug/10-mx31.rules @@ -0,0 +1,49 @@ +KERNEL=="ttyS[0-9]", NAME="tts/%n", SYMLINK+="tts%n" +KERNEL=="ttymxc[0-9]", NAME="ttymxc/%n", SYMLINK+="ttymxc%n" + +KERNEL=="mxc_mu[0-9]", NAME="mxc_mu/%n", SYMLINK+="mxc_mu%n" +KERNEL=="fb*", NAME="fb/%n", SYMLINK+="fb%n" +KERNEL=="i2c*", NAME="i2c/%n" +KERNEL=="mxc_ipc*", NAME="mxc_ipc/%n" +KERNEL=="video*", NAME="v4l/video%n" + +KERNEL=="rtc", NAME="misc/rtc" +KERNEL=="watchdog", NAME="misc/watchdog" + +KERNEL=="mc13783_adc", NAME="mc13783_adc", SYMLINK+="ts" +KERNEL=="pmic_adc", NAME="pmic_adc", SYMLINK+="ts" + +# The long class name gets cut off to be mc13783_connectiv in +# /sys/class/mc13783_connectivity/mc13783_connectivit +KERNEL=="mc13783_connectiv*", NAME="mc13783_connectivity" + +KERNEL=="mxc_ssi[0-9]*", NAME="mxc_ssi/%n", SYMLINK+="mxc_ssi%n" +KERNEL=="spi[0-9]*", NAME="spi/%n", SYMLINK+="spi%n" + +KERNEL=="mtdblock*", NAME="mtdblock/%n" SYMLINK+="mtdblock%n" +KERNEL=="mtd[0-9]", NAME="mtd/%n" + +# A more elegant way of doing this must exist... +KERNEL=="mtd0ro", NAME="mtd/0ro" +KERNEL=="mtd1ro", NAME="mtd/1ro" +KERNEL=="mtd2ro", NAME="mtd/2ro" +KERNEL=="mtd3ro", NAME="mtd/3ro" +KERNEL=="mtd4ro", NAME="mtd/4ro" +KERNEL=="mtd5ro", NAME="mtd/5ro" +KERNEL=="mtd6ro", NAME="mtd/6ro" +KERNEL=="mtd7ro", NAME="mtd/7ro" +KERNEL=="mtd8ro", NAME="mtd/8ro" +KERNEL=="mtd9ro", NAME="mtd/9ro" + +# Note that we want /dev/dsp linked to /dev/sound/dsp1... +KERNEL=="dsp", NAME="sound/dsp" +KERNEL=="dspW", NAME="sound/dspW" +KERNEL=="dsp1", NAME="sound/dsp1", SYMLINK+="dsp" +KERNEL=="mixer", NAME="sound/mixer", SYMLINK+="mixer" +KERNEL=="sequencer", NAME="sound/sequencer" +KERNEL=="sequencer2", NAME="sound/sequencer2" + +KERNEL=="ram[0-9]*", NAME="ram/%n", SYMLINK+="ram%n" + +KERNEL=="dvfs_dptc", NAME="dvfs_dptc", SYMLINK+="dptc dvfs" + diff --git a/recipes-core/udev/udev-165/bug/30-BUG.rules b/recipes-core/udev/udev-165/bug/30-BUG.rules new file mode 100644 index 0000000000..06faa6bb91 --- /dev/null +++ b/recipes-core/udev/udev-165/bug/30-BUG.rules @@ -0,0 +1,26 @@ +## +## BUG/BMI specific +## +KERNEL=="event*", ATTRS{name}=="bugnav", SYMLINK+="input/bugnav" +KERNEL=="event*", ATTRS{name}=="bmi_motion", SYMLINK+="input/bmi_motion" +KERNEL=="event*", ATTRS{name}=="bug_cam", SYMLINK+="input/bmi_cam" +KERNEL=="event*", ATTRS{name}=="bmi_audio_status_m1", SYMLINK+="input/bmi_audio_m1" +KERNEL=="event*", ATTRS{name}=="bmi_audio_status_m2", SYMLINK+="input/bmi_audio_m2" +KERNEL=="event*", ATTRS{name}=="bmi_audio_status_m3", SYMLINK+="input/bmi_audio_m3" +KERNEL=="event*", ATTRS{name}=="bmi_audio_status_m4", SYMLINK+="input/bmi_audio_m4" +DEVPATH=="/devices/platform/bugfb.0", SYMLINK+="bugfb" +KERNEL=="rtc0", SYMLINK+="rtc" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts0", SYMLINK+="input/bmi_lcd_ts0" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts1", SYMLINK+="input/bmi_lcd_ts1" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts2", SYMLINK+="input/bmi_lcd_ts2" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts3", SYMLINK+="input/bmi_lcd_ts3" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts4", SYMLINK+="input/bmi_lcd_ts4" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts5", SYMLINK+="input/bmi_lcd_ts5" +KERNEL=="event*", ATTRS{name}=="bmi_lcd_ts6", SYMLINK+="input/bmi_lcd_ts6" +ACTION=="add", DEVPATH=="/devices/conn*", RUN+="/bin/sh /etc/udev/scripts/bmi_eventpipe.sh" +ACTION=="remove", DEVPATH=="/devices/conn*", RUN+="/bin/sh /etc/udev/scripts/bmi_eventpipe.sh" +# +# For USB PBPSD, which we've arbitrarily decided will be module F001 +# +ACTION=="remove", SUBSYSTEM=="usb", DRIVERS=="psd_driver", ENV{BMIBUS_PRODUCT}="F001", ENV{BMIBUS_SLOT}="%n", RUN+="/bin/sh /etc/udev/scripts/bmi_eventpipe.sh" +ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="psd_driver", ENV{BMIBUS_PRODUCT}="F001", ENV{BMIBUS_SLOT}="%n", RUN+="/bin/sh /etc/udev/scripts/bmi_eventpipe.sh" diff --git a/recipes-core/udev/udev-165/bug/bmi_eventpipe.sh b/recipes-core/udev/udev-165/bug/bmi_eventpipe.sh new file mode 100644 index 0000000000..acbae56118 --- /dev/null +++ b/recipes-core/udev/udev-165/bug/bmi_eventpipe.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# This script passes BMI state variables to the running JVM. +# +if [ ${BMIBUS_PRODUCT} != "" ] && [ ${BMIBUS_SLOT} != "" ] && [ ${ACTION} != "" ]; +then + echo $BMIBUS_PRODUCT 0 $BMIBUS_SLOT $ACTION > /tmp/eventpipe +fi diff --git a/recipes-core/udev/udev-165/c7x0/default b/recipes-core/udev/udev-165/c7x0/default new file mode 100644 index 0000000000..d0050b873c --- /dev/null +++ b/recipes-core/udev/udev-165/c7x0/default @@ -0,0 +1,4 @@ +# Default for /etc/init.d/udev + +# Comment this out to disable device cache +#DEVCACHE="/etc/dev.tar" diff --git a/recipes-core/udev/udev-165/cache b/recipes-core/udev/udev-165/cache new file mode 100644 index 0000000000..c0d400b448 --- /dev/null +++ b/recipes-core/udev/udev-165/cache @@ -0,0 +1,22 @@ +#!/bin/sh -e + +export TZ=/etc/localtime + +[ -f /etc/default/udev ] && . /etc/default/udev + +echo "Caching udev devnodes" + +if [ "$DEVCACHE" != "" ]; then + echo -n "Populating dev cache" + (cd /; tar cf $DEVCACHE dev) + mv /tmp/uname /etc/udev/saved.uname + mv /tmp/cmdline /etc/udev/saved.cmdline + mv /tmp/atags /etc/udev/saved.atags + echo +else + rm -f /tmp/uname + rm -f /tmp/cmdline + rm -f /tmp/atags +fi + +exit 0 diff --git a/recipes-core/udev/udev-165/default b/recipes-core/udev/udev-165/default new file mode 100644 index 0000000000..5c4937a9a0 --- /dev/null +++ b/recipes-core/udev/udev-165/default @@ -0,0 +1,4 @@ +# Default for /etc/init.d/udev + +# Comment this out to disable device cache +DEVCACHE="/etc/dev.tar" diff --git a/recipes-core/udev/udev-165/init b/recipes-core/udev/udev-165/init new file mode 100644 index 0000000000..4dcb241a28 --- /dev/null +++ b/recipes-core/udev/udev-165/init @@ -0,0 +1,73 @@ +#!/bin/sh -e + +### BEGIN INIT INFO +# Provides: udev +# Required-Start: mountvirtfs +# Required-Stop: +# Default-Start: S +# Default-Stop: +# Short-Description: Start udevd, populate /dev and load drivers. +### END INIT INFO + +export TZ=/etc/localtime + +[ -d /sys/class ] || exit 1 +[ -r /proc/mounts ] || exit 1 +[ -x /sbin/udevd ] || exit 1 +[ -f /etc/default/udev ] && . /etc/default/udev +[ -f /etc/udev/udev.conf ] && . /etc/udev/udev.conf + +kill_udevd() { + if [ -x /sbin/pidof ]; then + pid=`/sbin/pidof -x udevd` + [ -n "$pid" ] && kill $pid + fi +} + +export ACTION=add +# propagate /dev from /sys +echo "Starting udev" + +# mount the tmpfs on /dev, if not already done +LANG=C awk "\$2 == \"/dev\" && \$3 == \"tmpfs\" { exit 1 }" /proc/mounts && { + mount -n -o mode=0755 -t tmpfs none "/dev" + mkdir -m 0755 /dev/pts + mkdir -m 1777 /dev/shm +} + +if [ "$DEVCACHE" != "" ]; then + # Invalidate udev cache if the kernel or its bootargs/cmdline have changed + [ -x /bin/uname ] && /bin/uname -mrspv > /tmp/uname || touch /tmp/uname + [ -r /proc/cmdline ] && cat /proc/cmdline > /tmp/cmdline || touch /tmp/cmdline + [ -r /proc/atags ] && cat /proc/atags > /tmp/atags || touch /tmp/atags + if [ -e $DEVCACHE ] && \ + cmp -s /tmp/uname /etc/udev/saved.uname && \ + cmp -s /tmp/cmdline /etc/udev/saved.cmdline && \ + cmp -s /tmp/atags /etc/udev/saved.atags; then + (cd /; tar xf $DEVCACHE > /dev/null 2>&1) + not_first_boot=1 + fi +fi + +if [ ! -e "/lib/modules/$(uname -r)"/modules.dep ] ; then + mkdir -p /lib/modules/$(uname -r) + depmod -ae +fi + +# make_extra_nodes +kill_udevd > "/dev/null" 2>&1 + + # trigger the sorted events + echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug + /sbin/udevd -d + + /sbin/udevadm control --env STARTUP=1 + if [ "$not_first_boot" != "" ];then + /sbin/udevadm trigger --subsystem-nomatch=tty --subsystem-nomatch=mem --subsystem-nomatch=vc --subsystem-nomatch=vtconsole --subsystem-nomatch=misc --subsystem-nomatch=dcon --subsystem-nomatch=pci_bus --subsystem-nomatch=graphics --subsystem-nomatch=backlight --subsystem-nomatch=video4linux --subsystem-nomatch=platform + (/sbin/udevadm settle --timeout=8; /sbin/udevadm control --env STARTUP=)& + else + /sbin/udevadm trigger + /sbin/udevadm settle + fi + +exit 0 diff --git a/recipes-core/udev/udev-165/local.rules b/recipes-core/udev/udev-165/local.rules new file mode 100644 index 0000000000..da4b38593c --- /dev/null +++ b/recipes-core/udev/udev-165/local.rules @@ -0,0 +1,35 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# Media automounting +SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" + +# Handle network interface setup +SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" +SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" + +# The first rtc device is symlinked to /dev/rtc +KERNEL=="rtc0", SYMLINK+="rtc" + +#The first framebuffer is symlinked to /dev/fb +KERNEL=="fb0", SYMLINK+="fb" + +# Try and modprobe for drivers for new hardware +ACTION=="add", DEVPATH=="/devices/*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}" + +# Create a symlink to any touchscreen input device +SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen0" +SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="ads7846", SYMLINK+="input/touchscreen0" diff --git a/recipes-core/udev/udev-165/omap3-pandora/local.rules b/recipes-core/udev/udev-165/omap3-pandora/local.rules new file mode 100644 index 0000000000..e433cf9593 --- /dev/null +++ b/recipes-core/udev/udev-165/omap3-pandora/local.rules @@ -0,0 +1,40 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# Media automounting +SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" + +# Handle network interface setup +SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" +SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" + +# The first rtc device is symlinked to /dev/rtc +KERNEL=="rtc0", SYMLINK+="rtc" + +#The first framebuffer is symlinked to /dev/fb +KERNEL=="fb0", SYMLINK+="fb" + +# Try and modprobe for drivers for new hardware +ACTION=="add", DEVPATH=="/devices/*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}" + +# Create a symlink to any touchscreen input device +SUBSYSTEM=="input", KERNEL=="event[0-9]*", SYSFS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen0" +SUBSYSTEM=="input", KERNEL=="event[0-9]*", SYSFS{modalias}=="ads7846", SYMLINK+="input/touchscreen0" + +# Local UDEV rule changes for the Pandora system. + +# Let all users access the event devices using EVDEV (the OpenPandora is not multiuser after all). +KERNEL=="event[0-9]",MODE="0666" \ No newline at end of file diff --git a/recipes-core/udev/udev-165/permissions.rules b/recipes-core/udev/udev-165/permissions.rules new file mode 100644 index 0000000000..f4f94a6dbe --- /dev/null +++ b/recipes-core/udev/udev-165/permissions.rules @@ -0,0 +1,110 @@ +ACTION!="add", GOTO="permissions_end" + +# devices needed to load the drivers providing them +KERNEL=="tun", OPTIONS+="ignore_remove" +KERNEL=="ppp", OPTIONS+="ignore_remove" +KERNEL=="loop[0-9]*", OPTIONS+="ignore_remove" + +# default permissions for block devices +SUBSYSTEM=="block", GROUP="disk" +# the aacraid driver is broken and reports that disks removable (see #404927) +SUBSYSTEM=="block", ATTRS{removable}=="1", \ + DRIVERS!="aacraid", GROUP="floppy" +# all block devices on these buses are "removable" +SUBSYSTEM=="block", SUBSYSTEMS=="usb|ieee1394|mmc|pcmcia", GROUP="floppy" + +# IDE devices +KERNEL=="hd[a-z]|pcd[0-9]*", DRIVERS=="ide-cdrom|pcd", \ + IMPORT{program}="cdrom_id --export $tempnode" +ENV{ID_CDROM}=="?*", GROUP="cdrom" +KERNEL=="ht[0-9]*", GROUP="tape" +KERNEL=="nht[0-9]*", GROUP="tape" + +# SCSI devices +KERNEL=="sr[0-9]*", IMPORT{program}="cdrom_id --export $tempnode" +SUBSYSTEMS=="scsi", ATTRS{type}=="1", GROUP="tape" +SUBSYSTEMS=="scsi", ATTRS{type}=="4", GROUP="cdrom" +SUBSYSTEMS=="scsi", ATTRS{type}=="5", GROUP="cdrom" +SUBSYSTEMS=="scsi", ATTRS{type}=="8", GROUP="tape" + +# USB devices +KERNEL=="legousbtower*", MODE="0666" +KERNEL=="lp[0-9]*", SUBSYSTEMS=="usb", GROUP="lp" + +# usbfs-like devices +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \ + MODE="0664" + +# iRiver music players +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="plugdev", \ + ATTRS{idVendor}=="4102", ATTRS{idProduct}=="10[01][135789]" + +# serial devices +SUBSYSTEM=="tty", GROUP="dialout" +SUBSYSTEM=="capi", GROUP="dialout" +SUBSYSTEM=="slamr", GROUP="dialout" +SUBSYSTEM=="zaptel", GROUP="dialout" + +# vc devices (all members of the tty subsystem) +KERNEL=="ptmx", MODE="0666", GROUP="root" +KERNEL=="console", MODE="0600", GROUP="root" +KERNEL=="tty", MODE="0666", GROUP="root" +KERNEL=="tty[0-9]*", GROUP="root" +KERNEL=="pty*", MODE="0666", GROUP="tty" + +# video devices +SUBSYSTEM=="video4linux", GROUP="video" +SUBSYSTEM=="drm", GROUP="video" +SUBSYSTEM=="dvb", GROUP="video" +SUBSYSTEM=="em8300", GROUP="video" +SUBSYSTEM=="graphics", GROUP="video" +SUBSYSTEM=="nvidia", GROUP="video" + +# misc devices +KERNEL=="random", MODE="0666" +KERNEL=="urandom", MODE="0666" +KERNEL=="mem", MODE="0640", GROUP="kmem" +KERNEL=="kmem", MODE="0640", GROUP="kmem" +KERNEL=="port", MODE="0640", GROUP="kmem" +KERNEL=="full", MODE="0666" +KERNEL=="null", MODE="0666" +KERNEL=="zero", MODE="0666" +KERNEL=="inotify", MODE="0666" +KERNEL=="sgi_fetchop", MODE="0666" +KERNEL=="sonypi", MODE="0666" +KERNEL=="agpgart", GROUP="video" +KERNEL=="rtc|rtc[0-9]*", GROUP="audio" +KERNEL=="kqemu", MODE="0666" +KERNEL=="tun", MODE="0666", + +KERNEL=="cdemu[0-9]*", GROUP="cdrom" +KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" +KERNEL=="pktcdvd", MODE="0644" + +# printers and parallel devices +SUBSYSTEM=="printer", GROUP="lp" +SUBSYSTEM=="ppdev", GROUP="lp" +KERNEL=="irlpt*", GROUP="lp" +KERNEL=="pt[0-9]*", GROUP="tape" +KERNEL=="pht[0-9]*", GROUP="tape" + +# sound devices +SUBSYSTEM=="sound", GROUP="audio" + +# ieee1394 devices +KERNEL=="raw1394", GROUP="disk" +KERNEL=="dv1394*", GROUP="video" +KERNEL=="video1394*", GROUP="video" + +# input devices +KERNEL=="event[0-9]*", ATTRS{name}=="*dvb*|*DVB*|* IR *" \ + MODE="0664", GROUP="video" +KERNEL=="js[0-9]*", MODE="0664" +KERNEL=="lirc[0-9]*", GROUP="video" + +# AOE character devices +SUBSYSTEM=="aoe", MODE="0220", GROUP="disk" +SUBSYSTEM=="aoe", KERNEL=="err", MODE="0440" + +LABEL="permissions_end" + diff --git a/recipes-core/udev/udev-165/run.rules b/recipes-core/udev/udev-165/run.rules new file mode 100644 index 0000000000..75d71375bb --- /dev/null +++ b/recipes-core/udev/udev-165/run.rules @@ -0,0 +1,14 @@ +# debugging monitor +RUN+="socket:/org/kernel/udev/monitor" + +# run a command on remove events +ACTION=="remove", ENV{REMOVE_CMD}!="", RUN+="$env{REMOVE_CMD}" + +# ignore the events generated by virtual consoles +KERNEL=="ptmx", OPTIONS+="last_rule" +KERNEL=="console", OPTIONS+="last_rule" +KERNEL=="tty" , OPTIONS+="last_rule" +KERNEL=="tty[0-9]*", OPTIONS+="last_rule" +KERNEL=="pty*", OPTIONS+="last_rule" +SUBSYSTEM=="vc", OPTIONS+="last_rule" + diff --git a/recipes-core/udev/udev-165/spitz/default b/recipes-core/udev/udev-165/spitz/default new file mode 100644 index 0000000000..d0050b873c --- /dev/null +++ b/recipes-core/udev/udev-165/spitz/default @@ -0,0 +1,4 @@ +# Default for /etc/init.d/udev + +# Comment this out to disable device cache +#DEVCACHE="/etc/dev.tar" diff --git a/recipes-core/udev/udev-165/tosa/default b/recipes-core/udev/udev-165/tosa/default new file mode 100644 index 0000000000..d0050b873c --- /dev/null +++ b/recipes-core/udev/udev-165/tosa/default @@ -0,0 +1,4 @@ +# Default for /etc/init.d/udev + +# Comment this out to disable device cache +#DEVCACHE="/etc/dev.tar" diff --git a/recipes-core/udev/udev-165/udev-replace-le16toh.patch b/recipes-core/udev/udev-165/udev-replace-le16toh.patch new file mode 100644 index 0000000000..7776c9a10e --- /dev/null +++ b/recipes-core/udev/udev-165/udev-replace-le16toh.patch @@ -0,0 +1,21 @@ +This patch is needed on uclibc. + +-Khem + +Index: udev-151/extras/ata_id/ata_id.c +=================================================================== +--- udev-151.orig/extras/ata_id/ata_id.c 2010-06-04 14:08:41.912730501 -0700 ++++ udev-151/extras/ata_id/ata_id.c 2010-06-04 14:09:31.492734527 -0700 +@@ -168,7 +168,11 @@ static void disk_identify_fixup_uint16 ( + uint16_t *p; + + p = (uint16_t *) identify; +- p[offset_words] = le16toh (p[offset_words]); ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ p[offset_words] = p[offset_words]; ++#else ++ p[offset_words] = __bswap_16 (p[offset_words]); ++#endif + } + + /** diff --git a/recipes-core/udev/udev-165/udev-replace-lutimes.patch b/recipes-core/udev/udev-165/udev-replace-lutimes.patch new file mode 100644 index 0000000000..dd77897345 --- /dev/null +++ b/recipes-core/udev/udev-165/udev-replace-lutimes.patch @@ -0,0 +1,25 @@ +This patch is needed on uclibc + +-Khem +Index: udev-151/udev/udev-node.c +=================================================================== +--- udev-151.orig/udev/udev-node.c 2010-06-04 14:18:59.082727182 -0700 ++++ udev-151/udev/udev-node.c 2010-06-04 14:20:27.485282812 -0700 +@@ -57,7 +57,7 @@ int udev_node_mknod(struct udev_device * + preserve = 1; + udev_selinux_lsetfilecon(udev, file, mode); + /* update time stamp when we re-use the node, like on media change events */ +- utimes(file, NULL); ++ utimensat(AT_FDCWD, file, NULL, 0); + } else { + char file_tmp[UTIL_PATH_SIZE + sizeof(TMP_FILE_EXT)]; + +@@ -178,7 +178,7 @@ static int node_symlink(struct udev *ude + info(udev, "preserve already existing symlink '%s' to '%s'\n", + slink, target); + udev_selinux_lsetfilecon(udev, slink, S_IFLNK); +- lutimes(slink, NULL); ++ utimensat(AT_FDCWD, slink, NULL, AT_SYMLINK_NOFOLLOW); + goto exit; + } + } diff --git a/recipes-core/udev/udev-165/udev.rules b/recipes-core/udev/udev-165/udev.rules new file mode 100644 index 0000000000..60288c06ed --- /dev/null +++ b/recipes-core/udev/udev-165/udev.rules @@ -0,0 +1,116 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# workaround for devices which do not report media changes +SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTR{removable}=="1", \ + ENV{ID_MODEL}=="IOMEGA_ZIP*", OPTIONS+="all_partitions" +SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTRS{media}=="floppy", \ + OPTIONS+="all_partitions" + +# SCSI devices +SUBSYSTEMS=="scsi", KERNEL=="sr[0-9]*", NAME="scd%n", SYMLINK+="sr%n" + +# USB devices +SUBSYSTEMS=="usb", KERNEL=="auer[0-9]*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="cpad[0-9]*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="dabusb*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="hiddev*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="legousbtower*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="lp[0-9]*", NAME="usb/%k" +SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", \ + ATTRS{product}=="Palm Handheld*|Handspring Visor|palmOne Handheld", \ + SYMLINK+="pilot" + +# usbfs-like devices +SUBSYSTEM=="usb_device", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", ACTION=="add", \ + NAME="%c" +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}" + +# serial devices +KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20" +KERNEL=="capi[0-9]*", NAME="capi/%n" + +# video devices +KERNEL=="dvb*", PROGRAM="/bin/sh -c 'K=%k; K=$${K#dvb}; printf dvb/adapter%%i/%%s $${K%%%%.*} $${K#*.}", ACTION=="add", \ + NAME="%c" +KERNEL=="card[0-9]*", NAME="dri/%k" + +# misc devices +KERNEL=="hw_random", NAME="hwrng" +KERNEL=="tun", NAME="net/%k" +KERNEL=="evtchn", NAME="xen/%k" + +KERNEL=="cdemu[0-9]*", NAME="cdemu/%n" +KERNEL=="pktcdvd[0-9]*", NAME="pktcdvd/%n" +KERNEL=="pktcdvd", NAME="pktcdvd/control" + +KERNEL=="cpu[0-9]*", NAME="cpu/%n/cpuid" +KERNEL=="msr[0-9]*", NAME="cpu/%n/msr" +KERNEL=="microcode", NAME="cpu/microcode" + +KERNEL=="umad*", NAME="infiniband/%k" +KERNEL=="issm*", NAME="infiniband/%k" +KERNEL=="uverbs*", NAME="infiniband/%k" +KERNEL=="ucm*", NAME="infiniband/%k" +KERNEL=="rdma_ucm", NAME="infiniband/%k" + +# ALSA devices +KERNEL=="controlC[0-9]*", NAME="snd/%k" +KERNEL=="hwC[D0-9]*", NAME="snd/%k" +KERNEL=="pcmC[D0-9cp]*", NAME="snd/%k" +KERNEL=="midiC[D0-9]*", NAME="snd/%k" +KERNEL=="timer", NAME="snd/%k" +KERNEL=="seq", NAME="snd/%k" + +# ieee1394 devices +KERNEL=="dv1394*", NAME="dv1394/%n" +KERNEL=="video1394*", NAME="video1394/%n" + +# input devices +KERNEL=="mice", NAME="input/%k" +KERNEL=="mouse[0-9]*", NAME="input/%k" +KERNEL=="event[0-9]*", NAME="input/%k" +KERNEL=="js[0-9]*", NAME="input/%k" +KERNEL=="ts[0-9]*", NAME="input/%k" +KERNEL=="uinput", NAME="input/%k" + +# Zaptel +KERNEL=="zapctl", NAME="zap/ctl" +KERNEL=="zaptimer", NAME="zap/timer" +KERNEL=="zapchannel", NAME="zap/channel" +KERNEL=="zappseudo", NAME="zap/pseudo" +KERNEL=="zap[0-9]*", NAME="zap/%n" + +# AOE character devices +SUBSYSTEM=="aoe", KERNEL=="discover", NAME="etherd/%k" +SUBSYSTEM=="aoe", KERNEL=="err", NAME="etherd/%k" +SUBSYSTEM=="aoe", KERNEL=="interfaces", NAME="etherd/%k" +SUBSYSTEM=="aoe", KERNEL=="revalidate", NAME="etherd/%k" + +# device mapper creates its own device nodes, so ignore these +KERNEL=="dm-[0-9]*", OPTIONS+="ignore_device" +KERNEL=="device-mapper", NAME="mapper/control" + +KERNEL=="rfcomm[0-9]*", GROUP="users", MODE="0660" + +# Firmware Helper +ACTION=="add", SUBSYSTEM=="firmware", RUN+="/lib/udev/firmware.sh" + +# Samsung UARTS +KERNEL=="s3c2410_serial[0-9]", NAME="ttySAC%n" + +# MXC UARTs +KERNEL=="ttymxc[0-4]", NAME="ttymxc%n" + diff --git a/recipes-core/udev/udev.inc b/recipes-core/udev/udev.inc new file mode 100644 index 0000000000..0c8a662294 --- /dev/null +++ b/recipes-core/udev/udev.inc @@ -0,0 +1,101 @@ +DESCRIPTION ?= "udev is a program which dynamically creates and removes device nodes from \ +/dev/. It responds to /sbin/hotplug device events and requires a 2.6 kernel." + +LICENSE = "GPLv2+" + +SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ + file://udev.rules \ + file://devfs-udev.rules \ + file://links.conf \ + file://permissions.rules \ + file://mount.sh \ + file://network.sh \ + file://local.rules \ + file://init \ + file://udev-compat-wrapper-patch" + +INC_PR = "r30" + +inherit update-rc.d autotools pkgconfig + +PARALLEL_MAKE = "" +UDEV_DEVFS_RULES ?= "0" +PKG_libvolume-id-dev = "libvolume-id-dev" + +RDEPENDS_${PN} += "module-init-tools-depmod udev-utils" + +INITSCRIPT_NAME = "udev" +INITSCRIPT_PARAMS = "start 03 S ." + +export CROSS = "${TARGET_PREFIX}" +export HOSTCC = "${BUILD_CC}" +export udevdir ?= "/dev" +# Put stuff in /lib and /sbin +export bindir := "${base_bindir}" +export sbindir := "${base_sbindir}" +export usrbindir := "${bindir}" +export usrsbindir := "${sbindir}" +export etcdir := "${sysconfdir}" + +TARGET_CC_ARCH += "${LDFLAGS}" +UDEV_EXTRAS = "" +EXTRA_OEMAKE = "-e \ + 'EXTRAS=${UDEV_EXTRAS}' \ + 'STRIP=echo'" + +RPROVIDES_udev_append = " udev-compat-wrapper" +RDEPENDS_udev_spitz += "udev-compat" +do_unpack_append_spitz() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_akita += "udev-compat" +do_unpack_append_akita() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_c7x0 += "udev-compat" +do_unpack_append_c7x0() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_poodle += "udev-compat" +do_unpack_append_poodle() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} + +# Modify init script on platforms that need to boot old kernels: +do_apply_compat_wrapper() { + cd ${WORKDIR} + sed -i "s:/sbin/udevd:\$UDEVD:g;s:/sbin/udevadm:\$UDEVADM:g" init + patch /dev/null + elif [ -x $MOUNT ]; then + $MOUNT $DEVNAME 2> /dev/null + fi + + # If the device isn't mounted at this point, it isn't configured in fstab + # 20061107: Small correction: The rootfs partition may be called just "rootfs" and not by + # its true device name so this would break. If the rootfs is mounted on two places + # during boot, it confuses the heck out of fsck. So Im auto-adding the root-partition + # to /etc/udev/mount.blacklist via postinst + + cat /proc/mounts | awk '{print $1}' | grep -q "^$DEVNAME$" || automount + +fi + + + +if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then + for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " ` + do + $UMOUNT -l $mnt + done + + # Remove empty directories from auto-mounter + test -e "/tmp/.automount-$name" && rm_dir "/media/$name" +fi diff --git a/recipes-core/udev/udev/c7x0/mount.blacklist b/recipes-core/udev/udev/c7x0/mount.blacklist new file mode 100644 index 0000000000..7e351bc988 --- /dev/null +++ b/recipes-core/udev/udev/c7x0/mount.blacklist @@ -0,0 +1,6 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/loop +/dev/ram \ No newline at end of file diff --git a/recipes-core/udev/udev/devfs-udev.rules b/recipes-core/udev/udev/devfs-udev.rules new file mode 100644 index 0000000000..0ba1ad4e7f --- /dev/null +++ b/recipes-core/udev/udev/devfs-udev.rules @@ -0,0 +1,108 @@ +# The use of these rules is not recommended or supported. +# In a world where devices can come and go at any time, the devfs scheme +# of simple device enumeration does not help _anything_. Just forget about +# it. Use custom rules to name your device or look at the persistent device +# naming scheme, which is implemented for disks and add your subsystem. + +# ide block devices +BUS="ide", KERNEL="hd*", PROGRAM="/etc/udev/ide-devfs.sh %k %b %n", NAME="%k", SYMLINK="%c{1} %c{2}" + +# md block devices +KERNEL="md[0-9]*", NAME="md/%n" + +# floppy devices +KERNEL="fd[0-9]*", NAME="floppy/%n" + +# tty devices +KERNEL="tty[0-9]*", NAME="vc/%n", SYMLINK="%k" +KERNEL="ttyS[0-9]*", NAME="tts/%n", SYMLINK="%k" +KERNEL="ttyUSB[0-9]*", NAME="tts/USB%n" + +# vc devices +KERNEL="vcs", NAME="vcc/0" +KERNEL="vcs[0-9]*", NAME="vcc/%n" +KERNEL="vcsa", NAME="vcc/a0" +KERNEL="vcsa[0-9]*", NAME="vcc/a%n" + +# v4l devices +KERNEL="video[0-9]*", NAME="v4l/video%n" +KERNEL="radio[0-9]*", NAME="v4l/radio%n" +KERNEL="vbi[0-9]*", NAME="v4l/vbi%n" +KERNEL="vtx[0-9]*", NAME="v4l/vtx%n" + +# dm devices (ignore them) +KERNEL="dm-[0-9]*", NAME="" + +# i2c devices +KERNEL="i2c-[0-9]*", NAME="i2c/%n", SYMLINK="%k" + +# loop devices +KERNEL="loop[0-9]*", NAME="loop/%n", SYMLINK="%k" + +# ramdisks +KERNEL="ram[0-9]*", NAME="rd/%n", SYMLINK="%k" + +# framebuffer devices +KERNEL="fb[0-9]*", NAME="fb/%n", SYMLINK="%k" + +# misc +KERNEL="rtc", NAME="misc/%k", SYMLINK="%k" +KERNEL="psaux", NAME="misc/%k", SYMLINK="%k" +KERNEL="agpgart", NAME="misc/%k", SYMLINK="%k" +KERNEL="rtc", NAME="misc/%k", SYMLINK="%k" +KERNEL="psaux", NAME="misc/%k", SYMLINK="%k" +KERNEL="uinput", NAME="misc/%k", SYMLINK="%k" + +# alsa devices +KERNEL="controlC[0-9]*", NAME="snd/%k" +KERNEL="hw[CD0-9]*", NAME="snd/%k" +KERNEL="pcm[CD0-9cp]*", NAME="snd/%k" +KERNEL="midi[CD0-9]*", NAME="snd/%k" +KERNEL="timer", NAME="snd/%k" +KERNEL="seq", NAME="snd/%k" + +# oss devices +KERNEL="audio*", NAME="sound/%k", SYMLINK="%k" +KERNEL="dmmidi", NAME="sound/%k", SYMLINK="%k" +KERNEL="dsp*", NAME="sound/%k", SYMLINK="%k" +KERNEL="midi*", NAME="sound/%k", SYMLINK="%k" +KERNEL="mixer*", NAME="sound/%k", SYMLINK="%k" +KERNEL="sequencer*", NAME="sound/%k", SYMLINK="%k" + +# input devices +KERNEL="mice", NAME="input/%k" +KERNEL="mouse*", NAME="input/%k" +KERNEL="event*", NAME="input/%k" +KERNEL="js*", NAME="input/%k" +KERNEL="ts*", NAME="input/%k" + +# USB devices +KERNEL="hiddev*", NAME="usb/%k" +KERNEL="auer*", NAME="usb/%k" +KERNEL="legousbtower*", NAME="usb/%k" +KERNEL="dabusb*", NAME="usb/%k" +BUS="usb", KERNEL="lp[0-9]*", NAME="usb/%k" + +# netlink devices +KERNEL="route", NAME="netlink/%k" +KERNEL="skip", NAME="netlink/%k" +KERNEL="usersock", NAME="netlink/%k" +KERNEL="fwmonitor", NAME="netlink/%k" +KERNEL="tcpdiag", NAME="netlink/%k" +KERNEL="nflog", NAME="netlink/%k" +KERNEL="xfrm", NAME="netlink/%k" +KERNEL="arpd", NAME="netlink/%k" +KERNEL="route6", NAME="netlink/%k" +KERNEL="ip6_fw", NAME="netlink/%k" +KERNEL="dnrtmsg", NAME="netlink/%k" +KERNEL="tap*", NAME="netlink/%k" + +# CAPI devices +KERNEL="capi", NAME="capi20", SYMLINK="isdn/capi20" +KERNEL="capi*", NAME="capi/%n" + +# Network devices +KERNEL="tun", NAME="net/%k" + +# raw devices +KERNEL="raw[0-9]*", NAME="raw/%k" diff --git a/recipes-core/udev/udev/init b/recipes-core/udev/udev/init new file mode 100755 index 0000000000..a13b9afcd5 --- /dev/null +++ b/recipes-core/udev/udev/init @@ -0,0 +1,212 @@ +#!/bin/sh + +UDEVSTART=/sbin/udevstart + +# defaults +tmpfs_size="2M" +udev_root="/dev" + +[ -x $UDEVSTART ] || exit 0 + +. /etc/udev/udev.conf + +############################################################################## + +# we need to unmount /dev/pts/ and remount it later over the tmpfs +unmount_devpts() { + if mountpoint -q /dev/pts/; then + umount -l /dev/pts/ + fi + + if mountpoint -q /dev/shm/; then + umount -l /dev/shm/ + fi +} + +# mount a tmpfs over /dev, if somebody did not already do it +mount_tmpfs() { + if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then + return 0 + fi + + # /dev/.static/dev/ is used by MAKEDEV to access the real /dev/ directory. + # /etc/udev/ is recycled as a temporary mount point because it's the only + # directory which is guaranteed to be available. + mount -n -o bind /dev /etc/udev + + if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs tmpfs /dev; then + umount /etc/udev + echo "udev requires tmpfs support, not started." + exit 1 + fi + + # using ln to test if /dev works, because touch is in /usr/bin/ + if ln -s test /dev/test-file; then + rm /dev/test-file + else + echo "udev requires tmpfs support, not started." + umount /etc/udev + umount /dev + exit 1 + fi + + mkdir -p /dev/.static/dev + chmod 700 /dev/.static/ + # The mount options in busybox are non-standard... + if test -x /bin/mount.util-linux + then + /bin/mount.util-linux --move /etc/udev /dev/.static/dev + elif test -x /bin/busybox + then + busybox mount -n -o move /etc/udev /dev/.static/dev + else + echo "udev requires an identifiable mount command, not started." + umount /etc/udev + umount /dev + exit 1 + fi +} + +# I hate this hack. -- Md +make_extra_nodes() { + [ -e /etc/udev/links.conf ] || return 0 + grep '^[^#]' /etc/udev/links.conf | \ + while read type name arg1; do + [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue + case "$type" in + L) ln -s $arg1 /dev/$name ;; + D) mkdir -p /dev/$name ;; + M) mknod -m 600 /dev/$name $arg1 ;; + *) echo "links.conf: unparseable line ($type $name $arg1)" ;; + esac + done +} + +# this function is duplicated in preinst, postinst and d-i +supported_kernel() { + case "$(uname -r)" in + 2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;; + 2.6.1[01]|2.6.1[01][!0-9]*) return 1 ;; + esac + return 0 +} + +# shell version of /usr/bin/tty +my_tty() { + [ -x /bin/readlink ] || return 0 + [ -e /proc/self/fd/0 ] || return 0 + readlink --silent /proc/self/fd/0 || true +} + +warn_if_interactive() { + if [ "$RUNLEVEL" = "S" -a "$PREVLEVEL" = "N" ]; then + return 0 + fi + + TTY=$(my_tty) + if [ -z "$TTY" -o "$TTY" = "/dev/console" ]; then + return 0 + fi + + printf "\n\n\nIt has been detected that the command\n\n\t$0 $*\n\n" + printf "has been run from an interactive shell.\n" + printf "It will probably not do what you expect, so this script will wait\n" + printf "60 seconds before continuing. Press ^C to stop it.\n" + printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n" + sleep 60 +} + +############################################################################## + +if ! supported_kernel; then + echo "udev requires a kernel >= 2.6.12, not started." + exit 1 +fi + +if [ ! -e /proc/filesystems ]; then + echo "udev requires a mounted procfs, not started." + exit 1 +fi + +if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then + echo "udev requires tmpfs support, not started." + exit 1 +fi + +if [ ! -d /sys/class/ ]; then + echo "udev requires a mounted sysfs, not started." + exit 1 +fi + +if [ ! -e /proc/sys/kernel/hotplug ] && [ ! -e /sys/kernel/uevent_helper ]; then + echo "udev requires hotplug support, not started." + exit 1 +fi + +############################################################################## + +# When modifying this script, do not forget that between the time that +# the new /dev has been mounted and udevstart has been run there will be +# no /dev/null. This also means that you cannot use the "&" shell command. + +case "$1" in + start) + if [ -e "$udev_root/.udevdb" ]; then + if mountpoint -q /dev/; then + TMPFS_MOUNTED=1 + else + echo ".udevdb already exists on the old $udev_root!" + fi + fi + warn_if_interactive + + #echo /sbin/udevsend > /proc/sys/kernel/hotplug + if [ -e /sys/kernel/uevent_helper ] ; then + echo "" > /sys/kernel/uevent_helper + else + echo "" > /proc/sys/kernel/hotplug + fi + udevsend + if [ "$UDEV_DISABLED" = "yes" ]; then + echo "udev disabled on the kernel command line, not started." + exit 0 + fi + + if [ ! "$TMPFS_MOUNTED" ]; then + unmount_devpts + mount_tmpfs + [ -d /proc/1 ] || mount -n /proc + # if this directory is not present /dev will not be updated by udev + mkdir /dev/.udevdb/ + echo "Creating initial device nodes..." + udevstart + fi + make_extra_nodes + ;; + stop) + warn_if_interactive + start-stop-daemon --stop --exec /sbin/udevd --quiet + unmount_devpts + if [ -d /dev/.static/dev/ ]; then + umount -l /dev/.static/dev/ || true + fi + echo "Unmounting /dev..." + # unmounting with -l should never fail + if ! umount -l /dev; then + exit 1 + fi + ;; + restart|force-reload) + start-stop-daemon --stop --exec /sbin/udevd --quiet + log_begin_msg "Recreating device nodes..." + udevstart + make_extra_nodes + log_end_msg 0 + ;; + *) + echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" + exit 1 + ;; +esac + +exit 0 diff --git a/recipes-core/udev/udev/links.conf b/recipes-core/udev/udev/links.conf new file mode 100644 index 0000000000..a9f8b58b27 --- /dev/null +++ b/recipes-core/udev/udev/links.conf @@ -0,0 +1,24 @@ +# This file does not exist. Please do not ask the debian maintainer about it. +# You may use it to do strange and wonderful things, at your risk. + +L fd /proc/self/fd +L stdin /proc/self/fd/0 +L stdout /proc/self/fd/1 +L stderr /proc/self/fd/2 +L core /proc/kcore +L sndstat /proc/asound/oss/sndstat +L MAKEDEV /sbin/MAKEDEV + +D pts +D shm + +M null c 1 3 +M console c 5 1 + +# Hic sunt leones. +M ppp c 108 0 +D loop +M loop/0 b 7 0 +D net +M net/tun c 10 200 + diff --git a/recipes-core/udev/udev/local.rules b/recipes-core/udev/udev/local.rules new file mode 100644 index 0000000000..5f2efbeb0c --- /dev/null +++ b/recipes-core/udev/udev/local.rules @@ -0,0 +1,22 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# Media automounting +SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" + +# Handle network interface setup +SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" +SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" diff --git a/recipes-core/udev/udev/mount.blacklist b/recipes-core/udev/udev/mount.blacklist new file mode 100644 index 0000000000..d3ebb17176 --- /dev/null +++ b/recipes-core/udev/udev/mount.blacklist @@ -0,0 +1,3 @@ +/dev/loop +/dev/ram +/dev/mtdblock diff --git a/recipes-core/udev/udev/mount.sh b/recipes-core/udev/udev/mount.sh new file mode 100644 index 0000000000..440dcee57b --- /dev/null +++ b/recipes-core/udev/udev/mount.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# +# Called from udev +# Attemp to mount any added block devices +# and remove any removed devices +# + +MOUNT="/bin/mount" +PMOUNT="/usr/bin/pmount" +UMOUNT="/bin/umount" +name="`basename "$DEVNAME"`" + +for line in `cat /etc/udev/mount.blacklist | grep -v ^#` +do + if ( echo "$DEVNAME" | grep -q "$line" ) + then + logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring" + exit 0 + fi +done + +automount() { + ! test -d "/media/$name" && mkdir -p "/media/$name" + + if ! $MOUNT -t auto -o sync $DEVNAME "/media/$name" + then + #logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/media/$name\" failed!" + rm_dir "/media/$name" + else + logger "mount.sh/automount" "Auto-mount of [/media/$name] successful" + touch "/tmp/.automount-$name" + fi +} + +rm_dir() { + # We do not want to rm -r populated directories + if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1" + then + ! test -z "$1" && rm -r "$1" + else + logger "mount.sh/automount" "Not removing non-empty directory [$1]" + fi +} + +if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ]; then + if [ -x "$PMOUNT" ]; then + $PMOUNT $DEVNAME 2> /dev/null + elif [ -x $MOUNT ]; then + $MOUNT $DEVNAME 2> /dev/null + fi + + # If the device isn't mounted at this point, it isn't configured in fstab + # 20061107: Small correction: The rootfs partition may be called just "rootfs" and not by + # its true device name so this would break. If the rootfs is mounted on two places + # during boot, it confuses the heck out of fsck. So Im auto-adding the root-partition + # to /etc/udev/mount.blacklist via postinst + + cat /proc/mounts | awk '{print $1}' | grep -q "^$DEVNAME$" || automount + +fi + + + +if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then + for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " ` + do + $UMOUNT -l $mnt + done + + # Remove empty directories from auto-mounter + test -e "/tmp/.automount-$name" && rm_dir "/media/$name" +fi diff --git a/recipes-core/udev/udev/network.sh b/recipes-core/udev/udev/network.sh new file mode 100644 index 0000000000..182c26d86a --- /dev/null +++ b/recipes-core/udev/udev/network.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +# udevd does clearenv(). Export shell PATH to children. +export PATH + +# Do not run when pcmcia-cs is installed +test -x /sbin/cardctl && exit 0 + +# We get two "add" events for hostap cards due to wifi0 +echo "$INTERFACE" | grep -q wifi && exit 0 + + +# Check if /etc/init.d/network has been run yet to see if we are +# called by starting /etc/rcS.d/S03udev and not by hotplugging a device +# +# At this stage, network interfaces should not be brought up +# automatically because: +# a) /etc/init.d/network has not been run yet (security issue) +# b) /var has not been populated yet so /etc/resolv,conf points to +# oblivion, making the network unusable +# + +spoofp="`grep ^spoofprotect /etc/network/options`" +if test -z "$spoofp" +then + # This is the default from /etc/init.d/network + spoofp_val=yes +else + spoofp_val=${spoofp#spoofprotect=} +fi + +test "$spoofp_val" = yes && spoofp_val=1 || spoofp_val=0 + +# I think it is safe to assume that "lo" will always be there ;) +if test "`cat /proc/sys/net/ipv4/conf/lo/rp_filter`" != "$spoofp_val" -a -n "$spoofp_val" +then + echo "$INTERFACE" >> /dev/udev_network_queue + exit 0 +fi + +# +# Code taken from pcmcia-cs:/etc/pcmcia/network +# + +# if this interface has an entry in /etc/network/interfaces, let ifupdown +# handle it +if grep -q "iface \+$INTERFACE" /etc/network/interfaces; then + case $ACTION in + add) + ifconfig | grep -q "^$INTERFACE" || ifup $INTERFACE + ;; + remove) + ifdown $INTERFACE + ;; + esac + + exit 0 +fi diff --git a/recipes-core/udev/udev/noasmlinkage.patch b/recipes-core/udev/udev/noasmlinkage.patch new file mode 100644 index 0000000000..0d8e854c0e --- /dev/null +++ b/recipes-core/udev/udev/noasmlinkage.patch @@ -0,0 +1,38 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- udev-062/udev.c~noasmlinkage.patch ++++ udev-062/udev.c +@@ -54,7 +54,7 @@ + } + #endif + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + switch (signum) { + case SIGALRM: +--- udev-062/udevd.c~noasmlinkage.patch ++++ udev-062/udevd.c +@@ -639,7 +639,7 @@ + return msg; + } + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + int rc; + +--- udev-062/udevstart.c~noasmlinkage.patch ++++ udev-062/udevstart.c +@@ -323,7 +323,7 @@ + exec_list(&device_list); + } + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + switch (signum) { + case SIGALRM: diff --git a/recipes-core/udev/udev/nokia900/10-cmt_speech.rules b/recipes-core/udev/udev/nokia900/10-cmt_speech.rules new file mode 100644 index 0000000000..25f46efeaa --- /dev/null +++ b/recipes-core/udev/udev/nokia900/10-cmt_speech.rules @@ -0,0 +1 @@ +KERNEL=="cmt_speech", MODE="0777" diff --git a/recipes-core/udev/udev/nokia900/70-persistent-net.rules b/recipes-core/udev/udev/nokia900/70-persistent-net.rules new file mode 100644 index 0000000000..b68f47c5f1 --- /dev/null +++ b/recipes-core/udev/udev/nokia900/70-persistent-net.rules @@ -0,0 +1,9 @@ +# This file was automatically generated by the /lib/udev/write_net_rules +# # program, run by the persistent-net-generator.rules rules file. +# # +# # You can modify it, as long as you keep each rule on a single +# # line, and change only the value of the NAME= key. +# +# # net device () +SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1f:df:*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0" + diff --git a/recipes-core/udev/udev/nokia900/nokia-n900-mac-hack.sh b/recipes-core/udev/udev/nokia900/nokia-n900-mac-hack.sh new file mode 100644 index 0000000000..c0b8251ae9 --- /dev/null +++ b/recipes-core/udev/udev/nokia900/nokia-n900-mac-hack.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +if [ $# -ne 2 ]; then + echo "Usage: $0 iface newmac" + echo " newmac is only saved if /etc/MAC is not found" + exit 1 +fi + +iface="$1" +newmac="$2" +macfile=/etc/"$iface"mac + +# If no MAC is found, save the one given as argument +if [ ! -e $macfile ]; then + /bin/echo "$newmac" > $macfile +# Otherwise load MAC from file +else + newmac=`/bin/cat $macfile` +fi + +# Configure interface +/sbin/ifconfig "$iface" down +/sbin/ifconfig "$iface" hw ether $newmac diff --git a/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-hacks.rules b/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-hacks.rules new file mode 100644 index 0000000000..fa2ddb8098 --- /dev/null +++ b/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-hacks.rules @@ -0,0 +1,8 @@ +# MAC address hack +# forces n900 to always use the same MAC address that is generated in the first boot +SUBSYSTEM=="net",KERNEL=="wlan0", RUN+="/etc/udev/scripts/nokia-n900-mac-hack.sh %k $attr{address}" + +# Create inputdev symlinks for kbslider contextkit plugin +SUBSYSTEM=="input" ATTRS{name}=="TWL4030 Keypad" SYMLINK+="input/keypad" +SUBSYSTEM=="input" ATTRS{name}=="gpio-keys" SYMLINK+="input/gpio-keys" + diff --git a/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-snd.rules b/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-snd.rules new file mode 100644 index 0000000000..413c1656f0 --- /dev/null +++ b/recipes-core/udev/udev/nokia900/udev-rules-nokia-n900-snd.rules @@ -0,0 +1,10 @@ +# ALSA devices +KERNEL=="controlC[0-9]*", NAME="snd/%k" +KERNEL=="hwC[D0-9]*", NAME="snd/%k" +KERNEL=="pcmC[D0-9cp]*", NAME="snd/%k" +KERNEL=="midiC[D0-9]*", NAME="snd/%k" +KERNEL=="timer", NAME="snd/%k" +KERNEL=="seq", NAME="snd/%k" + +KERNEL=="snd", SUBSYSTEM=="module", ACTION=="add", \ + RUN+="/bin/ln -sf /proc/asound/oss/sndstat $root/sndstat" diff --git a/recipes-core/udev/udev/omap3-pandora/local.rules b/recipes-core/udev/udev/omap3-pandora/local.rules new file mode 100644 index 0000000000..266c3ff859 --- /dev/null +++ b/recipes-core/udev/udev/omap3-pandora/local.rules @@ -0,0 +1,27 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# Media automounting +SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" + +# Handle network interface setup +SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" +SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" + +# Local UDEV rule changes for the Pandora system. + +# Let all users access the event devices using EVDEV (the OpenPandora is not multiuser after all). +KERNEL=="event[0-9]",MODE="0666" \ No newline at end of file diff --git a/recipes-core/udev/udev/permissions.rules b/recipes-core/udev/udev/permissions.rules new file mode 100644 index 0000000000..efbe568a2b --- /dev/null +++ b/recipes-core/udev/udev/permissions.rules @@ -0,0 +1,79 @@ +# default permissions for block devices +SUBSYSTEM=="block", GROUP="disk" +SUBSYSTEM=="block", SYSFS{removable}=="1", GROUP="floppy" + +# IDE devices +BUS=="ide", KERNEL=="hd[a-z]", SYSFS{removable}="1", \ + PROGRAM="/bin/cat /proc/ide/%k/media", RESULT=="cdrom*", GROUP="cdrom" +BUS=="ide", KERNEL=="ht[0-9]*", GROUP="tape" +BUS=="ide", KERNEL=="nht[0-9]*", GROUP="tape" + +# SCSI devices +BUS=="scsi", SYSFS{type}=="1", GROUP="tape" +BUS=="scsi", SYSFS{type}=="5", GROUP="cdrom" + +# USB devices +BUS=="usb", KERNEL=="legousbtower*", MODE="0666" +BUS=="usb", KERNEL=="lp[0-9]*", GROUP="lp" + +# serial devices +SUBSYSTEM=="tty", GROUP="dialout" +SUBSYSTEM=="capi", GROUP="dialout" +SUBSYSTEM=="slamr", GROUP="dialout" + +# vc devices (all members of the tty subsystem) +KERNEL=="ptmx", MODE="0666", GROUP="root" +KERNEL=="console", MODE="0600", GROUP="root" +KERNEL=="tty", MODE="0666", GROUP="root" +KERNEL=="tty[0-9]*", GROUP="root" +KERNEL=="pty*", MODE="0666", GROUP="tty" + +# video devices +SUBSYSTEM=="video4linux", GROUP="video" +SUBSYSTEM=="drm", GROUP="video" +SUBSYSTEM=="dvb", GROUP="video" +SUBSYSTEM=="em8300", GROUP="video" +SUBSYSTEM=="graphics", GROUP="video" +SUBSYSTEM=="nvidia", GROUP="video" + +# misc devices +KERNEL=="random", MODE="0666" +KERNEL=="urandom", MODE="0444" +KERNEL=="mem", MODE="0640", GROUP="kmem" +KERNEL=="kmem", MODE="0640", GROUP="kmem" +KERNEL=="port", MODE="0640", GROUP="kmem" +KERNEL=="full", MODE="0666" +KERNEL=="null", MODE="0666" +KERNEL=="zero", MODE="0666" +KERNEL=="inotify", MODE="0666" +KERNEL=="sgi_fetchop", MODE="0666" +KERNEL=="sonypi", MODE="0666" +KERNEL=="agpgart", GROUP="video" +KERNEL=="rtc", MODE="0660", GROUP="audio" + +KERNEL=="cdemu[0-9]*", GROUP="cdrom" +KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" +KERNEL=="pktcdvd", MODE="0644" + +# printers and parallel devices +SUBSYSTEM=="printer", GROUP="lp" +SUBSYSTEM=="ppdev", GROUP="lp" +KERNEL=="pt[0-9]*", GROUP="tape" +KERNEL=="pht[0-9]*", GROUP="tape" + +# sound devices +SUBSYSTEM=="sound", GROUP="audio" + +# ieee1394 devices +KERNEL=="raw1394", GROUP="disk" +KERNEL=="dv1394*", GROUP="video" +KERNEL=="video1394*", GROUP="video" + +# input devices +KERNEL=="event[0-9]*", MODE="0664" +KERNEL=="js[0-9]*", MODE="0664" + +# AOE character devices +SUBSYSTEM=="aoe", MODE="0220", GROUP="disk" +SUBSYSTEM=="aoe", KERNEL=="err", MODE="0440" + diff --git a/recipes-core/udev/udev/shr/mount.blacklist b/recipes-core/udev/udev/shr/mount.blacklist new file mode 100644 index 0000000000..117ac9b861 --- /dev/null +++ b/recipes-core/udev/udev/shr/mount.blacklist @@ -0,0 +1,4 @@ +/dev/loop +/dev/ram +/dev/mtdblock +/dev/mmcblk diff --git a/recipes-core/udev/udev/slugos/mount.blacklist b/recipes-core/udev/udev/slugos/mount.blacklist new file mode 100644 index 0000000000..d9da5cfd71 --- /dev/null +++ b/recipes-core/udev/udev/slugos/mount.blacklist @@ -0,0 +1,5 @@ +ram[0-9]$ +mtdblock[0-9]$ +hd[a-z]$ +sd[a-z]$ +loop[0-9]$ diff --git a/recipes-core/udev/udev/slugos/mount.sh b/recipes-core/udev/udev/slugos/mount.sh new file mode 100644 index 0000000000..b5298e97a2 --- /dev/null +++ b/recipes-core/udev/udev/slugos/mount.sh @@ -0,0 +1,83 @@ +#!/bin/sh +# +# Called from udev +# Attemp to mount any added block devices +# and remove any removed devices +# + +MOUNT="/bin/mount" +PMOUNT="/usr/bin/pmount" +UMOUNT="/bin/umount" +name="`basename "$DEVNAME"`" + +if ( blkid "$DEVNAME" | grep -q 'TYPE="mdraid"' ) +then + logger "udev/mount.sh" "[$DEVNAME] is a member of an array, ignoring" + exit 0 +fi + +for line in `cat /etc/udev/mount.blacklist | grep -v ^#` +do + if ( echo "$DEVNAME" | grep -q "$line" ) + then + logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring" + exit 0 + fi +done + +automount() { + ! test -d "/media/$name" && mkdir -p "/media/$name" + + if ! $MOUNT -t auto -o sync $DEVNAME "/media/$name" + then + #logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/media/$name\" failed!" + rm_dir "/media/$name" + else + logger "mount.sh/automount" "Auto-mount of [/media/$name] successful" + touch "/tmp/.automount-$name" + fi +} + +rm_dir() { + # We do not want to rm -r populated directories + if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1" + then + ! test -z "$1" && rm -r "$1" + else + logger "mount.sh/automount" "Not removing non-empty directory [$1]" + fi +} + +if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ]; then + # SlugOS: we pivot to the rootfs based on UUID, not on fstab -- so the fstab may not + # be correct at this point in the boot. So we must not let udev mount devices based + # soley on the fstab, lest we mount overtop the real rootfs. For now we just comment + # out the logic below and let the automount logic (far below) deal with all udev mount + # operations. + #if [ -x "$PMOUNT" ]; then + # $PMOUNT $DEVNAME 2> /dev/null + #elif [ -x $MOUNT ]; then + # $MOUNT $DEVNAME 2> /dev/null + #fi + + # If the device isn't mounted at this point, it isn't configured in fstab + # 20061107: Small correction: The rootfs partition may be called just "rootfs" and not by + # its true device name so this would break. If the rootfs is mounted on two places + # during boot, it confuses the heck out of fsck. So Im auto-adding the root-partition + # to /etc/udev/mount.blacklist via postinst + + cat /proc/mounts | awk '{print $1}' | grep -q "^$DEVNAME$" || automount + +fi + + + +if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then + for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " ` + do + $UMOUNT -l $mnt + done + + # Remove empty directories from auto-mounter + test -e "/tmp/.automount-$name" && rm_dir "/media/$name" +fi diff --git a/recipes-core/udev/udev/spitz/mount.blacklist b/recipes-core/udev/udev/spitz/mount.blacklist new file mode 100644 index 0000000000..38c7aa4b32 --- /dev/null +++ b/recipes-core/udev/udev/spitz/mount.blacklist @@ -0,0 +1,7 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/hda +/dev/loop +/dev/ram \ No newline at end of file diff --git a/recipes-core/udev/udev/tosa/mount.blacklist b/recipes-core/udev/udev/tosa/mount.blacklist new file mode 100644 index 0000000000..7e351bc988 --- /dev/null +++ b/recipes-core/udev/udev/tosa/mount.blacklist @@ -0,0 +1,6 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/loop +/dev/ram \ No newline at end of file diff --git a/recipes-core/udev/udev/udev-compat-wrapper-patch b/recipes-core/udev/udev/udev-compat-wrapper-patch new file mode 100644 index 0000000000..c90d05aefa --- /dev/null +++ b/recipes-core/udev/udev/udev-compat-wrapper-patch @@ -0,0 +1,37 @@ +This patch should be applied on platforms which support kernels < 2.6.27 and need udev-compat package. + +It should be applied after: +sed -i "s:/sbin/udevd:\$UDEVD:g;s:/sbin/udevadm:\$UDEVADM:g" init + +It has not .patch suffix, because such files would not be copied to +WORKDIR and cannot be selectively applied on another source file. + +--- init ++++ init +@@ -11,6 +11,17 @@ + + export TZ=/etc/localtime + ++UDEVD="/sbin/udevd" ++UDEVADM="/sbin/udevadm" ++# If we are running an old kernel and have a static udev present use that instead ++if [ -e /sbin/udevd-compat ] ; then ++ KERNELMICROVER="$(uname -r | sed 's/^[0-9]*\.[0-9]*\.\([0-9]*\).*$/\1/')" ++ if [ $KERNELMICROVER -lt 27 ] ; then ++ UDEVD="/sbin/udevd-compat" ++ UDEVADM="/sbin/udevadm-compat" ++ fi ++fi ++ + [ -d /sys/class ] || exit 1 + [ -r /proc/mounts ] || exit 1 + [ -x $UDEVD ] || exit 1 +@@ -21,6 +32,8 @@ + if [ -x /sbin/pidof ]; then + pid=`/sbin/pidof -x udevd` + [ -n "$pid" ] && kill $pid ++ pid=`/sbin/pidof -x udevd-compat` ++ [ -n "$pid" ] && kill $pid + fi + } + diff --git a/recipes-core/udev/udev/udev.rules b/recipes-core/udev/udev/udev.rules new file mode 100644 index 0000000000..5c566f6cef --- /dev/null +++ b/recipes-core/udev/udev/udev.rules @@ -0,0 +1,98 @@ +# 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' +# %e the smallest number for that name which does not matches an existing node +# %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 +# + +# SCSI devices +BUS=="scsi", KERNEL=="sr[0-9]*", NAME="scd%n", SYMLINK+="sr%n" + +# USB devices +BUS=="usb", KERNEL=="auer[0-9]*", NAME="usb/%k" +BUS=="usb", KERNEL=="cpad[0-9]*", NAME="usb/%k" +BUS=="usb", KERNEL=="dabusb*", NAME="usb/%k" +BUS=="usb", KERNEL=="hiddev*", NAME="usb/%k" +BUS=="usb", KERNEL=="legousbtower*", NAME="usb/%k" +BUS=="usb", KERNEL=="lp[0-9]*", NAME="usb/%k" +BUS=="usb", KERNEL=="ttyUSB*", SYSFS{product}=="Palm Handheld*", \ + SYMLINK+="pilot" + +# usbfs-like devices +SUBSYSTEM=="usb_device", \ + PROGRAM="/bin/sh -c 'export X=%k; export X=$${X#usbdev}; export B=$${X%%%%.*}; export D=$${X#*.}; echo bus/usb/$$B/$$D'", SYMLINK+="%c" + +# serial devices +KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20" +KERNEL=="capi[0-9]*", NAME="capi/%n" + +# video devices +KERNEL=="card[0-9]*", NAME="dri/%k" + +# misc devices +KERNEL=="hw_random", NAME="hwrng" +KERNEL=="tun", NAME="net/%k" + +KERNEL=="cdemu[0-9]*", NAME="cdemu/%n" +KERNEL=="pktcdvd[0-9]*", NAME="pktcdvd/%n" +KERNEL=="pktcdvd", NAME="pktcdvd/control" + +KERNEL=="cpu[0-9]*", NAME="cpu/%n/cpuid" +KERNEL=="msr[0-9]*", NAME="cpu/%n/msr" +KERNEL=="microcode", NAME="cpu/microcode" + +KERNEL=="umad*", NAME="infiniband/%k" +KERNEL=="issm*", NAME="infiniband/%k" +KERNEL=="uverbs*", NAME="infiniband/%k" +KERNEL=="ucm", NAME="infiniband/%k" + +KERNEL=="buzzer", NAME="misc/buzzer" + +# ALSA devices +KERNEL=="controlC[0-9]*", NAME="snd/%k" +KERNEL=="hwC[D0-9]*", NAME="snd/%k" +KERNEL=="pcmC[D0-9cp]*", NAME="snd/%k" +KERNEL=="midiC[D0-9]*", NAME="snd/%k" +KERNEL=="timer", NAME="snd/%k" +KERNEL=="seq", NAME="snd/%k" + +# ieee1394 devices +KERNEL=="dv1394*", NAME="dv1394/%n" +KERNEL=="video1394*", NAME="video1394/%n" + +# input devices +KERNEL=="mice", NAME="input/%k" +KERNEL=="mouse[0-9]*", NAME="input/%k" +KERNEL=="event[0-9]*", NAME="input/%k" +KERNEL=="js[0-9]*", NAME="input/%k" +KERNEL=="ts[0-9]*", NAME="input/%k" +KERNEL=="uinput", NAME="input/%k" + +# Zaptel +KERNEL=="zapctl", NAME="zap/ctl" +KERNEL=="zaptimer", NAME="zap/timer" +KERNEL=="zapchannel", NAME="zap/channel" +KERNEL=="zappseudo", NAME="zap/pseudo" +KERNEL=="zap[0-9]*", NAME="zap/%n" + +# AOE character devices +SUBSYSTEM=="aoe", KERNEL=="discover", NAME="etherd/%k" +SUBSYSTEM=="aoe", KERNEL=="err", NAME="etherd/%k" +SUBSYSTEM=="aoe", KERNEL=="interfaces", NAME="etherd/%k" + +# device mapper creates its own device nodes, so ignore these +KERNEL=="dm-[0-9]*", OPTIONS+="ignore_device" +KERNEL=="device-mapper", NAME="mapper/control" + +KERNEL="rfcomm[0-9]*", NAME="%k", GROUP="users", MODE="0660" + +# Firmware Helper +ACTION=="add", SUBSYSTEM=="firmware", RUN+="/sbin/firmware_helper" diff --git a/recipes-core/udev/udev/udev_network_queue.sh b/recipes-core/udev/udev/udev_network_queue.sh new file mode 100644 index 0000000000..05e08e9d1b --- /dev/null +++ b/recipes-core/udev/udev/udev_network_queue.sh @@ -0,0 +1,35 @@ +#! /bin/sh +# +# Copyright Matthias Hentges (c) 2006 +# License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the license) +# +# Filename: udev_network_queue.sh +# Date: 03-May-06 + +do_start() { + if test -e /dev/udev_network_queue + then + echo "Activating queued NICs..." + for NIC in `cat /dev/udev_network_queue` + do + export INTERFACE="$NIC" ; export ACTION=add + /etc/udev/scripts/network.sh + done + echo "" + else + echo "No NICs queued" + fi +} + +do_stop() { + /bin/true +} + +case "$1" in +start) do_start;; +stop) do_stop;; +restart) do_stop + do_start;; +*) echo "Usage: `basename $0` [ start | stop | restart ]" + exit 0;; +esac diff --git a/recipes-core/udev/udev/udevsynthesize.patch b/recipes-core/udev/udev/udevsynthesize.patch new file mode 100644 index 0000000000..7811188485 --- /dev/null +++ b/recipes-core/udev/udev/udevsynthesize.patch @@ -0,0 +1,776 @@ +--- udev-081/udevsynthesize.c.orig 2006-01-29 12:22:45.000000000 +0100 ++++ udev-081/udevsynthesize.c 2006-01-29 12:22:40.000000000 +0100 +@@ -0,0 +1,763 @@ ++/* ++ * udevcoldplug.c ++ * ++ * Copyright (C) 2005 SUSE Linux Products GmbH ++ * ++ * Author: ++ * Kay Sievers ++ * ++ * Synthesize kernel events from sysfs information and pass them ++ * to the udevd daemon. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation version 2 of the License. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "udev_libc_wrapper.h" ++#include "udev.h" ++#include "udevd.h" ++#include "udev_version.h" ++#include "logging.h" ++ ++#include "list.h" ++ ++#ifndef DT_DIR ++#define DT_DIR 4 ++#endif ++ ++static const char *udev_log_str; ++static int udevd_sock = -1; ++ ++#ifdef USE_LOG ++void log_message(int priority, const char *format, ...) ++{ ++ va_list args; ++ ++ if (priority > udev_log_priority) ++ return; ++ ++ va_start(args, format); ++ vsyslog(priority, format, args); ++ va_end(args); ++} ++#endif ++ ++struct device { ++ struct list_head node; ++ struct udevd_msg msg; ++ size_t bufpos; ++ char *path; ++}; ++ ++static dev_t read_devt(const char *path) ++{ ++ char filename[PATH_SIZE]; ++ char majorminor[64]; ++ unsigned int major, minor; ++ ssize_t count; ++ int fd; ++ ++ snprintf(filename, sizeof(filename), "%s/%s", path, "dev"); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ fd = open(filename, O_RDONLY); ++ if (fd < 0) ++ return 0; ++ ++ count = read(fd, majorminor, sizeof(majorminor)); ++ close(fd); ++ majorminor[count] = '\0'; ++ if (sscanf(majorminor, "%u:%u", &major, &minor) != 2) ++ return 0; ++ dbg("found major=%d, minor=%d", major, minor); ++ ++ return makedev(major, minor); ++} ++ ++static ssize_t read_file(const char *directory, const char *file, char *str, size_t len) ++{ ++ char filename[PATH_SIZE]; ++ ssize_t count; ++ int fd; ++ ++ memset(filename, 0, sizeof(filename)); ++ snprintf(filename, sizeof(filename), "%s/%s", directory, file); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ fd = open(filename, O_RDONLY); ++ if (fd < 0) ++ return -1; ++ ++ count = read(fd, str, len-1); ++ close(fd); ++ ++ if (count > (ssize_t)len) ++ count = len; ++ str[count-1] = '\0'; ++ ++ return count; ++} ++ ++static ssize_t read_link(const char *directory, const char *file, char *str, size_t size) ++{ ++ char filename[PATH_SIZE]; ++ char target[PATH_SIZE]; ++ int len; ++ char *back; ++ char *strip; ++ int level = 1; ++ ++ snprintf(filename, sizeof(filename), "%s/%s", directory, file); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ len = readlink(filename, target, sizeof(target)-1); ++ if (len < 0) ++ return -1; ++ target[len] = '\0'; ++ ++ back = target; ++ while (strncmp(back, "../", 3) == 0) { ++ back += 3; ++ level++; ++ } ++ while(level--) { ++ strip = strrchr(filename, '/'); ++ if (!strip) ++ return -1; ++ strip[0] = '\0'; ++ } ++ ++ snprintf(str, size, "%s/%s", filename, back); ++ str[size-1] = '\0'; ++ ++ return len; ++} ++ ++static char *add_env_key(struct device *device, const char *key, const char *value) ++{ ++ size_t pos = device->bufpos; ++ device->bufpos += sprintf(&device->msg.envbuf[device->bufpos], "%s=%s", key, value)+1; ++ return &device->msg.envbuf[pos]; ++} ++ ++static struct device *device_create(const char *path, const char *subsystem, dev_t devt) ++{ ++ struct device *device; ++ const char *devpath = &path[strlen(sysfs_path)]; ++ char target[PATH_SIZE]; ++ ++ device = malloc(sizeof(struct device)); ++ if (device == NULL) { ++ dbg("error malloc"); ++ return NULL; ++ } ++ memset(device, 0x00, sizeof(struct device)); ++ ++ device->path = add_env_key(device, "DEVPATH", devpath); ++ device->path += strlen("DEVPATH="); ++ add_env_key(device, "SUBSYSTEM", subsystem); ++ add_env_key(device, "ACTION", "add"); ++ add_env_key(device, "UDEV_COLDPLUG", "1"); ++ ++ if (major(devt)) { ++ char number[32]; ++ sprintf(number, "%u", major(devt)); ++ add_env_key(device, "MAJOR", number); ++ sprintf(number, "%u", minor(devt)); ++ add_env_key(device, "MINOR", number); ++ } ++ ++ if (strncmp(devpath, "/block/", strlen("/block/")) == 0 || ++ strncmp(devpath, "/class/", strlen("/class/")) == 0) { ++ char physpath[PATH_SIZE]; ++ ++ if (read_link(path, "device", physpath, sizeof(physpath)) > (ssize_t)strlen(sysfs_path)) { ++ add_env_key(device, "PHYSDEVPATH", &physpath[strlen(sysfs_path)]); ++ if (read_link(physpath, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); ++ } ++ if (read_link(physpath, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVBUS", &pos[1]); ++ } ++ } ++ } else if (strncmp(devpath, "/devices/", strlen("/devices/")) == 0) { ++ if (read_link(path, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); ++ } ++ if (read_link(path, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVBUS", &pos[1]); ++ } ++ } ++ ++ return device; ++} ++ ++static int device_list_insert(struct list_head *device_list, struct device *device) ++{ ++ struct device *loop_device; ++ ++ dbg("insert: '%s'", device->path); ++ ++ /* sort files in lexical order */ ++ list_for_each_entry(loop_device, device_list, node) ++ if (strcmp(loop_device->path, device->path) > 0) ++ break; ++ ++ list_add_tail(&device->node, &loop_device->node); ++ ++ return 0; ++} ++ ++static int add_device_udevd(struct device *device) ++{ ++ size_t msg_len; ++ struct sockaddr_un saddr; ++ socklen_t addrlen; ++ int retval; ++ ++ memset(&saddr, 0x00, sizeof(struct sockaddr_un)); ++ saddr.sun_family = AF_LOCAL; ++ /* use abstract namespace for socket path */ ++ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH); ++ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; ++ ++ strcpy(device->msg.magic, UDEV_MAGIC); ++ device->msg.type = UDEVD_UEVENT_UDEVSEND; ++ ++ msg_len = offsetof(struct udevd_msg, envbuf) + device->bufpos; ++ dbg("msg_len=%i", msg_len); ++ ++ retval = sendto(udevd_sock, &device->msg, msg_len, 0, (struct sockaddr *)&saddr, addrlen); ++ if (retval < 0) ++ return -1; ++ ++ return 0; ++} ++ ++static void exec_list(struct list_head *device_list, const char *first[], const char *last[]) ++{ ++ struct device *loop_device; ++ struct device *tmp_device; ++ int i; ++ ++ /* handle the "first" type devices first */ ++ if (first) ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ for (i = 0; first[i] != NULL; i++) { ++ if (strncmp(loop_device->path, first[i], strlen(first[i])) == 0) { ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ break; ++ } ++ } ++ } ++ ++ /* handle the devices we are allowed to, excluding the "last" type devices */ ++ if (last) ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ int found = 0; ++ for (i = 0; last[i] != NULL; i++) { ++ if (strncmp(loop_device->path, last[i], strlen(last[i])) == 0) { ++ found = 1; ++ break; ++ } ++ } ++ if (found) ++ continue; ++ ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ } ++ ++ /* handle the rest of the devices */ ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ } ++} ++ ++static int udev_scan_class(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ /* we want /dev/null and /dev/console first */ ++ const char *first[] = { ++ "/class/mem", ++ "/class/tty", ++ NULL, ++ }; ++ ++ snprintf(base, sizeof(base), "%s/class", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char dirname[PATH_SIZE]; ++ DIR *dir2; ++ struct dirent *dent2; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ ++ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); ++ dirname[sizeof(dirname)-1] = '\0'; ++ ++ dir2 = opendir(dirname); ++ if (!dir2) ++ continue; ++ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { ++ char dirname2[PATH_SIZE]; ++ struct device *device; ++ dev_t devt; ++ ++ if (dent2->d_name[0] == '.') ++ continue; ++ if (dent2->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); ++ dirname2[sizeof(dirname2)-1] = '\0'; ++ devt = read_devt(dirname2); ++ device = device_create(dirname2, dent->d_name, devt); ++ ++ if (strcmp(dent->d_name, "net") == 0 || ++ strcmp(dent->d_name, "bluetooth") == 0) { ++ add_env_key(device, "INTERFACE", dent2->d_name); ++ } else if (strcmp(dent->d_name, "pcmcia_socket") == 0 && ++ strlen(dent->d_name) > 14) { ++ add_env_key(device, "SOCKET_NO", ++ dent2->d_name + 14); ++ } ++ ++ device_list_insert(&device_list, device); ++ } ++ closedir(dir2); ++ } ++ closedir(dir); ++ exec_list(&device_list, first, NULL); ++ ++ return 0; ++} ++ ++static int udev_scan_block(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ /* dm wants to have the block devices around before it */ ++ const char *last[] = { ++ "/block/dm", ++ NULL, ++ }; ++ ++ snprintf(base, sizeof(base), "%s/block", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char dirname[PATH_SIZE]; ++ struct device *device; ++ struct dirent *dent2; ++ DIR *dir2; ++ dev_t devt; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ if (dent->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); ++ dirname[sizeof(dirname)-1] = '\0'; ++ devt = read_devt(dirname); ++ if (major(devt)) { ++ device = device_create(dirname, "block", devt); ++ device_list_insert(&device_list, device); ++ } ++ ++ /* look for partitions */ ++ dir2 = opendir(dirname); ++ if (!dir2) ++ continue; ++ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { ++ char dirname2[PATH_SIZE]; ++ ++ if (dent2->d_name[0] == '.') ++ continue; ++ if (dent2->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); ++ dirname2[sizeof(dirname2)-1] = '\0'; ++ devt = read_devt(dirname2); ++ if (major(devt)) { ++ device = device_create(dirname2, "block", devt); ++ device_list_insert(&device_list, device); ++ continue; ++ } ++ } ++ closedir(dir2); ++ } ++ closedir(dir); ++ exec_list(&device_list, NULL, last); ++ ++ return 0; ++} ++ ++static int pci_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ char vendor[PATH_SIZE]; ++ char product[PATH_SIZE]; ++ const char *name; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ name = strrchr(device->path, '/'); ++ if (name) ++ add_env_key(device, "PCI_SLOT_NAME", &name[1]); ++ ++ if (read_file(path, "class", value, sizeof(value)) > 0) ++ add_env_key(device, "PCI_CLASS", &value[2]); ++ ++ if (read_file(path, "vendor", vendor, sizeof(vendor)) > 0 && ++ read_file(path, "device", product, sizeof(product)) > 0) { ++ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PCI_ID", value); ++ } ++ ++ if (read_file(path, "subsystem_vendor", vendor, sizeof(vendor)) > 0 && ++ read_file(path, "subsystem_device", product, sizeof(product)) > 0) { ++ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PCI_SUBSYS_ID", value); ++ } ++ ++ return 0; ++} ++ ++static int usb_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ char str1[PATH_SIZE]; ++ char str2[PATH_SIZE]; ++ char str3[PATH_SIZE]; ++ unsigned int int1; ++ unsigned int int2; ++ unsigned int int3; ++ char *pos; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ /* device events have : in their directory name */ ++ pos = strrchr(path, '/'); ++ if (!strchr(pos, ':')) ++ return 0; /* and do not have other variables */ ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "bInterfaceClass", str1, sizeof(str1)) > 0 && ++ read_file(path, "bInterfaceSubClass", str2, sizeof(str2)) > 0 && ++ read_file(path, "bInterfaceProtocol", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "INTERFACE", value); ++ } ++ ++ /* move to the parent directory */ ++ pos[0] = '\0'; ++ ++ if (read_file(path, "idVendor", str1, sizeof(str1)) > 0 && ++ read_file(path, "idProduct", str2, sizeof(str2)) > 0 && ++ read_file(path, "bcdDevice", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%x/%x/%x", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PRODUCT", value); ++ } ++ ++ if (read_file(path, "bDeviceClass", str1, sizeof(str1)) > 0 && ++ read_file(path, "bDeviceSubClass", str2, sizeof(str2)) > 0 && ++ read_file(path, "bDeviceProtocol", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "TYPE", value); ++ } ++ ++ if (read_file(path, "devnum", str2, sizeof(str2)) > 0) { ++ pos = strrchr(path, 'b'); ++ int1 = (int) strtol(pos + 1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ snprintf(value, sizeof(value), ++ "/proc/bus/usb/%03d/%03d", int1, int2); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "DEVICE", value); ++ } ++ ++ return 0; ++} ++ ++static int serio_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "id/type", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_TYPE", value); ++ ++ if (read_file(path, "id/proto", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_PROTO", value); ++ ++ if (read_file(path, "id/id", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_ID", value); ++ ++ if (read_file(path, "id/extra", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_EXTRA", value); ++ ++ return 0; ++} ++ ++static int ccw_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE], *tmp; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "cutype", value, sizeof(value)) > 0) { ++ value[4] = 0; ++ tmp = &value[5]; ++ add_env_key(device, "CU_TYPE", value); ++ add_env_key(device, "CU_MODEL", tmp); ++ } ++ ++ if (read_file(path, "devtype", value, sizeof(value)) > 0) { ++ if (value[0] == 'n') { ++ add_env_key(device, "DEV_TYPE", "0000"); ++ add_env_key(device, "DEV_MODEL", "00"); ++ } ++ else { ++ value[4] = 0; ++ tmp = &value[5]; ++ add_env_key(device, "DEV_TYPE", value); ++ add_env_key(device, "DEV_MODEL", tmp); ++ } ++ } ++ ++ return 0; ++} ++ ++static int modalias_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ return 0; ++} ++ ++static int udev_scan_bus(const char *bus, int bus_handler(struct device *device)) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ snprintf(base, sizeof(base), "%s/bus/%s/devices", sysfs_path, bus); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char devpath[PATH_SIZE]; ++ struct device *device; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ ++ if (read_link(base, dent->d_name, devpath, sizeof(devpath)) < 0) ++ continue; ++ ++ device = device_create(devpath, bus, makedev(0, 0)); ++ if (bus_handler) { ++ if (bus_handler(device) < 0) { ++ dbg("'%s' bus handler skipped event", devpath); ++ free(device); ++ continue; ++ } ++ } ++ ++ device_list_insert(&device_list, device); ++ } ++ closedir(dir); ++ exec_list(&device_list, NULL, NULL); ++ ++ return 0; ++} ++ ++static int udev_scan_devices(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ ++ snprintf(base, sizeof(base), "%s/bus", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ if (dent->d_name[0] == '.') ++ continue; ++ if (dent->d_type != DT_DIR) ++ continue; ++ ++ /* add bus specific env values */ ++ if (strcmp(dent->d_name, "pci") == 0) ++ udev_scan_bus("pci", pci_handler); ++ else if (strcmp(dent->d_name, "usb") == 0) ++ udev_scan_bus("usb", usb_handler); ++ else if (strcmp(dent->d_name, "serio") == 0) ++ udev_scan_bus("serio", serio_handler); ++ else if (strcmp(dent->d_name, "ccw") == 0) ++ udev_scan_bus("ccw", ccw_handler); ++ else ++ udev_scan_bus(dent->d_name, modalias_handler); ++ } ++ closedir(dir); ++ ++ return 0; ++} ++ ++int main(int argc, char *argv[], char *envp[]) ++{ ++ LIST_HEAD(device_list); ++ int i; ++ ++ logging_init("udevcoldplug"); ++ udev_config_init(); sysfs_init(); ++ dbg("version %s", UDEV_VERSION); ++ ++ udev_log_str = getenv("UDEV_LOG"); ++ ++ /* disable all logging if not explicitely requested */ ++ if (udev_log_str == NULL) ++ udev_log_priority = 0; ++ ++ for (i = 1 ; i < argc; i++) { ++ char *arg = argv[i]; ++ ++ if (strcmp(arg, "help") == 0 || strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { ++ printf("Usage: udevcoldplug \n" ++ " --help print this help text\n\n"); ++ exit(0); ++ } else { ++ fprintf(stderr, "unknown option\n\n"); ++ exit(1); ++ } ++ } ++ ++ udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0); ++ if (udevd_sock < 0) { ++ err("error getting socket"); ++ return 1; ++ } ++ ++ /* create nodes for already available devices */ ++ udev_scan_class(); ++ udev_scan_block(); ++ ++ /* synthesize events for bus devices ++ * may load modules or configure the device */ ++ udev_scan_devices(); ++ ++ if (udevd_sock >= 0) ++ close(udevd_sock); ++ logging_close(); ++ ++ return 0; ++} +--- udev-081/Makefile ++++ udev-081/Makefile +@@ -58,6 +58,7 @@ PROGRAMS = \ + udevmonitor \ + udevinfo \ + udevtest \ ++ udevsynthesize \ + udevstart + + HEADERS = \ diff --git a/recipes-core/udev/udev/udevsynthesize.sh b/recipes-core/udev/udev/udevsynthesize.sh new file mode 100644 index 0000000000..d58217c144 --- /dev/null +++ b/recipes-core/udev/udev/udevsynthesize.sh @@ -0,0 +1,51 @@ +#!/bin/sh -e + +load_input_modules() { + for module in mousedev evdev joydev; do + modprobe -q $module || true + done +} + +if [ ! -e /sys/class/mem/null/uevent ]; then # <= 2.6.14 + /lib/udev/udevsynthesize + load_input_modules + exit 0 +fi + +# replace $IFS with something which is not likely to appear in a sysfs path, +# because some buggy drivers have spaces in their names +oldifs="$IFS" +IFS="|" + +for file in /sys/bus/*/devices/*/uevent /sys/class/*/*/uevent \ + /sys/block/*/uevent /sys/block/*/*/uevent; do + case "$file" in + */device/uevent) ;; # skip followed device symlinks + */\*/*) ;; + + */class/mem/*) # for /dev/null + first="$first${IFS}$file" ;; + + */block/md[0-9]*) + last="$last${IFS}$file" ;; + + *) + default="$default${IFS}$file" ;; + esac +done + +for file in $first${IFS}$default${IFS}$last; do + [ "$file" ] || continue + echo 'add' > "$file" || true +done + +IFS="$oldifs" + +case "$(uname -r)" in + 2.6.1[0-5]|2.6.1[0-5][!0-9]*) # <= 2.6.15 + load_input_modules + ;; +esac + +exit 0 + diff --git a/recipes-core/udev/udev_165.bb b/recipes-core/udev/udev_165.bb new file mode 100644 index 0000000000..c5a2130859 --- /dev/null +++ b/recipes-core/udev/udev_165.bb @@ -0,0 +1,181 @@ +DESCRIPTION = "udev is a daemon which dynamically creates and removes device nodes from \ +/dev/, handles hotplug events and loads drivers at boot time. It replaces \ +the hotplug package and requires a kernel not older than 2.6.12." + +LICENSE = "GPLv2+ & LGPLv2.1+" +LICENSE_${PN} = "GPLv2+" +LICENSE_libudev = "LGPLv2.1+" +LICENSE_libgudev = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \ + file://libudev/COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://extras/gudev/COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" + +PR = "r0" + +# Untested +DEFAULT_PREFERENCE = "-1" + +# Needed for udev-extras +DEPENDS = "gperf-native usbutils acl glib-2.0" +RDEPENDS_${PN} += "module-init-tools-depmod udev-utils" + +SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ + file://mount.blacklist \ + file://run.rules \ + " + +SRC_URI[md5sum] = "b8cf77be693fd09ccfcf26d3e4e23e97" +SRC_URI[sha256sum] = "5c271f43d8a28176050abbc6b4e4354203b6a7d810c72c18afefd1ee100485c3" + +SRC_URI += " \ + file://udev.rules \ + file://devfs-udev.rules \ + file://links.conf \ + file://permissions.rules \ + file://mount.sh \ + file://network.sh \ + file://local.rules \ + file://default \ + file://init \ + file://cache \ + file://udev-compat-wrapper-patch \ +" + +SRC_URI_append_h2200 = " file://50-hostap_cs.rules " +PACKAGE_ARCH_h2200 = "h2200" + +#buglabs's bug device +SRC_URI_append_bug = " \ + file://30-BUG.rules \ + file://10-mx31.rules \ + file://bmi_eventpipe.sh " + +SRC_URI_append_nokia900 = " \ + file://10-cmt_speech.rules \ + file://70-persistent-net.rules \ + file://udev-rules-nokia-n900-hacks.rules \ + file://udev-rules-nokia-n900-snd.rules \ + file://nokia-n900-mac-hack.sh \ +" + +PACKAGE_ARCH_bug = "bug" + +inherit update-rc.d autotools + +EXTRA_OECONF += " --with-udev-prefix= \ + --with-libdir-name=${base_libdir} \ + --with-pci-ids-path=/usr/share/misc \ + --disable-introspection \ + ac_cv_file__usr_share_pci_ids=no \ + ac_cv_file__usr_share_hwdata_pci_ids=no \ + ac_cv_file__usr_share_misc_pci_ids=yes \ + --sbindir=${base_sbindir} \ + --libexecdir=${base_libdir}/udev \ + --with-rootlibdir=${base_libdir} \ +" + +INITSCRIPT_NAME = "udev" +INITSCRIPT_PARAMS = "start 03 S ." + +PACKAGES =+ "libudev libgudev udev-utils" + +FILES_libudev = "${base_libdir}/libudev.so.*" +FILES_libgudev = "${base_libdir}/libgudev*.so.*" + +FILES_udev-utils = "${bindir}/udevinfo ${bindir}/udevtest ${base_sbindir}/udevadm" + +RPROVIDES_${PN} = "hotplug" +FILES_${PN} += "${usrbindir}/* ${usrsbindir}/udevd" +FILES_${PN}-dbg += "${usrbindir}/.debug ${usrsbindir}/.debug" + +# udev installs binaries under $(udev_prefix)/lib/udev, even if ${libdir} +# is ${prefix}/lib64 +FILES_${PN} += "/lib/udev* ${libdir}/ConsoleKit" +FILES_${PN}-dbg += "/lib/udev/.debug" + +RPROVIDES_udev_append = " udev-compat-wrapper" +RDEPENDS_udev_append_spitz = " udev-compat" +do_unpack_append_spitz() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_append_akita = " udev-compat" +do_unpack_append_akita() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_append_c7x0 = " udev-compat" +do_unpack_append_c7x0() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} +RDEPENDS_udev_append_poodle = " udev-compat" +do_unpack_append_poodle() { + bb.build.exec_func('do_apply_compat_wrapper', d) +} + +# Modify init script on platforms that need to boot old kernels: +do_apply_compat_wrapper() { + cd ${WORKDIR} + sed -i "s:/sbin/udevd:\$UDEVD:g;s:/sbin/udevadm:\$UDEVADM:g" init + patch