aboutsummaryrefslogtreecommitdiffstats
path: root/udev/udev-042/init
blob: 4e318812749a11c023c0bd9a4351ecd6fed0fa2b (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
#!/bin/sh -e

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

UDEVSTART=/sbin/udevstart

# default maximum size of the /dev ramfs
ramfs_size="1M"

[ -x $UDEVSTART ] || exit 0

. /etc/udev/udev.conf

case "$(uname -r)" in
  2.[012345].*)
    echo "udev requires a kernel >= 2.6, not started."
    exit 0
    ;;
esac

if ! grep -q '[[:space:]]ramfs$' /proc/filesystems; then
    echo "udev requires ramfs support, not started."
    exit 0
fi

if [ ! -e /proc/sys/kernel/hotplug ]; then
    echo "udev requires hotplug support, not started."
    exit 0
fi

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

# we need to unmount /dev/pts/ and remount it later over the ramfs
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 ramfs over /dev, if somebody did not already do it
mount_ramfs() {
  if grep -E -q "^[^[:space:]]+ /dev ramfs" /proc/mounts; then
    return 0
  fi

  # /.dev is used by /sbin/MAKEDEV to access the real /dev directory.
  # if you don't like this, remove /.dev/.
  [ -d /.dev ] && mount --bind /dev /.dev

  echo -n "Mounting a ramfs over /dev..."
  mount -n -o size=$ramfs_size,mode=0755 -t ramfs none /dev
  echo "done."
}

# I hate this hack.  -- Md
make_extra_nodes() {
  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 --mode=600 /dev/$name $arg1
      ;;
    *)
      echo "unparseable line ($type $name $arg1)"
      ;;
    esac
  done
}

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

if [ "$udev_root" != "/dev/" ]; then
  echo "WARNING: udev_root != /dev/"

case "$1" in
  start)
    if [ -e "$udev_root/.udev.tdb" ]; then
      if mountpoint -q /dev/; then
        echo "FATAL: udev is already active on $udev_root."
        exit 1
      else
        echo "WARNING: .udev.tdb already exists on the old $udev_root!"
      fi
    fi
    mount -n -o size=$ramfs_size,mode=0755 -t ramfs none $udev_root
    echo -n "Creating initial device nodes..."
    $UDEVSTART
    echo "done."
    ;;
  stop)
    start-stop-daemon --stop --exec /sbin/udevd --oknodo --quiet
    echo -n "Unmounting $udev_root..."
    # unmounting with -l should never fail
    if umount -l $udev_root; then
      echo "done."
    else
      echo "failed."
    fi
    ;;
  restart|force-reload)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}"
    exit 1
    ;;
esac

  exit 0
fi # udev_root != /dev/

##############################################################################
# When modifying this script, do not forget that between the time that
# the new /dev has been mounted and udevstart 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.tdb" ]; then
      if mountpoint -q /dev/; then
        echo "FATAL: udev is already active on $udev_root."
        exit 1
      else
        echo "WARNING: .udev.tdb already exists on the old $udev_root!"
      fi
    fi
    unmount_devpts
    mount_ramfs
    ACTION=add
    echo -n "Creating initial device nodes..."
    $UDEVSTART
    make_extra_nodes
    echo "done."
#    /etc/init.d/mountvirtfs start
    ;;
  stop)
    start-stop-daemon --stop --exec /sbin/udevd --oknodo --quiet
    unmount_devpts
    echo -n "Unmounting /dev..."
    # unmounting with -l should never fail
    if umount -l /dev; then
      echo "done."
      umount -l /.dev || true
#      /etc/init.d/mountvirtfs start
    else
      echo "failed."
    fi
    ;;
  restart|force-reload)
    start-stop-daemon --stop --exec /sbin/udevd --oknodo --quiet
    echo -n "Recreating device nodes..."
    ACTION=add
    $UDEVSTART
    make_extra_nodes
    echo "done."
    ;;
  *)
    echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}"
    exit 1
    ;;
esac

exit 0