summaryrefslogtreecommitdiff
path: root/meta/recipes-core/udev/eudev/init
blob: 0ab028b391eb3e75243f963d2384ed1e479c7ed1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/sh

### 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 @UDEVD@ ] || exit 1
SYSCONF_CACHED="/etc/udev/cache.data"
SYSCONF_TMP="/dev/shm/udev.cache"
DEVCACHE_REGEN="/dev/shm/udev-regen" # create to request cache regen

# A list of files which are used as a criteria to judge whether the udev cache could be reused.
CMP_FILE_LIST="/proc/version /proc/cmdline /proc/devices"
[ -f /proc/atags ] && CMP_FILE_LIST="$CMP_FILE_LIST /proc/atags"

# List of files whose metadata (size/mtime/name) will be included in cached
# system state.
META_FILE_LIST="lib/udev/rules.d/* etc/udev/rules.d/*"

# Command to compute system configuration.
sysconf_cmd () {
	cat -- $CMP_FILE_LIST
	stat -c '%s %Y %n' -- $META_FILE_LIST | awk -F/ '{print $1 " " $NF;}'
}

[ -f /etc/default/udev-cache ] && . /etc/default/udev-cache
[ -f /etc/udev/udev.conf ] && . /etc/udev/udev.conf
[ -f /etc/default/rcS ] && . /etc/default/rcS

kill_udevd () {
    pid=`pidof -x udevd`
    [ -n "$pid" ] && kill $pid
}

case "$1" in
  start)
    export ACTION=add
    # propagate /dev from /sys
    echo "Starting udev"

    # Check for requireed devtmpfs before trying to start udev and
    # mount a no-existant fs.
    if ! grep -q devtmpfs /proc/filesystems
    then
        echo "Missing devtmpfs, which is required for udev to run";
        echo "Halting..."
        halt
    fi
    # mount the devtmpfs on /dev, if not already done
    LANG=C awk '$2 == "/dev" && ($3 == "devtmpfs") { exit 1 }' /proc/mounts && {
            mount -n -o mode=0755 -t devtmpfs none "/dev"
    }
    [ -e /dev/pts ] || mkdir -m 0755 /dev/pts
    [ -e /dev/shm ] || mkdir -m 1777 /dev/shm
    # the automount rule for udev needs /tmp directory available, as /tmp is a symlink
    # to /var/tmp which in turn is a symlink to /var/volatile/tmp, we need to make sure
    # /var/volatile/tmp directory to be available.
    mkdir -m 1777 -p /var/volatile/tmp

    # Cache handling.
    if [ "$DEVCACHE" != "" ]; then
            if [ -e $DEVCACHE ]; then
		    sysconf_cmd > "$SYSCONF_TMP"
		    if cmp $SYSCONF_CACHED $SYSCONF_TMP >/dev/null; then
                            tar xmf $DEVCACHE -C / -m
                            not_first_boot=1
                            [ "$VERBOSE" != "no" ] && echo "udev: using cache file $DEVCACHE"
                            [ -e $SYSCONF_TMP ] && rm -f "$SYSCONF_TMP"
                            [ -e "$DEVCACHE_REGEN" ] && rm -f "$DEVCACHE_REGEN"
                    else
			    # Output detailed reason why the cached /dev is not used
			    cat <<EOF
udev: Not using udev cache because of changes detected in the following files:
udev:     $CMP_FILE_LIST
udev:     $META_FILE_LIST
udev: The udev cache will be regenerated. To identify the detected changes,
udev: compare the cached sysconf at   $SYSCONF_CACHED
udev: against the current sysconf at  $SYSCONF_TMP
EOF
			    touch "$DEVCACHE_REGEN"
                    fi
	    else
		    if [ "$ROOTFS_READ_ONLY" != "yes" ]; then
			    # If rootfs is not read-only, it's possible that a new udev cache would be generated;
			    # otherwise, we do not bother to read files.
			    touch "$DEVCACHE_REGEN"
		    fi
            fi
    fi

    # make_extra_nodes
    kill_udevd > "/dev/null" 2>&1

    # trigger the sorted events
    [ -e /proc/sys/kernel/hotplug ] && echo -e '\000' >/proc/sys/kernel/hotplug
    @UDEVD@ -d

    udevadm control --env=STARTUP=1
    if [ "$not_first_boot" != "" ];then
            if [ "$PROBE_PLATFORM_BUS" != "yes" ]; then
                PLATFORM_BUS_NOMATCH="--subsystem-nomatch=platform"
            else
                PLATFORM_BUS_NOMATCH=""
            fi
            udevadm trigger --action=add --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 $PLATFORM_BUS_NOMATCH
            (udevadm settle --timeout=3; udevadm control --env=STARTUP=)&
    else
            udevadm trigger --action=add
            udevadm settle
    fi
    ;;
  stop)
    echo "Stopping udevd"
    start-stop-daemon --stop --name udevd --quiet
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  status)
    pid=`pidof -x udevd`
    if [ -n "$pid" ]; then
	echo "udevd (pid $pid) is running ..."
    else
	echo "udevd is stopped"
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac
exit 0