summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/udev/eudev/init
blob: 477a525b21212ad72d2661e27e1218fca9fee5db (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
#!/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

[ -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
}

make_static_nodes () {
    [ -e /lib/modules/$(uname -r)/modules.devname ] || return 0
    [ -x @KMOD@ ] || return 0

    #output to /proc/self/fd/1 since /dev/stdout not created by udevd yet
    @KMOD@ static-nodes --format=tmpfiles --output=/proc/self/fd/1 |
    while read TTYPE TPATH TMODE TUSER TGROUP TAGE TARG; do
    case "${TTYPE}" in
    'd')
            test -d "${TPATH}" || mkdir -p -m "${TMODE}" "${TPATH}"
            ;;

    'c!')
            if [ ! -c "${TPATH}" ]; then
                    old_ifs="${IFS}"
                    IFS=:
                    set -- ${TARG}
                    IFS="${old_ifs}"
                    mknod -m "${TMODE}" "${TPATH}" c "$@"
            fi
            ;;

    *)
            echo "Unparseable line (${TTYPE} ${TPATH} ${TMODE} ${TUSER} ${TGROUP} ${TAGE} ${TARG})"
            return 1
            ;;
    esac
    if [ "${TUSER}" != "-" ]; then
            chown "${TUSER}" "${TPATH}"
    fi
    if [ "${TGROUP}" != "-" ]; then
            chgrp "${TGROUP}" "${TPATH}"
    fi
    done
}

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

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

    make_static_nodes
    # trigger the sorted events
    [ -e /proc/sys/kernel/hotplug ] && printf '\0\n' >/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