| #!/sbin/runscript |
| # Copyright 1999-2008 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| description="Maintain a tarball of not udev managed device nodes" |
| [ -e /etc/conf.d/udev ] && . /etc/conf.d/udev |
| |
| rc_device_tarball=${rc_device_tarball:-${RC_DEVICE_TARBALL:-NO}} |
| device_tarball=/lib/udev/state/devices.tar.bz2 |
| |
| depend() { |
| if [ -f /etc/init.d/sysfs ]; then |
| need udev-mount |
| fi |
| } |
| |
| start() |
| { |
| _start |
| } |
| |
| _start() { |
| if yesno "${rc_device_tarball}" && \ |
| [ -s "${device_tarball}" ] |
| then |
| ebegin "Populating /dev with saved device nodes" |
| tar -jxpf "${device_tarball}" -C /dev |
| eend $? |
| fi |
| } |
| |
| stop() { |
| if [ -e /dev/.devfsd ] || [ ! -e /dev/.udev ] || [ ! -z "${CDBOOT}" ] || \ |
| ! yesno "${rc_device_tarball}" || \ |
| ! touch "${device_tarball}" 2>/dev/null |
| then |
| return 0 |
| fi |
| |
| ebegin "Saving device nodes" |
| # Handle our temp files |
| save_tmp_base=/tmp/udev.savedevices."$$" |
| devices_udev="${save_tmp_base}"/devices.udev |
| devices_real="${save_tmp_base}"/devices.real |
| devices_totar="${save_tmp_base}"/devices.totar |
| device_tmp_tarball="${save_tmp_base}"/devices |
| |
| rm -rf "${save_tmp_base}" |
| mkdir "${save_tmp_base}" |
| touch "${devices_udev}" "${devices_real}" \ |
| "${devices_totar}" "${device_tmp_tarball}" |
| |
| if [ -f "${devices_udev}" -a -f "${devices_real}" -a \ |
| -f "${devices_totar}" -a -f "${device_tmp_tarball}" ] |
| then |
| cd /dev |
| # Find all devices, but ignore .udev directory |
| find . -xdev -type b -or -type c -or -type l | \ |
| cut -d/ -f2- | \ |
| grep -v ^\\.udev >"${devices_real}" |
| |
| # Figure out what udev created |
| udevadm info --export-db | sed -ne 's,^[SN]: \(.*\),\1,p' >"${devices_udev}" |
| # These ones we also do not want in there |
| for x in MAKEDEV core fd initctl pts shm stderr stdin stdout root; do |
| echo "${x}" >> "${devices_udev}" |
| done |
| if [ -d /lib/udev/devices ]; then |
| cd /lib/udev/devices |
| find . -xdev -type b -or -type c -or -type l | \ |
| cut -d/ -f2- >> "${devices_udev}" |
| cd /dev |
| fi |
| |
| fgrep -x -v -f "${devices_udev}" "${devices_real}" > "${devices_totar}" |
| |
| # Now only tarball those not created by udev if we have any |
| if [ -s "${devices_totar}" ]; then |
| # we dont want to descend into mounted filesystems (e.g. devpts) |
| # looking up username may involve NIS/network |
| # and net may be down |
| tar --one-file-system --numeric-owner \ |
| -jcpf "${device_tmp_tarball}" -T "${devices_totar}" |
| mv -f "${device_tmp_tarball}" "${device_tarball}" |
| else |
| rm -f "${device_tarball}" |
| fi |
| eend 0 |
| else |
| eend 1 "Could not create temporary files!" |
| fi |
| |
| rm -rf "${save_tmp_base}" |
| } |
| |