aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/udev/udev-118/openmoko/init
blob: e8b2cc57f020736126eb6fd30fa2745ce894143d (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          udev
# Required-Start:    mountkernfs
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Start udevd, populate /dev and load drivers.
### END INIT INFO

# This script is based on Debian's.

COLDPLUG=no
COLDPLUG_TARBALL="/lib/udev/devices.tar.gz"

for x in $(cat /proc/cmdline); do
        case $x in
        coldplug)
		COLDPLUG=yes
                ;;
        esac
done

# we need to unmount /dev/pts/ and remount it later over the tmpfs
unmount_devpts() {
  if mountpoint -q /dev/pts/; then
    umount -n -l /dev/pts/
  fi

  if mountpoint -q /dev/shm/; then
    umount -n -l /dev/shm/
  fi
}

# mount a tmpfs over /dev, if somebody did not already do it
mount_tmpfs() {
  if grep -q "/dev tmpfs" /proc/mounts; then
    return
  fi

  if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs udev /dev; then
    echo "udev requires tmpfs support, not started."
    exit 1
  fi

  return 0
}

create_dev_makedev() {
  if [ -e /sbin/MAKEDEV ]; then
    ln -sf /sbin/MAKEDEV /dev/MAKEDEV
  else
    ln -sf /bin/true /dev/MAKEDEV
  fi
}

make_extra_nodes() {
  ret=1
  if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
    cp -a /lib/udev/devices/* /$1/
    ret=0
  fi

  [ -e /etc/udev/links.conf ] || return $ret

  grep '^[^#]' /etc/udev/links.conf | \
  while read type name arg1; do
    [ "$type" -a "$name" -a ! -e "/$1/$name" -a ! -L "/$1/$name" ] || continue
    case "$type" in
      L) ln -s $arg1 /$1/$name ;;
      D) mkdir -p /$1/$name ;;
      M) mknod -m 600 /$1/$name $arg1 ;;
      *) echo "links.conf: unparseable line ($type $name $arg1)" >&2 ;;
    esac
  done

  return $ret
}

##############################################################################

[ -x /sbin/udevd ] || exit 0

PATH="/sbin:/bin"

# defaults
tmpfs_size="2M"
udev_root="/dev"

if [ -e /etc/udev/udev.conf ]; then
  . /etc/udev/udev.conf
fi

##############################################################################

# When modifying this script, do not forget that between the time that the
# new /dev has been mounted and udevadm trigger 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/.udev/" ]; then
	if mountpoint -q $udev_root/; then
	    TMPFS_MOUNTED=1
	else
	    echo ".udev/ already exists on the static $udev_root!"
	fi
    fi

    echo > /sys/kernel/uevent_helper

    if [ -z "$TMPFS_MOUNTED" ]; then
	unmount_devpts
	mount_tmpfs
    else
	# and clean up the database of the initramfs udev
	rm -rf /dev/.udev/
    fi

    # /dev/null must be created before udevd is started
    if ! make_extra_nodes "$udev_root"; then
	COLDPLUG=yes
    fi
    if [ ! -f "$COLDPLUG_TARBALL" ]; then
	COLDPLUG=yes
    fi

    # if this directory is not present /dev will not be updated by udev
    mkdir -p /dev/.udev/db/

    echo "Startting the hotplug events dispatcher"
    udevd --daemon

    mkdir -p /dev/.udev/queue/ /dev/.udev/rules.d/

    create_dev_makedev

    if [ $COLDPLUG != "no" ]; then
        echo "Synthesizing the initial hotplug events"
        udevadm trigger

        # wait for the udevd childs to finish
        echo "Waiting for /dev to be fully populated"
        if udevadm settle; then
            echo 'done'
        else
            echo 'timeout'
        fi
    fi

    ;;

    stop)
    echo "Stopping the hotplug events dispatcher"
    start-stop-daemon --stop --name udevd --quiet --oknodo
    ;;

    restart)
    echo "Stopping the hotplug events dispatcher"
    start-stop-daemon --stop --name udevd --quiet --oknodo

    echo "Startting the hotplug events dispatcher"
    udevd --daemon
    ;;

    reload|force-reload)
    udevadm control --reload_rules
    ;;

    *)
    echo "Usage: /etc/init.d/udev {start|stop|restart|reload|force-reload}"
    exit 1
    ;;
esac

exit 0