summaryrefslogtreecommitdiff
path: root/packages/udev/udev-118/init
blob: e44c675f2f0f3c5adbb725e974517d07eadba926 (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
#!/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

# 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
  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 udev /dev; then
    umount /etc/udev
    echo "udev requires tmpfs support, not started."
    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
}

make_extra_nodes() {
  [ -c /dev/null ] || mknod -m 666 /dev/null c 1 3
# I hate this hack.  -- Md
  if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
    cp -a /lib/udev/devices/* /dev/
  fi

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

supported_kernel() {
  case "$(uname -r)" in
    2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
    2.6.1[0134]|2.6.1[01234][!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
}

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

PATH="/sbin:/bin:/usr/bin"

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

# defaults
tmpfs_size="2M"

. /etc/udev/udev.conf

if ! supported_kernel; then
  echo "udev requires a kernel >= 2.6.15, 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

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

# When modifying this script, do not forget that between the time that
# the new /dev has been mounted and udevsynthesize has been run there will be
# no /dev/null. This also means that you cannot use the "&" shell command.
case "$1" in
    start)
    unmount_devpts
    mount_tmpfs
    [ -d /proc/1 ] || mount -n /proc

    # /dev/null must be created before udevd is started
    make_extra_nodes

    # It's all over netlink now
    if [ -e /proc/sys/kernel/hotplug ]; then
        echo "" > /proc/sys/kernel/hotplug
    fi

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

    echo "Synthesizing the initial hotplug events"
    udevtrigger
    udevsettle
    ;;

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

    restart|force-reload)
    echo "Stopping the hotplug events dispatcher" "udevd"
    if start-stop-daemon --stop --name udevd --quiet ; then
	exit 1
    fi

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

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

exit 0