aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-core/udev/udev/init
blob: a96638f734396f0e76a14a51f13ef6311b53a242 (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
#!/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
if [ "$use_udev_cache" != "" ]; then
	[ -f /etc/default/udev-cache ] && . /etc/default/udev-cache
fi
[ -f /etc/udev/udev.conf ] && . /etc/udev/udev.conf
[ -f /etc/default/rcS ] && . /etc/default/rcS

readfiles () {
   READDATA=""
   for filename in $@; do
	   if [ -r $filename ]; then
		   while read line; do
			   READDATA="$READDATA$line"
		   done < $filename
	   fi
   done
}

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
    mount -a -t tmpfs 2>/dev/null
    mkdir -p /var/volatile/tmp

    # Cache handling.
    # 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 /proc/atags"
    if [ "$use_udev_cache" != "" ]; then
	    if [ "$DEVCACHE" != "" ]; then
		    if [ -e $DEVCACHE ]; then
			    readfiles $CMP_FILE_LIST
			    NEWDATA="$READDATA"
			    readfiles /etc/udev/cache.data
			    OLDDATA="$READDATA"
			    if [ "$OLDDATA" = "$NEWDATA" ]; then
				    tar --directory=/ -xf $DEVCACHE > /dev/null 2>&1
				    not_first_boot=1
				    [ "$VERBOSE" != "no" ] && echo "udev: using cache file $DEVCACHE"
				    [ -e /dev/shm/udev.cache ] && rm -f /dev/shm/udev.cache
			    else
				    # Output detailed reason why the cached /dev is not used
				    if [ "$VERBOSE" != "no" ]; then
					    echo "udev: udev cache not used"
					    echo "udev: we use $CMP_FILE_LIST as criteria to judge whether the cache /dev could be resued"
					    echo "udev: olddata: $OLDDATA"
					    echo "udev: newdata: $NEWDATA"
				    fi
				    echo "$NEWDATA" > /dev/shm/udev.cache
			    fi
			    /usr/sbin/setenforce 1
		    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.
				    readfiles $CMP_FILE_LIST
				    echo "$READDATA" > /dev/shm/udev.cache
			    fi
		    fi
	    fi
    fi

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

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

    /usr/bin/udevadm control --env=STARTUP=1
    if [ "$not_first_boot" != "" ];then
            /usr/bin/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	--subsystem-nomatch=platform
            (/usr/bin/udevadm settle --timeout=10; /usr/bin/udevadm control --env=STARTUP=)&
    else
            /usr/bin/udevadm trigger --action=add
            /usr/bin/udevadm settle
    fi

    test ! -x /sbin/restorecon || /sbin/restorecon -F /dev

    ;;
  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