summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2012-04-03 21:08:04 +0200
committerKay Sievers <kay.sievers@vrfy.org>2012-04-03 21:08:04 +0200
commit19c5f19d69bb5f520fa7213239490c55de06d99d (patch)
tree0066ff6b95da3b86812f72f771fd09bab25d4e7a
parent3eff4208ffecedd778fec260f0d4b18e94dab443 (diff)
parent4db539b27021dcaa716828cbb689f591adb5af23 (diff)
import udev repository
-rw-r--r--src/udev/.gitignore40
-rw-r--r--src/udev/.vimrc4
-rw-r--r--src/udev/COPYING339
-rw-r--r--src/udev/ChangeLog6387
-rw-r--r--src/udev/INSTALL44
-rw-r--r--src/udev/Makefile.am712
-rw-r--r--src/udev/NEWS1735
-rw-r--r--src/udev/README101
-rw-r--r--src/udev/TODO22
-rwxr-xr-xsrc/udev/autogen.sh44
-rw-r--r--src/udev/configure.ac242
-rw-r--r--src/udev/m4/.gitignore4
-rw-r--r--src/udev/rules/42-usb-hid-pm.rules49
-rw-r--r--src/udev/rules/50-udev-default.rules107
-rw-r--r--src/udev/rules/60-persistent-alsa.rules14
-rw-r--r--src/udev/rules/60-persistent-input.rules38
-rw-r--r--src/udev/rules/60-persistent-serial.rules20
-rw-r--r--src/udev/rules/60-persistent-storage-tape.rules25
-rw-r--r--src/udev/rules/60-persistent-storage.rules89
-rw-r--r--src/udev/rules/75-net-description.rules14
-rw-r--r--src/udev/rules/75-tty-description.rules14
-rw-r--r--src/udev/rules/78-sound-card.rules89
-rw-r--r--src/udev/rules/80-drivers.rules12
-rw-r--r--src/udev/rules/95-udev-late.rules4
-rw-r--r--src/udev/src/.gitignore5
-rw-r--r--src/udev/src/COPYING502
-rw-r--r--src/udev/src/accelerometer/61-accelerometer.rules3
-rw-r--r--src/udev/src/accelerometer/accelerometer.c357
-rw-r--r--src/udev/src/ata_id/ata_id.c721
-rw-r--r--src/udev/src/cdrom_id/60-cdrom_id.rules20
-rw-r--r--src/udev/src/cdrom_id/cdrom_id.c1099
-rw-r--r--src/udev/src/collect/collect.c473
-rw-r--r--src/udev/src/docs/.gitignore17
-rw-r--r--src/udev/src/docs/Makefile.am99
-rw-r--r--src/udev/src/docs/libudev-docs.xml32
-rw-r--r--src/udev/src/docs/libudev-sections.txt127
-rw-r--r--src/udev/src/docs/libudev.types0
-rw-r--r--src/udev/src/docs/version.xml.in1
-rw-r--r--src/udev/src/floppy/60-floppy.rules4
-rw-r--r--src/udev/src/floppy/create_floppy_devices.c177
-rw-r--r--src/udev/src/gudev/.gitignore9
-rw-r--r--src/udev/src/gudev/COPYING502
-rw-r--r--src/udev/src/gudev/docs/.gitignore16
-rw-r--r--src/udev/src/gudev/docs/Makefile.am106
-rw-r--r--src/udev/src/gudev/docs/gudev-docs.xml93
-rw-r--r--src/udev/src/gudev/docs/gudev-sections.txt113
-rw-r--r--src/udev/src/gudev/docs/gudev.types4
-rw-r--r--src/udev/src/gudev/docs/version.xml.in1
-rwxr-xr-xsrc/udev/src/gudev/gjs-example.js75
-rw-r--r--src/udev/src/gudev/gudev-1.0.pc.in11
-rw-r--r--src/udev/src/gudev/gudev.h33
-rw-r--r--src/udev/src/gudev/gudevclient.c527
-rw-r--r--src/udev/src/gudev/gudevclient.h100
-rw-r--r--src/udev/src/gudev/gudevdevice.c963
-rw-r--r--src/udev/src/gudev/gudevdevice.h128
-rw-r--r--src/udev/src/gudev/gudevenumerator.c431
-rw-r--r--src/udev/src/gudev/gudevenumerator.h107
-rw-r--r--src/udev/src/gudev/gudevenums.h49
-rw-r--r--src/udev/src/gudev/gudevenumtypes.c.template39
-rw-r--r--src/udev/src/gudev/gudevenumtypes.h.template24
-rw-r--r--src/udev/src/gudev/gudevmarshal.list1
-rw-r--r--src/udev/src/gudev/gudevprivate.h41
-rw-r--r--src/udev/src/gudev/gudevtypes.h51
-rwxr-xr-xsrc/udev/src/gudev/seed-example-enum.js38
-rwxr-xr-xsrc/udev/src/gudev/seed-example.js72
-rw-r--r--src/udev/src/keymap/.gitignore5
-rw-r--r--src/udev/src/keymap/95-keyboard-force-release.rules54
-rw-r--r--src/udev/src/keymap/95-keymap.rules170
-rw-r--r--src/udev/src/keymap/README.keymap.txt101
-rwxr-xr-xsrc/udev/src/keymap/check-keymaps.sh38
-rwxr-xr-xsrc/udev/src/keymap/findkeyboards68
-rw-r--r--src/udev/src/keymap/force-release-maps/common-volume-keys3
-rw-r--r--src/udev/src/keymap/force-release-maps/dell-touchpad1
-rw-r--r--src/udev/src/keymap/force-release-maps/hp-other3
-rw-r--r--src/udev/src/keymap/force-release-maps/samsung-90x3a6
-rw-r--r--src/udev/src/keymap/force-release-maps/samsung-other10
-rwxr-xr-xsrc/udev/src/keymap/keyboard-force-release.sh.in22
-rw-r--r--src/udev/src/keymap/keymap.c447
-rw-r--r--src/udev/src/keymap/keymaps/acer22
-rw-r--r--src/udev/src/keymap/keymaps/acer-aspire_57204
-rw-r--r--src/udev/src/keymap/keymaps/acer-aspire_5920g5
-rw-r--r--src/udev/src/keymap/keymaps/acer-aspire_69205
-rw-r--r--src/udev/src/keymap/keymaps/acer-aspire_89305
-rw-r--r--src/udev/src/keymap/keymaps/acer-travelmate_c3005
-rw-r--r--src/udev/src/keymap/keymaps/asus3
-rw-r--r--src/udev/src/keymap/keymaps/compaq-e_evo4
-rw-r--r--src/udev/src/keymap/keymaps/dell29
-rw-r--r--src/udev/src/keymap/keymaps/dell-latitude-xt24
-rw-r--r--src/udev/src/keymap/keymaps/everex-xt50007
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-amilo_li_27323
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-amilo_pa_25483
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-amilo_pro_edition_v35054
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-amilo_pro_v32052
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-amilo_si_15206
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-esprimo_mobile_v54
-rw-r--r--src/udev/src/keymap/keymaps/fujitsu-esprimo_mobile_v62
-rw-r--r--src/udev/src/keymap/keymaps/genius-slimstar-32035
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard12
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-2510p_2530p2
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-compaq_elitebook2
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-pavilion3
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-presario-21003
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-tablet6
-rw-r--r--src/udev/src/keymap/keymaps/hewlett-packard-tx23
-rw-r--r--src/udev/src/keymap/keymaps/ibm-thinkpad-usb-keyboard-trackpoint7
-rw-r--r--src/udev/src/keymap/keymaps/inventec-symphony_6.0_7.02
-rw-r--r--src/udev/src/keymap/keymaps/lenovo-30005
-rw-r--r--src/udev/src/keymap/keymaps/lenovo-ideapad8
-rw-r--r--src/udev/src/keymap/keymaps/lenovo-thinkpad-usb-keyboard-trackpoint13
-rw-r--r--src/udev/src/keymap/keymaps/lenovo-thinkpad_x200_tablet6
-rw-r--r--src/udev/src/keymap/keymaps/lenovo-thinkpad_x6_tablet8
-rw-r--r--src/udev/src/keymap/keymaps/lg-x11012
-rw-r--r--src/udev/src/keymap/keymaps/logitech-wave16
-rw-r--r--src/udev/src/keymap/keymaps/logitech-wave-cordless15
-rw-r--r--src/udev/src/keymap/keymaps/logitech-wave-pro-cordless12
-rw-r--r--src/udev/src/keymap/keymaps/maxdata-pro_70009
-rw-r--r--src/udev/src/keymap/keymaps/medion-fid20602
-rw-r--r--src/udev/src/keymap/keymaps/medionnb-a5554
-rw-r--r--src/udev/src/keymap/keymaps/micro-star13
-rw-r--r--src/udev/src/keymap/keymaps/module-asus-w3j11
-rw-r--r--src/udev/src/keymap/keymaps/module-ibm16
-rw-r--r--src/udev/src/keymap/keymaps/module-lenovo17
-rw-r--r--src/udev/src/keymap/keymaps/module-sony8
-rw-r--r--src/udev/src/keymap/keymaps/module-sony-old2
-rw-r--r--src/udev/src/keymap/keymaps/module-sony-vgn8
-rw-r--r--src/udev/src/keymap/keymaps/olpc-xo74
-rw-r--r--src/udev/src/keymap/keymaps/onkyo14
-rw-r--r--src/udev/src/keymap/keymaps/oqo-model25
-rw-r--r--src/udev/src/keymap/keymaps/samsung-90x3a5
-rw-r--r--src/udev/src/keymap/keymaps/samsung-other14
-rw-r--r--src/udev/src/keymap/keymaps/samsung-sq1us7
-rw-r--r--src/udev/src/keymap/keymaps/samsung-sx20s4
-rw-r--r--src/udev/src/keymap/keymaps/toshiba-satellite_a1002
-rw-r--r--src/udev/src/keymap/keymaps/toshiba-satellite_a11010
-rw-r--r--src/udev/src/keymap/keymaps/toshiba-satellite_m30x6
-rw-r--r--src/udev/src/keymap/keymaps/zepto-znote11
-rw-r--r--src/udev/src/libudev-device-private.c185
-rw-r--r--src/udev/src/libudev-device.c1744
-rw-r--r--src/udev/src/libudev-enumerate.c947
-rw-r--r--src/udev/src/libudev-list.c344
-rw-r--r--src/udev/src/libudev-monitor.c874
-rw-r--r--src/udev/src/libudev-private.h213
-rw-r--r--src/udev/src/libudev-queue-private.c412
-rw-r--r--src/udev/src/libudev-queue.c474
-rw-r--r--src/udev/src/libudev-selinux-private.c109
-rw-r--r--src/udev/src/libudev-util-private.c242
-rw-r--r--src/udev/src/libudev-util.c570
-rw-r--r--src/udev/src/libudev.c457
-rw-r--r--src/udev/src/libudev.h189
-rw-r--r--src/udev/src/libudev.pc.in11
-rw-r--r--src/udev/src/mtd_probe/75-probe_mtd.rules8
-rw-r--r--src/udev/src/mtd_probe/mtd_probe.c51
-rw-r--r--src/udev/src/mtd_probe/mtd_probe.h49
-rw-r--r--src/udev/src/mtd_probe/probe_smartmedia.c97
-rw-r--r--src/udev/src/rule_generator/75-cd-aliases-generator.rules9
-rw-r--r--src/udev/src/rule_generator/75-persistent-net-generator.rules102
-rw-r--r--src/udev/src/rule_generator/rule_generator.functions113
-rw-r--r--src/udev/src/rule_generator/write_cd_rules126
-rw-r--r--src/udev/src/rule_generator/write_net_rules141
-rw-r--r--src/udev/src/scsi_id/.gitignore1
-rw-r--r--src/udev/src/scsi_id/README4
-rw-r--r--src/udev/src/scsi_id/scsi.h97
-rw-r--r--src/udev/src/scsi_id/scsi_id.8119
-rw-r--r--src/udev/src/scsi_id/scsi_id.c657
-rw-r--r--src/udev/src/scsi_id/scsi_id.h73
-rw-r--r--src/udev/src/scsi_id/scsi_serial.c990
-rw-r--r--src/udev/src/sd-daemon.c530
-rw-r--r--src/udev/src/sd-daemon.h282
-rw-r--r--src/udev/src/test-libudev.c501
-rw-r--r--src/udev/src/test-udev.c121
-rw-r--r--src/udev/src/udev-builtin-blkid.c207
-rw-r--r--src/udev/src/udev-builtin-firmware.c168
-rw-r--r--src/udev/src/udev-builtin-hwdb.c247
-rw-r--r--src/udev/src/udev-builtin-input_id.c218
-rw-r--r--src/udev/src/udev-builtin-kmod.c142
-rw-r--r--src/udev/src/udev-builtin-path_id.c498
-rw-r--r--src/udev/src/udev-builtin-usb_id.c482
-rw-r--r--src/udev/src/udev-builtin.c134
-rw-r--r--src/udev/src/udev-control.socket10
-rw-r--r--src/udev/src/udev-ctrl.c494
-rw-r--r--src/udev/src/udev-event.c1011
-rw-r--r--src/udev/src/udev-kernel.socket10
-rw-r--r--src/udev/src/udev-node.c379
-rw-r--r--src/udev/src/udev-rules.c2767
-rw-r--r--src/udev/src/udev-settle.service.in25
-rw-r--r--src/udev/src/udev-trigger.service.in10
-rw-r--r--src/udev/src/udev-watch.c170
-rw-r--r--src/udev/src/udev.conf3
-rw-r--r--src/udev/src/udev.h188
-rw-r--r--src/udev/src/udev.pc.in5
-rw-r--r--src/udev/src/udev.service.in14
-rw-r--r--src/udev/src/udev.xml695
-rw-r--r--src/udev/src/udevadm-control.c175
-rw-r--r--src/udev/src/udevadm-info.c568
-rw-r--r--src/udev/src/udevadm-monitor.c297
-rw-r--r--src/udev/src/udevadm-settle.c235
-rw-r--r--src/udev/src/udevadm-test-builtin.c128
-rw-r--r--src/udev/src/udevadm-test.c173
-rw-r--r--src/udev/src/udevadm-trigger.c232
-rw-r--r--src/udev/src/udevadm.c165
-rw-r--r--src/udev/src/udevadm.xml472
-rw-r--r--src/udev/src/udevd.c1746
-rw-r--r--src/udev/src/udevd.xml151
-rw-r--r--src/udev/src/v4l_id/60-persistent-v4l.rules20
-rw-r--r--src/udev/src/v4l_id/v4l_id.c87
-rw-r--r--src/udev/test/.gitignore1
-rwxr-xr-xsrc/udev/test/rule-syntax-check.py64
-rwxr-xr-xsrc/udev/test/rules-test.sh15
-rw-r--r--src/udev/test/sys.tar.xzbin0 -> 165116 bytes
-rwxr-xr-xsrc/udev/test/udev-test.pl1560
210 files changed, 43585 insertions, 0 deletions
diff --git a/src/udev/.gitignore b/src/udev/.gitignore
new file mode 100644
index 000000000..fa3500ba9
--- /dev/null
+++ b/src/udev/.gitignore
@@ -0,0 +1,40 @@
+*~
+*.o
+*.a
+*.lo
+*.la
+.libs
+.deps
+.dirstamp
+Makefile
+Makefile.in
+/aclocal.m4
+/autom4te.cache
+/config.h
+/config.h.in
+/config.log
+/config.status
+/config.guess
+/config.sub
+/libtool
+/ltmain.sh
+/install-sh
+/missing
+/configure
+/stamp-h1
+/depcomp
+/gtk-doc.make
+/build-aux
+/udev-test-install
+/udevd
+/udevadm
+/test-udev
+/test-libudev
+/accelerometer
+/ata_id
+/cdrom_id
+/collect
+/mtd_probe
+/v4l_id
+/keymap
+/scsi_id
diff --git a/src/udev/.vimrc b/src/udev/.vimrc
new file mode 100644
index 000000000..366fbdca4
--- /dev/null
+++ b/src/udev/.vimrc
@@ -0,0 +1,4 @@
+" 'set exrc' in ~/.vimrc will read .vimrc from the current directory
+set tabstop=8
+set shiftwidth=8
+set expandtab
diff --git a/src/udev/COPYING b/src/udev/COPYING
new file mode 100644
index 000000000..d159169d1
--- /dev/null
+++ b/src/udev/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/src/udev/ChangeLog b/src/udev/ChangeLog
new file mode 100644
index 000000000..dd5813826
--- /dev/null
+++ b/src/udev/ChangeLog
@@ -0,0 +1,6387 @@
+Summary of changes from v181 to v182
+============================================
+
+Kay Sievers (22):
+ build-sys: unpack test sysfs only for 'make check'
+ build-sys: add --disable-manpages
+ update sd-daemon files
+ test: remove outdated key attributes
+ update TOO
+ builtin: path_id - remove dead cciss code
+ rules: do not create by-id/scsi-* links for ATA devices
+ remove udev-acl
+ udev.conf - do not set any value by default
+ move src/extras subdirectories to src/
+ rules: delete outdated 30-kernel-compat.rules
+ rules: move 42-qemu-usb.rules to rules/ dir
+ remove edd_id extra
+ build-sys: remove empty directory
+ rules: delete s390 rules, they will move to s390utils
+ update TODO
+ rules: move all rules to top level rules/ dir
+ extras: path_id - skip ATA transport class devices
+ extras: path_id - add comment about readdir() rebase logic
+ extras: ata_id - do not log error if HDIO_GET_IDENTITY fails
+ rules sort order: /lib, /run, /etc
+ build-sys: place build binaries in the root
+
+Matthew Garrett (1):
+ rules: Enable USB autosuspend on more USB HID devices
+
+
+Summary of changes from v180 to v181
+============================================
+
+Andreas Schwab (1):
+ ata_id: fix identify string fixup
+
+Bruno Redondi (1):
+ keymap: Add Fujitsu Siemens Amilo Li 2732
+
+James M. Leddy (1):
+ keymap: Fix touchpad toggle button on Lenovo Ideapad
+
+Kay Sievers (4):
+ configure: show ROOTPREFIX in firmware path option help text
+ extras: cdrom_id - create /dev/cdrom and conditionally /dev/dvd for sr0
+ extras: cdrom_id - create only /dev/cdrom
+ ata_id: whitespace fixes
+
+Lucas De Marchi (1):
+ builtin: kmod - depend on libkmod >= 5
+
+
+Summary of changes from v179 to v180
+============================================
+
+Kay Sievers (4):
+ Makefile: update kernel.org hooks
+ build-sys: we need to install shipped man pages without xsltproc installed
+ builtin: blkid - add missing ID_ prefix for PART_ENTRY_* keys
+ do not stop rule processing when device node is no longer around
+
+
+Summary of changes from v178 to v179
+============================================
+
+Kay Sievers (8):
+ fix some fallout from tab removal
+ use devnode() for $name not sysname(), device nodes might be in a subdirectory
+ print warning when rules try to rename kernel device nodes
+ move variable inside condition
+ update TODO
+ build-sys: enable everything for 'make distcheck'
+ use sysname() for devices without a device node
+ fix path to extras
+
+
+Summary of changes from v177 to v178
+============================================
+
+Evan Nemerson (1):
+ gudev: several minor introspection fixes
+
+Kay Sievers (7):
+ Makefile: update kernel.org doc hooks for kup
+ builtin: blkid - add missing ID_ prefix
+ udevd: kill hanging event processes after 30 seconds
+ Makefile: switch from .asc to .sign
+ rules: rtc - point /dev/rtc symlink to 'hctosys' device
+ warn about deprecated RUN+="socket:" use
+ libudev: do not set DEVNAME= twice
+
+Martin Pitt (4):
+ keymap: Fix rfkill button on Hewlett-Packard HP ProBook
+ keymap: Fix eject button on Samsung 700Z series
+ keymap: Fix keyboard brightness keys on Samsung 700Z series
+ keymap: Add Alienware M14xR1
+
+
+Summary of changes from v176 to v177
+============================================
+
+Kay Sievers (3):
+ Makefile: update kernel.org sign and upload hook
+ rule_generator: fix to install rules in rules.d/
+ rule_generator: use += for dist_udevhome_DATA
+
+
+Summary of changes from v175 to v176
+============================================
+
+Alan Stern (1):
+ [PATCH[ udev: ata_id: Fix length of INQUIRY command
+
+Kay Sievers (61):
+ libudev: print log_fn address instead of ctx when setting logging function
+ do not ship autogen.sh in the tarball
+ man: clarify 'config file stack'
+ rename 'init' directory to 'systemd'
+ systemd: use PassCred=yes
+ use libexecdir, bindir, sbindir, switch to /usr/lib/udev in documentation
+ configure: fix typo
+ make: do not (mis-)use the config file generator, create .xz tarball
+ prepare builtins for blkid and kmod
+ add builtin load/unload initializers
+ build argv[] for builtin commands
+ update blkid builtin
+ rules: switch to built-in blkid
+ rules: do not preprocess 60-persistent-storage.rules
+ buildsys: disable tar.gz
+ builtin: blkid - add missing newline
+ builtin: blkid - add missing ID_FS_USAGE
+ builtin: kmod - switch modprobe to builtin
+ rules: do not preprocess 80-drivers.rules + 75-probe_mtd.rules
+ builtin: apply format string
+ remove last sbindir use
+ update NEWS
+ autogen.sh: moce CFLAGS from to configure.ac; print common ./configure options
+ builtin: kmod - link against libkmod
+ add copyright
+ builtin: kmod - reload index when rules are reloaded
+ builtin: rename load()/unload() to init()/exit()
+ invalidate rules and kmod index with 'udevadm control --reload'
+ update NEWS
+ builtin: firmware - move 'firmware' tool to builtins
+ builtin: firmware - add missing file
+ builtin: kmod - hook up udev main logging to libkmod
+ make: introduce --with-rootprefix=
+ update NEWS
+ move rules dirs to udev context; replace inotify with time-controlled stat()
+ udevd: always create runtime dir
+ builtin: move usb-db, pci-db to builtins
+ builtin: kmod - switch to kmod_module_probe_insert_module()
+ udevd: remove TIMEOUT= handling
+ update README
+ systemd: rename PassCred= to PsssCredentials=
+ remove mknod() logic and rely on 'devtmpfs'
+ builtin: kmod - hook up kmod_validate_resources()
+ build-sys: use use ${ac_default_prefix}
+ require kmod >= 3
+ build-sys: use --libexecdir=/usr/lib instead of /usr/lib/udev
+ autogen.sh: enable git pre-commit
+ merge udev/, libudev/, systemd/ files in src/; move extras/ to src/
+ replace unpacked sysfs test tree 'test/sys/' with packed tarball
+ rules: delete arch specific rules
+ doc: fix out of tree build (copy from libkmod)
+ autogen.sh: add CFLAGS and print entire line, so that mouse copy/paste works
+ build-sys: try to build without installed xsltproc
+ add test/src to .gitignore
+ tabs are as useful as a hole in the head
+ autogen.sh: makedev() misteriously breaks with -O0 here, use -O1 for now
+ fix debug message
+ add .vimrc
+ cdrom_id: int -> bool
+ fix compiler warning
+ man: mention that no daemons should be started by udev
+
+Lucas De Marchi (1):
+ builtin: kmod - log if modules are blacklisted
+
+Luis Felipe Strano Moraes (1):
+ Switch spawn_read to void and remove useless stores there.
+
+Martin Pitt (1):
+ 75-persistent-net-generator.rules: Add Xen
+
+Mike Frysinger (1):
+ hwdb: drop useless line freeing
+
+Sjoerd Simons (1):
+ keymap: Add Lenovo Thinkpad X220 Tablet
+
+Ville Skyttä (1):
+ man: spelling fix
+
+
+Summary of changes from v174 to v175
+============================================
+
+David Zeuthen (2):
+ gudev: Use strtoul to parse unsigned 64-bit integers
+ gudev: Use g_ascii_strtoull() instead of strtoul()
+
+Harald Hoyer (1):
+ extras/keymap/findkeyboards: beautify shell code and get rid of grep
+
+Jerone Young (1):
+ keymap: Fix micmute remap for Lenovo Thinkpads
+
+Kay Sievers (7):
+ make: add gpg signing bits
+ ignore entire rules line if unknown keys are used
+ do not skip /dev/{disk,char}/M:m removal when the device node is already gone
+ replace AC_DISABLE_STATIC with LT_INIT([disable-static])
+ make: tweak some autofoo according to Flameeyes' recommendations for libabc
+ rules: restore rule to set cdrom group for optical drives
+ rules: fix typo
+
+Martin Pitt (8):
+ check-keymaps.sh: Allow running separately
+ extras/keymap/findkeyboards: Filter out non-event devices
+ findkeyboards: Consistently use spaces instead of tabs
+ keymap: Fix stuck keys on GIGABYTE i1520M
+ keymap: More Asus module variants
+ keymap: Fix "internet" key on HP G62
+ keymap: Fix bluetooth key on Acer TravelMate 7720
+ keymap: Fix stuck keys on BenQ nScreen
+
+
+Summary of changes from v173 to v174
+============================================
+
+David Zeuthen (1):
+ ata_id: Check for Compact Flash card
+
+Jerone Young (1):
+ Add mic mute keycode support for Lenovo Thinkpad USB keyboard
+
+Kay Sievers (34):
+ gtk-doc: delete empty files
+ libudev: list - use binary search for list lookup
+ rules: move input_id to default rules
+ implement path_id, usb_id, input_id as built-in command
+ do not remove static nodes on module unload
+ rules: remove legacy rules for cdrom and usb printer
+ update TODO
+ preserve 'sticky bit' on 'add/change' events
+ libudev: util_get_sys_(subsystem,driver}() -> util_get_sys_core_link_value()
+ export USEC_INITIALIZED= and take timestamp on message receive time
+ libudev: udev_device_get_sysattr_value() return syspath of custom links
+ libudev: list - properly sort linked list not only the index
+ mknod: do not complain about existing node
+ update README
+ libudev: fix typo in documentation
+ rules: fuse: do not mount fusectl from udev rules
+ keymap: add genius keymap to Makefile
+ update NEWS
+ usb_id: can't use global variables when used as built-in
+ remove 'udevadm trigger --type=failed' and SYSFS, ID, BUS keys
+ libudev: export udev_util_encode_string()
+ update TODO
+ systemd: no not start udev in a container
+ systemd: no not start udev in a container
+ delete left-over files in extras/
+ systemd: update drop-in sd-daemon files
+ udevadm: control - use /run/udev/control socket instead of abstract namespace one
+ udevd: control - no not delete socket file when --daemon is used
+ udev_ctrl_cleanup()- accept NULL as argument
+ update NEWS
+ udevd: install into /lib/udev instead of /sbin
+ udevd: add missing braces
+ systemd: use ConditionCapability=CAP_MKNOD instead of ConditionVirtualization=!container
+ rules: do not load sg module
+
+Kir Kolyshkin (1):
+ keymap: add Genius SlimStar 320
+
+Martin Pitt (1):
+ keymap: Update Acer Aspire 5920g
+
+Matthias Clasen (1):
+ make: allow to pass ${ACLOCAL_FLAGS}
+
+Paul Fox (1):
+ keymap: update the OLPC keymap for correct function key behavior
+
+Petr Uzel (1):
+ udevadm: settle - return failure if unknown option is given
+
+Steve Langasek (1):
+ udevd: exit - process events before signals in worker
+
+Thomas Hood (2):
+ keymap: Support keymap overrides in /etc/udev/keymaps
+ keymap: Support for microphone mute button on ThinkPad X220 et al
+
+
+Summary of changes from v172 to v173
+============================================
+
+Allin Cottrell (1):
+ configure: allow to disable mtd_probe
+
+Kay Sievers (15):
+ make: fix 'make tar-sync'
+ udevd: use 'uptime' in debug timestamp
+ udevd: fix (recently) broken static node permission setting
+ rules: mount fuse filesystem only 'add'
+ udevadm: move udevadm command descriptions into their files
+ udev-acl: skip ACLs when systemd is running, disable by default
+ do not delete database when renaming netif, the db name does not change anymore
+ do not allow kernel properties to be set by udev rules
+ configure: reorder options
+ rules: input - do not create (broken) links for bluetooth devices
+ rules: serial - do not export ID_PORT, use ID_USB_INTERFACE_NUM
+ rules: sound - instead of ID_IFACE use standard ID_USB_INTERFACE_NUM
+ keymap: do not run usb_id for bluetooth devices
+ udevadm: trigger --type=failed - log deprecation warning
+ udevd: debug - put timestamp in []
+
+Martin Pitt (4):
+ gudev: Ship JavaScript examples
+ scsi_id: Ship README
+ Remove obsolete extras/scsi_id/scsi_id.config
+ keymap: Only run on key devices
+
+
+Summary of changes from v171 to v172
+============================================
+
+Bastien Nocera (3):
+ accelerometer: add orientation property
+ udev-acl: fix memleak
+ accelerometer: add documentation
+
+Harald Hoyer (2):
+ udevadm-*.c: return != 0, if unknown option given
+ udev/udevadm-monitor.c: fixed misplaced brace
+
+Kay Sievers (33):
+ rules: apply 'audio' group of the static snd/{seq,timer} nodes
+ Makefile: add tar-sync
+ rules: static_node - use 0660 if group is given to get the cigar
+ rule-syntax-check.py: use print()
+ make: use 'git tag'
+ rules: run input_id for main input devices too
+ update TODO
+ configure: add AC_CONFIG_AUX_DIR, AC_CONFIG_SRCDIR
+ cdrom_id: add tray lock and eject handling
+ rules: enable in-kernel media-presence polling
+ update TODO
+ delete mobile-action-modeswitch which has moved to usb_modeswitch
+ libudev: enumerate - scan /sys/module
+ rules: move polling rule above 'block' match
+ libudev: monitor - update doc
+ rules: set polling value only if it is disabled
+ libudev: device - fix udev_device_get_tags_list_entry() to always load database
+ rules: remove redundant MODE="0664" from lp rules
+ rules: fix wrong wildcard match, we always need a ':*' at the end
+ libudev: device - export udev_device_has_tag()
+ path_id: add missing '-' to tape suffix
+ path_id: add ID_PATH_TAG= to be used in udev tags
+ enforce valid TAG+= names
+ update TODO
+ libudev: device - add udev_device_has_tag() to libudev.h and gtk-doc
+ libudev: enumerate - add udev_enumerate_add_match_parent()
+ libudev: enumerate - include parent device itself with match_parent()
+ libudev: enumerate - clarify documentation
+ path_id: recognize ACPI parent devices
+ rules: input - call path_id for ACPI devices
+ udevadm: monitor - use uptime to match the kernel's timestamp
+ libudev: ctrl - move code to udev directory
+ update sd-daemon.[ch]
+
+Keshav P.R (1):
+ rules: support for gpt partition uuid/label
+
+Lee, Chun-Yi (1):
+ Support more MSI notebook by using asterisk on dmi vendor name
+
+Marco d'Itri (1):
+ Add missing commas to 95-keymap.rules
+
+Martin Pitt (3):
+ keymap: Add Microsoft Natural Keyboard
+ keymap: Add force-release quirk for Hannspree SN10.
+ keymap: Add slight name variations of Toshiba Satellites
+
+Peter Jones (1):
+ ata_id: show the error message when HDIO_GET_IDENTITY fails
+
+
+Summary of changes from v170 to v171
+============================================
+
+Kay Sievers (17):
+ libudev: export symbols explicitely and individually from C code not from separate file or prefix match
+ libudev: device - make a bunch of symbols static
+ systemd: Replace Requires= with Wants=, run trigger in parallel
+ systemd: sort trigger after socket
+ systemd: trigger - run after udev.service (for now)
+ systemd: set socket buffer size to 128 MB like udev has
+ update TODO
+ update TODO
+ libudev: monitor - use SOCK_NONBLOCK
+ systemd: split socket file
+ systemd: add missing socket files
+ rules: fix whitespace
+ rules: implement TAGS== match
+ libudev: enumerate - do not ignore other matches when add_match_tag() is used
+ rules: support substitutions in TAG=
+ path_id: allow to be asked about usb_devices not only usb_interfaces
+ systemd: run udev.service and udev-trigger.service in parallel
+
+Scott James Remnant (1):
+ configure: allow usb.ids location to be specified
+
+
+Summary of changes from v169 to v170
+============================================
+
+Kay Sievers (1):
+ libudev: ctrl - properly wait for incoming message after connect
+
+Michal Soltys (1):
+ configure.ac: fixes for rule_generator and modeswitch
+
+
+Summary of changes from v168 to v169
+============================================
+
+Kay Sievers (26):
+ simplify rules file overwrite logic
+ libudev: list - use bit flags for 'sort' and 'unique'
+ libudev: queue - _unref() should return the object
+ remove dead fstab_import files
+ hid2hci: prepare move to bluez package
+ set event timeout to 60 sec and settle timeout to 120
+ udevd: improve error message in case exec() fails
+ configure: allow to enable/disable extras individually
+ delete hid2hci which moved to the bluez tree
+ update TODO/NEWS
+ bump requirement to Linux kernel 2.6.32 and ARM 2.6.36
+ libudev: ctrl - log accept4() errors
+ update NEWS
+ update INSTALL, NEWS, configure comment, queue doc
+ update TODO
+ udevd: create queue file before daemonizing to reliably block 'settle'
+ udevd: remove left-over SIGALRM
+ gudev: silent gtk-doc warnings
+ cdrom_id: remove unused --export switch to silent gcc
+ libudev: queue - always rebuild queue file when nothing is queued anymore
+ libudev: device - use DEVMODE from kernel as the default mode
+ update TODO
+ Merge branch 'docs/udev.xml' of git://github.com/mfwitten/udev
+ udate TODO, NEWS, INSTALL
+ build: use --gc-sections, -fvisibility=hidden
+ udevadm: settle: wake up more often if --seq-start= or --exit-if-exists= is used
+
+Koen Kooi (1):
+ configure: reintroduce introspection flags to fix crosscompilation
+
+Michael Witten (36):
+ Docs: udev.xml: Offset daemon name with commas
+ Docs: udev.xml: Remove commas (and unnecessary repetition)
+ Docs: udev.xml: `are' -> `is'; the subject is `Access'
+ Docs: udev.xml: Use present tense
+ Docs: udev.xml: Clarification through proper wording
+ Docs: udev.xml: `,' -> `;'
+ Docs: udev.xml: `key value' -> `key-value'
+ Docs: udev.xml: `,' -> `:'
+ Docs: udev.xml: Use `assignment' consistently
+ Docs: udev.xml: `comma-separated' is a better description
+ Docs: udev.xml: Remove unnecessary repitition
+ Docs: udev.xml: Add a few more words for context
+ Docs: udev.xml: Use `unless' for clarity
+ Docs: udev.xml: Clarify PROGRAM key
+ Docs: udev.xml: `a shell style' -> `shell-style'
+ Docs: udev.xml: Clean `*' description
+ Docs: udev.xml: Clean character range description
+ Docs: udev.xml: Clean up description of NAME assignment key
+ Docs: udev.xml: Clean up description of SYMLINK assignment key
+ Docs: udev.xml: Clean up description of ENV assignment key
+ Docs: udev.xml: Clean up description of RUN assignment key
+ Docs: udev.xml: Clean up description of LABEL assignment key
+ Docs: udev.xml: Add missing `.'
+ Docs: udev.xml: `which' -> `content of which'
+ Docs: udev.xml: `commandline' -> `command line'
+ Docs: udev.xml: Clean up WAIT_FOR description
+ Docs: udev.xml: `a' -> `the'
+ Docs: udev.xml: Clean up introduction to substitutions.
+ Docs: udev.xml: Use normal sentence structure
+ Docs: udev.xml: Actually make a separate paragraph
+ Docs: udev.xml: Add comma
+ Docs: udev.xml: `char' -> `character'
+ Docs: udev.xml: `comma-separated' is a better description
+ Docs: udev.xml: Clarify through a change in word ordering
+ Docs: udev.xml: Improved word order
+ Docs: udev.xml: Fix dangling modifier
+
+Nix (1):
+ libudev: queue - accept NULL passed into udev_queue_export_cleanup()
+
+
+Summary of changes from v167 to v168
+============================================
+
+David Zeuthen (1):
+ Run ata_id on non-removable USB devices
+
+Harald Hoyer (1):
+ udevd: clarify worker exit status
+
+Kay Sievers (35):
+ version bump
+ systemd: let settle depend on trigger, do not block basic with trigger
+ selinux: do not label files in runtime dir
+ selinux: firmware - do not label files in runtime dir
+ udevadm: control - add --exit
+ trivial cleanups
+ udevd: log warning if /run is not writable
+ libudev: ctrl - fix refcounting in connection handling
+ udevadm: settle - watch queue file
+ libudev: bump revision
+ udevadm: info --cleanup-db
+ udevd: do not nice processes
+ "db_persist=" -> "db_persist"
+ udevd: move OOM disable into --daemon option
+ systemd: add OOMScoreAdjust=-1000
+ require explicit "db_persist" to exclude device info from --db-cleanup
+ udevd: get netlink socket from systemd
+ fix more warnings
+ libudev: ctrl, monitor - use SOCK_NONBLOCK
+ systemd: socket -> sockets
+ udevadm: monitor - use epoll
+ libudev: test - use epoll
+ udevadm: test - use printf() instead of info() for non-debug output
+ use 'else if' in epoll event array loop
+ libudev: run_program() - select() -> epoll
+ udevd: ppoll() -> epoll + signalfd
+ Merge branch 'docs/README' of git://github.com/mfwitten/udev
+ timeout handling without alarm()
+ udevadm: settle - kill alarm()
+ udevd: netif rename - use ifindex for temporary name
+ udevd: always use udevd[] log prefix
+ udevd: rules files - accept empty or /dev/null links
+ udevd: log signal number when spawned processes fail
+ systemd: Reqires= -> Wants=udev.socket
+ udevd, udev-event: sync waitpid() error handling
+
+Lee, Chun-Yi (1):
+ Add rule for Acer Aspire One ZG8 to use acer-aspire_5720 keymap
+
+Leonid Antonenkov (1):
+ rule-generator: net - ignore Hyper-V virtual interfaces
+
+Martin Pitt (3):
+ Revert "Do not build extras with --disable-extras"
+ Avoid spinning up CD on pressing eject button
+ keymap: Another ID for Logitech Wave keyboard
+
+Michael Reed (1):
+ path_id: rework SAS device handling
+
+Michael Witten (12):
+ Docs: README: `to replace' -> `replacing'
+ Docs: README: `,' -> `;'
+ Docs: README: Clean up a sentence
+ Docs: README: Use present tense
+ Docs: README: Add missing `and'
+ Docs: README: Remove commas and use subjective mood
+ Docs: README: Clean up `udev extras' requirements
+ Docs: README: Clarify configuration of existing devices
+ Docs: README: `does never apply' -> `never applies'
+ Docs: README: Flip sentence structure to improve wording
+ Docs: README: `set up' is the verb; `setup' is a noun
+ Docs: README: Add a comma to offset the modifier
+
+Seth Forshee (1):
+ keymap: Support Dell Latitude XT2 tablet-mode navigation keys
+
+Thomas Egerer (1):
+ udevd: add 'N:' to optstring in getopt_long
+
+
+Summary of changes from v166 to v167
+============================================
+
+Andrey Borzenkov (1):
+ udev-acl: add /dev/sgX nodes for CD-ROM
+
+David Zeuthen (1):
+ cdrom_id: Don't ignore profiles when there is no media available
+
+Harald Hoyer (2):
+ cdrom_id: cd_media_toc() extend toc size to 65536
+ udev-acl/70-acl.rules: tag ID_REMOTE_CONTROL with acl
+
+Kay Sievers (29):
+ version bump
+ Merge branch 'master' of git+ssh://master.kernel.org/pub/scm/linux/hotplug/udev
+ v4l_id: kill the v4l1 ioctl
+ v4l_id: remove left-over variable
+ update some comments
+ test-libudev: add short options
+ libudev: udev_device_get_sysattr_list_entry() update
+ libudev: resolve ifindex in udev_device_new_from_id_filename()
+ libudev: bump minor version
+ udev-acl: move sg rule to optical drive rule
+ move /dev/.udev/ to /dev/.run/udev/ and convert old udev database at udevd startup
+ NEWS: clarify /dev/.run/ requirements
+ input_id: silent gcc warnings
+ fstab_import: disable build
+ systemd: remove deprecated udev-retry.service
+ fstab_import: remove from configure
+ update sd-daemon.[ch]
+ udevd: use facility == LOG_DAEMON when writing to /dev/kmsg
+ udevd: initialize fds, for proper close() on exit
+ use /run/udev/ if possible and fall back to /dev/.udev/
+ rules: run ata_id only on SPC-3 or later optical drives
+ systemd: bind udev control socket in systemd and split udev.service
+ systemd: use sockets.target not socket.target
+ man: remove trigger --type=failed handling
+ libudev: export udev_get_run_path()
+ libudev: docs - add udev_get_run_path()
+ libudev: make valgrind happy
+ systemd: do not enable udev-settle.service by default
+ systemd: udev.socket - disable implicit dependencies
+
+Kei Tokunaga (1):
+ udevadm: enumerate - update prev pointer properly
+
+Lee, Chun-Yi (2):
+ Remap Acer WMI touchpad toggle key to F21 used by X
+ Remap MSI Laptop touchpad on/off key to F22 and F23
+
+Martin Pitt (12):
+ 60-persistent-input.rules: Support multiple interfaces
+ Only build v4l_id if V4L1 header file is available
+ 60-persistent-input.rules: Do not create duplicate links
+ Fix building with --disable-extras
+ Do not build extras with --disable-extras
+ v4l_id: Drop videodev.h check again
+ keymap: Fix Acer Aspire 5920G media key
+ input_id: Consistently use tabs for indentation
+ input_id: Add some debugging output
+ input_id: Avoid memory overflow with too long capability masks
+ input_id: Cover key devices which only have KEY_* > 255
+ input_id: Rewrite debug logging to use standard udev info()
+
+Seth Forshee (1):
+ keymap: continue reading keymap after invalid scancodes
+
+Thomas Egerer (3):
+ libudev: allow to get list of all available sysfs attrs for a device
+ libudev: use sysfs attr ilist interface for attribute walk
+ udevadm: info - make attribute array static and const
+
+
+Summary of changes from v165 to v166
+============================================
+
+Chris Bagwell (1):
+ Remap Eee PC touchpad toggle key to F21 used by X
+
+Gerd Hoffmann (1):
+ extras: add rules for qemu guests
+
+Jürgen Kaiser (1):
+ keymap: Add Acer Aspire 8930
+
+Kay Sievers (7):
+ version bump
+ man: generate html pages for www.kernel.org
+ man: fix typo
+ make: fix qemu rules file name
+ extras: qemu - fix typo
+ ata_id: do not print empty serial numbers to avoid unwanted trailing '_'
+ update gitignore
+
+Martin Pitt (6):
+ keymap: Add Acer TravelMate C310
+ keymap: Update README.keymap.txt
+ keymap: Add Lenovo ThinkPad X201 tablet
+ keymap: Move reading of event in separate function
+ keymap: More robust state machine
+ keymap: Explain how to end the program
+
+Matthew Garrett (1):
+ keymap: Remove wlan from Dell
+
+
+Summary of changes from v164 to v165
+============================================
+
+Andy Whitcroft (1):
+ keymap: Add release quirks for two Zepto Znote models and AMILO Xi 2428
+
+Bastien Nocera (2):
+ keymap: Add force release for HP touchpad off
+ extras/keymap: Make touchpad buttons consistent
+
+David Henningsson (1):
+ Add ACLs for FFADO supported sound cards
+
+David Zeuthen (6):
+ ata_id: Support SG_IO version 4 interface
+ Run scsi_id and ata_id on the scsi_device object
+ Use ata_id, not scsi_id, on ATAPI devices
+ Add GUdevEnumerator type and Device.get_tags() method
+ Add g_udev_device_get_is_initialized() method
+ gudev: Add Device.get_usec_since_initialized
+
+Harald Hoyer (2):
+ udev-rules.c: change import property buffer to 16384 bytes
+ 70-acl.rules: add ACLs for ID_PDA devices
+
+Jakub Wilk (1):
+ man: udev - workaraound -> workaround
+
+Jan Drzewiecki (1):
+ cdrom_id: Fix media state for unreadable DVDs
+
+Kay Sievers (19):
+ version bump
+ rules: 78-sound-card - remove specific hardware matches, they do not belong here
+ rules: drop OSS audio rule
+ rules: drop alsa jack-plug input devices
+ rules: revert bsg use until the event ordering problem is sorted out
+ libudev: do not overwrite path with readlink() call
+ udevadm: info - honor --export and --export-prefix for property query
+ udevadm: info - honor --export, --export-prefix=
+ udevd: use dev_t or netif ifindex as database key
+ udevd: always create /dev/{char,block}/$major:$minor
+ udevd: simplify udev database and fix DEVNAME handling
+ udevd: switch to common id_filename functions
+ udevd: write full database file for (unsupported) renamed device nodes
+ check ifindex > 0 instead of subsystem == "net"
+ libudev: enumerate - allow to filter-out not-already-initialized devices
+ libudev: fix renamed device nodes detection logic
+ libudev: record and export "age" of device record
+ gudev: bump minor version
+ update NEWS
+
+Martin Pitt (5):
+ keymap: Add Sony Vaio VGN71
+ keymap: Add some more Sony Vaio VGN-* models
+ Add ACL for media player USB devices
+ keymap: Fix struck Touchpad key on Dell Latitude E series
+ keymap: Fix struck Touchpad key on Dell Precision M series
+
+Michal Soltys (1):
+ udevd: create static nodes before /dev/null is needed
+
+
+Summary of changes from v163 to v164
+============================================
+
+David Zeuthen (1):
+ Install libgudev-1.0.so in prefix / instead of prefix /usr
+
+Harald Hoyer (1):
+ cdrom_id: request the drive profile features with a dynamic length
+
+Kay Sievers (4):
+ version bump
+ udevd: do not wrongly delay events for devices with swapped names
+ return proper error code in rename_netif()
+ libudev: return kernel provided devnode when asked before we handled any rules
+
+Martin Pitt (2):
+ keymap: Apply force-release rules to all Samsung models.
+ keymap: Add Toshiba Satellite U500
+
+
+Summary of changes from v162 to v163
+============================================
+
+David Zeuthen (2):
+ gudev: Deliver ::uevent signal in the thread-default main loop
+ Bump required GLib version to 2.22
+
+Hannes Reinecke (1):
+ scsi_id: export target port group
+
+Kay Sievers (5):
+ version bump
+ scsi_id: fix compiler warnings
+ systemd: hook into basic.target instead of sysinit.target
+ systemd: sort before basic.target
+ udevd: add sd-daemon.c
+
+Lee, Chun-Yi (1):
+ keymap: Add alternate MSI vendor name
+
+Martin Pitt (8):
+ keymap: Add Lenovo Y550
+ Clarify WAIT_FOR documentation
+ fix various syntax errors in rules
+ Add automatic rules syntax check
+ cdrom_id: Try reading the medium if all MMC commands fail
+ Revert "cdrom_id: Try reading the medium if all MMC commands fail"
+ cdrom_id: Fall back to CDROM_DRIVE_STATUS if all MMC commands fail
+ cdrom_id: Don't read beyond "last track" in TOC
+
+Torsten Schoenfeld (1):
+ gudev: add a few annotations that newer gobject-introspection versions demand
+
+
+Summary of changes from v161 to v162
+============================================
+
+David Woodhouse (1):
+ Add keymap for Lenovo IdeaPad S10-3
+
+Jan Drzewiecki (2):
+ cdrom_id: Drop MEDIA_SESSION_NEXT for DVD-RW-RO
+ cdrom_id: Fix DVD blank detection for sloppy firmware
+
+Kay Sievers (10):
+ init: update systemd service files
+ init: update systemd service files
+ init: add 'udev -' to description in systemd service files
+ udevd: add pid to kmsg logs
+ init: edit systemd service descriptions
+ version bump
+ udevd: remove unneeded credential passing from init_notify()
+ set SELinux context on 'add' but not on 'change' events
+ systemd: enable all udev services unconditionally
+ Revert "Add alternative KVM MAC address blacklist"
+
+Luca Tettamanti (1):
+ Add support for oom_score_adj
+
+Marco d'Itri (2):
+ udev-acl: do not mistake all SCSI "processor" devices for scanner
+ do not create persistent name rules for KVM network interfaces
+
+Martin Pitt (12):
+ cdrom_id: Add media status debugging
+ udev(7): Point out required extension, and remove some confusion
+ keymap: Add Onkyo PC
+ keymap: Add HP G60
+ keymap: Fix Sony VAIO VGN-SZ2HP/B
+ udev(7) manpage: Fix description of $attr
+ gudev: fix crash if netlink is not available
+ keymap: Fix Acer TravelMate 4720
+ cdrom_id: Fix DVD-RW media detection
+ Fix KVM MAC address range
+ do not create persistent name rules for VMWare network interfaces
+ Add alternative KVM MAC address blacklist
+
+Michael Forney (1):
+ Don't install systemd scripts with --without-systemdsystemunitdir
+
+Michal Soltys (1):
+ ChangeLog fix
+
+
+Summary of changes from v160 to v161
+============================================
+
+Fortunato Ventre (1):
+ keymap: Add force-release quirks for a lot more Samsung models
+
+Harald Hoyer (3):
+ udev-event.c: rename interface to <src>-<dest>, if <dest> taken
+ rule_generator/write_net_rules: prevent interface to be named "eth"
+ cdrom_id: READ TOC before READ DISC INFORMATION fixes qemu
+
+Jan Drzewiecki (5):
+ cdrom_id: Fix detection of reblanked DVD+RW and DVD-RAM
+ cdrom_id: Handle pre-MMC2 drives
+ cdrom_id: Also apply format check to DVD-RW
+ cdrom_id: No "next session" for "other" media state
+ cdrom_id: Fix state for fresh DVD-RW
+
+Jerone Young (1):
+ Fix volume keys not releasing on Mivvy G310
+
+Kay Sievers (12):
+ version bump
+ rules: remove firewire rules for deprecated drivers
+ udev-acl: update firewire matches to recent rule changes
+ libudev: bump minor so version after adding symbols
+ call util_delete_path() only when we actually deleted stuff
+ udev-acl: properly handle CK change events for root user
+ udev-acl: remove specific device matches from the rules file
+ fix broken "compile warning fix"
+ always log error when renaming a network interface fails
+ do not rename the database on device rename
+ cdrom_id: whitespace fix
+ cdrom_id: do not bail out when we can not read the TOC like for empty CDRW
+
+Marco d'Itri (3):
+ hid2hci: fix Logitech diNovo, MX5500 and other keyboards
+ log an error when a message from the wrong version of udevadm is ignored
+ hid2hci: fix for Logitech diNovo Edge keyboard
+
+Martin Pitt (1):
+ keymap: Generalize Samsung keymaps
+
+Michal Schmidt (1):
+ udev-acl: really fix ACL assignment in CK events
+
+Richard Hughes (1):
+ udev-acl: add DDC_DEVICE to the types that are managed
+
+Stefan Richter (1):
+ rules: add more FireWire IDs: Point Grey IIDC; AV/C + vendor unique
+
+Yin Kangkai (7):
+ udevadm: fix short options in getopt()
+ udevd: fix some memory leaks in error path
+ malloc()+memset() -> calloc()
+ udevd: fix short options in getopt()
+ udevd: fix unref'ing of device in error path
+ udevd: create static device links only when the target exists
+ udev: fix compile warning
+
+
+Summary of changes from v159 to v160
+============================================
+
+Harald Hoyer (2):
+ 60-persistent-storage-tape: s/path_id.sh/path_id/
+ 60-persistent-storage-tape.rules: make own by-path symlink for nst tapes
+
+Kay Sievers (4):
+ version bump
+ rules: tape - remove WAIT_FOR instruction and don't export BSG_DEV
+ allow final assignment for OPTIONS:="nowatch"
+ udevd: init_notify() fix abstract namespace name handling
+
+Lennart Poettering (1):
+ systemd: make service files readable by GKeyFile
+
+Martin Pitt (2):
+ keymap: Find alternate Lenovo module
+ keymap: Add Lenovo ThinkPad SL Series extra buttons
+
+
+Summary of changes from v158 to v159
+============================================
+
+Jerone Young (1):
+ Fix stuck volume key presses for Toshiba Satellite U300 & U305models
+
+Kay Sievers (5):
+ version bump
+ add systemd service files
+ make: pre-process and install systemd service files when needed
+ make: fix 'make distcheck'
+ switch a few left-over from GPLv2 to GPLv2 or later
+
+Lennart Poettering (1):
+ systemd: update service files for newly introduced DefaultDependencies= option
+
+Martin Pitt (1):
+ keymap: Add Logitech Cordless Wave Pro
+
+Matthew Garrett (1):
+ keymap: Add support for IBM-branded USB devices
+
+Michael Meeks (1):
+ gudev: respect possibly given LD_LIBRARY_PATH
+
+Ryan Harper (2):
+ Add virtio-blk support to path_id
+ Add virtio-blk by-id rules based on 'serial' attribute
+
+
+Summary of changes from v157 to v158
+============================================
+
+Harald Hoyer (1):
+ extras/keymap: add Samsung N210 to keymap rules
+
+Kay Sievers (7):
+ version bump
+ libudev: fix fd leak in udev_enumerate_scan_devices() when tags are searched
+ udevd: in case we don't daemonize, send READY message to /sbin/init
+ delete last distro specific rules
+ remove a few comments in file headers
+ mtd_probe: add needed include, modprobe blacklist flag, and change some whitespace
+ rules: remove unused subdir
+
+Martin Pitt (4):
+ Fix hid2hci rules harder
+ add Vala vapi for gudev-1.0
+ Revert "add Vala vapi for gudev-1.0"
+ Fix usb printer rule for multiple USB interfaces
+
+Maxim Levitsky (1):
+ mtd_probe: add autodetection for xD cards
+
+Paul Bender (1):
+ configure.ac: fix cross compilation
+
+
+Summary of changes from v156 to v157
+============================================
+
+Harald Hoyer (1):
+ 40-redhat.rules: removed file
+
+Jerone Young (3):
+ Fix wlan key on Inspirion 1210
+ Fix wlan key on Inspiron 910
+ Fix wlan key on Inspiron 1010 & 1110
+
+Kay Sievers (25):
+ configure.ac: version bump
+ Makefile.am: silent build mkdir
+ rules: mount fuse control filesystem
+ fix compilation with --enable-debug
+ while (1) -> for (;;)
+ childs -> children
+ udevd: replace --debug-trace with --children-max
+ udevd: fix comments
+ rules: add -v to modprobe calls to be able see what will be loaded
+ udevd: read debug settings from kernel commandline
+ update NEWS
+ rules: delete pilot rules and remove redhat directory
+ man: add static device nodes and udevd debug options
+ man: add kernel command line parameters
+ man: udevd - update intro
+ rules: rename packages -> arch
+ rules: SUSE - move last distro rule to package
+ rules: add misc/30-kernel-compat.rules
+ make: mkdir /lib/udev/devices/
+ make: fix rules/ subdir names
+ udevd: set umask before creating files/directories
+ add IMPORT{cmdline}
+ IMPORT{cmdline}: start at first char after '='
+ libudev: doc - fix typo
+ update NEWS
+
+
+Summary of changes from v155 to v156
+============================================
+
+Bryan Kadzban (1):
+ udevd: fix typo /proc/fd -> /proc/self/fd
+
+Kay Sievers (4):
+ configure.ac: version bump
+ cdrom_id: do not export ID_CDROM_MEDIA_SESSION_LAST_OFFSET= for single session media
+ rules: optical drives - use ID_CDROM_MEDIA_TRACK_COUNT_DATA
+ libudev: fix udev_queue_get_seqnum_sequence_is_finished() with empty queue file
+
+
+Summary of changes from v154 to v155
+============================================
+
+Kay Sievers (11):
+ reset process priority before executing RUN+=
+ configure.ac: version bump
+ rules: SUSE - delete device-mapper rules
+ libudev: add O_CLOEXEC
+ use default mode of 0600 for nodes if gid == 0
+ udevd: create standard symlinks and handle /lib/udev/devices
+ update NEWS README
+ fix tests and allow MODE=000
+ create static nodes provided by kernel modules to allow module autoloading
+ update NEWS
+ man: directly use 'refentry'
+
+
+Summary of changes from v153 to v154
+============================================
+
+Harald Hoyer (2):
+ Makefile.am: add LGPL COPYING file to EXTRA_DIST
+ cdrom_id: only mark sr[0-9]* as ID_CDROM
+
+Jerone Young (1):
+ Fix volume keys not releasing for Pegatron platform
+
+Kay Sievers (23):
+ configure.ac: version bump
+ more readlink buffer size handling
+ remove left-over from ignore_remove and all_partitions
+ fix previous commit
+ udevadm: info --export-db -- remove watch handle export
+ add TAG= to improve event filtering and device enumeration
+ all to match against a given TAG==
+ udev-acl: use a tag instead of a property to mark devices
+ fix logic on-demand loading logic for db and uevent
+ use the usual TAG+=, TAG= logic
+ delete old tags when configuration changes
+ libudev: accept NULL in udev_device_get_tags_list_entry()
+ export tag functions
+ export udev_device_get_tags_list_entry()
+ udevd: always try to find an idle worker instead of forking a new one
+ remove unused parameter from udev_node_mknod()
+ remove debug output during rules parsing
+ warn when renaming kernel-provided nodes instead of adding symlinks
+ man: udevadm trigger - the default is "change" not "add"
+ update README regarding kernel version and default rules
+ add info message when empty NAME is given
+ libudev: add documentation for recently added functions
+ udevd: reload config only for *.rules files
+
+Martin Pitt (1):
+ keymap: Fix Bluetooth key on Acer TravelMate 4720
+
+Mathias Nyman (1):
+ remove buffer-overrun risk in readlink call
+
+Matthias Schwarzott (1):
+ rules: Gentoo - remove old devfs compat rules
+
+Michael Thayer (1):
+ fix device node deletion
+
+Robby Workman (1):
+ configure.ac: move firmware-path setting out of extras section
+
+Yin Kangkai (2):
+ keymap: Add keymap and force-release quirk for Samsung N128
+ keymap: Add keymap quirk of WebCam key for MSI netbooks.
+
+
+Summary of changes from v152 to v153
+============================================
+
+Kay Sievers (1):
+ configure.ac: version bump
+
+Robby Workman (1):
+ configure.ac: fix broken firmware search path in configure.ac
+
+
+Summary of changes from v151 to v152
+============================================
+
+Adrian Bunk (1):
+ udev needs automake 1.10
+
+Amit Shah (2):
+ Fix virtio-ports rule to use $attr instead of $ATTR
+ rules: virtio - fix is to check if the 'name' attribute is present
+
+Andy Whitcroft (2):
+ keymap: Add Samsung Q210/P210 force-release quirk
+ keymap: Add Fujitsu Amilo 1848+u force-release quirk
+
+Dan Williams (1):
+ modeswitch: morph into tool that only switches Mobile Action cables
+
+David Zeuthen (3):
+ Decrease buffer size when advancing past NUL byte
+ Use UTIL_LINE_SIZE, not UTIL_PATH_SIZE to truncate properties
+ Increase UTIL_LINE_SIZE from 2048 to 16384
+
+Harald Hoyer (1):
+ cdrom_id: remove debugging code
+
+Jerone Young (6):
+ Force key release for volume keys on Dell Studio 1557
+ Fix Keymapping for upcoming Dell Laptops
+ Add new Dell touchpad keycode
+ Revert special casing 0xD8 to latitude XT only
+ Fix Dell Studio 1558 volume keys not releasing
+ Add support for another Dell touchpad toggle key
+
+Kamal Mostafa (3):
+ keymap: Unite laptop models needing common volume-key release quirk
+ keymap: Add force-release quirk for Coolbox QBook 270-02
+ keymap: Add force-release quirk for Mitac 8050QDA
+
+Kay Sievers (43):
+ libudev: bump minor version
+ udevadm: fix untested and broken commit to set buffer size
+ configure.ac: version bump
+ udev-acl: no not encourage use of ACL_MANAGE outside of rules file
+ replace utimes() with utimensat()
+ libbudev-private: rename udev_list_entry_get_flag()
+ udevadm: monitor - use / as separator in --subsystem-match=subsystem[/devtype]
+ use major:minor as entries in symlink stack instead of devpath
+ use major:minor as entries in watch directory
+ libudev: docs - .gitignore backup files
+ firmware: fix possible segfault when firmware device goes away while loading
+ do not reset SELinux context when the node was not touched
+ libudev: add udev_device_new_from_environment()
+ add LGPL COPYING to libudev and GUdev
+ cdrom_id: open non-mounted optical media with O_EXCL
+ libudev: update documentation
+ extras: mobile-action-modeswitch - update gitignore
+ scsi_id: add rand() in retry loop
+ cdrom_id: retry to open the device, if EBUSY
+ cdrom_id: check mount state in retry loop
+ cdrom_id: always set ID_CDROM regardless if we can run cdrom_id
+ rules: delete outdated packagees rules
+ rules: we do not have static devices which are renamed
+ unify/cleanup event handling
+ allow IMPORT{db}="KEY"
+ usb-db: remove double '/'
+ replace "add|change" with "!remove"
+ update NEWS
+ log info only if we actually delete the node
+ udevadm: trigger - switch default action from "add" to "change"
+ remove "all_partitions" option
+ rules: call modprobe on all events but "remove"
+ remove "ignore_remove" option
+ update NEWS
+ cdrom_id: rework feature/profiles buffer parsing
+ cdrom_id: print more debug messages
+ cdrom_id: debug - print feature values in hex
+ cdrom_id: debug - print feature values in hex
+ cdrom_id: set ID_CDROM_MEDIA=1 only for known media
+ Revert "Fix switching Logitech bluetooth adapters into hci mode."
+ add O_NOFOLLOW when creating files in link stack
+ delete only device nodes, not symlinks when deleting a devtmpfs node
+ doc: add section about how *not* to rename device nodes
+
+Marco d'Itri (3):
+ rules: input - create by-path/ links for pci devices
+ Fix switching Logitech bluetooth adapters into hci mode.
+ doc: document the WAIT_FOR timeout
+
+Martin Pitt (12):
+ keymap: Add Dell Inspiron 1011 (Mini 10)
+ Fix brightness keys on MSI Wind U-100
+ keymap: Fix LG X110
+ keymap: Add Toshiba Satellite M30X
+ udev-acl: Correctly handle ENV{ACL_MANAGE}==0
+ input_id: Fix linking
+ keymap: Add Acer TravelMate 6593G and Acer Aspire 1640
+ keymap: Fix another key for Acer TravelMate 6593
+ cdrom_id: Fix uninitialized variables
+ cdrom_id: Fix uninitialized buffers
+ cdrom_id: Do not ignore errors from scsi_cmd_run()
+ cdrom_id: Swap media state and TOC info probing
+
+Mike Brudevold (1):
+ cdrom_id: add missing profiles to feature_profiles
+
+Robert Hooker (1):
+ keymap: Add support for Gateway AOA110/AOA150 clones.
+
+Scott James Remnant (2):
+ libudev: export udev_monitor_set_receive_buffer_size()
+ udevadm monitor: increase netlink buffer size
+
+Thomas Bächler (1):
+ firmware: fix error reporting on missing firmware files
+
+Yury G. Kudryashov (3):
+ configure.ac - fix typo in --with-pci-ids-path option
+ hid2hci: include linux/types.h for __u32
+ configure.ac: ddd --with-firmware-path option
+
+
+Summary of changes from v150 to v151
+============================================
+
+Amit Shah (1):
+ rules: Add symlink rule for virtio ports
+
+Bryan Kadzban (1):
+ Fix reverted floppy-device permissions
+
+Egbert Eich (1):
+ rulews: suse - add do-not-load-KMS-modules rules
+
+Frederic Crozat (1):
+ rules: acl - add COLOR_MEASUREMENT_DEVICE match
+
+Kay Sievers (11):
+ configure.ac: version bump
+ udevd: inotify - do not parse rules at create but at close
+ do not remove device nodes of active kernel devices
+ libudev: device - create db file atomically
+ clarify message about not removed device node
+ input_id: include limits.h
+ keymap: include linux/limits.h
+ keymap: linux/input.h - get absolute include path from gcc
+ delete outdated and unmaintained writing_udev_rules
+ update README and NEWS
+ update tests
+
+Marco d'Itri (2):
+ writing_udev_rules: update rules files names
+ keymap: support for the Samsung N140 keyboard
+
+Martin Pitt (4):
+ add ACL rule for Garmin GPSMap 60
+ keymap: move force-release directory
+ extras/keymap/check-keymaps.sh: Ignore comment-only lines
+ keymap: Fix invalid map line
+
+
+Summary of changes from v149 to v150
+============================================
+
+Clemens Buchacher (2):
+ add Samsung R70/R71 keymap
+ keymap: Samsung R70/R71 force-release quirk
+
+Daniel Drake (2):
+ keymap: Add OLPC XO key mappings
+ keymap: Fix typo in compal rules
+
+Daniel Elstner (1):
+ libudev: wrap in extern "C" block for C++
+
+David Zeuthen (1):
+ Export ID_WWN_VENDOR_EXTENSION and ID_WWN_WITH_EXTENSION
+
+Jerone Young (1):
+ keymap: Lenovo Thinkpad USB Keyboard with Tracepoint
+
+Johannes Stezenbach (2):
+ keymap: add Samsung N130
+ keymap: handle atkbd force_release quirk
+
+Kay Sievers (15):
+ util_unlink_secure(): chmod() before chown()
+ floppy: fix rule to create additional floppy device nodes
+ configure.ac: version bump
+ remove remaining support for CONFIG_SYSFS_DEPRECATED
+ cdrom_id: remove deprecated device matches
+ rules: add "block" match to floppy rule
+ update mtime of nodes and links when we re-use them
+ udevadm: info - fix info --root --query=name --path= for device without a device node
+ remove remaining support for CONFIG_SYSFS_DEPRECATED
+ fix typo in log message priority handling
+ remove UDEV_RUN environment variable
+ udevadm: logging - copy va_list and do not use it twice
+ libudev: doc - add symbols to sections.txt
+ work around gtk-doc which breaks distcheck
+ gobject-introspection: use $datadir instead of $prefix
+
+Marco d'Itri (2):
+ build: keymap - create subdir
+ rules: udev-acl - add firewire video devices
+
+Martin Pitt (12):
+ keymap: Add Acer Aspire 1810T
+ 95-keymap.rules: Run on change events, too
+ keymap: fix findkeyboards
+ Speed up udev_enumerate_scan_*
+ keymap: Add hotkey quirk for Acer Aspire One (AO531h/AO751h)
+ Clarify RUN/IMPORT documentation
+ keymap: Add Logitech S510 USB keyboard
+ keymap: add Acer TravelMate 8471
+ keymap: Add Acer Aspire 1810TZ
+ keymap: Add LG X110
+ keymap: Add Fujitsu Amilo Li 1718
+ keymap: Document force-release
+
+Piter PUNK (1):
+ firmware: convert shell script to C
+
+Scott James Remnant (1):
+ 70-acl.rules: ACL manage Android G1 dev phones
+
+Thomas de Grenier de Latour (1):
+ libudev: enumerate - fix move_later logic
+
+
+Summary of changes from v148 to v149
+============================================
+
+Daniel Elstner (1):
+ really fix both in-tree and out-of-tree builds
+
+Dmitry Torokhov (1):
+ input-id: identify touchscreens
+
+Kay Sievers (4):
+ libudev: doc - use #NULL
+ configure.ac: version bump
+ really really fix both in-tree and out-of-tree builds
+ fix both in-tree and out-of-tree builds
+
+Martin Pitt (6):
+ input_id: Fix endless loop for non-input devices
+ input_id: Do not tag non-input devices with ID_INPUT
+ input_id: small optimization
+ input_id: check event mask
+ input_id: Check mouse button for ID_INPUT_MOUSE
+ udev_device_get_parent_with_subsystem_devtype(): Clarify documentation
+
+
+Summary of changes from v147 to v148
+============================================
+
+Dan Williams (3):
+ Revert "modem-modeswitch: add a device"
+ Revert "extras/modem-modeswitch: Add Huawei E1550 GSM modem"
+ modem-modeswitch: 61-option-modem-modeswitch.rules is only for Option NV devices
+
+Daniel Mierswa (1):
+ Fix typo in NEWS, ConsoleKit-0.4.11 -> 0.4.1
+
+David Zeuthen (4):
+ cdrom_id: Still check profiles even if there is no media
+ scsi_id: Export WWN and Unit Serial Number
+ Create /dev/disk/by-id/wwn-0x... symlinks
+ Also create /dev/disk/by-id/wwn-0x..-part%n symlinks for partitions
+
+Dmitry Torokhov (1):
+ extras/input_id: Correctly identify touchpads
+
+Harald Hoyer (1):
+ modem-modeswitch: add a device
+
+Kay Sievers (8):
+ rules: set mode of floppy device nodes to 0660
+ remove "ignore_device"
+ print warning for BUS=, SYSFS{}=, ID=
+ test-udev: remove "ignore_device" code
+ udev-test.pl: catch-up with recent changes
+ rules: remove support for IDE (hd*) devices
+ ata_id: skip ATA commands if we find an optical drive
+ Revert "Fix out-of-tree builds"
+
+Martin Pitt (5):
+ README.keymap.txt: small clarification
+ extras: Add input_id
+ 70-acl.rules: Use new-style input properties
+ input: Deprecate ENV{ID_CLASS}
+ input_id: code cleanup
+
+Scott James Remnant (1):
+ Fix out-of-tree builds
+
+
+Summary of changes from v146 to v147
+============================================
+
+Alan Jenkins (1):
+ udevd: queue-export - remove retry loop
+
+Andrew Church (1):
+ fix wrong parameter size on ioctl FIONREAD
+
+Daniel Mierswa (2):
+ don't compare a non-existing function with NULL
+ use nanosleep() instead of usleep()
+
+David Zeuthen (4):
+ gudev: remove G_UDEV_API_IS_SUBJECT_TO_CHANGE since API is now stable
+ ata_id: export more advanced ATA features
+ gudev: Fix up GUdevDeviceNumber
+ gudev: Remove LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE from priv header
+
+Florian Zumbiehl (10):
+ util_delete_path(): use util_strscpy()
+ util_lookup_group(): fix memory leak if realloc() fails
+ util_delete_path(): handle multiple leading slashes
+ util_create_path(): fix possible out of bounds array access
+ ude_rules.c: fix possible NULL pointer dereference in get_key()
+ util_resolve_sys_link(): fix possible buffer overflow
+ udev_util_encode_string(): fix possible buffer overflow
+ udev-rules.c: parse_file() - fix possible buffer overflow
+ udev_queue_get_seqnum_sequence_is_finished(): fix possible file handle leak
+ util_run_program(): fix possible buffer overflow #2
+
+Harald Hoyer (2):
+ scsi_id: prevent buffer overflow in check_fill_0x83_prespc3()
+ rename interfaces to <iface>_rename if rename fails
+
+Jeremy Kerr (1):
+ util_run_program: restore signal mask before executing event RUN commands
+
+Kay Sievers (45):
+ make: sort Makefile.am per target/extra
+ configure.ac: version bump
+ udev-acl: allow to skip ACL handling
+ rules: rfkill has no group, so use 0644
+ rule_generator: net - fix MATCHDEVID
+ make: add comment
+ update NEWS
+ print warning for NAME="%k" - it breaks the kernel supplied DEVNAME
+ warn about non-readable or empty rules file
+ change database file names
+ assign errno for getgrnam_r()/getpwnam_r()
+ doc: udevadm test *does* create nodes and links these days
+ util_unlink_secure(): chmod() before chown()
+ util_create_path(): fix errno usage
+ inotify_add_watch(): do not store watch, if it failed
+ update TODO
+ update README
+ rules: suse - use NAME for mapper/control
+ libudev-util.c: get_sys_link() - return error for empty link target
+ udev-rules.c: remove 'first_token' variable
+ Revert "udev-rules.c: remove 'first_token' variable"
+ test: catch possible bug in GOTO resolving
+ udevadm: remove symlink support for old commands
+ util_run_program(): skip multiple spaces in argv creation
+ fix whitespace
+ require 2.6.27 for proper signalfd handling
+ fix randonm findings from llvm-clang-analyzer
+ simplify "symlink name stack"
+ reorder create_path() and node/link creation to be called in a direct sequence
+ put util_create_path() and file creastion in a retry loop
+ udevadm: control - remove compat code
+ scsi_id: delete copy of bsg.h
+ fix SYMLINK{} option parsing
+ rules: remove remaining NAME="%k"
+ rules: drop almost all NAME= keys
+ update TODO, NEWS
+ udevd: serialize events for with the same major/minor
+ break loops if util_create_path() returns error
+ remove "last_rule" option
+ use CLOEXEC flags instead of fcntl()
+ unblock signals we might want to handle
+ udevd: create /dev/.udev/rules.d/ before watching it wit inotify
+ gudev: fix pkg-config call to work with "make distcheck"
+ update NEWS
+ Revert "gudev: fix out-of-tree build"
+
+Lennart Poettering (5):
+ pci-db: make sure we actually read the pci.ids file instead of usb.ids
+ sound: recognize saa7134 TV card sound devices as TV cards
+ sound: include ALSA sound card id in ID_ID property
+ sound: include ALSA sound card id in /dev/snd/by-id/ links
+ Revert "sound: include ALSA sound card id in /dev/snd/by-id/ links"
+
+Marco d'Itri (6):
+ doc: writing_udev_rules updated for the new command names
+ rules: sound - do not use /usr/bin/env
+ udevadm: print all messages to stderr with priority higher or equal than LOG_ERR
+ udevadmi: control = exit with rc=2 if there is some system error
+ gudev: gir-scanner workaround for out of tree builds
+ gudev: fix out-of-tree build
+
+Mario Limonciello (1):
+ hid2hci: remove superfluous bmAttributes match
+
+Martin Pitt (24):
+ extras/keymap: Add Acer Aspire 6920
+ extras/modem-modeswitch: eject ZTE MF6xx fake CD-ROMs
+ extras/keymap: Fix hold key on Acer Aspire 6920
+ extras/keymap: Fix case matching for Micro-Star
+ Revert "extras/keymap: Fix case matching for Micro-Star"
+ make raw USB printer devices accessible for lp
+ modem-modeswitch rules: Match more devices
+ extras/keymap: fix hash table collisions
+ extras/keymap: Rename KEY_COFFEE to KEY_SCREENLOCK
+ fix single-session CD detection
+ fix previous commit for CD detection
+ make raw USB printer devices world-readable again
+ 50-udev-default.rules: fix printer MODE
+ keymap: Add Logitech Wave USB
+ keymap: add missing map file
+ keymap: fix usb_id invocation
+ keymap: make USB keyboards really work
+ keymap: Add Logitech Wave cordless
+ keymap: add HP Pavillion dv6315ea
+ keymap: add HP 2230s
+ Makefile.am: fix build with mawk
+ extras/keymap/README.keymap.txt: Fix bug report link
+ fix major fd leak in link handling
+ modem-modeswitch: fix ZTE MF6xx rule
+
+Matthias Schwarzott (2):
+ rules: Gentoo update
+ rules: Gentoo update
+
+Maxim Levitsky (1):
+ keymap for Acer Aspire 5720
+
+Peter Rajnoha (1):
+ libudev: allow to store negative values in the udev database
+
+Scott James Remnant (1):
+ util_run_program: *really* restore signal mask before executing event RUN commands
+
+William Jon McCann (1):
+ udev-acl: catch up with ConsoleKit 0.4.1
+
+
+Summary of changes from v145 to v146
+============================================
+
+Alan Jenkins (3):
+ man: fix unused, inaccurate metadata
+ man: SYMLINK can be matched as well as assigned
+ fix spelling
+
+Anssi Hannula (2):
+ rules: exclude digitizers from joystick class
+ udev-acl: add joystick devices
+
+Diego Elio 'Flameeyes' Pettenò (21):
+ Merge libudev, udev, and the unconditional extras in a single Makefile.am.
+ Replace the custom test-run target with the standard make check.
+ Also merge into the top-level Makefile.am the simpler extras.
+ Change hook handling to be more portable.
+ Merge keymap building in the top-level Makefile.am.
+ Make keymap generation rules be silent (backward-compatible).
+ Move pkg-config docs and man pages before conditionals.
+ Finally, also merge gudev into the top-level Makefile.am.
+ Make sure to clean up all the built sources.
+ Make sure to use dependency/target variables.
+ Add silent-rule support for the gudev rules.
+ Fix building of introspection library on top-level Makefile.am.
+ Fix another relative path for the new working directory.
+ Include the correct directory for out-of-source builds.
+ Add tests to the distribution; this fixes "make distcheck".
+ Ask gperf to use ANSI-C for generation.
+ Merge in Makefile.am.inc into Makefile.am
+ Use the keymap check during “make distcheck” rather than “check”.
+ Fix building of documentation when doing out-of-source builds.
+ Fix “make distcheck” run outside of the source directory.
+ Use LT_INIT to explicit that udev needs libtool series 2.
+
+Eric W. Biederman (1):
+ fix util_lookup_group to handle large groups
+
+Erik Forsberg (1):
+ extras/modem-modeswitch: Add Huawei E1550 GSM modem
+
+Kay Sievers (18):
+ udevd: add timestamp to --debug output
+ v4l_id: exit with 0 when --help is given
+ configure.ac: version bump
+ hid2hci: remove hid structures and include kernel header
+ path_id: make global variable static
+ udevadm: trigger - add --sysname-match=
+ rules: serial - fix path_id call
+ path_id: fix typo in comment
+ format names are not case insensitive
+ hid2hci: rewrite (and break) rules and device handling
+ make: build internal tools against libudev-private.la
+ update a few years of copyright
+ libudev: silent gcc warning: may be used uninitialized in this function
+ make: suppress enter/leaving directory messages
+ re-enable failed event tracking
+ "record_failed" -> "fail_event_on_error"
+ udevd: block for 15 seconds after error when too old kernel is detected
+ make: fix issues from non-recursive conversion
+
+Lennart Poettering (1):
+ enumeration: move ALSA control devices to the end of the enumerated devices of each card
+
+Mario Limonciello (2):
+ hid2hci: support to hid2hci for recovering Dell BT devices after S3
+ hid2hci: install re-trigger for hid device when recovering from S3
+
+Martin Pitt (17):
+ add keymap for Clevo D410J laptop
+ extras/keymap: add Zepto ZNote
+ extras/keymap: add Everex Stepnote XT5000T
+ extras/keymap: add Compal Hel80i
+ keymap tool: improve help
+ keymap tool: support scancode/keycode pair arguments
+ keymap: inline one-line key maps
+ extras/keymap: fix check-keymaps.sh for inline mappings
+ extras/keymap: add recently added keymap files to Makefile.am
+ extras/keymap: Add HP Presario 2100
+ extras/keymap: cover more Compaq Evo models
+ extras/keymap: Add Fujitsu Amilo M
+ extras/keymap: teach findkeyboards about USB keyboards
+ extras/keymap: Add Samsung SX22S
+ extras/keymap: Fix crash for unknown keys
+ extras/keymap: Add Samsung NC20
+ extras/keymap: Fix Bluetooth key on Acer Aspire 6920
+
+
+Summary of changes from v144 to v145
+============================================
+
+Ian Campbell (1):
+ scsi_id: correct error handling in prepend_vendor_model
+
+Kay Sievers (10):
+ README: add CONFIG_BLK_DEV_BSG
+ use MIN() MAX() from param.h
+ configure.ac: version bump
+ libudev: device - free values before updating them
+ libudev: enumerate - sort with qsort()
+ udevd: detach event from worker if we kill a worker
+ udevadm: info - add space after R:, A:, W: on database export
+ udevd: make sure a worker finishes event handling before exiting
+ udevd: handle SIGCHLD before the worker event message
+ udevd: use bool
+
+
+Summary of changes from v143 to v144
+============================================
+
+Jon Masters (1):
+ firmware: search for third party or sysadmin supplied firmware updates
+
+Kay Sievers (19):
+ configure.ac: add AM_SILENT_RULES
+ configure.ac: version bump
+ TODO: add cleanup of ATA_COMPAT
+ libudev: queue - add comments for queue format
+ udev/.gitignore: add udev.pc
+ configure.ac: version bump
+ do not exports properties starting with a '.'
+ scsi_id: --reformat_serial - use udev_util_replace_whitespace()
+ ata_id: sync ID_SERIAL(_SHORT) with other *_id tools
+ rules: make ata_id properties the default for all ATA block devices
+ scsi_id: delete no longer needed config file
+ update NEWS
+ man: udev - add private properties like ENV{.FOO}="bar"
+ Merge branch 'firmware' of git://git.kernel.org/pub/scm/linux/kernel/git/jcm/udev-jcm
+ udevadm: test - print list of properties
+ build: do not delete .la files
+ libudev: monitor - handle kernel supplied DEVNAME properly
+ update NEWS
+ build: add *exec* to the internal rootlibdir name
+
+Martin Pitt (2):
+ hid2hci: narrow matches to real HCI devices
+ extras/udev-acl: add smartcard readers
+
+Stefan Richter (1):
+ rules: set group ownership of new firewire driver device files
+
+
+Summary of changes from v142 to v143
+============================================
+
+Alan Jenkins (5):
+ udevadm: settle - fix timeout
+ udevd: remove tiny bit of dead code
+ udevd: implement a more efficient queue file format
+ udev-selinux.c: remove libudev header
+ udevd: queue-export - fix crash
+
+Benjamin Gilbert (1):
+ test: check string substitutions in OWNER and GROUP
+
+Dan Williams (2):
+ rules: tty/net - move from udev-extras
+ extras/modem-modeswitch: move from udev-extras
+
+David Zeuthen (1):
+ gudev: move from udev-extras
+
+Kay Sievers (95):
+ version bump
+ rules: v4l do not mix vbi and video nodes
+ fix possible endless loop for GOTO to non-existent LABEL
+ Revert "rules: v4l do not mix vbi and video nodes"
+ rule-generator: cd - skip by-path links if we create by-id links
+ remove format char string truncation syntax
+ use more efficient string copying
+ edd_id: use openat()
+ use openat(), unlinkat(), fstatat()
+ update TODO
+ remove unused GL_FORMAT from rules parser
+ require key names in uppercase
+ keep the ifdef'd udevd testing/profiling hack
+ fix location of database files
+ udevadm: settle - make --timeout=0 working
+ update NEWS
+ rules: add SUBSYSTEM match to scsi rules
+ cdrom_id: suppress ID_CDROM_MEDIA_STATE=blank for plain non-writable CDROM media
+ udevadm: control - add comment to man page about --reload-rules
+ cdrom_id: add error message if open() fails
+ udevadm: settle - add --exit-if-exists=<file>
+ udevd: remove check for dev_t, DEVPATH_OLD takes care of that
+ str[sp]cpyl: add __attribute__ ((sentinel))
+ udevd: convert to event worker processes
+ udevd: close netlink socket in worker and set cloexec
+ rules: do not call path_id for virtual devices
+ udevd: use enum instead of char in struct declaration
+ allow format substitution in path of ATTR{<path>}=="<value>"
+ cleanup $attr{} substitution
+ path_id: implement in C using libudev
+ path_id: update SCSI handling
+ path_id: add comments
+ fix signed/unsigned warning
+ libudev: enumerate - allow multiple keys with the same name
+ udevadm: trigger - add --property-match=<key>:<value>
+ udevadm: info - accept --query without a value and print properties
+ udevadm: control - --env -> --property
+ udevadm: monitor --environment -> --property
+ path_id: handle fibre channel
+ path_id: add iscsi support
+ path_id: delete old shell script
+ udevd: print error if worker dies unexpectedly
+ path_id: rename scsi sub-fuctions
+ libudev: add comments to libudev.h
+ libudev: move to top-level directory
+ fix libudev include in Makefile.am.in
+ libudev: device_new() -> udev_device_new()
+ udevd: log info for created/killed workers
+ libudev: call log functions conditionally
+ move syslog wrapper to libudev
+ move common stuff from udev/ to private parts of libudev/
+ libudev: rename private files to *-private.c
+ rules: remove scsi ch module loading rule
+ update NEWS
+ udevadm: info -revert "accept --query without argument"
+ README: add kernel options
+ README: add INOTIFY and SIGNALFD
+ USE_LOG -> ENABLE_LOGGING, DEBUG -> ENABLE_DEBUG, USE_SELINUX -> WITH_SELINUX
+ libudev: add gtk-doc
+ libudev: update documentation
+ libudev: doc - add section headers
+ libudev: doc - add enumerate
+ libudev: doc - add queue
+ update TODO
+ libudev: doc - add namespace for index
+ libudev: move .so version to libudev Makefile
+ autogen.sh: simplify
+ TODO: update
+ libudev: remove prefix from .so version variables
+ libudev: doc - add empty libudev.types
+ udev-acl: move from udev-extras
+ INSTALL: add --enable-extras
+ udev-acl: handle missing action when called in CK mode
+ v4l_id: move from udev-extras
+ libudev: doc - libudev-docs.sgml -> libudev-doc.xml
+ gudev: fix typo in configure option
+ v4l_id: 70-v4l.rules -> 60-persistent-v4l.rules
+ configure: enable all extras by default, provide --disable-extras
+ autogen.sh: make "CFLAGS=-O0 ./autogen.sh" working
+ NEWS: add --disable-extras
+ cleanup ./configure installation directory options
+ rules: remove MMC rule, 2.6.30 has the modalias
+ configure.ac: print error if gperf is missing
+ libudev: install in $libdir and move later to $rootlibdir
+ extras/keymap: use LIBEXECDIR instead /lib/udev
+ README: add /lib/udev/ is private
+ rules: do not install usb-id/pci-id rules when --disable-extras is used
+ extras: delete man pages for private udev tools
+ README: update
+ extras/keymap: install findkeyboards in /lib/udev
+ INSTALL: use /sbin instead of %{sbindir}
+ NEWS: update
+ udev.pc: add
+ Merge branch 'master' of git+ssh://master.kernel.org/pub/scm/linux/hotplug/udev
+ docs: install writing_udev_rules
+
+Lennart Poettering (2):
+ rules: sound - move from udev-extra
+ usb-db: move from udev-extras
+
+Marcel Holtmann (1):
+ rules: make RFKILL control device world readable
+
+Mario Limonciello (1):
+ hid2hci: move from udev-extras
+
+Martin Pitt (5):
+ keymap: move from udev-extras
+ extras/keymap: Fix WLAN button on ThinkPads
+ keymap: Update findkeyboard path in docs
+ udev-acl: Manage hplip device permissions
+ extras/keymap: Update findkeyboards location
+
+Matthias Schwarzott (3):
+ rules: Gentoo update
+ rules: Gentoo update
+ rules: Gentoo update
+
+Scott James Remnant (1):
+ OWNER/GROUP: fix if logic
+
+
+Summary of changes from v141 to v142
+============================================
+
+Andre Przywara (1):
+ rules: create /dev/cpu/<n>/cpuid world readable
+
+Ian Campbell (1):
+ path_id: support identification of Xen virtual block devices
+
+John Wright (1):
+ edd_id: add cciss devices
+
+Kay Sievers (46):
+ version bump
+ libudev: path_encode - always return 0 if encoded string does not fit into size
+ libudev: monitor - clarify socket handling documentation
+ udevd: log error for too old kernels or CONFIG_SYSFS_DEPRECATED
+ rules: remove DVB shell script
+ update NEWS
+ cdrom_id: add Xen cdrom support
+ test-libudev: update monitor source
+ TODO: add packet filter
+ update NEWS
+ cdrom_id: add and use ID_CDROM_MEDIA to decide if we run vol_id
+ libudev: monitor - add client socket filter for subsystem value
+ udevadm: monitor - print error if we can not bind to socket
+ update TODO
+ udevadm monitor - add --subsystem-match=
+ libudev: monitor - use simpler hash
+ libudev: monitor - switch to filter_add_match_subsystem_devtype()
+ libudev: monitor - do not filter messages with wrong magic
+ udevadm: monitor - add <subsytem>:<devtype> support
+ libudev: monitor - add udev_monitor_filter_remove
+ libudev: queue - fix get_seqnum_is_finished()
+ cdrom_id: skip media tests if CDROM_DRIVE_STATUS != CDS_DISC_OK
+ libudev: queue - clarify comments
+ libudev: monitor - export filter_update()
+ update NEWS
+ drop "extern" keyword from non-static function
+ rule_generator: net - fix usb comment generation
+ rules: input - add links for USB/platform non-kbd/mouse devices
+ rules: input - fix comments
+ rules: add rfcomm* to group dialout
+ accept DEVNAME from the kernel as a hint for the node name
+ update TODO
+ build: use AC_MSG_RESULT
+ rules: add "event*" match
+ udevd: revert initial device node creation
+ rules: remove initramfs comment
+ handle devtmpfs nodes
+ oops, removed ppp entry from rules got committed
+ remove all PHYSDEVPATH handling and warning about
+ remove asmlinkage
+ rules: fix ieee1394 rules
+ add "static" back to the inline functions
+ update TODO
+ delete vol_id and require util-linux-ng's blkid
+ delete libvolume_id
+
+Lubomir Rintel (1):
+ rule-generator: net - whitelist NICs that violate MAC local scheme
+
+
+Summary of changes from v140 to v141
+============================================
+
+Adam Buchbinder (4):
+ usb_id: add manpage
+ cdrom_id: update manpage
+ create_floppy_devices: expand manpage
+ vol_id: fix language in manpage
+
+Alan Jenkins (1):
+ avoid leaking netlink socket fd to external programs
+
+Borislav Petkov (1):
+ rules: rename ide-floppy to ide-gd
+
+David Brownell (1):
+ rules: exclude mtd* from persistent disk links
+
+Kay Sievers (15):
+ rules: fix extra quote in 50-udev-default.rules
+ version bump
+ udevadm: test - handling trailing '/' in devpath
+ udevadm: monitor - clarify printed header
+ rules: remove ram* from persisten disk links blacklist
+ rules: serial - support ttyACM devices
+ rules: replace IDE driver with media match
+ usb_id: add ID_VENDOR_ID, ID_MODEL_ID, ID_USB_INTERFACE_NUM, ID_USB_DRIVER
+ libudev: GPL -> LGPL
+ usb_id: remove unused variable
+ send monitor events back to netlink socket
+ "UDEV_MONITOR_KERNEL/UDEV" -> "kernel/udev"
+ IMPORT: 2048 -> 4096 bytes buffer
+ path_encode: fix max length calculation
+ libudev: monitor - unify socket message handling
+
+Michal Soltys (1):
+ rules: md-raid.rules fix
+
+Robby Workman (1):
+ udevadm: trigger - add "--action" to --help
+
+Scott James Remnant (1):
+ libudev: monitor - ignore messages from unusual sources
+
+
+Summary of changes from v139 to v140
+============================================
+
+Harald Hoyer (1):
+ libvolume_id: bump age
+
+Kay Sievers (12):
+ version bump
+ update TODO
+ volume_id: ntfs - fix uuid setting
+ update TODO
+ rules: Fedora update
+ libudev: queue - use lstat() to check existence of symlink
+ udevadm: settle - add --seq-start= --seq-end=
+ udevd: switch watch symlinks to devpath
+ udevadm: add text for new options to command and man page
+ update TODO
+ libudev: ctrl - return error after sending ctrl message
+ udevadm: settle - use timeout signal, instead of loop counter
+
+Michael Prokop (1):
+ fix compile error in debug mode
+
+Scott James Remnant (1):
+ udevadm: settle - synchronise with the udev daemon
+
+
+Summary of changes from v138 to v139
+============================================
+
+Kay Sievers (11):
+ version bump
+ remove static local variable
+ use the event udev_device to disable the watch on "remove"
+ add "nowatch" to disable a default installed watch with a later rule
+ add m4/ subdir
+ use AC_USE_SYSTEM_EXTENSIONS instead of AC_GNU_SOURCE
+ usb_id: add ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:
+ usb_id: return values if called directly for an usb_device
+ usb_id: fix NULL string usage
+ usb_id: fix comment
+ udevadm: info - export all devices with --export-db
+
+Scott James Remnant (10):
+ Don't add inotify watch until RUN rules processed.
+ Clear existing inotify watch before processing.
+ Cleanup a little.
+ Allow watch handle to be stored in the udevdb.
+ Store watch handle in db.
+ Use the udevdb to speed up watch clearing.
+ Put a log message in a more sensible place.
+ Output watch handle in udevadm info.
+ lookup the old watch handle; reload only if has a path
+ Look at more inotify events in the buffer than just the first.
+
+
+Summary of changes from v137 to v138
+============================================
+
+David Zeuthen (1):
+ *_id: add model/vendor enc strings
+
+Karel Zak (2):
+ vol_id: fix ddf version string
+ vol_id: add missing id->type to swap0
+
+Kay Sievers (13):
+ man: fix grammar
+ version bump
+ fix NAME="" logic
+ rules: dm - add escape for uuid links with whitespace
+ test: add test for empty and non-existent ATTR
+ rules: fix md "change"/"remove" handling
+ autogen.sh: add more warnings
+ fix NAME= and OPTION+="string_escape=..." logic
+ rules: move OPTIONS to separate rule
+ use global "reload_config" flag
+ rules: add "watch" option to dm and md rules
+ rules: include loop block devices in persistent links
+ release 138
+
+Matthias Schwarzott (1):
+ rules: Gentoo update
+
+Miklos Vajna (1):
+ doc: writing udev rules - refer to 'udevadm info' instead of 'udevinfo'
+
+Scott James Remnant (2):
+ udevd: optionally watch device nodes with inotify
+ rules: update persistent storage rules to use inotify watches
+
+
+Summary of changes from v136 to v137
+============================================
+
+Alan Jenkins (2):
+ man: typo fixes
+ remove stray initializer
+
+Kay Sievers (17):
+ version bump
+ rules: fix typo in ide cd rule
+ libudev: use 4096 bytes buffer for attribute reading
+ rules: add drm devices to group "video"
+ do not complain about a missing /etc/udev/rules.d/
+ udevadm: test - remove --force option
+ update NEWS
+ remove name from index if the node name has changed
+ cleanup old names before creating the new names
+ open-code pollfd setup
+ increase netif renaming timeout from 30 to 90 seconds
+ Merge commit '5f03ed8a56d308af72db8a48ab66ed68667af2c6'
+ Merge commit '9032f119f07ad3b5116b3d4858816d851d4127de'
+ split up long line
+ udevd: add back SA_RESTART
+ usb_id: handle ATAPI devices like SCSI devices
+ udevadm: settle - fix typo
+
+Lennart Poettering (1):
+ fix naming for tape nst devices in /dev/tape/by-path/
+
+Olaf Kirch (2):
+ udevd: use ppoll instead of signal pipes
+ reap children faster
+
+Scott James Remnant (2):
+ Allow user and group lookup to be disabled.
+ Expose delayed name resolution
+
+Sven Jost (1):
+ volume_id: support via raid version 2
+
+
+Summary of changes from v135 to v136
+============================================
+
+Adam Buchbinder (1):
+ extras: fix mis-spelling of "environment"
+
+Harald Hoyer (1):
+ rule_generator: fix enumeration for write_cd_rules
+
+Jeremy Higdon (1):
+ path_id: rework SAS persistent names
+
+Karel Zak (1):
+ volume_id: HPFS code clean up
+
+Kay Sievers (54):
+ rules: ATA_COMPAT do not try to match on sr*, it will never have vendor ATA
+ scsi_id: do not fail if no serial is found like for optical drives
+ update configure and NEWS
+ rules: fix isdn rules
+ rules: add persistent /dev/serial/{by-id,by-path} rules
+ make: install serial rules file
+ make: do not delete autotools generated file with distclean
+ udevadm: settle - allow --timeout=0 and --quiet
+ rules: move aoe rules to default rules file
+ volume_id: btrfs - update format
+ rules: add "do not edit header"
+ volume_id: support sub-uuid's and plug in btrfs device uuid
+ libudev: include <sys/types.h>
+ build: add -lsepol
+ build: just use autoreconf -i
+ rules: remove ide-scsi
+ rules: first simple step merging with Ubuntu rules
+ "'/sbin/modprobe abnormal' exit" - also print program options
+ rules: more changes toward Ubuntu rules merge
+ rules: more changes toward Ubuntu rules merge
+ rules: remove /dev/raw/raxctl symlink, it's a devfs leftover
+ rules: rtc - create rtc compat link only for cmos type rtc
+ rules: remove legacy symlinks
+ rules: do not put raw1394 in "video" group
+ rules: second round merging with Ubuntu rules
+ rules: remove /dev/dsp /dev/audio
+ rules: put alsa in group "audio"
+ rules: isdn - remove /dev/isdn/capi20 symlink
+ rules: provide /dev/raw/rawctl
+ if needed, store database entries also for devices which do not have a device node
+ build: use autoreconf --symlink
+ usb_id: add "image" class
+ require non-SYSFS_DEPRECATED 2.6.20+ kernel
+ build: default to --prefix=/usr --exec-prefix=""
+ libudev: enumerate - add lookup by property
+ rules: input - make sure needed variables are set
+ libudev: device - read "uevent" only if info is not already loaded
+ libudev: subsytem -> subsystem
+ libudev: bump revision
+ usb_id: use devtype lookup
+ require 2.6.22+ kernel
+ rules: Ubuntu merge - use group "cdrom"
+ rules: Ubuntu merge - use group "tape"
+ rules: replace DVB shell script rule
+ rules: Ubuntu merge - s/uucp/dialout/
+ update NEWS
+ update NEWS
+ enable skipping of "naming-only" rules
+ usb_id: s/image/media/
+ udevadm: s/udevinfo/udevadm info/
+ rules: reorder block rules
+ rules: zaptel - add "dialout" group
+ libudev: device - add udev_device_get_property_value()
+ libudev: test - add udev_device_get_property_value()
+
+Marcel Holtmann (3):
+ libudev: device - add devtype support
+ libudev: device - lookup subsystem and devtype together
+ libudev: device - remove udev_device_get_parent_with_subsystem
+
+Michal Soltys (1):
+ man: udev - update NAME assignment
+
+Ryan Thomas (1):
+ rules: add rules for AoE devices
+
+
+Summary of changes from v134 to v135
+============================================
+
+Kay Sievers (6):
+ usb_id: add "break" to currently unused case labels
+ rules: fix cciss disk/by-id/ links
+ rules: add infiniband rules
+ rules: infiniband.rules -> 40-infiniband.rules
+ fix network interface name swapping
+ update configure and NEWS
+
+Marcel Holtmann (1):
+ usb_id: fix switch statement for video type
+
+Piter PUNK (2):
+ rules: /dev/null -> X0R
+ rules: add usb device nodes
+
+
+Summary of changes from v133 to v134
+============================================
+
+Gabor Z. Papp (1):
+ include errno.h in sysdeps.h
+
+Harald Hoyer (1):
+ rules: add persistent rules for memory stick block devices
+
+Kay Sievers (19):
+ autogen.sh: fix -print-multi-os-directory usage
+ volume_id: update btrfs magic
+ bump version
+ rules: merge group "video" into default rules
+ rules: v4l - add by-id/ links for USB devices
+ libudev: accept NULL whitelist in util_replace_chars()
+ usb_id: replace chars in returned strings
+ ata_id: make sure, we do not have slashes in values
+ scsi_id: make sure, we do not have slashes in values
+ volume_id: remove unused usage types
+ vol_id: if regular files are probed, use stat() for the size value
+ volume_id: update btrfs
+ volume_id: clear probing result before probing and do not probe a second time, if not needed
+ path_id: fix fibre channel handling
+ update NEWS TODO
+ floppy: use ARRAY_SIZE()
+ fix handling of swapping node name with symlink name
+ silence PHYSDEV* warning for WAIT_FOR* rules
+ rules: exclude "btibm" devices from vol_id calls
+
+Matthias Schwarzott (1):
+ rules: Gentoo update
+
+Peter Breitenlohner (2):
+ man: fix typos
+ floppy: fix array bounds check and minor calculation
+
+
+Summary of changes from v132 to v133
+============================================
+
+Alan Jenkins (2):
+ udevd: de-duplicate strings in rules
+ scsi_id: we don't use DEVPATH env var anymore, update man page
+
+Karel Zak (1):
+ volume_id: fat - move check for msdos signature (0x55 0xaa)
+
+Kay Sievers (22):
+ silence "comparison between signed and unsigned"
+ string index - split nodes and childs to allow and unlimited number of childs
+ reserve child slot 0
+ merge trie nodes, childs and root into a single array
+ set errno = ENOSYS in inotify stub
+ udevadm: info - unify -V and --version
+ rules: remove DEVTYPE disk/partition
+ rules: remove pnp shell script, acpi loads these modules properly
+ update NEWS
+ configure: add linux-hotplug mail address
+ remove len == 0 check, the index root is always '\0'
+ volume_id: bump revision
+ volume_id: always check for all filesystem types and skip conflicting results
+ volume_id: fat - accept empty FAT32 fsinfo signature
+ fix spelling in comment
+ volume_id: ntfs - mark as no other fs must match
+ vol_id: clarify error message
+ libudev: device - handle disk "device" link for partitions in deprecated sysfs layout
+ limit $attr(<symlink>) magic to well-known links only
+ udevd: fix cleanup of /dev/.udev/uevent_seqnum
+ fix $links substitution for devices without any link
+ update NEWS
+
+Sergey Vlasov (1):
+ udevadm: fix option parsing breakage with klibc
+
+
+Summary of changes from v131 to v132
+============================================
+
+Kay Sievers (2):
+ fix size_t compiler warning on 32 bit platforms
+ convert debug string arrays to functions
+
+
+Summary of changes from v130 to v131
+============================================
+
+Alan Jenkins (17):
+ libudev: fix sysnum logic for digit-only device names
+ udevd: avoid overhead of calling rmdir on non-empty directories
+ use more appropriate alternatives to malloc()
+ libudev: util - optimize path_encode()
+ libudev: allocate udev_device->envp[] dynamically
+ replace strncpy() with strlcpy()
+ use re-entrant variants of getpwnam and getgrnam
+ udevd: fix memory leak
+ udevd: fix WAIT_FOR_SYSFS execution order
+ fix handling of string_escape option
+ udevd: use a tighter loop for compare_devpath()
+ udevd: avoid implicit memset in match_attr()
+ kerneldoc comment fixes
+ udevd: simplify rules execution loop
+ udevd: fix termination of rule execution
+ udevd: be more careful when matching against parents
+ udevd: shrink struct token to 12 bytes
+
+Kay Sievers (113):
+ remove outdated docs/README-gcov_for_udev
+ libudev: device - add device lookup by subsystem:sysname
+ libudev: also prefix non-exported functions with udev_*
+ libudev: add udev_monitor_send_device()
+ libudev: list - add flag
+ libudev: device - generate DEVNAME and DEVLINKS properties
+ vol_id: update README
+ libudev: handle ! in sysname, add sysnum, return allocated list_entry on add
+ delete simple-build-check.sh
+ test: move global ENV{ENV_KEY_TEST}="test" to local rule
+ libudev: monitor - fix send_device() property copying
+ libudev: device - add get_envp() to construct envp from property list
+ libudev: do not include ctrl in libudev.so
+ libudev: monitor - do not mangle DEVLINKS property
+ libudev: update DEVLINKS property when properties are read
+ libudev: device - lookup "subsystem" and "driver" only once
+ libudev: device - export properties when values are set
+ libudev: list - handle update of key with NULL value
+ libudev: ctrl - fix typo in set_env()
+ libudev: add global property list
+ libudev: device - copy global properties, unset empty properties
+ volume_id: btrfs - update magic to latest disk format
+ udevd: use libudev
+ move udev_device_db to libudev
+ rename udev source files
+ libudev: always add UDEV_LOG
+ libudev: monitor - export MAJOR/MINOR only if available
+ udev-node: name_list -> udev_list
+ udev-rules-parse: name_list -> udev_list
+ delete name_list, move common file functions
+ fix sorting of rules files
+ run_program: prevent empty last argv entry
+ update IMPORT= file/stdout property parsing
+ update rules file parsing
+ delete udev-util-file.c
+ libudev: list - prepend udev_* to all functions
+ libudev: add sysnum to test program
+ test: fix a few unintentially wrongly written rules which cause parse errors
+ libudev: monitor - add set_receive_buffer_size()
+ libudev: ctrl - change magic to integer
+ libudev: make list_node functions available
+ udevd: use udev_list_node
+ collect: use udev_list
+ delete list.h
+ merge udev-rules.c and udev-rules-parse.c
+ make struct udev_rules opaque
+ move run_program to util
+ udev_event_run() -> udev_event_execute_rules()
+ udev_rules_run() -> udev_event_execute_run();
+ move udev_rules_apply_format() to udev-event.c
+ udev_list_cleanup() -> udev_list_cleanup_entries()
+ selinux_init(udev) -> udev_selinux_init(udev)
+ prefix udev-util.c functions with util_*
+ pass make distcheck
+ libudev: device - get_attr_value() -> get_sysattr_value()
+ cdrom_id: remove ARRAY_SIZE() declaration
+ replace missing get_attr_value() -> get_sysattr_value()
+ add "root" == 0 shortcuts to lookup_user/group()
+ do not use the new work-in-progress parser rule matcher
+ libudev: device - 128 -> ENVP_SIZE
+ add util_resolve_subsys_kernel()
+ handle numerical owner/group string in lookup_user/group()
+ replace in-memory rules array with match/action token list
+ do not create temporary node ($tempnode) if node already exists
+ shrink struct udev_event
+ shrink struct udev_event
+ rule_generator: fix netif NAME= value extraction regex
+ skip SYMLINK rules for devices without a device node
+ rules: let empty strings added to buffer always return offset 0
+ fix uninitialized variable warnings
+ cache uid/gid during rule parsing
+ distinguish "match" from "assign" by (op < OP_MATCH_MAX)
+ determine at rule parse time if we need to call fnmatch()
+ special-case "?*" match to skip fnmatch()
+ libudev: monitor - replace far too expensive snprintf() with strlcpy()
+ libudev: monitor - cache result of monitor send buffer
+ fix "unused" warnings
+ remove debug printf
+ match KEY="A|B" without temporary string copy
+ match_attr() - copy attr value only when needed
+ do not init string arrays, just clear first byte
+ fix $attr{[<subsystem>/<sysname>]<attribute>} substitution
+ libudev: device - fill envp array while composing monitor buffer
+ test: add RUN+="socket: ..." to a test to run monitor code
+ libudev: device - allocate envp array only once
+ update NEWS
+ udevd: merge exec and run queue to minimize devpath string compares
+ ATTR{}== always fails if the attribute does not exist
+ rules: remove SCSI timeouts
+ rules: remove "add" match from usb device node rule
+ edd_id: add "change" event match
+ fstab_import: add "change" event match
+ write trace log to stderr
+ log rules file and line number when NAME, SYMLINK, OWNER, GROUP, MODE, RUN is applied
+ skip entire rule containing device naming keys, if no device can be named
+ fix udev_node_update_old_links() logic
+ move some info() to dbg()
+ add "devel" and "install" switches to autogen.sh
+ move debugging strings inside #ifdef DEBUG
+ firmware.sh: record missing files in /dev/.udev/firmware-missing/
+ fix list handling in enumerate and rules file sorting
+ volume_id: btrfs update
+ info() PROGRAM and IMPORT execution
+ fix $links substitution
+ fix cleanup of possible left-over symlinks
+ do not import the "uevent" file when we only read the db to get old symlinks
+ usb_id: MassStorage SubClass 6 is "scsi" not "disk"
+ unify string replacement
+ $links should be relative
+ fix indentation
+ rules: md - add mdadm 3 device naming
+ cleanup /dev/.udev/queue on startup and exit
+ udevadm: settle - exit if udevd exits
+
+Matthias Koenig (1):
+ volume_id: swap - larger PAGE_SIZE support
+
+Steven Whitehouse (1):
+ volume_id: support for GFS2 UUIDs
+
+
+Summary of changes from v129 to v130
+============================================
+
+Kay Sievers (26):
+ fix compile error with --disable-logging
+ libudev: enumerate - add_device() -> add_syspath()
+ volume_id: hpfs - read label and uuid
+ use no_argument, required_argument, optional_argument in longopts
+ libudev: get rid of selinux
+ libudev: device - add get_parent_with_subsystem()
+ usb_id: use libudev
+ udevadm: info - fix --query=all for devices without a device node
+ vol_id: add size= option
+ move selinux noops to udev.h
+ volume_id: add dbg() as noop to check for compile errors
+ vol_id: fix logging glue
+ vol_id: always use the safe string versions for unencoded label and uuid
+ volume_id: better DDF raid detection
+ volume_id: add btrfs
+ volume_id: use PRIu64i, PRIx64 macros
+ udevd: clarify deprecated sysfs layout warning
+ libudev: fix --enable-debug
+ don not print error if GOTO jumps just to next rule
+ volume_id: add more vfat debugging information
+ libudev: libudev.pc remove selinux
+ store node name and symlinks into db symlink target if they are small enough
+ volume_id: more fat debugging
+ libudev: fix typo in "multiple entries in symlink" handling
+ connect /sys and /dev with /sys/dev/{block,char}/<maj>:<min> and /dev/{block,char}/<maj>:<min>
+ replace spaces in dm and md name symlinks
+
+
+Summary of changes from v128 to v129
+============================================
+
+Alan Jenkins (7):
+ udev-test.pl: set non-zero exitcode if tests fail
+ scsi_id: compiler warning on 32-bit
+ trivial cleanup in udev_rules_iter
+ avoid repeated scans for goto targets (udev_iter_find_label)
+ replace strerror() usage with threadsafe "%m" format string
+ fix messages (inc. debug compile failure) introduced when optimizing "goto"
+ allow compiler to check dbg() arguments on non-debug builds
+
+Kay Sievers (46):
+ libudev: switch to "udev_device_get_parent"
+ libudev: udev_device - add attribute cache
+ libudev: handle "device" link as parent, handle "class" "block" as "subsystem"
+ udevadm: info - fix lookup-by-name
+ libudev: switch API from devpath to syspath
+ libudev: rename ctrl_msg to ctrl_msg_wire
+ vol_id: fix lib logging glue
+ fix broken symlink resolving
+ fix udevadm trigger
+ libudev: pass udev_device in enumerate
+ libudev: fix "subsystem" value
+ always include config.h from Makefile
+ libudev: udev_device_get_devname -> udev_device_get_devnode
+ libudev: add udev_device_new_from_devnum()
+ libudev: also import "uevent" file when reading udev database
+ libudev: add userdata pointer
+ libudev: replace awkward callback list interfaces with list iterators
+ libudev: get devnum from uevent file
+ libudev: enumerate_get_devices_list -> enumerate_get_list
+ libudev: initialize selinux only when needed
+ libudev: device - read database only when needed
+ libudev: rework list handling
+ libudev: more list rework
+ lubudev: accept more sys directories as devices, and parent devices
+ libudev: enumerate - accept list of subsystems to scan, or skip
+ libudev: enumerate "subsystem"
+ libudev: enumerate - scan /sys/block/ if needed
+ libudev: enumerate - split new() and scan()
+ test: replace ancient sysfs tree with recent one
+ test: add missing pci directory because of .gitignore *.7
+ gitignore: move *.8 to subdirs
+ test: replace last reference of "/class/*" devpath
+ fix dbg() callers
+ libudev: enumerate - scan devices and subsystems, add subsystem and attribute filter
+ udevadm: trigger: use libudev
+ fix segfault caused by wrong pointer used in dbg()
+ libudev: device_init() -> device_new()
+ udevadm: trigger fix long option --type=
+ libudev: add queue interface
+ udevadm: settle - use libudev queue
+ libudev: device - handle /sys/block/<disk-device-link>/<partition>
+ libudev: enumerate - ignore regular files while scanning
+ udevadm: trigger --type=failed - use libudev queue
+ rules: ieee1394 - create both, by-id/scsi-* and by-id/ieee-* links
+ build: include Makefile.am.inc in all Makefile.am
+ udevd: print warning if CONFIG_SYSFS_DEPRECATED is used
+
+
+Summary of changes from v127 to v128
+============================================
+
+Alan Jenkins (8):
+ fix uninitialized name_list error::ignore_error
+ do not needlessly declare some local variables in udev_rules_parse.c as static
+ remove deprecated envp[] in main()
+ fix name compare bug name_list_key_add()
+ remove redundant string copy in udev_rules_apply_format()
+ remove redundant "remove trailing newlines" in udevadm info
+ threadsafe rules iteration
+ fix off-by-one in pass_env_to_socket()
+
+Kay Sievers (53):
+ libudev: add monitor documentation
+ libudev: fix --disable-log
+ autogen.sh: add --with-selinux
+ volume_id: hfs - calculate proper uuid
+ fix dangling pointer returned by attr_get_by_subsys_id()
+ udev-test.pl: add --valgrind option
+ libudev: libudev.pc add Libs.private
+ volume_id: fail on undefined __BYTE_ORDER
+ remove FAQ
+ libudev: fix monitor documentation
+ libudev: add udev_device_get_syspath()
+ udev_device_init() remove statically allocated device support
+ udevadm: info - fix broken --device-id-of-file=
+ udevadm: control - use getopt_long()
+ udevadm: print warning to stderr if udevadm is called by symlink
+ udev-test.pl: remove left-over comment from --valgrind option
+ udevadm: rename source files
+ udevadm: rename internal functions to udevadm_*
+ udevadm: split out control functions
+ udevadm: move init from commands to udevadm
+ autogen.sh: add debug
+ use libudev code, unify logging, pass udev context around everywhere
+ volume_id: linux_raid - fix logic for volumes with size == 0
+ vol_id: add --debug option
+ udevadm: add --version --help options to man page, hide them as commands
+ move udev_ctrl to libudev-private
+ udev-test.pl: set udev_log="err"
+ test-udev: cleanup libudev context and overridden rules file string
+ test-udev: remove unused var
+ add a bunch of private device properties to udev_device
+ udevadm: monitor - use libudev for udev monitor
+ libudev: monitor - add event properties to udev_device
+ udevadm: log message if udevadm link is used
+ udevd: remove max_childs_running logic
+ libudev: monitor- add netlink uevent support
+ udevadm: monitor - use libudev code to retrieve device data
+ libudev: udev_device - read "driver" value
+ libudev: rename enumerate function
+ libudev: add selinux
+ libudev: initialize selinux after logging
+ volume_id: merge util.h in libvolume_id-private.h
+ update file headers
+ libudev: udev_device - add more properties
+ libudev: do not use udev_db.c
+ libudev: get rid of udev_sysfs.c
+ libudev: get rid of udev_utils.c
+ libudev: rename libudev-utils.c libudev-util.c
+ libudev: do not use any udev source file
+ extras: use libudev code
+ convert to libudev and delete udev_utils_string.c
+ get rid of udev_sysdeps.c
+ use size definitions from libudev
+ udevadm: info - use "udev_device"
+
+
+Summary of changes from v126 to v127
+============================================
+
+Karel Zak (2):
+ build-sys: don't duplicate file names
+ build-sys: remove non-POSIX variable names
+
+Kay Sievers (26):
+ add inotify dummy definitions if inotify is not available
+ build: remove autopoint check
+ udevadm: trigger - add missing attr filter to synthesized "subsystem" register events
+ ignore duplicated rules file names
+ fix .gitignore
+ rules: delete all distro rules which do not use default rules
+ rules: add nvram
+ rules: add isdn rules
+ rules: Gentoo update
+ add missing includes
+ add some warnings
+ update .gitignore
+ add missing 'v' for "make changelog"
+ build: fix "make dist"
+ vol_id: make the --offset= argument optional
+ rules: optical drives - probe at last session offset, do not probe for raid
+ libudev: add library to access udev information
+ libudev: split source files
+ update INSTALL
+ libudev: add udev event monitor API
+ volume_id: remove deprecated functions and bump major version
+ volume_id: remove left-over fd close()
+ split udev_device.c to leave out rules handling from libudev
+ libudev: link against selinux if needed
+ firmware.sh: lookup lookup kernel provided firmware directory
+ libudev: require LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
+
+Michal Soltys (1):
+ rules: fix md rules for partitioned devices
+
+
+Summary of changes from v125 to v126
+============================================
+
+Kay Sievers (9):
+ delete all Makefiles and move udev source to udev/
+ use autotools
+ rules: mode 0660 for group "disk"
+ rules: update Fedora rules
+ update ChangeLog
+ INSTALL: --enable-selinux not --with-selinux
+ volume_id: move static lib to $prefix
+ volume_id: create relative links
+ rules: run vol_id on opticals only if media is found
+
+Marco d'Itri (1):
+ rules: Debian update
+
+Thomas Koeller (1):
+ use proper directory lib/lib64 for libvolume_id
+
+
+Summary of changes from v124 to v125
+============================================
+
+John Huttley (1):
+ rules: tape rules - add nst to usb and 1394 links
+
+Karl O. Pinc (1):
+ man: clarify $attr{} parent searching
+
+Kay Sievers (14):
+ collect: fix size_t printf
+ path_id: suppress trailing '-' like 'ID_PATH=pci-0000:05:01.0-'
+ rules: add v4l persistent links
+ docs: update some docs and delete outdated stuff
+ scsi_id: fix fallback to sg v3 for sg nodes
+ rules: fix cciss rules for partition numbers > 9
+ udev.conf: udevcontrol -> udevadm control
+ rules: use consistently OPTIONS+=
+ scsi_id: the fallback fix broke error handling
+ man: rebuild from xml
+ do not touch node ownership and permissions, if already correct
+ rules: tape rules - add nst to by-path/ links
+ udevadm: info - add --export format to --device-id-of-file=
+ move default rules from /etc/udev/rules.d/ to /lib/udev/rules.d/
+
+Marco d'Itri (7):
+ rules_generator: net rules - do not print error if file is missing and ignore commented rules
+ man: add link_priority default value
+ scsi_id: man page fix
+ udevadm: settle - add verbose output when running into timeout
+ rules: Debian update
+ rules: Debian update
+ ignore rule with GOTO to a non-existent label
+
+Thomas Koeller (1):
+ scsi_id: include sys/stat.h
+
+Tobias Klauser (1):
+ collect: check realloc return value
+
+
+Summary of changes from v123 to v124
+============================================
+
+Kay Sievers (1):
+ cdrom_id: fix recognition of blank media
+
+
+Summary of changes from v122 to v123
+============================================
+
+Erik van Konijnenburg (3):
+ add substitution in MODE= field
+ Makefile: use udevdir in "make install"
+ volume_id: support for oracleasm
+
+Harald Hoyer (1):
+ scsi_id: retry open() on -EBUSY
+
+Karel Zak (2):
+ volume_id: remove unnecessary global variable
+ volume_id: enable GFS probing code, add LABEL support
+
+Kay Sievers (5):
+ edd_id: call it only for sd* and hd*
+ rename WAIT_FOR_SYSFS to WAIT_FOR and accept an absolute path
+ rules: tape rules - use bsg device nodes for SG_IO
+ rules: persistent net - handle "locally administered" ibmveth MAC addresses
+ cdrom_id: export ID_CDROM_MEDIA_TRACK_COUNT_AUDIO=, ID_CDROM_MEDIA_TRACK_COUNT_DATA=
+
+Michal Soltys (1):
+ man: add NAME== match entry
+
+Xinwei Hu (2):
+ collect: realloc buffer, if needed
+ udevd: export .udev/queue/$seqnum before .udev/uevent_seqnum
+
+
+Summary of changes from v121 to v122
+============================================
+
+Hannes Reinecke (2):
+ scsi_id: remove all sysfs dependencies
+ scsi_id: add SGv4 support
+
+Karel Zak (1):
+ volume_id: clean up linux_raid code
+
+Kay Sievers (8):
+ scsi_id: update man page
+ scsi_id: remove bus_id option
+ scsi_id: add --sg-version= option
+ rules: adapt to new scsi_id
+ rules: adapt tape rules to new scsi_id
+ scsi_id: add bsg.h
+ volume_id: bump version
+ Makefile: do not create udevcontrol, udevtrigger symlinks
+
+MUNEDA Takahiro (2):
+ man: udevd- fix udev(8) reference
+ man: scsi_id
+
+Matthias Schwarzott (1):
+ cdrom_id: fix segfault
+
+
+Summary of changes from v120 to v121
+============================================
+
+Damjan Georgievski (1):
+ libvolume_id: recognize swap partitions with a tuxonice hibernate image
+
+Daniel Drake (1):
+ writing udev rules: fix rule typos
+
+David Woodhouse (1):
+ rules_generator: net rules - add "dev_id" value to generated rules
+
+Harald Hoyer (1):
+ selinux: more context settings
+
+Kay Sievers (21):
+ udevinfo: do not replace chars when printing ATTR== matches
+ vol_id: add --offset option
+ cdrom_id: replace with version which also exports media properties
+ udevd: at startup write message including version number to kernel log
+ rules_generator: net rules - always add KERNEL== match to generated rules
+ selinux: fix missing includes
+ allow setting of MODE="0000"
+ path_id: remove subsystem whitelist
+ logging: add trailing newline to all strings
+ scsi_id: initialize serial strings
+ persistent device naming: also read unpartitioned media
+ cdrom_id: add more help text
+ add $links substitution
+ fstab_import: add program to IMPORT matching fstab entry
+ add OPTIONS+="event_timeout=<seconds>"
+ write "event_timeout" to db
+ udevadm: trigger - add --env= option
+ udevadm: control - fix --env key to accept --env=<KEY>=<value>
+ udevadm: info - do not print ATTR{dev}==
+ persistent device naming: update tape rules
+ rules: update md rules
+
+
+Summary of changes from v119 to v120
+============================================
+
+Kay Sievers (9):
+ test: remove duplicated EXTRA entry
+ rules: remove last WAIT_FOR_SYSFS, load ppdev, switch scsi_device
+ udevadm: trigger - option to synthesize events and pass them to a socket
+ udevadm: info - resolve devpath if symlink is given
+ udevadm: remove old man page links and compat links for debugging tools
+ udevadm: trigger - fix broken socket option check
+ udevadm: trigger - fix --socket== + --verbose
+ also accept real socket files for RUN+="socket:<path>"
+ persistent device naming: cleanup storage rules
+
+Michael Kralka (1):
+ udevd: serialize events if they refer to the same major:minor number
+
+
+Summary of changes from v118 to v119
+============================================
+
+Anthony L. Awtrey (1):
+ do not skip RUN execution if device node removal fails
+
+Harald Hoyer (2):
+ rules: Fedora update
+ rules: do not set GROUP="disk" for scanners
+
+Jiri Slaby (1):
+ rules_generator: add missing write_net_rules unlock
+
+Karel Zak (2):
+ volume_id: fix UUID raw buffer usage
+ volume_id: fix typo in function documentation
+
+Kay Sievers (10):
+ switch mailing lists to linux-hotplug@vger.kernel.org
+ rules: remove tty rule which can never run because of an earlier "last_rule"
+ volume_id: update ext detection
+ selinux: set context for real file name not the temp name
+ hack to allow ATTR{block/*/uevent}="change"
+ rules_generator: add KERNEL=="<netifname>*" to generated rules
+ persistent device naming: also run on "change" event
+ test: add "subsystem" links to all devices
+ sysfs: depend on "subsystem" link
+ extend hack to allow TEST=="*/start"
+
+Matthias Schwarzott (1):
+ volume_id: respect LDFLAGS
+
+Neil Williams (1):
+ volume_id: add prefix=, exec_prefix=
+
+Roy Marples (1):
+ Makefile: do not require GNU install
+
+
+Summary of changes from v117 to v118
+============================================
+
+Daniel Drake (1):
+ doc: update "writing udev rules"
+
+Hannes Reinecke (1):
+ volume_id: LVM - add uuid
+
+Kay Sievers (9):
+ remove udevstart
+ rules_generator: do not create rules with insufficient matches
+ man: udevadm settle - mention 180 seconds default timeout
+ libvolume_id: squashfs - add endianess support for LZMA compression
+ rules: add AOE rule
+ volume_id: md - add metadata minor version
+ volume_id: run only once into a timeout for unreadable devices
+ create_floppy_devices: fix logic for more than one floppy device
+ volume_id: also add readable check to probe_all()
+
+Matthias Schwarzott (1):
+ rules: Gentoo update
+
+Michael Prokop (1):
+ libvolume_id: squashfs+LZMA compression detection
+
+
+Summary of changes from v116 to v117
+============================================
+
+Dan Nicholson (2):
+ extras: ignore built and generated files
+ volume_id: create relative symlink when $(libdir) = $(usrlibdir)
+
+Kay Sievers (15):
+ usb_id: fail if vendor/product can not be retrieved
+ rules: SUSE update
+ firmware: do not print error if logger is missing
+ volume_id: vfat - allow all possible sector sizes
+ volume_id: LUKS - export version
+ volume_id: ntfs - rely on valid master file table
+ volume_id: bump version
+ udevinfo: exclude "uevent" file from --attribute-walk
+ udevadm: merge all udev tools into a single binary
+ udevadm: accept command as option, like --help, --version
+ udevadm: add info option --device-id-of-file=<file>
+ Makefile: fix bogus version number than got committed
+ udevadm: also return major==0 results for --device-id-of-file
+ man: udevd.8 - remove udevcontrol section
+ udevadm: control - allow command to be passed as option
+
+MUNEDA Takahiro (1):
+ man: fix udevadm.8 typo
+
+Matthias Schwarzott (2):
+ firmware: remove hardcoded path to logger
+ rules: Gentoo update
+
+VMiklos (1):
+ rules: Frugalware update
+
+
+Summary of changes from v115 to v116
+============================================
+
+Bryan Kadzban (1):
+ rules: fix typos
+
+Harald Hoyer (3):
+ check line length after comment check and whitespace strip
+ only install *.rules
+ remove extra space from udevinfo symlink output
+
+Kay Sievers (29):
+ rules: fix two trivial typos
+ rules: random and urandom are 0666
+ rules: add REMOVE_CMD rule
+ track "move" events to rename database and failed files
+ rules: Gentoo update
+ rules: add i2o driver rule
+ man: recreate man pages
+ volume_id: fix linux_raid metadata version 1.0 detection
+ add $name substitution
+ do not delete the device node with ignore_remove, but handle the event
+ print warning for invalid TEST operations
+ rules: do not delete /lib/udev/devices/ nodes on "remove"
+ rules: remove broken nvram group assignment without any permission
+ add /dev/rtc symlink if new rtc drivers are used
+ increase WAIT_FOR_SYSFS timeout to 10 seconds
+ rules: put bsd nodes in /dev/bsd/ directory
+ path_id: fix for stacked class devices
+ ignore device node names while restoring symlinks from the stack
+ use SEQNUM in /dev/.udev/queue/ instead of devpath
+ rules: add memstick module loading
+ udevinfo: simplify symlink printing logic
+ prevent wrong symlink creation if database disagress with current rules
+ fix wrong variable used in logged string
+ update README
+ rule_generator: move all policy from write_net_rules to the rules file
+ rules: call usb_id only for SUBSYSTEMS=="usb"
+ rules: split out and fix persistent tape rules
+ fix debug output string
+ rule_generator: always match netif type in generated rule
+
+Matthias Schwarzott (3):
+ rules: Gentoo update
+ rules: Gentoo update
+ rules: Gentoo update
+
+Michael Morony (1):
+ set buffer size if strlcpy/strlcat indicate truncation
+
+maximilian attems (1):
+ correct includes in udev_selinux.c
+
+
+Summary of changes from v114 to v115
+============================================
+
+Harald Hoyer (1):
+ rules: fix typo in 80-drivers.rules
+
+Kay Sievers (15):
+ rules: add default rules
+ rules: update SUSE rules
+ rules: add packages rules
+ rules: add ia64 rules
+ rules: move md-raid rules to packages dir
+ rules: run vol_id only for partitions
+ rules: update Fedora rules
+ edd_id: move persistent rules to its own file
+ accept relative path for TEST
+ rules: add iowarrior rule
+ volume_id: fix sqashfs detection
+ do not ignore dynamic rule if it is the last one in the list
+ rule_generator: fix wrong DRIVERS!= logic
+ rules: update Fedora
+ Makefile: install default rules
+
+Marco d'Itri (3):
+ rules_generator: remove policy from write_cd_rules
+ rules_generator: fix write_cd_rules when similar names exist in the root directory
+ rules: Debian update
+
+
+Summary of changes from v113 to v114
+============================================
+
+Hannes Reinecke (3):
+ collect: extra to synchronize actions across events
+ add $driver subtitution
+ rules_generator: add S/390 persistent network support
+
+Kay Sievers (24):
+ rules_generator: remove executable flag from include file
+ always unlink temporary file before creating new one
+ rules: SUSE update
+ volume_id: ext4 detection
+ udevtrigger: allow to specify action string
+ add option to RUN key to ignore the return value of the program
+ use global udev_log variable instead of parameter in run_program
+ add udev_rules_run() to handle RUN list
+ move udev_utils_run.c into udev_rules.c
+ rules: SUSE update
+ name_list: rename loop_name -> name_loop
+ handle dynamic rules created in /dev/.udev/rules.d/
+ allow SYMLINK== match
+ libvolume_id: use /usr/$libdir in pc file
+ Makefile: add --as-needed flag to ld
+ restore behavior of NAME==
+ rules_generator: remove "installation" function
+ udevtrigger: trigger "driver" events
+ rules: update SUSE
+ rules: Fedora update
+ rules: add "do not edit" comment
+ rules: Fedora update
+ rules_generator: skip random MAC addresses
+ write changed network interface names to the kernel log
+
+Matthias Schwarzott (3):
+ rules: Gentoo update
+ fix inotify to work not only once
+ rules: Gentoo update
+
+Richard Hughes (1):
+ Makefile: add "make dist" for nightly snapshots
+
+
+Summary of changes from v112 to v113
+============================================
+
+David Zeuthen (1):
+ vol_id: do not fail if unable to drop privileges
+
+Kay Sievers (12):
+ add missing ChangeLog
+ make ATTR{[$SUBSYSTEM/$KERNEL]<attr>}="<value>" working
+ rules: recognize partitions and disk devices properly
+ rules: SUSE update
+ atomically replace existing nodes and symlinks
+ do not try to create existing file
+ info() for ignore_remove
+ rules: SUSE update
+ Makefile: check for missing ChangeLog or RELEASE-NOTES at release
+ allow to disable the replacement of unusual characters
+ no newline in log messages
+ udevd: do not use syslog if --verbose (debugging) is used
+
+Tobias Klauser (1):
+ fix typo in udev_utils_run.c
+
+
+Summary of changes from v111 to v112
+============================================
+
+Fabio Massimo Di Nitto (1):
+ rules: ignore partitons that span the entire disk
+
+Hannes Reinecke (1):
+ cciss device support
+
+Kay Sievers (34):
+ udevd: close /proc/meminfo after reading
+ create_floppy_devices: remove dead "unlink" code
+ volume_id: add function documentation
+ udev_db: escape path names with \x00 instead of %00
+ udevsettle: use long options
+ replace_chars: replace spaces in node name
+ volume_id: add and export string encoding function
+ vol_id: export encoded strings
+ rules: use encoded strings instead of skipping characters
+ udevtest: print message before log output
+ volume_id: escape % character
+ replace_chars: replace % character
+ IMPORT: do not mangle whitespace
+ scsi_id: do not install symlink in /sbin
+ rules: SUSE update
+ volume_id: terminate overlong label strings
+ scsi_id: add long options
+ rules: use long options for scsi_id
+ path_id: skip subsystem directory
+ rules: fix cciss rule
+ rules: SUSE update
+ scsi_id: fix typo in help text
+ fix "do not access parent" warning for ATTR{}
+ sysfs: add device lookup by $SUBSYSYTEM:$KERNEL
+ events for "bus" and "class" registration must be matched as "subsystem"
+ udevtest: add --subsystem option
+ sysfs: change order of subsystem lookup
+ add $sys substitution
+ add TEST=="<file>" key
+ add "[$SUBSYSTEM/$KERNEL]<attribute>" lookup
+ sysfs: handle bus/class top-level directories
+ sysfs: skip unknown sysfs directories
+ rules: SUSE update
+ release 112
+
+Miklos Vajna (2):
+ create_floppy_devices: add man page
+ path_id: remove on make uninstall
+
+Ryan Lortie (1):
+ volume_id: support for long-filename based labels
+
+Scott James Remnant (2):
+ replace_untrusted_chars: replace all whitespace with space
+ run_program: log "info" not "error" if program is missing
+
+
+Summary of changes from v110 to v111
+============================================
+
+Kay Sievers (19):
+ rules: SUSE update
+ rules: Fedora update
+ volume_id: use md native uuid format
+ vol_id: use long options
+ volume_id: add volume_id_get_* functions
+ vol_id: use volume_id_get_*
+ udevd: use fgets() to read /proc files
+ volume_id: add internal UUID_STRING
+ volume_id: add DDF support
+ vol_id: README update
+ volume_id: rename UUID_64BIT_LE/BE
+ vol_id: add ID_FS_UUID_SAFE
+ rules: use ID_FS_UUID_SAFE
+ rules: SUSE update
+ volume_id: give access to list of all available probers
+ vol_id: use libvolume_id prober list for --probe-all
+ volume_id: add remaining names for prober lookup by type
+ rules: SUSE update
+ volume_id: vol_id depends on libvolume_id
+
+Matthias Schwarzott (2):
+ volume_id: fix Makefile for parallel make
+ rules: Gentoo update
+
+
+Summary of changes from v109 to v110
+============================================
+
+Harald Hoyer (1):
+ udevcontrol: allow to set global variables in udevd
+
+Kay Sievers (13):
+ remove eventrecorder.sh
+ update SUSE rules
+ volume_id: add md metadata 1.0, 1.1, 1.2 support
+ unset variable with ENV{VAR}=""
+ delete copies of default rules in SUSE rules
+ volume_id: ext - fix endianess in version number
+ rules: Fedora update
+ volume_id: old md metadata has only 32 bit for the uuid
+ volume_id: minix version 3 support
+ don't create $tempnode for devices without major
+ usb_id: add <devpath> to help text
+ ata_id: use getopt_long()
+ rules: SUSE update
+
+Matthias Schwarzott (3):
+ Makefile: respect CFLAGS/LDFLAGS
+ rules: Gentoo update
+ ata_id: don't log error for libata devices on older kernels
+
+
+Summary of changes from v108 to v109
+============================================
+
+Harald Hoyer (1):
+ create_floppy_devices: create nodes with correct selinux context
+
+Kay Sievers (11):
+ udevtest: export ACTION string if given as option
+ update SUSE rules
+ make ACTION!="add|change" working
+ udevtest: import uevent variables if possible
+ udevinfo: export all information stored in database
+ default rules: add libata compat links
+ create_path: don't fail if something else created the directory
+ udevd: fix serialization of events
+ path_id: remove broken example
+ libvolume_id: do not install static library
+ update SUSE rules
+
+Matthias Schwarzott (2):
+ update Gentoo rules
+ persistent device naming: add joystick links
+
+VMiklos (1):
+ path_id: add man page
+
+
+Summary of changes from v107 to v108
+============================================
+
+Kay Sievers (3):
+ udevinfo: relax check for the correct device if looked up by name
+ don't write to sysfs files during test run
+ finally remove the directory event-multiplexer crap
+
+Matthias Schwarzott (2):
+ write_cd_rules: set default link type to "by-id" for usb and ieee1394 devices
+ update Gentoo rules
+
+Pozsar Balazs (1):
+ udevsettle: read udev not kernel seqnum first
+
+
+Summary of changes from v106 to v107
+============================================
+
+Jean Tourrilhes (1):
+ udevtest: export UDEV_LOG if we changed it
+
+Kay Sievers (33):
+ man: add missing options to various man pages
+ man: fix typo
+ create_floppy_devices: apply specified mode without umask
+ man: spelling fixes
+ udevmonitor: add switch for kernel and udev events
+ default rules: wait for 0:0:0:0 scsi devices only
+ update Fedora rules
+ delete dasd_id, it moved to s390-tools
+ update Gentoo rules
+ encode db-file names, instead of just replacing '/'
+ update internal variables if we see $DEVPATH during IMPORT
+ increase /proc/stat buffer
+ maintain index over device-names to devpath relation
+ restore overwritten symlinks when the device goes away
+ store devpath with the usual leading slash
+ add link_priority to rule options, and store it in database
+ pick actual valid device in udev_db_lookup_name
+ cleanup already existing db-entries and db-index on device update
+ selinux: move selinux_exit() to the main programs
+ remove old error message
+ read list of devices from index, make index private to database
+ priority based symlink handling
+ volume_id: get rid of compiler warning
+ udevinfo: remove -d option
+ update %n on netif name change
+ if a node goes away, possibly restore a waiting symlink
+ update TODO
+ man: add "link_priority" option
+ update SUSE rules
+ udevtest: add --force mode
+ udevinfo: print link priority
+ usb_id: append target:lun to storage device serial
+ run_directory: add final warning before removal
+
+Marco d'Itri (1):
+ update Debian rules
+
+Matthias Schwarzott (2):
+ udevd: cleanup std{in,our,err} on startup
+ udevmonitor: fix swapped event switch descriptions
+
+
+Summary of changes from v105 to v106
+============================================
+
+A. Costa (1):
+ man: fix typos in scsi_id and udevd
+
+Andrey Borzenkov (2):
+ vol_id: add -L to print raw partition label
+ vol_id: document -L
+
+Jamie Wellnitz (1):
+ persistent device naming: tape devices and medium changers
+
+Kay Sievers (15):
+ exclude parent devices from DRIVER== match
+ volume_id: really fix endianess bug in linux_raid detection
+ release 105
+ man: correct udevinfo --export-db
+ path_id: append LUN to iSCSI path
+ create_floppy_devices: add option for owner/group
+ update example rules
+ apply format chars to ATTR before writing to sysfs
+ add (subsystem) to udevmonitor output
+ update DRIVER== changes
+ remove --version from the udevinfo man page
+ add test for an attribute which contains an operator char
+ man: add note about parent matching behavior
+ scsi_id: accept tabs in /etc/scsi_id.conf
+ remove dead rule in persistent tape rules
+
+Matthias Schwarzott (4):
+ correct typo in extras/scsi_id/scsi_id.conf
+ fix retry-loop in netif-rename code
+ add option --version to udevd
+ rule_generator: fix for creating rules on read-only filesystem
+
+Peter Breitenlohner (1):
+ fix INSTALL_PROGRAM vs. INSTALL_SCRIPT
+
+Sergey Vlasov (3):
+ udevd: init signal pipe before daemonizing
+ unlink old database file before creating a new one
+ fix %c $string substitution
+
+Theodoros V. Kalamatianos (1):
+ fix udev attribute names with a colon
+
+
+Summary of changes from v104 to v105
+============================================
+
+A. Costa (1):
+ man: fix typos in scsi_id and udevd
+
+Andrey Borzenkov (2):
+ vol_id: add -L to print raw partition label
+ vol_id: document -L
+
+Kay Sievers (2):
+ exclude parent devices from DRIVER== match
+ volume_id: really fix endianess bug in linux_raid detection
+
+Matthias Schwarzott (2):
+ correct typo in extras/scsi_id/scsi_id.conf
+ fix retry-loop in netif-rename code
+
+Peter Breitenlohner (1):
+ fix INSTALL_PROGRAM vs. INSTALL_SCRIPT
+
+Sergey Vlasov (3):
+ udevd: init signal pipe before daemonizing
+ unlink old database file before creating a new one
+ fix %c $string substitution
+
+
+Summary of changes from v103 to v104
+============================================
+
+Kay Sievers (12):
+ update Fedora rules
+ update example rules
+ update SUSE rules
+ update SUSE rules
+ volume_id: fix endianess bug in linux_raid detection
+ man: fix udevmonitor text
+ man: recreate from xml
+ rename config "filename" to "dir"
+ remove outdated documentation
+ rename "udev.c" to "test-udev.c" - it is only for testing
+ update Fedora rules
+ use git-archive instead of git-tar-tree
+
+Kazuhiro Inaoka (1):
+ inotify syscall definitions for M32R
+
+Marco d'Itri (2):
+ write_cd_rules: identity-based persistence
+ scsi_id: remove trailing garbage from ID_SERIAL_SHORT
+
+Russell Coker (1):
+ SELinux: label created symlink instead of node
+
+
+Summary of changes from v102 to v103
+============================================
+
+Kay Sievers:
+ persistent storage rules: skip gnbd devices
+ volume_id: add checksum check to via_raid
+ volume_id: add comment about hfs uuid conversion
+ update SUSE rules
+ update Fedora rules
+
+
+Summary of changes from v101 to v102
+============================================
+
+Daniel Drake:
+ writing_udev_rules: fix typo in example rule
+
+Kay Sievers:
+ create missing ChangeLog for version 101
+ update SUSE rules
+ update default rules
+ first try "subsystem" link at a parent device, before guessing
+ if /sys/subsystem exists, skip class, bus, block scanning
+ scsi_id: export ID_SERIAL_SHORT without vendor/product
+ update SUSE rules
+
+MUNEDA Takahiro:
+ path_id: fix SAS disk handling
+
+
+Summary of changes from v100 to v101
+============================================
+
+Arjan Opmeer:
+ fix udevinfo help text typo
+
+Bryan Kadzban:
+ cleanup default rules
+ add IMPORT operations to the udev man page
+
+Kay Sievers:
+ remove Makefile magic for leading '0' in version
+ udevd: use getopt_long()
+ udevd: add --verbose option to log also to stdout
+ udevd: add --debug-trace option
+ rule_generator: improve net rule comment generation
+ volume_id: correct iso9660 high sierra header
+ warn if a PHYSEDV* key, the "device" link, or a parent attribute is used
+ don't print PHYSDEV* warnings for old WAIT_FOR_SYSFS rules
+ udevinfo: print error in --attribute-walk
+ udev_sysfs: unify symlink resolving
+ udevtrigger: trigger devices sorted by their dependency
+ fix spelling in deprecation warning
+ release 101
+
+Michał Bartoszkiewicz:
+ udevtrigger: fix typo that prevents partition events
+
+Miles Lane:
+ clarify "specified user/group unknown" error
+
+Piter PUNK:
+ update slackware rules
+
+VMiklos:
+ update Frugalware rules
+
+
+Summary of changes from v099 to v100
+============================================
+
+Kay Sievers:
+ update SUSE rules
+ fix messed up ChangeLog from release 099
+ man: add $attr{} section about symlinks
+ revert persistent-storage ata-serial '_' '-' replacement
+
+
+Summary of changes from v098 to v099
+============================================
+
+Greg KH:
+ update Gentoo rules
+
+Kay Sievers:
+ udev_db.c: include <sys/stat.h>
+ use fnmatch() instead of our own pattern match code
+ rename major/minor variable to maj/min to avoid warning
+ update source file headers
+ udevtest: print header that ENV{} can't work
+ update TODO
+ udevtrigger: options to filter by subsystem and sysfs attribute
+ udevtrigger: remove unused longindex
+ udevinfo: use long options
+ udevd: use files instead of symlinks for /dev/.udev/queue,failed
+ udevtrigger: fix pattern match
+ reorder options in udevinfo man page
+ udevinfo: fix SUBSYTEMS spelling error
+ fix ENV{TEST}="Test: $env{TEST}"
+ let $attr{symlink} return the last element of the path
+ cdrom_id: add rules file to call cdrom_id
+ udevinfo: do not show symlinks as attributes in --attribute-walk
+ remove broken name_cdrom.pl
+
+Marco d'Itri:
+ update Debian rules
+ run_program: close pipe fd's which are connected to child process
+ add persistent rules generator for net devices and optical drives
+
+MUNEDA Takahiro:
+ changes rules for ata disk from '_' to '-'
+
+Sergey Vlasov:
+ make struct option arrays static const
+ fix "subsytem" typo
+
+
+Summary of changes from v097 to v098
+============================================
+
+Alex Merry:
+ udevtest: allow /sys in the devpath paramter
+
+Harald Hoyer:
+ selinux: init once in the daemon, not in every event process
+
+Kay Sievers:
+ udevd: remove huge socket buffer on the control socket
+ man page: fix typo
+ rename udev_libc_wrapper -> udev_sysdeps
+ db: store devpath - node relationship for all devices
+ udevinfo: allow -a -n <node>
+ udevinfo, udevtest: simplify '/sys' stripping from devpath argument
+ lookup_user, lookup_group: report "unknown user" and "lookup failed"
+ consistent key naming to match only the event device or include all parent devices
+ skip rule, if too may keys of the same type are used
+ introduce ATTR{file}="value" to set sysfs attributes
+ update SUSE rules
+ update default rules
+ export DRIVER for older kernels as a replacement for PHYSDEVDRIVER
+ fix typo in SUBSYSTEMS key parsing
+ udevtrigger: add --retry-failed
+ volume_id: add suspend partition detection
+ vol_id: use primary group of 'nobody' instead of 'nogroup'
+ remove built-in /etc/passwd /etc/group parser
+ always expect KEY{value} on ATTR, ATTRS, ENV keys
+ use new key names in test programs
+ cleanup commandline argument handling
+ db: don't create a db file for only a node name to store
+ man: add ATTR{file}="value" assignment
+
+Lennart Poettering:
+ volume_id: fix fat32 cluster chain traversal
+
+Marco d'Itri:
+ fix 'unknow user' error from getpwnam/getgrnam
+ fix rc when using udev --daemon
+ update Debian rules
+
+Michał Bartoszkiewicz:
+ man pages: fix typos
+
+
+Summary of changes from v096 to v097
+============================================
+
+Anssi Hannula:
+ add joystick support to persistent input rules
+
+Kay Sievers:
+ firmware.sh: remove needless '/'
+ vol_id: add --skip-raid and --probe-all option
+ switch uevent netlink socket to group 1 only
+ increase /proc/stat read buffer
+ use "change" instead of "online" events
+ remove 'static' from local variable
+ libvolume_id: add parameter 'size' to all probe functions
+ man pages: replace 'device-path' by 'devpath'
+ man pages: work around xmlto which tries to be smart
+ refresh vol_id man page
+ udevinfo: add DRIVER==
+ Makefile: fix dependency
+ libvolume_id: read ufs2 label
+ switch ifdef __KLIBC__ to ifndef __GLIBC__
+ report failing getpwnam/getgrnam as error
+ rename udevcontrol message types and variables
+ initialize unused sockets to -1
+ udevd: remove useless udevinitsend parameter
+ update README
+ udevd: autotune max_childs/max_childs_running
+ update frugalware rules
+ update SUSE rules
+ move default rules to etc/udev/rules.d/
+ add 'crypto' devices to persistent storage rules
+ add late.rules to default rules
+ update Fedora rules
+ don't report an error on overlong comment lines
+ update SUSE rules
+ udevd: read DRIVER from the environment
+
+Marco d'Itri:
+ make rename_netif() error messages useful
+ path_id: fix an harmless syntax error
+
+Piter PUNK:
+ update slackware rules
+
+Richard Purdie:
+ Fix inotify syscalls on ARM
+
+
+Summary of changes from v095 to v096
+============================================
+
+Kay Sievers:
+ Makefiles: fix .PHONY for man page target
+ allow longer devpath values
+ path_id: prepare for new sysfs layout
+
+
+Summary of changes from v094 to v095
+============================================
+
+Kay Sievers:
+ update SUSE rules
+ don't remove symlinks if they are already there
+ allow "online" events to create/update symlinks
+ udevinfo: clarify parent device attribute use
+ update SUSE rules
+ netif rename: optimistic loop for the name to become free
+ remove broken %e enumeration
+
+Tobias Klauser:
+ print usage of udevcontrol when no or invalid command is given
+
+
+Summary of changes from v093 to v094
+============================================
+
+Daniel Drake:
+ update "writing udev rules"
+
+Kay Sievers:
+ libvolume_id: gfs + gfs2 support
+ remove MODALIAS key and substitution
+ add persistent-input.rules
+
+Marco d'Itri:
+ update Debian rules
+
+
+Summary of changes from v092 to v093
+============================================
+
+Hannes Reinecke:
+ path_id: add support for iSCSI devices
+
+Kay Sievers:
+ libvolume_id: fat - check for signature at end of sector
+ libvolume_id: add more software raid signatures
+ update Fedora rules
+ path_id: prevent endless loop for SAS devices on older kernels
+ remove udevsend
+ replace binary firmware helper with shell script
+ skip device mapper devices for persistent links
+
+
+Summary of changes from v091 to v092
+============================================
+
+Kay Sievers:
+ don't include stropts.h, some libc's don't like it
+ udevd: create leading directories for /dev/.udev/uevent_seqnum
+ vol_id: fix logging from libvolume_id's log function
+ update SUSE rules
+ update SUSE rules
+ add more warnings for invalid key operations
+ fix offsetof() build issue with recent glibc
+ selinux: fix typo in block device node selection
+ vol_id: add NetWare volume detection
+ edd_id: fix "(null)" output if "mbr_signature" does not exist
+ update Fedora rules
+ libvolume_id: nss - use different uuid
+
+Libor Klepac:
+ path_id: add platform and serio support
+
+Marco d'Itri:
+ update Debian rules
+ path_id: fix bashism
+
+
+Summary of changes from v090 to v091
+============================================
+
+Hannes Reinecke:
+ path_id: fix SAS device path generation
+
+Kay Sievers:
+ udevtest: don't try to delete symlinks
+ persistent rules: fix typo in dm rule
+ allow NAME=="value" to check for already assigned value
+ udevd: export initial sequence number on startup
+
+
+Summary of changes from v089 to v090
+============================================
+
+Kay Sievers:
+ udevd: export current seqnum and add udevsettle
+ volume_id: fix endianess conversion typo for FAT32
+ merge device event handling and make database content available on "remove"
+ set default udevsettle timeout to 3 minutes
+ export INTERFACE_OLD if we renamed a netif
+ let udevmonitor show the possibly renamed devpath
+ volume_id: move some debug to info level
+ udevtrigger: fix event order
+ usb_id: remove uneeded code
+ remove old symlinks before creating current ones
+ path_id: fix loop for SAS devices
+ apply format char to variables exported by ENV
+
+Marco d'Itri:
+ add inotify support for hppa and MIPS and log if inotify is not available
+
+Matt Kraai:
+ fix typo in error message
+
+
+Summary of changes from v088 to v089
+============================================
+
+Hannes Reinecke:
+ path_id: add bus to USB path
+
+Kay Sievers:
+ change rule to skip removable IDE devices
+ don't create uuid/label links for raid members
+ volume_id: provide library
+ fix rule order for persistent tape links
+ update man page
+ volume_id: provide a custom debug function
+ volume_id: rename subdirectory
+ volume_id: use shared library by default
+ because is better than cause
+ volume_id: remove some global symbols
+ volume_id: define exported symbols
+ remove all stripping code
+ man pages: mention udev(7) not udev(8)
+ update Debian rules
+ move all *_id programs to /lib/udev/
+ update Red Hat rules
+ update SUSE rules
+ pass CROSS_COMPILE to AR and RANLIB down to extras/
+ volume_id: update README
+ volume_id: generate man page from xml source
+ update README
+ fix symlink targets in Makefiles
+
+
+Summary of changes from v087 to v088
+============================================
+
+Hannes Reinecke:
+ persistent links: add scsi tape links and usb path support
+
+Kay Sievers:
+ volume_id: add squashfs detection
+ reset signal handler in event process
+ correct use of fcntl()
+ add udevtrigger to request events for coldplug
+ add ',' to trusted chars
+ volume_id: remove partition table parsing code
+ volume_id: remove all partition table support
+ fix spelling error in debug string
+ rename "persistent disk" to "persistent storage"
+ fix output for USB path
+
+
+Summary of changes from v086 to v087
+============================================
+
+Hannes Reinecke:
+ path_id: support SAS devices
+
+Kay Sievers:
+ fix persistent disk rules to exclude removable IDE drives
+ warn about %e, MODALIAS, $modalias
+ remove devfs rules and scripts
+
+Masatake YAMATO:
+ typo in debug text in udev_run_hotplugd.c
+
+
+Summary of changes from v085 to v086
+============================================
+
+Kay Sievers:
+ volume_id: replace __packed__ by PACKED macro
+ volume_id: split raid and filesystem detection
+ volume_id: add missing return
+ udevd: fix queue export for multiple events for the same device
+
+Kyle McMartin:
+ workaround missing kernel headers for some architectures
+
+Nix:
+ update to udev-084/doc/writing_udev_rules
+
+
+Summary of changes from v084 to v085
+============================================
+
+Andrey Borzenkov:
+ Fix trivial spelling errors in RELEASE-NOTES
+
+Jeroen Roovers:
+ fix typo in parisc support to path_id
+
+Kay Sievers:
+ make WAIT_FOR_SYSFS usable in non "wait-only" rules
+ fix typo in man page
+ include sys/socket.h for klibc build
+ cramfs detection for bigendian
+ exit WAIT_FOR_SYSFS if the whole device goes away
+ update SUSE rules
+ update Red Hat rules
+ update Gentoo rules
+ include errno.h in udev_libc_wrapper.c
+
+
+Summary of changes from v083 to v084
+============================================
+
+Kay Sievers:
+ update SUSE rules
+ switch CROSS to CROSS_COMPILE
+ replace fancy silent build program by simple kernel build like logic
+ move manpages to top level
+ remove UDEVD_UEVENT_INITSEND
+ whitespace fixes
+ scsi_id: remove dead files
+ optimize sysfs device and attribute cache
+ let SYSFS{} look at the device, not only the parent device
+ add debug output to sysfs operations
+
+
+Summary of changes from v082 to v083
+============================================
+
+Andrey Borzenkov:
+ man page: document when substitutions are applied for RUN and other keys
+ check for ignore_device in loop looks redundant
+
+Kay Sievers:
+ udevstart: fix NAME="" which prevents RUN from being executed
+ find programs in /lib/udev for IMPORT if {program} is not given
+ don't add $SUBSYSTEM automatically as $1 to programs
+ remove redundant substitution of RUN key
+
+
+Summary of changes from v081 to v082
+============================================
+
+Andrey Borzenkov:
+ substitute format chars in RUN after rule matching
+
+Kay Sievers:
+ scsi_id, usb_id: request device parent by subsystem
+ path_id: work with "all devices in /sys/devices"
+ ignore all messages with missing devpath or action
+ Makefile: remove dynamic config file generation
+ path_id: handle fiber channel (Hannes Reinecke <hare@suse.de>)
+ usb_id: don't fail on other subsytems than "scsi"
+ don't do RUN if "ignore_device" is given
+ increase kernel uevent buffer size
+ move udev(8) manpage to udev(7)
+ recreate man pages from xml source
+ remove udev, udevstart, udevsend from the default installation
+ update SUSE rules
+ rename apply_format() cause it is public now
+ udevtest: add udev_rules_apply_format() to RUN keys
+ let "ignore_device" always return the event successfully
+
+Olivier Blin:
+ fixes udev build with -fpie
+
+
+Summary of changes from v080 to v081
+============================================
+
+Kay Sievers:
+ add DEVLINKS to "remove" event
+ better log text and comments
+ vol_id: probe volume as user nobody
+ fix BUS, ID, $id usage
+ prepare moving of /sys/class devices to /sys/devices
+
+
+Summary of changes from v079 to v080
+============================================
+
+Brent Cook:
+ fix dependency for make -j2
+
+coly:
+ fix man page typos
+
+Kay Sievers:
+ update RELEASE-NOTES + TODO
+ fix typo in man page
+ update TODO
+ update SUSE rules
+ path_id: fix invalid character class
+ replace libsysfs
+
+Marco d'Itri:
+ udev_selinux.c: include udev.h
+
+
+Summary of changes from v078 to v079
+============================================
+
+Kay Sievers:
+ don't log error if database does not exist
+ use udev_root instead of "/dev"in selinux matchpathcon_init_prefix()
+ scsi_id: read page 0x80 with libata drives
+ update SUSE rules
+ remove %e from man page
+
+
+Summary of changes from v077 to v078
+============================================
+
+Greg Kroah-Hartman:
+ Update Gentoo udev main rule file.
+ add parisc support to path_id
+
+Hannes Reinecke:
+ scsi_id: -u fold multiple consecutive whitespace chars into single '_'
+
+Harald Hoyer:
+ optimize SELinux path match
+
+Kay Sievers:
+ update README
+ allow C99 statements
+ fix segfaulting create_floppy_devices
+ update SUSE rules
+ remove unused variables
+ remove default settings in udev.conf
+ clearenv() is now part of klibc
+ add DEVLINKS to the event environment
+
+Kurt Garloff:
+ scsi_id: support pre-SPC3 page 83 format
+
+
+Summary of changes from v076 to v077
+============================================
+
+Kay Sievers:
+ merge two consecutive static strlcat's
+ don't return an error, if "ignore_device" is used
+ remove outdated and misleading stuff
+ move SEQNUM event skipping to udevsend
+ update RELEASE-NOTES
+ update SUSE rules
+ allow programs in /lib/udev called without the path
+ update SUSE rules
+ add target to to generate ChangeLog section
+ update Red Hat rules
+
+Marco d'Itri:
+ allow to overwrite the configured udev_root by exporting UDEV_ROOT
+ let udevsend ignore events with SEQNUM set
+ update Debian rules
+
+
+Summary of changes from v75 to v076
+============================================
+
+Kay Sievers:
+ fix typo in eventrecorder
+ volume_id: include stddef.h header
+ remove misleading install instructions
+ remove all built-in wait_for_sysfs logic
+ add linux/types.h back, old glibc-kernel-headers want it
+ volume_id: use glibc's byteswap
+ udevd: ignore all messages without DEVPATH
+ udevd: track exit status of event process
+ udevd: export event queue and event state
+ remove "udev_db" option from config file
+ Makefile: remove exec_prefix and srcdir
+ update README and RELEASE-NOTES
+ udevd: track killed event processes as failed
+ update README
+ don't start udevd from udevsend
+ udevd: add a missing return
+ libvolume_id: fix weird fat volume recognition
+ move some helpers from extras to /lib/udev
+
+Scott James Remnant:
+ move delete_path() to utils
+ clean-up empty queue directories
+ Makefile: fail, if submake fails
+
+
+Summary of changes from v74 to v075
+============================================
+
+Greg Kroah-Hartman:
+ Make run_directory.c stat the place it is going to try to run.
+
+Kay Sievers:
+ forgot the ChangeLog for 074
+ volume_id: provide libvolume_id.a file
+ remove our own copy of klibc
+ remove outdated HOWTO
+ update TODO
+ update SUSE rules
+ remove completely useless start script
+ fix tests and remove no longer useful stuff
+ replace udeveventrecorder by a shell script
+
+
+Summary of changes from v73 to v074
+============================================
+
+Kay Sievers:
+ never queue events with TIMEOUT set
+ let NAME="" supress node creation, but do RUN keys
+ remove udevinitsend
+ update .gitignore
+
+Marco d'Itri:
+ add strerror() to error logs
+ move some logging from dbg() to info()
+
+
+Summary of changes from v72 to v073
+============================================
+
+Kay Sievers:
+ udevd: depend on netlink and remove all sequence reorder logic
+ print useconds in udevmonitor
+ add RELEASE-NOTES, update TODO
+
+
+Summary of changes from v71 to v072
+============================================
+
+Ananth N Mavinakayanahalli:
+ libsysfs: translate devpath of the symlinked class devices to its real path
+
+Jan Luebbe:
+ add man pages for *_id programs
+
+Kay Sievers:
+ volume_id: add OCFS Version 1
+ volume_id: add Veritas fs
+ volume_id: check ext fs for valid blocksize, cause magic is only 2 bytes
+ volume_id: move blocksize validation to fix jbd recognition
+ volume_id: fix typo in ocfs
+ volume_id: add vxfs include
+ volume_id: make FAT32 recognition more robust
+ volume_id: Version 051
+ volume_id: fix typo in ext blocksize check
+ volume_id: Version 052
+ FAQ: remove confusing statement about module loading
+ cleanup compiler/linker flags
+ use DESTDIR on uninstall, no need to pass prefix to submake
+ allow to pass STRIPCMD, to skip stripping of binaries
+ cleanup make release
+ fix the new warnings I asked for
+ move rules parsing into daemon
+ "make STRIPCMD=" will disable the stripping of binaries
+ remove no longer working udevd-test program
+ "STRIPCMD=" for the EXTRAS
+ add dummy inotify syscalls on unsupported architecture
+ remove no longer needed waiting for "dev" file
+ revert the "read symlink as device patch"
+ use libsysfs to translate the class linke to the device path
+ libsysfs: remove brute-force "bus", "driver" searching for old kernels
+ test: add "driver" and "bus" links to test sysfs tree
+ update RELEASE-NOTES
+ udevd: don't daemonize before initialization
+ log to console if syslog is not available
+ udevd: disable OOM
+ remove precompiled rules option
+ export DEVNAME on "remove" only if we really got a node to remove
+ fix typo in umask()
+
+
+Summary of changes from v70 to v071
+============================================
+
+Greg Kroah-Hartman:
+ Remove the udev.spec file as no one uses it anymore
+
+John Hull:
+ edd_id: check that EDD id is unique
+
+Kay Sievers:
+ ata_id: open volume O_NONBLOCK
+ add "Persistent Device Naming" rules file for disks
+ scsi_id: switch temporary node creation to /dev
+ volume_id: set reiser instead of reiserfs for filesystem type
+ update devfs rules header
+ update Debian rules
+ update Fedora rules
+ update Debian rules
+ remove no longer needed includes
+ switch tools and volume_id from LGPL to GPLv2
+ add edd-*-part%n to the persistent.rules
+ update Debian persistent rules
+ clarify README
+ udevd: fix initial timeout handling
+ force event socket buffer size to 16MB
+ udevd: move logging from err to info for non-hotplug uevent
+ fix selinux compilation
+ libsysfs: accept sysmlinks to directories instead of real directories
+
+Marco d'Itri:
+ run_directory: fix typo in "make install"
+
+
+Summary of changes from v069 to v070
+============================================
+
+Amir Shalem:
+ udevd: fix udevd read() calls to leave room for null byte
+
+Edward Goggin:
+ scsi_id: derive a UID for a SCSI-2 not compliant with the page 83
+
+Greg Kroah-Hartman:
+ fix nbd error messages with a gentoo rule hack
+ fix scsi_id rule in gentoo config file
+
+Jürg Billeter:
+ EXTRAS/Makefile: fix install targets to match main Makefile
+
+Kay Sievers:
+ volume_id: fix error handling with failing read()
+ EXTRAS: cleanup and sync all Makefiles
+ add install test to 'make buildtest'
+ update RELEASE-NOTES
+
+Olivier Blin:
+ fix a debug text typo in udev_rules.c
+
+
+Summary of changes from v068 to v069
+============================================
+
+Amir Shalem:
+ fix typo in firmware_helper
+
+Duncan Sands:
+ firmware_helper: fix write count
+
+Kay Sievers:
+ *_id: fix zero length in set_str()
+ add program name to logged error
+ fix exit code of udevinitsend and udevmonitor
+ udevd: keep the right order for messages without SEQNUM
+ volume_id: don't probe for mac_partition_maps
+ udevmonitor: cleanup on exit
+ path_id: remove SUSE specific PATH
+ update SUSE rules
+ add pci_express to bus list
+ update SUSE rules
+ store ENV{key}="value" exported keys in the database
+ fix lookup for name in the udevdb, it should return the devpath
+ prepare for new HAL udevdb dump
+ print persistent data with "udevinfo -q all"
+ change parameter order of udev_db_search_name()
+ add and use name_list_cleanup() for cleaning up the string lists
+ don't store devpath in udevdb, we don't need it
+ add uft8 validation for safe volume label exporting
+ start to enforce plain ascii or valid utf8
+ use WRITE_END/READ_END for the pipe index
+ remove not needed sig_flag for state of signal_pipe
+ don't reenter get_udevd_msg() if message is ignored
+ rename ...trailing_char() to ...trailing_chars()
+ vol_id: ID_LABEL_SAFE will no longer contain fancy characters
+ udevd: move some logging to "info" and "err"
+ remove special TIMEOUT handling from incoming queue
+ udev_test.pl: we replace untrusted chars with '_'
+ check the udevdb before assigning a new %e
+ update RELEASE-NOTES
+ udevinfo: add database export
+ write man page masters in DocBook XML
+ udevinfo: rename dump() to export()
+ test the automatic man page rebuild and checkin
+ Makefile: remove all the duplicated rules
+ all man pages rewritten to use DocBook XML
+ add missing udevsend man page
+ also forgot udevmonitor.8
+ udevinfo: restore -d option
+ scsi_id: rename SYSFS to LIBSYSFS
+ add edd_id tool to match BIOS EDD disk information
+ move and update libsysfs.txt
+ klibc: update to version 1.1.1
+ delete cdromsymlinks* - obsoleted by cdrom_id and IMPORT rules
+ delete docs/persistent_naming - obsoleted by persistent disk names
+ delete old Fedora html page
+ add "totally outdated" header to docs/overview :)
+ update SUSE rules
+ fix useless but funny name_cdrom.pl script to work again
+ update TODO
+ Makefile: fix prerequisits for $(PROGRAMS)
+ Makefile: cleanup install targets
+ remove chassis_id program
+ fic gcov use and move it into the Makefile
+ FAQ: update things that have changed
+
+Thierry Vignaud:
+ switch to '==' in raid-devfs.sh
+
+
+Summary of changes from v067 to v068
+============================================
+
+Greg Kroah-Hartman:
+ add EXTRAS documentation to the README file.
+ Always open the cdrom drive in non-blocking mode in cdrom_id
+ cdrom_id: change err() to info() to help with debugging problems
+
+Kay Sievers:
+ cleanup some debug output and move to info level + unify select() loops
+ move udevmonitor to /usr/sbin
+ ENV{TEST}=="1" compares and ENV{TEST}="1" sets the environment
+ vol_id: fix sloppy error handling
+ fix typo in cdrom_id syslog
+ bring std(in|out|err) fd's in a sane state
+ fix printed udevmonitor header
+
+
+Summary of changes from v066 to v067
+============================================
+
+Greg Kroah-Hartman:
+ added the cdrom.h #defines directly into the cdrom_id.c file
+
+Kay Sievers:
+ update SUSE rules
+ fix make install, as we don't provide a default rule set anymore
+ fix more compiler warnings ...
+ fix udevstart event ordering, we want /dev/null very early
+ don't fail too bad, if /dev/null does not exist
+
+
+Summary of changes from v065 to v066
+============================================
+
+Greg Kroah-Hartman:
+ update gentoo rule file.
+ Created cdrom_id program to make it easier to determine cdrom types
+ added cdrom_id to the build check
+ updated gentoo rule file to handle removable ide devices.
+ changed cdrom_id exports to be easier to understand and consistant with other _id programs.
+ fix klibc build issue in cdrom_id.c
+ Change the gentoo rules to use cdrom_id instead of cdsymlink.sh
+ changed location of gentoo helper apps to be /sbin instead of in scripts dir
+ tweak the gentoo rules some more.
+
+Kay Sievers:
+ add NETLINK define for the lazy distros
+ read sysfs attribute also from parent class device
+ switch some strlcpy's to memcpy
+ allow clean shutdown of udevd
+ add flag for reading of precompiled rules
+ update distro rules files
+ add SUSE rules
+ update SUSE rules
+ add firmware_helper to load firmware
+ more distro rules updates
+ update README
+ remove example rules and put the dev.d stuff into the run_directory folder
+ trivial text cleanups
+ update SUSE rules
+ split udev_util in several files
+ update SUSE rules
+ allow logging of all output from executed tools
+ add Usage: to udevmonitor and udevcontrol
+ move some logging to the info level
+
+Thierry Vignaud:
+ fix udevinfo output
+
+
+Summary of changes from v064 to v065
+============================================
+
+Greg Kroah-Hartman:
+ Added persistent name rules for block devices to gentoo rule file.
+ Added horrible (but fun) path_id script to extras.
+ Update gentoo rules file.
+
+Kay Sievers:
+ update release notes for next version
+ add udevmonitor, to debug netlink+udev events at the same time
+ allow RUN to send the environment to a local socket
+ fix GGC signed pointer warnings and switch volume_id to stdint
+
+
+Summary of changes from v063 to v064
+============================================
+
+Andre Masella:
+ volume_id: add OCFS (Oracle Cluster File System) support
+
+Hannes Reinecke:
+ usb_id: fix typo
+ add ID_BUS to *_id programs
+ create_floppy_devices: add tool to create floppy nodes based on sysfs info
+
+Kay Sievers:
+ move code to its own files
+ make SYSFS{} usable for all devices
+ add padding to rules structure
+ allow rules to have labels and skip to next label
+ thread unknown ENV{key} match as empty value
+
+
+Summary of changes from v062 to v063
+============================================
+
+Anton Farygin:
+ fix typo in GROUP value application
+
+Greg Kroah-Hartman:
+ add 'make tests' as I'm always typing that one wrong...
+ Really commit the udev_run_devd changes...
+ Fixed udev_run_devd to run the /etc/dev.d/DEVNAME/ files too
+ fix position of raw rules in gentoo config file
+
+Hannes Reinecke:
+ dasd_id: add s390 disk-label prober
+ fix usb_id and let scsi_id ignore "illegal request"
+
+Kay Sievers:
+ volume_id: remove s390 dasd handling, it is dasd_id now
+ trivial fixes for *_id programs
+ IMPORT: add {parent} to import the persistent data of the parent device
+ allow multiple values to be matched with KEY=="value1|value2"
+ udevd: set incoming socket buffer SO_RCVBUF to maximum
+ remember mapped rules state
+ ata_id: check for empty serial number
+ compile dasd only on s390
+
+Ville Skyttä:
+ correct default mode documentation in udev
+
+
+Summary of changes from v061 to v062
+============================================
+
+Kay Sievers:
+ fix symlink values separated by multiple spaces
+ update RELEASE-NOTES
+ fix typo in group assignment
+ fix default-name handling and NAME="" rules
+ add WAIT_FOR_SYSFS key to loop until a file in sysfs arrives
+ fix unquoted strings in udevinitsend
+
+Summary of changes from v060 to v061
+============================================
+
+Greg Kroah-Hartman:
+ Sync up the Debian rules files
+ fix cdrom symlink problem in gentoo rules
+ Fix ChangeLog titles
+
+Kay Sievers:
+ update RELEASE-NOTES
+ we want to provide OPTFLAGS
+ rename ALARM_TIMEOUT to UDEV_ALARM_TIMEOUT
+ udevd: optimize env-key parsing
+ don't resolve OWNER, GROUP on precompile if string contains %, $
+ set default device node to /dev
+ create udevdb files only if somehting interesting happened
+ pack parsed rules list
+ replace useless defines by inline text
+ move rule matches to function
+ add usb_id program to generate usb-storage device identifiers
+ add IEEE1394 rules to the gentoo rule file
+ fake also kernel-name if we renamed a netif
+ allow OPTIONS to be recognized for /sys/modules /sys/devices events
+ switch gentoo rules to new operators
+
+
+Summary of changes from v059 to v060
+============================================
+
+Greg Kroah-Hartman:
+ Fix the gentoo udev rules to allow the box to boot properly
+
+Gustavo Zacarias:
+ Udev doesn't properly build with $CROSS
+
+Kay Sievers:
+ Keep udevstart from skipping devices without a 'dev' file
+
+Marco d'Itri:
+ #define NETLINK_KOBJECT_UEVENT
+
+
+Summary of changes from v058 to v059
+============================================
+
+Greg Kroah-Hartman:
+ Update the gentoo rule file
+ Fix udevinfo for empty sysfs directories
+ Fix makefile to allow 'make release' to work with git
+
+Hannes Reinecke:
+ udev: fix netdev RUN handling
+ udevcontrol: fix exit code
+
+Kay Sievers:
+ prepare RELEASE-NOTES
+ add ID_TYPE to the id probers
+ add -x to scsi_id to export the queried values in env format
+ store the imported device information in the udevdb
+ rename udev_volume_id to vol_id and add --export option
+ add ata_id to read serial numbers from ATA drives
+ IMPORT allow to import program returned keys into the env
+ unify execute_command() and execute_program()
+ IMPORT=<file> allow to import a shell-var style config-file
+ allow rules to be compiled to one binary file
+ fix the fix and change the file to wait for to the "bus" link
+ fix udevstart and let all events trvel trough udev
+ prepare for module loading rules and add MODALIAS key
+ remove device node, when type block/char has changed
+ Makefile: remove dev.d/ hotplug.d/ from install target
+ udevcontrol: add max_childs command
+ udevd: control log-priority of the running daemon with udevcontrol
+ udeveventrecorder: add small program that writes an event to disk
+ klibc: add missing files
+ udevinitsend: handle replay messages correctly
+ udev man page: add operators
+ udevd: allow starting of udevd with stopped exec-queue
+ klibc: version 1.0.14
+ udev: handle all events - not only class and block devices
+ volume_id: use udev-provided log-level
+ udev: clear lists if a new value is assigned
+ udev: move dev.d/ handling to external helper
+ udev: allow final assignments :=
+ udevd: improve timeout handling
+ Makefile: fix DESTDIR
+ udevd: add initsend
+ udevd: add udevcontrol
+ udevd: listen for netlink events
+
+Stefan Schweizer:
+ Dialout group fix for capi devices in the gentoo rules file
+
+Summary of changes from v057 to v058
+============================================
+
+Daniel Drake:
+ o Writing udev rules docs update
+
+Darren Salt:
+ o update cdsymlinks to latest version
+
+Greg Kroah-Hartman:
+ o remove detach_state files from the sysfs test tree
+ o Update permissions on test scripts so they will run properly now
+ o hopefully fix up the symlinks in the test directory
+ o Removed klibc/klibc.spec as it is autogenerated
+ o Added symlinks thanks to Kay's script and git hacking
+ o add Red Hat/Fedora html documenation
+ o Update Red Hat default udev rules
+
+Kay Sievers:
+ o selinux: fix handling during creation of symlinks
+ o Fedora udev.rules update
+ o libsysfs: version 2.0
+ o klibc: version 1.0.7
+
+Masanao Igarashi:
+ o Fix libsysfs issue with relying on the detach_state file to be
+
+Summary of changes from v056 to v057
+============================================
+
+<tklauser:access.unizh.ch>:
+ o fix stupid all_partitions bug
+
+Kay Sievers:
+ o add test for make -j4 to build-check
+ o klibc: version 1.0.6
+ o update Debian rules
+ o apply default permissions only for devices that will need it
+ o adapt RELEASE-NOTES
+ o udev_volume_id: fix endianess macros
+ o udev-test.pl: add test for DEVNAME export to RUN environment
+ o update the man page to reflect the recent changes
+ o export DEVNAME to RUN-key executed programs
+ o fix make -j4 and the local klibc-install
+ o update RELEASE-NOTES
+ o add RUN key to be able to run rule based notification
+ o fix udevtest to print the error if logging is disabled
+ o move execute_program to utils + add action to init_device
+ o correct correction for error path for PROGRAM execution
+ o correct error path for PROGRAM execution
+ o klibc: version 1.0.5
+ o check for strlen()==0 before accessing strlen()-1
+ o allow to match against empty key values
+ o read %s{}-sysfs values at any device in the chain
+ o udev_rules.c: don't change sysfs_device while walking up the device chain
+ o klibc: strlcpy/strlcat - don't alter destination if size == 0
+ o fix klibc's broken strlcpy/strlcat
+ o udevinfo: print SYSFS attribute the same way we match it
+ o remove untrusted chars read from sysfs-values or returned by PROGRAM
+ o udevinfo: print errors to stderr instead of stdout
+ o klibc: version 1.0.4
+ o support log-priority levels in udev.conf
+ o test-suite: remove UDEV_TEST, it's not needed anymore
+ o libsysfs: remove trailing slash on SYSFS_PATH override
+
+
+Summary of changes from v055 to v056
+============================================
+
+<tklauser:access.unizh.ch>:
+ o fix header paths in udev_libc_wrapper.c
+
+Kay Sievers:
+ o udev-test.pl: use more common user/group names
+ o klibc: remove SCCS directories from the temporary klibc install
+ o udev-test.pl: add a test where the group cannot be found in /etc/passwd
+ o udev-test.pl: add check for textual uid/gid
+ o fix bad typo that prevents the GROUP to be applied
+ o udevd: don't delay events with TIMEOUT in the environment
+ o klibc: use klcc wrapper instead of our own Makefile
+ o change call_foreach_file to return a list
+
+
+Summary of changes from v054 to v055
+============================================
+
+<jkluebs:luebsphoto.com>:
+ o This patch causes the remove handler to check that each symlink actually points to the correct devnode and skip it if it does not.
+
+<pebenito:gentoo.org>:
+ o udev selinux fix
+
+<tklauser:access.unizh.ch>:
+ o The following patch fixes some warnings when compiling volume_id from udev with the -Wall compiler flag. Define _GNU_SOURCE for strnlen() and correct the path to logging.h
+ o The following patch fixes a warning when compiling chassis_id from udev with the -Wall compiler flag. There are too much conversions in the format string of sscanf(). One %d can be dropped.
+
+Greg Kroah-Hartman:
+ o fix raid rules
+ o added frugalware udev ruleset
+ o merge selinux and Kay's symlink fixes together
+
+Hannes Reinecke:
+ o volume_id: Fix label/uuid reading for reiserfs
+
+Kay Sievers:
+ o add udevstart to the RELEASE-NOTES
+ o volume_id: version 43
+ o clarify the shortcomings of %e
+ o correct rule match for devices without a physical device
+ o remove unneeded code, libsysfs does this for us
+ o add final release note
+ o add ENV{} key to match agains environment variables
+ o simplify sysfs_pair handling
+ o add a test and simplify debug statement
+ o support =, ==, !=, += for the key match and assignment
+ o add OPTION="last_rule" to skip any later rule
+ o rename namedev_dev to udev_rule
+ o correct enum device_type
+ o remove udevstart on make clean
+ o volume_id: version 42
+ o volume_id: version 41
+ o remove unneeded include
+ o The path to dlist.h is not correct
+ o udevinfo -d: use '=' as separator, cause ':' may be a part of the devpath
+ o klibc: version 1.0.3
+ o add RELEASE-NOTES file
+ o test suite: move "driver" link to physical device
+ o remove PLACE key match
+ o don't lookup "root" in the userdb
+ o fix ia64 compile
+ o fix segfaulting udev while DRIVER matching
+ o cleanup list.h
+ o klibc: version 0.214
+ o rename device_list->list to device_list->node
+ o replace strncpy()/strncat() by strlcpy()/strlcat()
+ o split udev and udevstart
+ o udev_volume_id: version 39
+ o rename LOG to USE_LOG in all places
+ o remove Makefile magic for klibc integration
+ o klibc_fixups: remove no longer needed stuff
+ o udev_volume_id: volume_id v38
+ o use numeric owner/group as default values to avoid parsing userdb
+ o fix up segfaulting binaries with new klibc
+ o udevinfo -d: speed-up device dump
+ o klibc: version 0.211
+ o klibc_fixups: remove unneeded stuff
+ o replace weird defines by real code
+ o udev-test.pl: remove useless tests
+ o allow unlimitied count of symlinks
+ o unmap db-file after use
+ o remove typedef for call_foreach_file() handler function
+ o correct udev_init_device
+ o rename attributes to options
+ o kill stupid gcc4 warning
+ o trivial clenaup of namedev code
+ o klibc: check for gcc4
+ o klibc: update v0.205
+
+Thierry Vignaud:
+ o gentoo rule update for raid devices
+
+
+Summary of changes from v053 to v054
+============================================
+
+<tklauser:access.unizh.ch>:
+ o udev_volume_id: add Reiser4 support
+
+Kay Sievers:
+ o namedev: skip backslashes only if followed by newline
+ o wait_for_sysfs: add joydev
+ o udevinfo: print devpath -> node relationship for all devices
+ o trivial rename of some variables
+ o klibc v0.199
+ o big libsysfs diet (pre 2.0 version)
+ o udev_volume_id: volume_id v35
+ o add "serio" to bus list
+ o determine device type in udev_init_device()
+ o move kernel name/number evaluation into udev_init_device()
+ o detect NAME="" as ignore_device rule
+ o trivial namedev cleanup
+ o cleanup db functions
+ o clean up match_place()
+ o switch device type to enum
+ o switch major/minor to dev_t
+ o remove the device node only if the major/minor number matches
+ o libsysfs: work around a klibc bug
+ o introduce OPTIONS=ignore_device, ignore_remove, all_partitions" key
+ o namedev: execute PROGRAM only once and not possibly for every physical device
+
+Patrick Mansfield:
+ o update scsi_id to work with libsysfs changes
+
+
+Summary of changes from v052 to v053
+============================================
+
+Greg Kroah-Hartman:
+ o fix gentoo fb permission issue
+ o allow simple-build-check.sh to go faster if MAKEOPTS is set
+ o make the release tarballs have writable files in them
+ o remove gentoo permission file as it's not valid anymore
+
+Kay Sievers:
+ o fix special file mode mask for temporary device node
+ o udevstart: simplify "dev" file searching
+ o udev_volume_id: remove temporary node creation and parent handling
+ o add %P modifier to query the node name of the parent device
+ o udev_volume_id: remove __packed__ from dasd structure as it does not work
+ o create /block/*/range count of partitons for all_partitions
+
+Patrick Mansfield:
+ o scsi_id changes for use with udev %N and %p
+
+
+Summary of changes from v051 to v052
+============================================
+
+<md:linux.it>:
+ o debian: update rules files
+ o raid-devfs.sh: devfs names for hardware RAID controllers
+ o scsi_id: when udevstart is started, /tmp is not writeable
+ o cdsymlinks.sh: trivial fix, the variable is initialized to '', not 0
+
+<sschweizer:gmail.com>:
+ o gentoo/udev.rules: add default permissions for sound devices
+
+Greg Kroah-Hartman:
+ o fix example comment in ide-devfs.sh
+ o Add infiniband to gentoo rules
+ o Another gentoo fix, adding dvb support
+ o Fix gentoo bug #76056 (fb device group permissions.)
+ o Fix gentoo bug #81102, device nodes for the pktcdvd device
+
+Kay Sievers:
+ o provide temporary device node for callouts to access the device
+ o udev_volume_id: fix dasd disklabel reading with -l option
+ o udev_volume_id: volume_id version 034
+ o udev_volume_id: rename probe_ibm into probe_dasd
+ o udev_volume_id: volume_id version 032
+ o Makefile: add some more warnings and prepare for clean gcc4 compile
+ o Makefile: cleanup conditional config option sections
+ o fix -Wsign-compare warnings
+ o chassis_id: clean compilation and fix bad function parameter passing
+ o simple_build_check: make it possible to pass KERNEL_DIR
+ o selinux: cleanup udev integration
+
+Michael Buesch:
+ o trivial: remove _all_ trailing slashes with no_trailing_slash()
+ o trivial: fix signedness
+ o namdev: allow symlink-only rules to specify node permissions
+ o udevd: fix valgrind warning
+
+
+Summary of changes from v050 to v051
+============================================
+
+<roland:digitalvampire.org>:
+ o This fixes a silly mistake in how udevinfo prints the major and minor numbers (right now it prints the minor next to "MAJOR" and the major next to "MINOR" ;)
+
+<tklauser:access.unizh.chbk>:
+ o I tried to compile udev 050plus with the GCC 4.0 snapshot 200412119 and got two errors about possibly uninitialized structs, so I fixed this.
+
+Christian Bornträger:
+ o udev_volume_id: fix -d option
+
+Greg Kroah-Hartman:
+ o gentoo fb permission fix
+ o fix gcc 2.96 issue in libsysfs
+ o remove the lfs startup script on request of the author
+ o clean up the aoe char device rules, and delete the block one as it's not needed
+ o add aoe block and char device rules to the gentoo rule file
+ o fix udev_volume_id build error
+
+Hannes Reinecke:
+ o rearrange link order in Makefile
+
+Kay Sievers:
+ o udev_volume_id: new version of volume_id
+ o klibc: update to version 0.198
+ o udev_volume_id: fix FAT label reading
+ o klibc: update to version 0.196
+ o udevd: throttle the forking of processes
+ o udevd: add possible initialization of expected_seqnum
+ o udevd: it's obviously not the brightest idea to exit a device node manager if it doesn't find /dev/null
+ o udevd: separate socket handling to prepare for other event sources
+ o udevd: support -d switch to become a daemon
+ o udev_volume_id: version 27
+ o udevd: split up message receiving an queueing
+ o remove useless warning if udev.conf contains keys not read by udev itself
+ o improve event sequence serialization
+ o remove udevsend syslog noise on udevd startup
+ o limit the initial timeout of the udevd event handling
+ o correct detection of hotplug.d/ udevsend loop
+ o correct log statement
+ o remove default_* permissions from udev.conf file
+ o update Fedora config files and add some more tests
+ o allow permissions only rules
+ o add SUBSYSTEM rule to catch all block devices and apply the disk permissions
+ o update Fedora config files
+ o handle renamed network interfaces properly if we manage hotplug.d/
+ o allow multiline rules by backslash at the end of the line
+ o add OnStream tape drive rules
+ o simplify rules file by setting default mode to 0660
+ o simplify permission application
+ o I broke the extras/ again. Add simple build test script now
+ o Merge vrfy.org:/home/kay/src/udev into vrfy.org:/home/kay/src/udev.kay
+ o initial merge of fedora udev.permissions into udev.rules
+ o remove permissions file mentioning from the udev man page
+ o fix some typos in gentoo's udev.rules introduced by the merge
+
+Michael Buesch:
+ o The attached patch fixes the code path if namedev_name_device() fails
+
+Summary of changes from v049 to v050
+============================================
+
+<harald:redhat.com>:
+ o selinux patch
+
+<tklauser:access.unizh.ch>:
+ o I made some more changes to the manpage of udev including
+
+Kay Sievers:
+ o update libsysfs to CVS version and fix segfaulting attribute reading
+ o klibc supports LOG_PID now, so remove our own implementation
+ o avoid building klibc test programs and pass SUBDIRS= to klibc clean
+
+
+Summary of changes from v048 to v049
+============================================
+
+Greg Kroah-Hartman:
+ o fix 'make clean' error in klibc
+
+Kay Sievers:
+ o update klibc to 0.194
+ o export DEVNAME regardless of the state of udev_dev_d
+ o add class specific files for class/spi_transport and class/spi_host
+ o udevd-test.pl: remove wrong date calculation
+ o check earlier if we should run as udevstart
+ o remove double initialization
+ o include missing header to udevtest.c
+ o add -V option to udev to print the version number
+ o prevent udev node creatinon for "class" registration
+ o udevd: serialization of the event sequence of a chain of devices
+ o add a class/fc_host file to the list of what to wait for
+ o udev_volume_id: links sysfs.a instead of all objects
+
+Martin Schlemmer:
+ o remove leftover from udevinfo's -d option
+
+
+Summary of changes from v047 to v048
+============================================
+
+Greg Kroah-Hartman:
+ o fix udev_volume_id so it will now build properly
+ o fix scsi_id build errors due to changes in the main udev makefile
+
+
+Summary of changes from v046 to v047
+============================================
+
+<klauser:access.unizh.ch>:
+ o Various typos and other litte errors in udev.8.in
+
+<sjoerd:spring.luon.net>:
+ o DEVNAME on device removal
+
+<sschweizer:gmail.com>:
+ o Allow GROUP to have modifiers in it
+
+Greg Kroah-Hartman:
+ o add more debian rules files
+ o move distro specific config files into their own directories
+ o update debian rules files
+ o added asterix rules to the gentoo file
+ o use udevstart for udev.init.* files
+ o delete a bunch of files no longer needed
+ o fix gentoo scsi cdrom rule
+ o Fix the multithreaded build again
+ o merge
+ o comment out ability to run udev-test.pl with valgrind
+ o fix spurious valgrind warning in udev
+ o fix udevinfo '-q path' option as it was not working
+ o merge
+ o fix parallel build error
+
+Kay Sievers:
+ o update Fedora dev.d/ example and remove unused conf.d/ directory
+ o don't install distribution specific init script on "make install"
+ o restore OWNER/GROUP assignment in rule coming from RESULT
+ o make gcov compile scripts working with recent gcc
+ o fix udev-test/udev-test.pl to work with again
+ o add net/atml and class/ppdev to the wait_for_sysfs exception list
+ o add net/nlv* devices to the exception list
+ o add "pcmcia" and "fc_transport" to the wait_for_sysfs lists
+ o remove unused timestamp field
+ o simplify permission handling
+ o handle /etc/hotplug.d/ only if the event comes from udevd
+ o trivial cleanups and change some comments
+ o remove unused variables
+ o udevsend/udevd handle events without a subsystem
+ o use blacklist on device "remove" and remove dev.d/ call code duplication
+ o update the man pages and correct Usage: hints
+ o don't call the hotplug scripts with a test run
+ o don't call dev.d/ scripts twice, if directory = subsystem
+ o remove archive file if we changed something
+ o link archive insted of objects
+ o rename udev_lib to udev_utils and dev_d to udev_multiplex
+ o handle whole hotplug event with udevd/udev
+ o integrate wait_for_sysfs in udev
+ o make the searched multiplex directories conditionally
+ o add MANAGED_EVENT to the forked udev environment
+ o export DEVNAME on remove event
+ o export udev_log flag to the environment
+ o remove my test code
+ o add support for /devices-devices without any file to wait for
+ o Patch from Alex Riesen <raa.lkml@gmail.com>
+ o add a bunch of busses to the list of what to wait for
+ o close connection to syslog in forked udevd child
+ o udevd exit path cleanup
+ o fix network device naming bug
+
+
+Summary of changes from v045 to v046
+============================================
+
+Greg Kroah-Hartman:
+ o make spotless for releases
+
+Kay Sievers:
+ o Don't try to print major/minor for devices without a dev file
+ o remove get_device_type and merge that into udev_set_values()
+ o prevent udevd crash if DEVPATH is not set
+ o add ippp and bcrypt to the exception lists of wait_for_sysfs
+ o let klibc add the trailing newline to syslog conditionally
+ o disable logging for udevstart
+ o add NAME{ignore_remove} attribute
+ o remove historical SYSFS_attr="value" format
+ o don't wait for sysfs if the kernel(2.6.10-rc2) tells us what not to expect
+ o change key names in udevinfo sysfs walk to match the kernel
+ o support DRIVER as a rule key
+ o support SUBSYSTEM as a rule key
+ o rename udevdb* to udev_db*
+ o Make dev.d/ handling a separate processing stage
+ o make the udev object available to more processing stages
+ o remove udev_lib dependency from udevsend, which makes it smaller
+ o add ACTION to udev object to expose it to the whole process
+ o make udevinfo's -r option also workimg for symlink queries
+ o let udev act as udevstart if argv[1] == "udevstart"
+ o improve udevinfo sysfs info walk
+ o add sysfs info walk to udevinfo
+ o pass the whole event environment to udevd
+ o replace tdb database by simple lockless file database
+
+
+Summary of changes from v044 to v045
+============================================
+
+Martin Schlemmer:
+ o Some updates for Gentoo's udev rules
+
+
+Summary of changes from v043 to v044
+============================================
+
+Greg Kroah-Hartman:
+ o add cdsymlinks.sh support to gentoo rules file
+ o fix gentoo legacy tty rule
+ o remove 'sudo' usage from the Makefile
+ o make udev-test.pl test for root permissions before running
+
+Kay Sievers:
+ o reduce syslog noise of udevsend if multiple instances try to start udevd
+ o add i2c-dev to the list of devices without a bus
+
+
+Summary of changes from v042 to v043
+============================================
+
+Greg Kroah-Hartman:
+ o add test target to makefile
+ o add dumb script to show all sysfs devices in the system
+
+Kay Sievers:
+ o Shut up wait_for_sysfs class/net failure messages, as it's not possible to
+ get that right for all net devices. Kernels later than 2.6.10-rc1 will
+ handle that by carrying the neccessary information in the hotplug event.
+ o wait() for specific pid to return from fork()
+ o Don't use any syslog() in signal handler, cause it may deadlock
+ o Add support for highpoint ataraid to volume_id to suppress label reading on raid set members.
+ o Add a bunch of devices without "device" symlinks
+ o Exit, if udevtest cannot open the device (segfault)
+ o Patches from Harald Hoyer <harald@redhat.com>
+ o Apply the default permissions even if we found a entry in the permissions
+ file. Correct one test, as the default is applied correctly now and the
+ mode will no longer be 0000.
+ o add test for format chars in multiple symlinks to replace
+ o Add net/vmnet and class/zaptel to the list of devices without physical device
+
+
+Summary of changes from v040 to v042
+============================================
+
+Greg Kroah-Hartman:
+ o add inotify to the rules for gentoo
+
+Kay Sievers:
+ o skip waiting for device if we get a bad event for class creation and not for a device underneath it
+ o add net/pan and net/bnep handling
+ o switch wait for bus_file to stat() instead of open() add net/tun device handling add ieee1394 device handling
+ o Remove the last klibc specific line from the main udev code Move _KLIBC_HAS_ARCH_SIG_ATOMIC_T to the fixup file which is automatically included by the Makefile is we build with klibc
+ o ignore *.rej files from failed patches
+ o update to libsysfs 1.2.0 and add some stuff klib_fixup Now we have only the sysfs.h file different from the upstream version to map our dbg() macro.
+ o improve klibc fixup integration
+ o cleanup udevd/udevstart
+ o expose sysfs functions for sharing it
+
+
+Summary of changes from v039 to v040
+============================================
+
+<jk:blackdown.de>:
+ o wait_for_sysfs update for dm devices
+
+Greg Kroah-Hartman:
+ o sparse cleanups on the tree
+ o fix stupid cut-and-paste error for msr devices on gentoo boxes
+ o add *~ to bk ignore list
+ o delete udevruler.c as per Kay's request
+ o fix up the wait_for_sysfs_test script a bit
+
+Kay Sievers:
+ o fix debug in volume id / fix clashing global var name
+ o volume_id fix
+ o $local user
+ o cleanup netif handling and netif-dev.d/ events
+ o big cleanup of internal udev api
+ o don't wait for dummy devices
+ o close the syslog
+ o Fix ppp net devices in wait_for_sysfs
+ o Fix wait_for_sysfs messages (more debugging info)
+
+
+Summary of changes from v038 to v039
+============================================
+
+Greg Kroah-Hartman:
+ o Hopefully fix the vcs issue in wait_for_sysfs
+ o take out & from wait_for_sysfs_test that I previously missed
+ o add very nice cdsymlinks scripts
+ o add some helper scripts for dvb and input devices
+ o add debian config files
+ o let the extras/ programs build "pretty" also
+ o tweak the ccdv program to handle files in subdirectories being built
+ o crap, I messed up the 'sed' instances pretty badly, this fixes the config and man page mess
+ o fix broken 'make -j5' functionality
+
+Kay Sievers:
+ o swich attribute open() to simple stat()
+ o wait_for_sysfs update for /class/firmware and /class/net/irda devices
+ o fix unusual sysfs behavior for pcmcia_socket
+ o remove sleeps from udev as it is external now
+ o delete udevruler?
+ o Makefile fix
+
+Patrick Mansfield:
+ o update udev to scsi_id 0.7
+ o pass SYSFS setting down for extras builds
+ o move assignments past local variables
+
+
+Summary of changes from v037 to v038
+============================================
+
+<andrew.patterson:hp.com>:
+ o Re: Problem parsing %s in udev rules
+
+Greg Kroah-Hartman:
+ o fix up error in building extras and libsysfs
+
+Summary of changes from v036 to v037
+============================================
+
+<md:linux.it>:
+ o small udev patch
+
+Greg Kroah-Hartman:
+ o fix compilation warning in tdb log message
+ o Fix build error with klibc due to recent changes
+ o merge
+ o add wait_for_sysfs test script to the tarball to help people debug their boxes
+ o add ipsec to wait_for_sysfs ignore list
+ o added ccdv to bk ignore list
+ o a few more Makefile tweaks for the quiet feature
+ o Make the build silent, thanks to a helper program from ncftp
+ o rename files to have '_' instead of '-' in them
+ o change max time to wait in wait_for_sysfs to 10 seconds to hopefully handle some slow machines
+ o add support for class/raw/ to wait_for_sysfs
+ o fix up Makefile for wait_for_sysfs udev_version.h dependancy
+ o remove the debian specific file, as they don't want to share with the rest of the world :(
+
+Kay Sievers:
+ o prevent deadlocks on an corrupt udev database
+ o wait_for_sysfs_update
+
+Michael Buesch:
+ o fix asmlinkage
+ o fix incompatible pointer type warning
+
+
+Summary of changes from v035 to v036
+============================================
+
+Greg Kroah-Hartman:
+ o add the error number to the error message in wait_for_sysfs to help out in debugging problems
+
+Summary of changes from v034 to v035
+============================================
+
+Greg Kroah-Hartman:
+ o added ieee1394 support to wait_for_sysfs
+ o update wait_for_sysfs with a bunch more devices thanks to user reports
+
+Summary of changes from v033 to v034
+============================================
+
+Kay Sievers:
+ o wait_for_sysfs bluetooth class update
+
+Greg Kroah-Hartman:
+ o add comment in wait_for_sysfs to explain the structure better
+ o Revert previous dev_d.c change, it's not what is causing HAL problems
+ o hm, somethings odd with DEVPATH, see if this fixes it
+ o 33_bk mark for the makefile
+ o wait_for_sysfs: clean up the logic for the list of devices that we do not expect device symlinks for
+ o get rid of annoying extra lines in the syslog for some libsysfs debug messages
+ o added support for i2c devices in wait_for_sysfs.c
+ o add support for i2c-adapter devices to wait_for_sysfs.c
+
+Summary of changes from v032 to v033
+============================================
+
+<harald:redhat.com>:
+ o udev close on exec
+ o some cleanups and security fixes
+ o some cleanups and security fixes
+ o selinux for udev
+ o cleanup PATCH for extras/chassis_id/Makefile
+
+<kpfleming:backtobasicsmgmt.com>:
+ o respect prefix= setting in built udev.conf (updated)
+
+Greg Kroah-Hartman:
+ o add support for usb interfaces to wait_for_sysfs to keep it quiet
+ o enable native tdb spinlocks on i386 platforms
+ o delete extras/multipath-tools as per the author's request
+ o be paranoid in dev_d.c
+ o add USE_SELINUX to README documentation so people have a chance to see what is going on
+ o update the selinux.h file to start to look sane
+ o update bk ignore list for the wait_for_sysfs binary
+ o kdetv wants to see device nodes in /dev
+ o update comments in scsi-devfs.sh
+ o fix up Makefiles to get the klibc build working properly
+ o update bk ignore list for new klibc generated files
+ o oops forgot to add the new klibc/include directory
+ o update klibc to version 0.181
+
+Kay Sievers:
+ o fix problems with dev.d and udevstart
+ o wait_for_sysfs debug cleanup
+ o fix problems using scsi_id with udevstart
+ o update volume_id
+ o finally solve the bad sysfs-timing for all of us
+ o volume-id build fix and update
+ o switch udev's seqnum to u64
+ o add enum tests
+ o fix udev segfaults with bad permissions file
+
+Patrick Mansfield:
+ o update udev to include scsi_id 0.6
+
+
+Summary of changes from v031 to v032
+============================================
+
+<harald:redhat.com>:
+ o udev parse bug
+
+Kay Sievers:
+ o handle only block and class devices
+ o fix udevstart badly broken in udev 031
+
+
+Summary of changes from v030 to v031
+============================================
+
+<arun:codemovers.org>:
+ o udev - read long lines from config files overflow fix
+
+<ballarin.marc:gmx.de>:
+ o Update the FAQ with info about hardlink security
+
+<david:fubar.dk>:
+ o compatibility symlinks for udev
+
+David Weinehall:
+ o Minor POSIX-fixes for udev
+
+Greg Kroah-Hartman:
+ o add symlink for video rule
+ o add a "first" list to udevstart and make it contain the class/mem/ devices
+ o fix compiler warning in udevtest.c
+ o Fix old-style pty breakage in rules file for tty device
+ o add rules for i386 cpu devices
+ o add permission for legotower usb devices
+
+Kay Sievers:
+ o Fix naming ethernet devices in udevstart
+ o update udev_volume_id
+ o let /sbin/hotplug execute udev earlier
+ o pass SEQNUM trough udevd
+ o fix manpages based on esr's spambot
+
+Martin Schlemmer:
+ o add microcode rule to permissions.gentoo file
+
+Michael Buesch:
+ o Try to provide a bit of security for hardlinks to /dev entries
+
+Olaf Hering:
+ o udevsend depends on udev_lib.o
+
+Tom Rini:
+ o fix UDEV_NO_SLEEP
+ o clean up start_udev a bit
+ o Make udev/udevstart be one binary
+ o Add 'asmlinkage' to udev-030
+
+
+Summary of changes from v029 to v030
+============================================
+
+Greg Kroah-Hartman:
+ o fix stupid off-by-one bug that caused udevstart to die on x86-64 boxes
+
+
+Summary of changes from v028 to v029
+============================================
+
+Greg Kroah-Hartman:
+ o add permission rule for jogdial device
+ o fix dumb bug I added to udevstart
+ o make a "last list" of devices for udevstart to operate on last
+ o fix permission problem with input event and ts nodes for gentoo
+ o change default perms of misc/rtc to be readable by anyone
+
+Olaf Hering:
+ o allow NAME_SIZE > SYSFS_PATH_MAX
+
+
+Summary of changes from v027 to v028
+============================================
+
+<atul.sabharwal:intel.com>:
+ o Patch for chassis_id exras module
+
+Daniel Drake:
+ o Writing udev rules doc update
+
+Greg Kroah-Hartman:
+ o clean up block whitelist search logic a bit
+ o reverse order of scanning of udevstart to look at class before block
+
+Kay Sievers:
+ o update udev_volume_id
+
+Leann Ogasawara:
+ o udevstart performance increase
+
+Patrick Mansfield:
+ o update udev scsi_id to scsi_id 0.5
+
+
+Summary of changes from v026 to v027
+============================================
+
+<fork0:users.sf.net>:
+ o fix handle leak in udev_lib.c
+
+Greg Kroah-Hartman:
+ o tweak the gentoo default permission rules as they are wrong for tty and misc devices
+
+
+Summary of changes from v025 to v026
+============================================
+
+Arnd Bergmann:
+ o udev rpm fix
+
+Greg Kroah-Hartman:
+ o add test for ! in partition name
+ o 025_bk mark
+ o Update to version 117 of klibc (from version 108)
+ o add volume_id ignore rule for bk
+ o add volume_id support to the udev.spec file
+ o remove dbus and selinux stuff from the udev.spec file
+ o delete udev_selinux as it doesn't work properly and is the wrong way to do it
+ o Deleted the udev_dbus extra as it didn't really work properly and HAL has a real solution now
+ o add udev.permissions.slackware file
+ o udevstart: close open directories
+
+Kay Sievers:
+ o fix udevd zombies
+ o catchup with recent klibc
+ o Re: udevsend fallback
+ o udev_volume_id update
+ o udev callout for reading filesystem labels
+ o udev callout for reading filesystem labels
+ o udev default config layout changes
+
+Leann Ogasawara:
+ o evaluate getenv() return value for udev_config.c
+
+Summary of changes from v024 to v025
+============================================
+
+<md:linux.it>:
+ o devfs.sh-ide-floppy
+
+<sjoerd:spring.luon.net>:
+ o DEVNODE -> DEVNAME transition fixes
+
+Daniel Drake:
+ o Update writing udev rules docs
+
+Greg Kroah-Hartman:
+ o make dev.d call each directory in the directory chain of the device name, instead of just the whole name
+ o add devd_test script
+ o add more permissions based on SuSE's recommendations
+ o added rules for tun and raw devices
+ o add udev conf.d file
+ o Switch the default config to point to a directory for the rules and permission files
+ o update the Red Hat .dev files to work on other distros
+ o add dbus.dev, pam_console.dev and selinux.dev files for /etc/dev.d/default/ usage
+ o add hints for red hat users from Leann Ogasawara <ogasawara@osdl.org>
+ o add scripts to run gcov for udev from Leann Ogasawara <ogasawara@osdl.org>
+ o change permissions on udevd test scripts
+ o Fix build process for users who have LC_ALL set to a non-english language
+ o Added expanded tests to the test framework from Leann Ogasawara <ogasawara@osdl.org>
+ o added execelent "writing udev rules" document from Daniel Drake <dan@reactivated.net>
+ o added rule to put USB printers in their proper places
+ o added rules for CAPI devices
+ o added a dev.d alsa script to help people out
+
+Kay Sievers:
+ o fix test regressions
+ o udev_selinux changes
+ o udevd test script
+ o udev_dbus changes
+ o fix devpath for netdev
+
+Leann Ogasawara:
+ o gcov for udev
+
+
+Summary of changes from v023 to v024
+============================================
+
+<atul.sabharwal:intel.com>:
+ o Add README for chassis_id
+ o Add chassis_id program to extras directory
+
+<chris_friesen:sympatico.ca>:
+ o udevd race conditions and performance, assorted cleanups
+
+<hare:suse.de>:
+ o fix SEGV in libsysfs/dlist.c
+
+<maryedie:osdl.org>:
+ o add OSDL documentation for persistent naming
+
+<md:linux.it>:
+ o small ide-devfs.sh fix
+
+Greg Kroah-Hartman:
+ o remove compiler warning from udevd.c
+ o only generate udev.8 on the fly, not all other man pages
+ o update bk ignore list some more
+ o update bk ignore list
+ o switch to generate the man pages during the normal build, not during the install
+ o convert udev.8.in to use @udevdir@ macro for make install
+ o first step of making man pages dynamically generated
+ o add install and uninstall the etc/dev.d/net/hotplug.dev file to the Makefile
+ o tweak net_test a bit
+ o fix some segfaults when running udevtest for network devices
+ o make a net_test test script using udevtest
+ o handle the subsytem if provided in udevtest
+ o add hotplug.dev script to handle renamed network devices
+ o add a bunch of network class devices to the test sysfs tree
+ o add udevruler to the bk ignore list
+ o update RFC-dev.d docs due to DEVNODE to DEVNAME change
+ o clean up chassis_id coding style
+ o clean up the OSDL document formatting a bit
+ o add netlink rules to devfs and gentoo rules files
+ o added USB device rules to rules files
+ o clean up the gentoo rules file a bit more, adding dri rules
+ o fix up udev.rules to handle oss rules better
+ o 023_bk mark
+ o fix udev.spec file for where udevtest should be placed
+
+Kay Sievers:
+ o tweak node unlink handling
+ o switch udevd's msg_dump() to #define
+ o handle netdev in udevruler
+ o man page cleanup
+ o put config info in db for netdev
+ o increase udevd event timeout
+ o udevstart fix
+ o put netdev handling and dev.d/ in manpages
+ o DEVPATH for netdev
+ o netdev - udevdb+dev.d changes
+ o udevd race conditions and performance, assorted cleanups - take 2
+ o udevinfo patch
+ o dev_d.c file sorting and cleanup
+ o apply all_partitions rule to main block device only
+
+
+Summary of changes from v022 to v023
+============================================
+
+Kay Sievers:
+ o hmm, handle net devices with udev?
+ o correct apply_format() for symlink only rules
+ o don't init namedev on remove
+ o first stupid try for a rule compose gui
+ o replace fgets() with mmap() and introduce udev_lib.[hc]
+ o make udevtest a real program :)
+
+Daniel E. F. Stekloff:
+ o udevinfo patch
+
+Greg Kroah-Hartman:
+ o create the /etc/dev.d/ directories in 'make install'
+ o actually have udev run files ending in .dev in the /etc/dev.d/ directory as documented
+ o added RFC-dev.d document detailing how /etc/dev.d/ works
+ o fixed up udev.spec to handle selinux stuff properly now
+ o remove USE_DBUS and USE_SELINUX flags from the README as they are no longer present
+ o remove selinux stuff from the main Makefile
+ o move udev_selinux into extras/selinux
+ o fix dbus build in the udev.spec file
+ o remove dbus stuff from main Makefile
+ o move udev_dbus to extras/dbus
+ o udev_dbus can now compile properly, but linnking is another story
+ o remove udev_dbus.h from Makefile
+ o first cut at standalone udev_selinux program
+ o remove selinux support from udev core as it's no longer needed
+ o first cut at standalone udev_dbus program
+ o add get_devnode() helper to udev_lib for udev_dbus program
+ o remove dbus code from core udev code as it's no longer needed to be there
+ o add /etc/dev.d/ support for udev add and remove events
+ o fix build error in namedev.c caused by previous patch
+ o 022_bk tag
+ o fix 'make spotless' to really do that in klibc
+ o add a question/answer about automounting usb devices to the FAQ
+ o mark scsi-devfs.sh as executable
+ o Increase the name size as requested by Richard Gooch <rgooch@ras.ucalgary.ca>
+ o fix udevtest to build properly after the big udev_lib change
+
+Olaf Hering:
+ o uninitialized variable for mknod and friend
+
+Richard Gooch:
+ o SCSI logical and physical names for udev
+
+Theodore Y. T'so:
+ o Trivial man page typo fixes to udev
+
+
+Summary of changes from v021 to v022
+============================================
+
+<ananth:in.ibm.com>:
+ o more Libsysfs updates
+ o Libsysfs updates
+
+<async:cc.gatech.edu>:
+ o fix HOWTO-udev_for_dev for udevdir
+
+Kay Sievers:
+ o udev-test.pl cleanup
+ o add dev node test to udev-test.pl
+ o add permission tests
+ o "symlink only" test
+ o callout part selector tweak
+ o cleanup callout fork
+ o allow to specify node permissions in the rule
+ o man page beauty
+ o put symlink only rules to the man page
+ o rename strn*() macros to strmax
+ o conditional remove of trailing sysfs whitespace
+ o clarify udevinfo text
+ o better fix for NAME="foo-%c{N}" gets a truncated name
+ o overall trivial trivial cleanup
+ o fix NAME="foo-%c{N}" gets a truncated name
+ o cleanup mult field string handling
+
+<ken:cgi101.com>:
+ o fix a type in docs/libsysfs.txt
+ o Added line to udev.permissions.redhat
+ o Include more examples in the docs area for gentoo and redhat
+
+<md:linux.it>:
+ o udevstart fixes
+
+Greg Kroah-Hartman:
+ o add big major tests to udev-test.pl
+ o add a test for a minor over 255
+ o udev-test.pl: print out major:minor and perm test "ok" if is ok
+ o make perm and major:minor test errors be reported properly
+ o remove extra ; in namedev_parse.c
+ o Added multipath-tools 0.1.1 release
+ o deleted current extras/multipath directory
+ o 021_bk mark
+ o fix the build for older versions of gcc
+
+Hanna V. Linder:
+ o Small fix to remove extra "will" in man page
+
+Olaf Hering:
+ o make spotless
+ o udev* segfaults with new klibc
+
+Patrick Mansfield:
+ o add tests for NAME="foo-%c{N}"
+
+Summary of changes from v020 to v021
+============================================
+
+Kay Sievers:
+ o install udevinfo in /usr/bin
+ o blacklist pcmcia_socket
+
+Greg Kroah-Hartman:
+ o fix udev.spec to find udevinfo now that it has moved to /usr/bin
+ o Fix another problem with Makefile installing initscript
+ o fix the Makefile to install the init script into the proper directory
+ o make spec file turn off selinux support by default
+
+
+Summary of changes from v019 to v020
+============================================
+
+<christophe.varoqui:free.fr>:
+ o multipath update
+
+Kay Sievers:
+ o man page udevstart
+ o cleanup udevstart
+ o bugfix for local user
+ o unlink bugfix
+ o TODO update
+ o clarify udevinfo device walk
+ o udevinfo symlink reverse query
+ o fix stroul endptr use
+ o add $local user spport for permissions
+ o udev - man page update
+ o udev - fix debug info for multiple rule file config
+ o udev - kill udevd on install
+ o udev - activate formt length attribute
+ o udev - safer sprintf() use
+
+<md:linux.it>:
+ o no error on enoent
+ o escape dashes in man pages
+ o remove usage of expr in ide-devfs.sh
+
+<rml:ximian.com>:
+ o automatically install correct initscript
+ o update documetation for $local
+
+Andrey Borzenkov:
+ o Add symlink only rules support
+
+Greg Kroah-Hartman:
+ o update the TODO list as we already have a devfs config file
+ o make start_udev use udevstart binary
+ o install udevstart
+ o Remove Debian permission files as the Debian maintainer doesn't seem to want to share :(
+ o update the Gentoo rules files
+ o Add Red Hat rules and permissions files
+ o add udevstart to the ignore list
+ o add udevstart program based on a old patch from Harald Hoyer <harald@redhat.com>
+ o unlink the file before we try to create it
+ o Merge greg@bucket:/home/greg/src/udev into kroah.com:/home/greg/src/udev
+
+
+Summary of changes from v018 to v019
+============================================
+
+Kay Sievers:
+ o TODO update
+ o udev - correct relative symlink
+ o udev - safer string handling - part four
+ o udev - safer string handling - part three
+ o udev - safer string handling - part two
+ o udev - man page update
+ o udev - safer string handling all over the place
+ o manpage update
+ o udev - allow all files in a directory as the config
+ o udev - simple klibc textual uid/gid handling
+
+Andrey Borzenkov:
+ o do not remove real .udev.tdb during RPM build
+
+Greg Kroah-Hartman:
+ o add new TODO item about local user permissions
+ o Add initial SELinux support for udev
+ o fix build for very old versions of make
+ o remove limit of the number of args passed to PROGRAM
+ o force udev to include the internal version of libsysfs and never the external one
+ o fix up libsysfs header file usage to fix bug reports from users that have sysfsutils installed already
+ o remove udevtest on 'make clean'
+ o remove udevd priority TODO item, as it's not needed at all
+
+Patrick Mansfield:
+ o update udev scsi_id to scsi_id 0.4
+
+
+Summary of changes from v017 to v018
+============================================
+
+<ext.devoteam.varoqui:sncf.fr>:
+ o [PATCH] symlink dm-[0-9]* rule
+ o update extras/multipath
+
+<john-hotplug:fjellstad.org>:
+ o init.d debian patch
+
+Kay Sievers:
+ o udev - TODO update
+ o udev - add %s{filename} to man page
+ o udev - udevd/udevsend man page
+ o udev - switch callout part selector to {attribute}
+ o udev - switch SYSFS_file to SYSFS{file}
+ o udev - create all partitions of blockdevice
+ o allow SYSFS{file}
+ o Adding '%s' format specifier to NAME and SYMLINK
+
+Greg Kroah-Hartman:
+ o added some scsi_id files to the bk ignore file
+ o added scsi_id and some more documentation to the udev.spec file
+ o update udev.rules.gentoo with new config file format
+ o Update the Gentoo udev.rules and udev.permissions files
+ o Create a udev.rules.examples file to hold odd udev.rules
+ o add udevd priority issue to the TODO list
+ o more HOWTO cleanups
+ o add HOWTO detailing how to use udev to manage /dev
+ o mv libsysfs/libsysfs.h to libsysfs/sysfs/libsysfs.h to make it easier to use
+ o add start_udev init script
+ o add support for UDEV_NO_SLEEP env variable so Gentoo people will be happy
+ o start up udevd ourselves in the init script to give it some good priorities
+ o update the red hat init script to handle nodes that are not present
+ o add a "old style" SYSFS_attribute test to udev-test.pl
+ o Have udevsend report more info in debug mode
+ o Have udevd report it's version in debug mode
+ o fix up bug created for udevtest in previous partition creation patch
+ o update the udev.spec to add udevtest and make some more Red Hat suggested changes
+ o add ability to install udevtest to Makefile
+ o 017_bk mark
+ o Add another test to udev-test.pl and fix a bug when only running 1 test
+ o Fix bug where we did not use the "converted" kernel name if we had no rule
+
+Patrick Mansfield:
+ o udev use new libsysfs header file location
+ o udev add some ID tests
+
+
+Summary of changes from v016 to v017
+============================================
+
+<azarah:nosferatu.za.org>:
+ o make logging a config option
+
+<christophe.varoqui:free.fr>:
+ o more udev-016/extras/multipath
+ o more udev-016/extras/multipath
+ o update extras/multipath
+
+Kay Sievers:
+ o udev - keep private data out of the database?
+ o better credential patch
+ o udevd - client access authorization
+ o compile udevd with klibc
+ o udev - fix "ignore method"
+ o udev - fix cdrom symlink rule
+ o convert udevsend/udevd to DGRAM and single-threaded
+ o udevd - kill the lockfile
+ o udevd - fix socket path length
+ o udevd - switch socket path to abstract namespace
+ o udevd - allow to bypass sequence number
+ o include used function
+
+Greg Kroah-Hartman:
+ o add udev_log to the documentation
+ o fix offsetof() define in klibc
+ o add some .spec file changes from Red Hat
+ o update the init.d udev script based on a patch from Red Hat
+ o remove the .udev.tdb when installing or uninstalling to be safe
+ o remove the database at startup
+ o fix bug in permission handling
+ o update klibc to version .107
+ o update the bitkeeper ignore file list
+ o add udevtest program to build
+ o fix problem where usb devices can be either the main device or the interface
+ o more logging.h cleanups to be a bit more flexible
+ o stop using mode_t as different libcs define it in different ways :(
+ o remove some more KLIBC fixups that are no longer needed
+ o let udev-test.pl run an individual test if you ask it to
+ o Handle the '!' character that some block devices have
+ o add a block device with a ! in the name, and a test for this
+ o fix up 'make release' to use bk to build the export tree
+ o fix log option code so that it actually works for all udev programs
+ o finish syncing up with klibc
+ o sync with latest version of klibc (0.107)
+ o fix up Makefile dependancies for udev_version.h
+
+Patrick Mansfield:
+ o udev add wild card compare for ID
+ o udev kill extra bus_id compares in match_id
+
+
+Summary of changes from v015 to v016
+============================================
+
+<elkropac:students.zcu.cz>:
+ o get_dev_number() in extras/ide-devfs.sh
+
+<rrm3:rrm3.org>:
+ o FAQ udev.rules.devfs
+
+Greg Kroah-Hartman:
+ o add udevd and udevsend to the spec file
+ o make /etc/hotplug.d/default/udev.hotplug symlink point to udevsend now
+ o add KERNEL_DIR option so that the distros will be happy
+ o make udevsend binary even smaller
+ o udevsend now almost compiles with klibc, struct sockaddr_un is only problem now
+ o fix up logging code so that it can be built without it being enabled
+ o rework the logging code so that each program logs with the proper name in the syslog
+ o remove logging.c as it's no longer needed
+ o kill the last examples that contained the %D option
+ o remove a __KLIBC__ tests in libsysfs, as klibc now supports getpagesize()
+ o udevd - remove stupid locking error I wrote
+ o update to klibc version 0.101, fixing the stdin bug
+ o fix Makefile typo for USE_LSB install
+ o allow dbus code to actually build again
+
+Kay Sievers:
+ o let udevsend build with klibc
+ o udevd - config cleanup
+ o udevd - cleanup and better timeout handling
+ o fix possible buffer overflow
+ o udevd - next round of fixes
+ o udevinfo - missing options for man page
+ o udev - trivial style cleanup
+
+
+Summary of changes from v014 to v015
+============================================
+
+<mbuesch:freenet.de>:
+ o LFS init script update
+
+Greg Kroah-Hartman:
+ o update klibc to version 0.98
+ o clean up udevinfo on 'make clean'
+ o add udevinfo man page to spec file
+ o remove command line documentation from udev man page
+ o create initial version of udevinfo man page
+ o added URL to spec file
+ o add udevinfo to udev.spec file
+ o add udevinfo to install target of Makefile
+ o rip out command line code from udev, now that we have udevinfo
+ o udevinfo doesn't need to declare main_envp
+ o move get_pair to udev_config.c because udevinfo doesn't need all of namedev.o
+ o more makefile cleanups
+ o move udevinfo into the main build and clean up the main Makefile a bit
+ o clean up compiler warnings if building using klibc
+ o make udevd only have one instance running at a time
+ o new testd.block script for debugging
+ o udevsnd : clean up message creation logic a bit
+ o make bk ignore udevd and udevsend binaries
+ o whitespace cleanups
+ o remove TODO item about BUS value, as it is now done
+ o add support for figuring out which device on the sysfs "chain" the rule applies to
+
+Kay Sievers:
+ o udevinfo - now a real program :)
+ o udevd - cleanup and better timeout handling
+ o udev - next round of udev event order daemon
+ o fix udevd exec
+ o udev - udevinfo with device chain walk
+ o spilt udev into pieces
+
+
+Summary of changes from v013 to v014
+============================================
+
+<ananthmg:rediffmail.com>:
+ o libsysfs update for refresh + namedev.c changes
+
+<christophe.varoqui:free.fr>:
+ o udev-013/extras/multipath update
+
+<flamingice:sourmilk.net>:
+ o minor patch for devfs rules
+
+Kay Sievers:
+ o udev - program to query all device attributes to build a rule
+ o set default owner/group in db - update
+ o udev - reverse user query options
+ o udev - kill %D from udev-test.pl
+ o add udev logging to info log
+ o udev - mention format string escape char in man page
+
+Greg Kroah-Hartman:
+ o misc code cleanups
+ o fixup logging.h to handle different logging options properly
+ o clean up the logging patch a bit to make the option more like the other options
+ o remove the %D modifier as it is not longer needed
+ o remove unneeded keyboard rule
+ o add usb_host and pci_bus to the class blacklist
+ o added input device rules to udev.rules and udev.rules.devfs
+ o 013_bk mark
+
+Hanna V. Linder:
+ o set default owner/group in db
+ o small cut n paste error fix
+
+Patrick Mansfield:
+ o update udev scsi_id to scsi_id 0.3
+
+
+Summary of changes from v012 to v013
+============================================
+
+<eike-hotplug:sf-tec.de>:
+ o LSB init script and other stuff
+
+<elkropac:students.zcu.cz>:
+ o fix udev directory for Debian init script
+
+<tiggi:infa.abo.fi>:
+ o udev 012 old gcc fixup
+
+Christophe Saout:
+ o add IGNORE rule type
+ o small cleanup
+
+Greg Kroah-Hartman:
+ o update TODO with some new, small items
+ o Cset exclude: greg@kroah.com|ChangeSet|20040113010256|48515
+ o update the README in a few places
+ o fix -d typo in the manpage update
+ o Fix stupid gcc "optimization" of 1 character printk() calls.... Ick
+ o oops, forgot to fix up the PROGRAM result from ID to RESULT in the config files
+ o Add alsa device rules and a few other devfs rules
+ o fix a few stale comments in namedev.c
+ o convert the default rules files to the new format
+ o convert the test shell scripts to the config file format
+ o add bus test for usb-serial bus
+ o Add some helpful messages if the user uses the older config file format
+ o added dri rule to the default config file
+ o added init.d udev script for debian
+ o add a script that tests the IGNORE rule
+ o add silly script that names cdrom drives based on the cd in them
+ o add cdrom rule for ide cdrom
+ o replace list_for_each with list_for_each_entry, saving a few lines of code
+ o add a blacklist of class devices we do not want to look at
+
+Kay Sievers:
+ o fix klibc with printf() and gcc
+ o udev - small script optimization
+ o udev - introduce format escape char
+ o udev - more CALLOUT is PROGRAM now
+ o udev - CALLOUT is PROGRAM now
+ o update documentation for new config file format
+ o more advanced user query options
+ o udev - simple debug tweak
+ o udev - drop all methods :)
+ o udev - advanced user query options
+ o udev - Makefile error
+ o udev - make exec_callout() reusable
+ o udev - exec status fix for klibc
+ o fix Silly udev script
+
+
+Summary of changes from v011 to v012
+============================================
+
+<azarah:nosferatu.za.org>:
+ o make symlink work properly if there is already a file in its place
+ o Fix udev gcc-2.95.4 compat
+
+<christophe.varoqui:free.fr>:
+ o extras multipath update
+ o extras multipath update
+
+Kay Sievers:
+ o mention user callable udev + options in man page
+ o make udev user callable to query the database
+ o depend on all .h files
+ o cleanup namedev_parse debug text
+ o extend exec_program[]
+ o ide-devfs.sh update
+ o fix for apply_format()
+ o check for empty symlink string
+ o 'ide' missing in bus_files[]
+ o small trivial cleanup of latest changes
+
+<mbuesch:freenet.de>:
+ o introduce signal handler
+
+<rml:ximian.com>:
+ o udev spec file update
+
+Greg Kroah-Hartman:
+ o minor grammer fixes for the udev_vs_devfs document
+ o move the dbus config file to etc/dbus-1/system.d/
+ o move the config files to etc/udev to clean up main directory a bit
+ o add Gentoo versions of the rules and permissions files
+ o if using glibc, link dynamically, as no one like 500Kb udev binaries
+ o minor change to udev_vs_devfs document
+ o added udev vs devfs supid document to the tree
+ o move the signal handling registration to after we have initialized enough stuff
+ o make ide-devfs.sh executable in the tree
+ o udev.permissions.debian - forgot the dm nodes
+ o update the udev.permissions.debian file with new entries
+ o added udev.init script for the Linux From Scratch project
+
+
+
+Summary of changes from v010 to v011
+============================================
+
+<mbuesch:freenet.de>:
+ o proper cleanup on udevdb_init() failure
+
+<mh:nadir.org>:
+ o patch udev 009-010 rpm spec file
+
+<svetljo:gmx.de>:
+ o fix udev sed Makefile usage
+
+Greg Kroah-Hartman:
+ o add documentation about the BUS key being optional for the LABEL rule
+ o add tests for LABEL rule with a device that has no bus
+ o Don't require the BUS value for the LABEL rule
+ o If a LABEL rule has a BUS id, then we must check to see if the device is on a bus
+ o add documentation about the BUS key being optional for the CALLOUT rule
+ o If a CALLOUT rule has a BUS id, then we must check to see if the device is on a bus
+ o Don't require the BUS value for the CALLOUT rule
+ o add test for callout rule with a device that has no bus
+ o 010_bk stamp
+ o added different build options to the rpm udev.spec file
+ o add pci to the bus_files list
+ o check for empty line a bit better in the parser
+ o more init script cleanups, the stop target now calls udev to cleanup instead of just removing the whole /udev directory
+ o make udev init script run udev in the background to let startup go much faster
+ o fix long delay for all devices in namedev
+
+
+Summary of changes from v009 to v010
+============================================
+
+<ananth:in.ibm.com>:
+ o change pgsize
+
+<christophe.varoqui:free.fr>:
+ o extras multipath update
+ o extras multipath update
+ o extras multipath update
+ o extras multipath update
+
+Kay Sievers:
+ o fix udev-test.pl
+ o small cleanup udev-remove.c
+ o experimental CALLOUT script for devfs ide node creation with cd, disc, part
+ o add any valid device
+ o introduce format char 'k' for kernel-name
+ o trivial make fixes
+ o don't overwrite old config on install
+ o udev-remove.c cleanups
+ o bug in udev-remove.c
+ o trivial cleanup parser changes
+
+<roman.kagan:itep.ru>:
+ o fix comment and whitespace handling in config files
+
+Adam Kropelin:
+ o Allow build with empty EXTRAS
+
+Daniel E. F. Stekloff:
+ o libsysfs 0.4.0 patch
+ o fix scsi_id segfault with udev-009
+ o add libsysfs docs
+
+David T. Hollis:
+ o mark config files as such in the rpm spec file
+
+Greg Kroah-Hartman:
+ o fix complier warning in namedev.c
+ o add documentation for the new '%k' modifier (kernel name replacement)
+ o add documentation about the multiple sysfs values that are now allowed for the LABEL rule
+ o add tests for multi-file LABEL rules
+ o add ability to have up to 5 SYSFS_ file/value pairs for the LABEL rule
+ o Just live with a sleep(1) in namedev for now until libsysfs is fixed up
+ o try to wait until the proper device file shows up in sysfs
+ o remove unneeded TODO and FIXME entry
+ o clean up the stand-alone tests to work properly on other people's machines
+ o add tests to catch whitespace and comment config file parsing errors
+
+
+Summary of changes from v008 to v009
+============================================
+
+<christophe.varoqui:free.fr>:
+ o more extras/multipath changes
+ o and more extras/multipath updates
+ o more extras/multipath updates
+ o yet more extras/multipath
+ o more extras/multipath updates
+ o extras/multipath update
+
+<david:fubar.dk>:
+ o D-BUS patch for udev-008
+
+<eike-hotplug:sf-tec.de>:
+ o add init.d/udev to "make install"
+ o add init.d/udev to the spec file
+
+Kay Sievers:
+ o don't rely on field order in namedev_parse
+ o get part of callout return string
+ o remove '\n' from end of callout return
+ o man-page mention multiple symlinks
+ o allow multiple symlinks
+ o cleanup man & remove symlink comment
+ o experimental (very simple) SYMLINK creation
+ o man page beauty
+ o pattern match for label method
+ o a bug in linefeed removal
+
+<rml:ximian.com>:
+ o remove udev from runlevels on uninstall
+ o install initscript in udev rpm
+
+Daniel E. F. Stekloff:
+ o pre-libsysfs-0.4.0 patch
+
+Greg Kroah-Hartman:
+ o signal fixes due to klibc update
+ o sync klibc with release 0.95
+ o add mol permissions to the debian permissions file
+ o update the FAQ with info about bad modprobe events from the devfs scheme
+ o some cleanups due to the need for LABEL rules to use "SYSFS_" now
+ o Add restart target to the etc/init.d/udev script
+ o tweak the config file generation portion of the Makefile a bit
+ o change devfs disk name rule from 'disk' to 'disc'
+ o add vc support to udev.rules.devfs
+ o added a devfs udev config file from Marco d'Itri <md@Linux.IT>
+ o set default mode to 0600 to be safer
+ o Makefile tweaks for the DBUS build
+ o update the FAQ due to the latest devfs mess on lkml and also due to symlinks now working
+ o document the different Makefile config options that we have
+ o change USE_DBUS to DBUS in Makefile, and disable it by default as it's still to hard to build on all systems
+ o fix formatting of udev_dbus.c to use tabs. Also get it to build properly now
+ o move all of the DBUS logic into one file and remove all of the #ifdef crud from the main code
+
+Olaf Hering:
+ o dump latest klibc into the udev build tree
+ o use udevdir in udev.conf
+
+Patrick Mansfield:
+ o better allow builds of extras programs under udev
+ o update udev extras/scsi_id to version 0.2
+
+
+Summary of changes from v007 to v008
+============================================
+
+<azarah:nosferatu.za.org>:
+ o more config file parsing robustness
+
+<christophe.varoqui:free.fr>:
+ o udev-007/extras/multipath update
+
+Arnd Bergmann:
+ o Build failure - missing linux/limits.h include?
+ o Add format modifier for devfs like naming
+ o klibc makefile fixes
+
+Daniel E. F. Stekloff:
+ o another patch for path problem
+ o quick fix for libsysfs bus
+ o libsysfs changes for sysfsutils 0.3.0
+
+Greg Kroah-Hartman:
+ o fix up some duplicated function compiler warnings in libsysfs
+ o fix some compiler warnings in the tdb code
+ o Added Kay's name to the man page
+ o update the wildcard documentation in the man page to show the new styles supported
+ o fix permission handling logic
+ o enable default_mode ability to actually build
+ o add support for the default_mode variable, as it is documented
+ o show permissions and groups in the label_test
+ o remove some items off of the TODO list, as they are now done
+ o fix up the tests to work without all of the environ variables
+ o get rid of the majority of the debug environment variables
+ o Update the man page to show the new config file, it's format, and how to use it
+ o fix up the tests to support the rules file name change
+ o add support for a main udev config file, udev.conf
+ o turn debugging messages off by default
+ o split out the namedev config parsing logic to namedev_parse.c
+ o rename namedev's get_attr() to be main namedev_name_device() as that's what it really is
+ o add devfs like tty rules as an example in the default config file
+ o operate on the rules in the order they are in the config file (within the rule type) instead of operating on them backwards.
+ o Cset exclude: dsteklof@us.ibm.com|ChangeSet|20031126173159|56255
+ o add test for checking the BUS value
+ o fix problem where we were not looking at the BUS value
+ o add scsi and pci bus links in the test sysfs tree
+ o add test and documentation for new %D devfs format modifier
+ o changed the default location of the database to /udev/.udev.tdb to be LSB compliant
+ o get rid of functions in klibc_fixups that are now in klibc
+ o sync up with the 0.84 version of klibc
+ o fix udev init.d script to handle all class devices in sysfs
+ o fix the test.block and test.tty scripts due to their moveing. Also add a test.all script
+ o 007_bk version change to Makefile
+
+Kay Sievers:
+ o pattern matching for namedev
+ o catch replace device by wildcard
+ o udev.8 tweak numeric id text
+ o udev-test.pl add subdir test
+ o namedev.c strcat tweak
+ o overall whitespace + debug text conditioning
+ o udev-test.pl - tweaks
+
+Martin Hicks:
+ o Add -nodefaultlibs while compiling against klibc
+
+Olaf Hering:
+ o ARCH detection for ppc
+
+Patrick Mansfield:
+ o fix udev parallel builds with klibc
+
+
+Summary of changes from v006 to v007
+============================================
+
+<md:linux.it>:
+ o fix segfault in parsing bad udev.permissions file
+
+Greg Kroah-Hartman:
+ o update default config file with a CALLOUT rule, and more documentation
+ o updated the man page with the latest format specifier changes
+ o added ability to put format specifiers in the CALLOUT program string
+ o tweak udev-test.pl to report '0' errors if that's what happened
+ o only build klibc_fixups.c if we are actually using klibc
+ o add support for string group and string user names in udev.permissions
+ o add getgrnam and getpwnam to klibc_fixups files
+ o remove Makefile.klibc
+ o add udev-test perl script from Kay Sievers <kay.sievers@vrfy.org> which blows away my puny shell scripts
+ o added debian's version of udev.permissions
+ o change to 006_bk version
+
+Kay Sievers:
+ o format char for CALLOUT output
+ o more namedev whitespace cleanups
+ o support arguments in callout exec
+ o namedev.c - change order of fields in CALLOUT
+ o namedev.c whitespace + debug text cleanup
+ o man page with udev.permissions wildcard
+
+Olaf Hering:
+ o static klibc udev does not link against crt0.o
+
+Summary of changes from v005 to v006
+============================================
+
+<chris_friesen:sympatico.ca>:
+ o faster test scripts
+
+Arnd Bergmann:
+ o more robust config file parsing in namedev.c
+ o add bus id modifier
+
+Daniel E. F. Stekloff:
+ o patch for libsysfs sysfs directory handling
+
+Greg Kroah-Hartman:
+ o add another line to udev.permissions in the proper format
+ o tweak replace_test
+ o fix permissions to work properly now
+ o add real udev.permissions file to test directory
+ o fix namedev.c to build with older version of gcc
+ o add dumb test for all of the different modifiers
+ o update the TODO list with more items that people can easily do
+ o move the test.block and test.tty scripts to the test/ directory
+ o add remove actions to the test scripts
+ o turn DEBUG_PARSER off by default
+ o add some documentation for the %b modifier to the default config file
+ o fix make install rule for when the udev symlink is already there
+ o change release target in makefile
+ o change debug level on printf values for now
+ o updated demo config file
+ o add some documentation of the modifiers to the default config file
+ o add demo config file
+ o updated bk ignore list for klibc generated files
+ o add printf option to label test to verify it works
+ o fix up printf-like functionality due to previous changes
+ o get the major/minor number before we name the device
+ o add scsi_id "extra" program from Patrick Mansfield <patmans@us.ibm.com>
+ o Add multipath "extra" program from Christophe Varoqui, <christophe.varoqui@free.fr>
+ o trailing whitespace cleanups
+ o splig LABEL and NUMBER into separate functions
+ o add TOPO regression test
+ o move TOPOLOGY rule to it's own function
+ o fix bug where NUMBER and TOPOLOGY would not work for partitions
+ o clean up the way we find the sysdevice for a block device for namedev
+ o updated label test script (tests for partitions now.)
+ o split REPLACE and CALLOUT into separate functions
+ o add debug line for REPLACE call
+ o add replace test
+ o add more sysfs test tree files
+ o change UDEV_SYSFS_PATH environment variable due to libsysfs change
+ o fix bug in klibc's isspace function
+ o fix udev-add.c to build properly with older versions of gcc
+ o add prototype for ftruncate to klibc
+ o Remove a few items from the TODO list that are already done
+ o version number to 005_bk
+ o pull some klibc stuff into the make Makefile to try to stay in sync
+ o klibc build fixes
+
+Kay Sievers:
+ o apply permissions.conf support for wildcard and default name
+ o man page with included placeholder list
+ o implement printf-like placeholder support for NAME
+ o more manpage tweaks
+ o add support for subdirs
+ o add uid/gid to nodes
+
+Olaf Hering:
+ o DESTDIR for udev
+
+Paul Mundt:
+ o Fixup path for kernel includes when building with klibc
+
+Robert Love:
+ o udev init script
+
+
+Summary of changes from v004 to v005
+============================================
+
+<kay:vrfy.org>:
+ o namedev.c comments + debug patch
+ o man page update
+
+Greg Kroah-Hartman:
+ o ignore the klibc/linux symlink
+ o add klibc linux symlink info to the README
+ o get 'make release' to work properly again
+ o added README info for how to build using klibc
+ o turn off debugging if we are building with klibc
+ o turn off debugging in namedev
+ o added vsyslog support to klibc
+ o add ftruncate to klibc
+ o klibc specific tweaks
+ o libsysfs does not need mntent.h in it's header file
+ o udev build tweaks to tdb's spinlock code
+ o klibc makefile changes
+ o build tdb and libsysfs from the same makefile as udev
+ o udev-add build cleanups for other libc versions
+ o tweak tdb to build within udev better
+ o make libsysfs spit debug messages to the same place as the rest of udev
+ o make libsysfs build cleanly
+ o updated bk ignore list
+ o added klibc version 0.82 (cvs tree) to the udev tree
+ o makefile fix for now
+ o Merge greg@bucket:/home/greg/src/udev into kroah.com:/home/greg/src/udev
+ o hm, makefile bug with so many files... will fix later
+ o regression tests starting to be added
+ o fix LABEL bug for device files (not class files.)
+ o more warning flags to the build
+ o got rid of struct device_attr
+ o rename namedev.permissions and namedev.config to udev.permissions and udev.config
+ o fix dbg line in namedev.c
+ o more overrides of config info with env variables if in test mode
+ o Fix bug causing udev to sleep forever waiting for dev file to show up
+ o change version to 004_bk
+ o make config files, sysfs root, and udev root configurable from config variables
+
+Robert Love:
+ o udev: sleep_for_dev() bits
+ o udev: another canidate for static
+
+
+Summary of changes from v003 to v004
+============================================
+
+Daniel E. F. Stekloff:
+ o new version of libsysfs patch
+
+Greg Kroah-Hartman:
+ o 004 release
+ o major database cleanups
+ o Changed test.block and test.tty to take ACTION from the command line
+ o don't sleep if 'dev' file is already present on device add
+ o fix comment about how the "dev" file is made up
+ o more database work. Now we only store the info we really need right now
+ o add BUS= bug to TODO list so it will not get forgotten
+ o spec file changes
+ o test.block changes
+ o ok, rpm likes the "_" character instead of "-" better
+ o change the version to 003-bk to keep things sane with people using the bk tree
+ o got "remove of named devices" working
+ o fix segfaults when dealing with partitions
+
+Kay Sievers:
+ o man file update
+ o man page update
+
+Robert Love:
+ o udev: mode should be mode_t
+ o udev: trivial trivialities
+ o udev: cool test scripts again
+ o udev spec file symlink support
+ o udev: cool test scripts
+ o udev spec file bits
+
+
+Summary of changes from v0.2 to v003
+============================================
+
+Daniel E. F. Stekloff:
+ o udevdb patch
+ o udevdb prototype
+
+Greg Kroah-Hartman:
+ o update the spec file for the new version and install process
+ o fix makefile release rule to not drop tdb.h file
+ o Add FAQ for udev
+ o removed AUTHORS and INSTALL files as they were pretty pointless
+ o copyright updates
+ o Add AUTHORS and INSTALL files
+ o TODO updates
+ o Updatd the README
+ o updated the TODO list
+ o add udev man page (basically just a place holder for now.)
+ o added uninstall support
+ o added install target for makefile so people don't have to do it by hand anymore
+ o add version to debug log on startup
+ o tell the user what mknod() we are trying to do
+ o add dbg_parse() to cut down on parse file debugging statements
+ o put config files and database in /etc/udev by default
+ o add ols 2003 udev paper to docs/
+ o clean up some debugging stuff in namedev.c
+ o do not build the tdb binary programs, only the objects
+ o merge tdb into the build process
+ o Added tdb code from latest cvs version in the samba tree
+ o added my name to the .spec file
+ o minor cleanups
+ o cleanup the mknod code a bit
+ o remove mknod callout
+ o handle new major:minor format of dev files that showed up in 2.6.0-test2-bk3 or so
+ o oops, everything was getting created as 000 mode, try to fix this up, but fail...
+ o more test stuff
+
+Olaf Hering:
+ o print udev pid
+
+Patrick Mansfield:
+ o add callout config type to udev
+
+Paul Mundt:
+ o Fix TDB cross compilation
+ o udev spec file
+ o udev/libsysfs cross compile fixes
+
+
+Summary of changes from v0.1 to v0.2
+============================================
+
+Greg Kroah-Hartman:
+ o more test stuff
+ o removed unneeded stuff from udev.h
+ o added 0.2 change log info
+ o start working on label support, and fix some segfaults for block devices
+ o test config file changes
+ o add NUMBER support (basically same logic as TOPOLOGY, perhaps we should
+ merge this...)
+ o added topology support
+ o got REPLACE to work properly
+ o make struct config_device contain a struct device_attr instead of
+ duplicating the mess
+ o block test
+ o split the tests up into different files
+ o split udev main logic into udev-add and udev-remove
+ o Clean up the namedev interface a bit, making the code smaller
+ o bk: update ignore list
+ o update the tests to handle block devices too
+ o add initial libsysfs support
+ o added libsysfs to the build
+ o added libsysfs code from sysutils-0.1.1-071803 release
+ o namedev config files are fully parsed
+ o more permission tests
+ o make log_message spit out warnings so I don't have to spend forever
+ chasing down stupid bugs that aren't there...
+ o added klibc makefile
+ o Initial namedev parsing of config files
+ o sleep for 2 seconds to give the kernel a chance to actually create the
+ files we need
+ o pick a better default UDEV_ROOT
+ o fix up the test to actually work
+ o added more documentation in README and TODO files
+
+
+Summary of changes up to v0.1
+============================================
+
+Greg Kroah-Hartman:
+ o added more documentation in README and TODO files
+ o updated the documentation
+ o cleaned up the makefile a bit
+ o remove now works!
+ o restructure code to be able to actually get remove_node() to work
+ o Creating nodes actually works
+ o added stupid test script for debugging
+ o added initial documentation and gpl license
+ o enabled debugging
+ o updated ignore list
+ o added initial files
+ o fixed up config
+ o Initial repository create
+ o BitKeeper file /home/greg/src/udev/udev/ChangeSet
+
diff --git a/src/udev/INSTALL b/src/udev/INSTALL
new file mode 100644
index 000000000..0a34e77df
--- /dev/null
+++ b/src/udev/INSTALL
@@ -0,0 +1,44 @@
+The options used usually look like:
+ %configure \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --bindir=/usr/bin \
+ --libdir=/usr/lib64 \
+ --libexecdir=/usr/lib \
+ --with-systemdsystemunitdir=/usr/lib/systemd/system \
+ --with-selinux
+
+The options used in a RPM spec file look like:
+ %configure \
+ --prefix=%{_prefix} \
+ --sysconfdir=%{_sysconfdir} \
+ --bindir=%{_bindir} \
+ --libdir=%{_libdir} \
+ --libexecdir=%{_prefix}/lib \
+ --with-systemdsystemunitdir=%{_prefix}/lib/systemd/system \
+ --with-selinux
+
+The options to install udev in the rootfs instead of /usr,
+and udevadm in /sbin:
+ --prefix=%{_prefix} \
+ --with-rootprefix= \
+ --sysconfdir=%{_sysconfdir} \
+ --bindir=/sbin \
+ --libdir=%{_libdir} \
+ --with-rootlibdir=/lib64 \
+ --libexecdir=/lib \
+ --with-systemdsystemunitdir=/lib/systemd/system \
+ --with-selinux
+
+Some tools expect udevadm in 'sbin'. A symlink to udevadm in 'bin'
+needs to be manually created if needed.
+
+The defined location for scripts and binaries which are called
+from rules is (/usr)/lib/udev/ on all systems and architectures. Any
+other location will break other packages, who rightfully expect
+the (/usr)/lib/udev/ directory, to install their rule helper and udev
+rule files.
+
+Default udev rules and persistent device naming rules may be required
+by other software that depends on the data udev collects from the
+devices.
diff --git a/src/udev/Makefile.am b/src/udev/Makefile.am
new file mode 100644
index 000000000..1c7f86b08
--- /dev/null
+++ b/src/udev/Makefile.am
@@ -0,0 +1,712 @@
+# Copyright (C) 2008-2012 Kay Sievers <kay.sievers@vrfy.org>
+# Copyright (C) 2009 Diego Elio 'Flameeyes' Pettenò <flameeyes@gmail.com>
+
+SUBDIRS = .
+
+ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
+
+AM_MAKEFLAGS = --no-print-directory
+
+LIBUDEV_CURRENT=13
+LIBUDEV_REVISION=2
+LIBUDEV_AGE=13
+
+LIBGUDEV_CURRENT=1
+LIBGUDEV_REVISION=1
+LIBGUDEV_AGE=1
+
+AM_CPPFLAGS = \
+ -include $(top_builddir)/config.h \
+ -I$(top_srcdir)/src \
+ -DSYSCONFDIR=\""$(sysconfdir)"\" \
+ -DPKGLIBEXECDIR=\""$(libexecdir)/udev"\"
+
+AM_CFLAGS = \
+ ${my_CFLAGS} \
+ -fvisibility=hidden \
+ -ffunction-sections \
+ -fdata-sections
+
+AM_LDFLAGS = \
+ -Wl,--gc-sections \
+ -Wl,--as-needed
+
+DISTCHECK_CONFIGURE_FLAGS = \
+ --enable-debug \
+ --enable-rule_generator \
+ --enable-floppy \
+ --with-selinux \
+ --enable-gtk-doc \
+ --with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)
+
+BUILT_SOURCES =
+EXTRA_DIST =
+CLEANFILES =
+INSTALL_EXEC_HOOKS =
+INSTALL_DATA_HOOKS =
+UNINSTALL_EXEC_HOOKS =
+DISTCHECK_HOOKS =
+DISTCLEAN_LOCAL_HOOKS =
+
+udevhomedir = $(libexecdir)/udev
+udevhome_SCRIPTS =
+dist_udevhome_SCRIPTS =
+dist_udevhome_DATA =
+dist_man_MANS =
+
+SED_PROCESS = \
+ $(AM_V_GEN)$(MKDIR_P) $(dir $@) && $(SED) \
+ -e 's,@VERSION\@,$(VERSION),g' \
+ -e 's,@prefix\@,$(prefix),g' \
+ -e 's,@rootprefix\@,$(rootprefix),g' \
+ -e 's,@exec_prefix\@,$(exec_prefix),g' \
+ -e 's,@libdir\@,$(libdir),g' \
+ -e 's,@includedir\@,$(includedir),g' \
+ -e 's,@bindir\@,$(bindir),g' \
+ -e 's,@pkglibexecdir\@,$(libexecdir)/udev,g' \
+ < $< > $@ || rm $@
+
+%.pc: %.pc.in Makefile
+ $(SED_PROCESS)
+
+%.rules: %.rules.in Makefile
+ $(SED_PROCESS)
+
+%.service: %.service.in Makefile
+ $(SED_PROCESS)
+
+%.sh: %.sh.in Makefile
+ $(SED_PROCESS)
+ $(AM_V_GEN)chmod +x $@
+
+%.pl: %.pl.in Makefile
+ $(SED_PROCESS)
+ $(AM_V_GEN)chmod +x $@
+
+# ------------------------------------------------------------------------------
+SUBDIRS += src/docs
+
+include_HEADERS = src/libudev.h
+lib_LTLIBRARIES = libudev.la
+noinst_LTLIBRARIES = libudev-private.la
+
+libudev_la_SOURCES =\
+ src/libudev-private.h \
+ src/libudev.c \
+ src/libudev-list.c \
+ src/libudev-util.c \
+ src/libudev-device.c \
+ src/libudev-enumerate.c \
+ src/libudev-monitor.c \
+ src/libudev-queue.c
+
+libudev_la_LDFLAGS = \
+ $(AM_LDFLAGS) \
+ -version-info $(LIBUDEV_CURRENT):$(LIBUDEV_REVISION):$(LIBUDEV_AGE)
+
+libudev_private_la_SOURCES =\
+ $(libudev_la_SOURCES) \
+ src/libudev-util-private.c \
+ src/libudev-device-private.c \
+ src/libudev-queue-private.c
+
+if WITH_SELINUX
+libudev_private_la_SOURCES += src/libudev-selinux-private.c
+libudev_private_la_LIBADD = $(SELINUX_LIBS)
+endif
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = src/libudev.pc
+EXTRA_DIST += src/libudev.pc.in
+CLEANFILES += src/libudev.pc
+
+EXTRA_DIST += src/COPYING
+# move lib from $(libdir) to $(rootlib_execdir) and update devel link, if needed
+libudev-install-move-hook:
+ if test "$(libdir)" != "$(rootlib_execdir)"; then \
+ mkdir -p $(DESTDIR)$(rootlib_execdir) && \
+ so_img_name=$$(readlink $(DESTDIR)$(libdir)/libudev.so) && \
+ so_img_rel_target_prefix=$$(echo $(libdir) | sed 's,\(^/\|\)[^/][^/]*,..,g') && \
+ ln -sf $$so_img_rel_target_prefix$(rootlib_execdir)/$$so_img_name $(DESTDIR)$(libdir)/libudev.so && \
+ mv $(DESTDIR)$(libdir)/libudev.so.* $(DESTDIR)$(rootlib_execdir); \
+ fi
+
+libudev-uninstall-move-hook:
+ rm -f $(DESTDIR)$(rootlib_execdir)/libudev.so*
+
+INSTALL_EXEC_HOOKS += libudev-install-move-hook
+UNINSTALL_EXEC_HOOKS += libudev-uninstall-move-hook
+
+# ------------------------------------------------------------------------------
+udev-confdirs:
+ -mkdir -p $(DESTDIR)$(sysconfdir)/udev/rules.d
+ -mkdir -p $(DESTDIR)$(libexecdir)/udev/devices
+
+INSTALL_DATA_HOOKS += udev-confdirs
+
+udevrulesdir = $(libexecdir)/udev/rules.d
+dist_udevrules_DATA = \
+ rules/42-usb-hid-pm.rules \
+ rules/50-udev-default.rules \
+ rules/60-persistent-storage-tape.rules \
+ rules/60-persistent-serial.rules \
+ rules/60-persistent-input.rules \
+ rules/60-persistent-alsa.rules \
+ rules/60-persistent-storage.rules \
+ rules/75-net-description.rules \
+ rules/75-tty-description.rules \
+ rules/78-sound-card.rules \
+ rules/80-drivers.rules \
+ rules/95-udev-late.rules
+
+udevconfdir = $(sysconfdir)/udev
+dist_udevconf_DATA = src/udev.conf
+
+sharepkgconfigdir = $(datadir)/pkgconfig
+sharepkgconfig_DATA = src/udev.pc
+EXTRA_DIST += src/udev.pc.in
+CLEANFILES += src/udev.pc
+
+if WITH_SYSTEMD
+dist_systemdsystemunit_DATA = \
+ src/udev-control.socket \
+ src/udev-kernel.socket
+
+systemdsystemunit_DATA = \
+ src/udev.service \
+ src/udev-trigger.service \
+ src/udev-settle.service
+
+EXTRA_DIST += \
+ src/udev.service.in \
+ src/udev-trigger.service.in \
+ src/udev-settle.service.in
+
+CLEANFILES += \
+ src/udev.service \
+ src/udev-trigger.service \
+ src/udev-settle.service
+
+systemd-install-hook:
+ mkdir -p $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants
+ ln -sf ../udev-control.socket $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants/udev-control.socket
+ ln -sf ../udev-kernel.socket $(DESTDIR)$(systemdsystemunitdir)/sockets.target.wants/udev-kernel.socket
+ mkdir -p $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants
+ ln -sf ../udev.service $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants/udev.service
+ ln -sf ../udev-trigger.service $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants/udev-trigger.service
+
+INSTALL_DATA_HOOKS += systemd-install-hook
+endif
+
+bin_PROGRAMS = \
+ udevadm
+
+pkglibexec_PROGRAMS = \
+ udevd
+
+udev_common_sources = \
+ src/udev.h \
+ src/udev-event.c \
+ src/udev-watch.c \
+ src/udev-node.c \
+ src/udev-rules.c \
+ src/udev-ctrl.c \
+ src/udev-builtin.c \
+ src/udev-builtin-blkid.c \
+ src/udev-builtin-firmware.c \
+ src/udev-builtin-hwdb.c \
+ src/udev-builtin-input_id.c \
+ src/udev-builtin-kmod.c \
+ src/udev-builtin-path_id.c \
+ src/udev-builtin-usb_id.c
+
+udev_common_CFLAGS = \
+ $(BLKID_CFLAGS) \
+ $(KMOD_CFLAGS)
+
+udev_common_LDADD = \
+ libudev-private.la \
+ $(BLKID_LIBS) \
+ $(KMOD_LIBS)
+
+udev_common_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -DFIRMWARE_PATH="$(FIRMWARE_PATH)" \
+ -DUSB_DATABASE=\"$(USB_DATABASE)\" -DPCI_DATABASE=\"$(PCI_DATABASE)\"
+
+udevd_SOURCES = \
+ $(udev_common_sources) \
+ src/udevd.c \
+ src/sd-daemon.h \
+ src/sd-daemon.c
+udevd_CFLAGS = $(udev_common_CFLAGS)
+udevd_LDADD = $(udev_common_LDADD)
+udevd_CPPFLAGS = $(udev_common_CPPFLAGS)
+
+udevadm_SOURCES = \
+ $(udev_common_sources) \
+ src/udevadm.c \
+ src/udevadm-info.c \
+ src/udevadm-control.c \
+ src/udevadm-monitor.c \
+ src/udevadm-settle.c \
+ src/udevadm-trigger.c \
+ src/udevadm-test.c \
+ src/udevadm-test-builtin.c
+udevadm_CFLAGS = $(udev_common_CFLAGS)
+udevadm_LDADD = $(udev_common_LDADD)
+udevadm_CPPFLAGS = $(udev_common_CPPFLAGS)
+
+# ------------------------------------------------------------------------------
+if ENABLE_MANPAGES
+dist_man_MANS += \
+ src/udev.7 \
+ src/udevadm.8 \
+ src/udevd.8
+endif
+
+EXTRA_DIST += \
+ src/udev.xml \
+ src/udevadm.xml \
+ src/udevd.xml
+
+if HAVE_XSLTPROC
+dist_noinst_DATA = \
+ src/udev.html \
+ src/udevadm.html \
+ src/udevd.html
+
+src/%.7 src/%.8 : src/%.xml
+ $(AM_V_GEN)$(XSLTPROC) -o $@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
+
+src/%.html : src/%.xml
+ $(AM_V_GEN)$(XSLTPROC) -o $@ -nonet http://docbook.sourceforge.net/release/xsl/current/xhtml-1_1/docbook.xsl $<
+endif
+
+# ------------------------------------------------------------------------------
+TESTS = \
+ test/udev-test.pl \
+ test/rules-test.sh
+
+check_PROGRAMS = \
+ test-libudev \
+ test-udev
+
+test_libudev_SOURCES = src/test-libudev.c
+test_libudev_LDADD = libudev.la
+
+test_udev_SOURCES = \
+ $(udev_common_sources) \
+ src/test-udev.c
+test_udev_CFLAGS = $(udev_common_CFLAGS)
+test_udev_LDADD = $(udev_common_LDADD)
+test_udev_CPPFLAGS = $(udev_common_CPPFLAGS)
+test_udev_DEPENDENCIES = test/sys
+
+# packed sysfs test tree
+test/sys:
+ $(AM_V_GEN)mkdir -p test && tar -C test/ -xJf $(top_srcdir)/test/sys.tar.xz
+
+test-sys-distclean:
+ -rm -rf test/sys
+DISTCLEAN_LOCAL_HOOKS += test-sys-distclean
+
+EXTRA_DIST += test/sys.tar.xz
+
+# ------------------------------------------------------------------------------
+ata_id_SOURCES = src/ata_id/ata_id.c
+ata_id_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += ata_id
+
+# ------------------------------------------------------------------------------
+cdrom_id_SOURCES = src/cdrom_id/cdrom_id.c
+cdrom_id_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += cdrom_id
+dist_udevrules_DATA += src/cdrom_id/60-cdrom_id.rules
+
+# ------------------------------------------------------------------------------
+collect_SOURCES = src/collect/collect.c
+collect_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += collect
+
+# ------------------------------------------------------------------------------
+scsi_id_SOURCES =\
+ src/scsi_id/scsi_id.c \
+ src/scsi_id/scsi_serial.c \
+ src/scsi_id/scsi.h \
+ src/scsi_id/scsi_id.h
+scsi_id_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += scsi_id
+dist_man_MANS += src/scsi_id/scsi_id.8
+EXTRA_DIST += src/scsi_id/README
+
+# ------------------------------------------------------------------------------
+v4l_id_SOURCES = src/v4l_id/v4l_id.c
+v4l_id_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += v4l_id
+dist_udevrules_DATA += src/v4l_id/60-persistent-v4l.rules
+
+# ------------------------------------------------------------------------------
+accelerometer_SOURCES = src/accelerometer/accelerometer.c
+accelerometer_LDADD = libudev-private.la -lm
+pkglibexec_PROGRAMS += accelerometer
+dist_udevrules_DATA += src/accelerometer/61-accelerometer.rules
+
+# ------------------------------------------------------------------------------
+if ENABLE_GUDEV
+SUBDIRS += src/gudev/docs
+
+libgudev_includedir=$(includedir)/gudev-1.0/gudev
+libgudev_include_HEADERS = \
+ src/gudev/gudev.h \
+ src/gudev/gudevenums.h \
+ src/gudev/gudevenumtypes.h \
+ src/gudev/gudevtypes.h \
+ src/gudev/gudevclient.h \
+ src/gudev/gudevdevice.h \
+ src/gudev/gudevenumerator.h
+
+lib_LTLIBRARIES += libgudev-1.0.la
+
+pkgconfig_DATA += src/gudev/gudev-1.0.pc
+EXTRA_DIST += src/gudev/gudev-1.0.pc.in
+CLEANFILES += src/gudev/gudev-1.0.pc
+
+libgudev_1_0_la_SOURCES = \
+ src/gudev/gudevenums.h \
+ src/gudev/gudevenumtypes.h \
+ src/gudev/gudevenumtypes.h\
+ src/gudev/gudevtypes.h \
+ src/gudev/gudevclient.h \
+ src/gudev/gudevclient.c \
+ src/gudev/gudevdevice.h \
+ src/gudev/gudevdevice.c \
+ src/gudev/gudevenumerator.h \
+ src/gudev/gudevenumerator.c \
+ src/gudev/gudevprivate.h
+
+nodist_libgudev_1_0_la_SOURCES = \
+ src/gudev/gudevmarshal.h \
+ src/gudev/gudevmarshal.c \
+ src/gudev/gudevenumtypes.h \
+ src/gudev/gudevenumtypes.c
+BUILT_SOURCES += $(nodist_libgudev_1_0_la_SOURCES)
+
+libgudev_1_0_la_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_builddir)/src\
+ -I$(top_srcdir)/src\
+ -I$(top_builddir)/src/gudev \
+ -I$(top_srcdir)/src/gudev \
+ -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT \
+ -D_GUDEV_COMPILATION \
+ -DG_LOG_DOMAIN=\"GUdev\"
+
+libgudev_1_0_la_CFLAGS = \
+ -fvisibility=default \
+ $(GLIB_CFLAGS)
+
+libgudev_1_0_la_LIBADD = libudev.la $(GLIB_LIBS)
+
+libgudev_1_0_la_LDFLAGS = \
+ -version-info $(LIBGUDEV_CURRENT):$(LIBGUDEV_REVISION):$(LIBGUDEV_AGE) \
+ -export-dynamic -no-undefined \
+ -export-symbols-regex '^g_udev_.*'
+
+EXTRA_DIST += \
+ src/gudev/COPYING \
+ src/gudev/gudevmarshal.list \
+ src/gudev/gudevenumtypes.h.template \
+ src/gudev/gudevenumtypes.c.template \
+ src/gudev/gjs-example.js \
+ src/gudev/seed-example-enum.js \
+ src/gudev/seed-example.js
+
+src/gudev/gudevmarshal.h: src/gudev/gudevmarshal.list
+ $(AM_V_GEN)glib-genmarshal $< --prefix=g_udev_marshal --header > $@
+
+src/gudev/gudevmarshal.c: src/gudev/gudevmarshal.list
+ $(AM_V_GEN)echo "#include \"gudevmarshal.h\"" > $@ && \
+ glib-genmarshal $< --prefix=g_udev_marshal --body >> $@
+
+src/gudev/gudevenumtypes.h: src/gudev/gudevenumtypes.h.template src/gudev/gudevenums.h
+ $(AM_V_GEN)glib-mkenums --template $^ > \
+ $@.tmp && mv $@.tmp $@
+
+src/gudev/gudevenumtypes.c: src/gudev/gudevenumtypes.c.template src/gudev/gudevenums.h
+ $(AM_V_GEN)glib-mkenums --template $^ > \
+ $@.tmp && mv $@.tmp $@
+
+if ENABLE_INTROSPECTION
+src/gudev/GUdev-1.0.gir: libgudev-1.0.la $(G_IR_SCANNER)
+ $(AM_V_GEN)$(G_IR_SCANNER) -v \
+ --warn-all \
+ --namespace GUdev \
+ --nsversion=1.0 \
+ --include=GObject-2.0 \
+ --library=gudev-1.0 \
+ --library-path=$(top_builddir)/src \
+ --library-path=$(top_builddir)/src/gudev \
+ --output $@ \
+ --pkg=glib-2.0 \
+ --pkg=gobject-2.0 \
+ --pkg-export=gudev-1.0 \
+ --c-include=gudev/gudev.h \
+ -I$(top_srcdir)/src/\
+ -I$(top_builddir)/src/\
+ -D_GUDEV_COMPILATION \
+ -D_GUDEV_WORK_AROUND_DEV_T_BUG \
+ $(top_srcdir)/src/gudev/gudev.h \
+ $(top_srcdir)/src/gudev/gudevtypes.h \
+ $(top_srcdir)/src/gudev/gudevenums.h \
+ $(or $(wildcard $(top_builddir)/src/gudev/gudevenumtypes.h),$(top_srcdir)/src/gudev/gudevenumtypes.h) \
+ $(top_srcdir)/src/gudev/gudevclient.h \
+ $(top_srcdir)/src/gudev/gudevdevice.h \
+ $(top_srcdir)/src/gudev/gudevenumerator.h \
+ $(top_srcdir)/src/gudev/gudevclient.c \
+ $(top_srcdir)/src/gudev/gudevdevice.c \
+ $(top_srcdir)/src/gudev/gudevenumerator.c
+
+src/gudev/GUdev-1.0.typelib: src/gudev/GUdev-1.0.gir $(G_IR_COMPILER)
+ $(AM_V_GEN)g-ir-compiler $< -o $@
+
+girdir = $(GIRDIR)
+gir_DATA = src/gudev/GUdev-1.0.gir
+
+typelibsdir = $(GIRTYPELIBDIR)
+typelibs_DATA = src/gudev/GUdev-1.0.typelib
+
+CLEANFILES += $(gir_DATA) $(typelibs_DATA)
+endif # ENABLE_INTROSPECTION
+
+# move lib from $(libdir) to $(rootlib_execdir) and update devel link, if needed
+libgudev-install-move-hook:
+ if test "$(libdir)" != "$(rootlib_execdir)"; then \
+ mkdir -p $(DESTDIR)$(rootlib_execdir) && \
+ so_img_name=$$(readlink $(DESTDIR)$(libdir)/libgudev-1.0.so) && \
+ so_img_rel_target_prefix=$$(echo $(libdir) | sed 's,\(^/\|\)[^/][^/]*,..,g') && \
+ ln -sf $$so_img_rel_target_prefix$(rootlib_execdir)/$$so_img_name $(DESTDIR)$(libdir)/libgudev-1.0.so && \
+ mv $(DESTDIR)$(libdir)/libgudev-1.0.so.* $(DESTDIR)$(rootlib_execdir); \
+ fi
+
+libgudev-uninstall-move-hook:
+ rm -f $(DESTDIR)$(rootlib_execdir)/libgudev-1.0.so*
+
+INSTALL_EXEC_HOOKS += libgudev-install-move-hook
+UNINSTALL_EXEC_HOOKS += libgudev-uninstall-move-hook
+endif
+
+# ------------------------------------------------------------------------------
+if ENABLE_KEYMAP
+keymap_SOURCES = src/keymap/keymap.c
+keymap_CPPFLAGS = $(AM_CPPFLAGS) -I src/keymap
+nodist_keymap_SOURCES = \
+ src/keymap/keys-from-name.h \
+ src/keymap/keys-to-name.h
+BUILT_SOURCES += $(nodist_keymap_SOURCES)
+
+pkglibexec_PROGRAMS += keymap
+dist_doc_DATA = src/keymap/README.keymap.txt
+
+dist_udevrules_DATA += \
+ src/keymap/95-keymap.rules \
+ src/keymap/95-keyboard-force-release.rules
+
+dist_udevhome_SCRIPTS += src/keymap/findkeyboards
+udevhome_SCRIPTS += src/keymap/keyboard-force-release.sh
+
+EXTRA_DIST += \
+ src/keymap/check-keymaps.sh \
+ src/keymap/keyboard-force-release.sh.in
+
+CLEANFILES += \
+ src/keymap/keys.txt \
+ src/keymap/keys-from-name.gperf \
+ src/keymap/keyboard-force-release.sh
+
+udevkeymapdir = $(libexecdir)/udev/keymaps
+dist_udevkeymap_DATA = \
+ src/keymap/keymaps/acer \
+ src/keymap/keymaps/acer-aspire_5720 \
+ src/keymap/keymaps/acer-aspire_8930 \
+ src/keymap/keymaps/acer-aspire_5920g \
+ src/keymap/keymaps/acer-aspire_6920 \
+ src/keymap/keymaps/acer-travelmate_c300 \
+ src/keymap/keymaps/asus \
+ src/keymap/keymaps/compaq-e_evo \
+ src/keymap/keymaps/dell \
+ src/keymap/keymaps/dell-latitude-xt2 \
+ src/keymap/keymaps/everex-xt5000 \
+ src/keymap/keymaps/fujitsu-amilo_li_2732 \
+ src/keymap/keymaps/fujitsu-amilo_pa_2548 \
+ src/keymap/keymaps/fujitsu-amilo_pro_edition_v3505 \
+ src/keymap/keymaps/fujitsu-amilo_pro_v3205 \
+ src/keymap/keymaps/fujitsu-amilo_si_1520 \
+ src/keymap/keymaps/fujitsu-esprimo_mobile_v5 \
+ src/keymap/keymaps/fujitsu-esprimo_mobile_v6 \
+ src/keymap/keymaps/genius-slimstar-320 \
+ src/keymap/keymaps/hewlett-packard \
+ src/keymap/keymaps/hewlett-packard-2510p_2530p \
+ src/keymap/keymaps/hewlett-packard-compaq_elitebook \
+ src/keymap/keymaps/hewlett-packard-pavilion \
+ src/keymap/keymaps/hewlett-packard-presario-2100 \
+ src/keymap/keymaps/hewlett-packard-tablet \
+ src/keymap/keymaps/hewlett-packard-tx2 \
+ src/keymap/keymaps/ibm-thinkpad-usb-keyboard-trackpoint \
+ src/keymap/keymaps/inventec-symphony_6.0_7.0 \
+ src/keymap/keymaps/lenovo-3000 \
+ src/keymap/keymaps/lenovo-ideapad \
+ src/keymap/keymaps/lenovo-thinkpad-usb-keyboard-trackpoint \
+ src/keymap/keymaps/lenovo-thinkpad_x6_tablet \
+ src/keymap/keymaps/lenovo-thinkpad_x200_tablet \
+ src/keymap/keymaps/lg-x110 \
+ src/keymap/keymaps/logitech-wave \
+ src/keymap/keymaps/logitech-wave-cordless \
+ src/keymap/keymaps/logitech-wave-pro-cordless \
+ src/keymap/keymaps/maxdata-pro_7000 \
+ src/keymap/keymaps/medion-fid2060 \
+ src/keymap/keymaps/medionnb-a555 \
+ src/keymap/keymaps/micro-star \
+ src/keymap/keymaps/module-asus-w3j \
+ src/keymap/keymaps/module-ibm \
+ src/keymap/keymaps/module-lenovo \
+ src/keymap/keymaps/module-sony \
+ src/keymap/keymaps/module-sony-old \
+ src/keymap/keymaps/module-sony-vgn \
+ src/keymap/keymaps/olpc-xo \
+ src/keymap/keymaps/onkyo \
+ src/keymap/keymaps/oqo-model2 \
+ src/keymap/keymaps/samsung-other \
+ src/keymap/keymaps/samsung-90x3a \
+ src/keymap/keymaps/samsung-sq1us \
+ src/keymap/keymaps/samsung-sx20s \
+ src/keymap/keymaps/toshiba-satellite_a100 \
+ src/keymap/keymaps/toshiba-satellite_a110 \
+ src/keymap/keymaps/toshiba-satellite_m30x \
+ src/keymap/keymaps/zepto-znote
+
+udevkeymapforcereldir = $(libexecdir)/udev/keymaps/force-release
+dist_udevkeymapforcerel_DATA = \
+ src/keymap/force-release-maps/dell-touchpad \
+ src/keymap/force-release-maps/hp-other \
+ src/keymap/force-release-maps/samsung-other \
+ src/keymap/force-release-maps/samsung-90x3a \
+ src/keymap/force-release-maps/common-volume-keys
+
+src/keymap/keys.txt: $(INCLUDE_PREFIX)/linux/input.h
+ $(AM_V_at)mkdir -p src/keymap
+ $(AM_V_GEN)$(AWK) '/^#define.*KEY_[^ ]+[ \t]+[0-9]/ { if ($$2 != "KEY_MAX") { print $$2 } }' < $< | sed 's/^KEY_COFFEE$$/KEY_SCREENLOCK/' > $@
+
+src/keymap/keys-from-name.gperf: src/keymap/keys.txt
+ $(AM_V_GEN)$(AWK) 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print $$1 ", " $$1 }' < $< > $@
+
+src/keymap/keys-from-name.h: src/keymap/keys-from-name.gperf Makefile
+ $(AM_V_GEN)$(GPERF) -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < $< > $@
+
+src/keymap/keys-to-name.h: src/keymap/keys.txt Makefile
+ $(AM_V_GEN)$(AWK) 'BEGIN{ print "const char* const key_names[KEY_CNT] = { "} { print "[" $$1 "] = \"" $$1 "\"," } END{print "};"}' < $< > $@
+
+keymaps-distcheck-hook: src/keymap/keys.txt
+ $(top_srcdir)/src/keymap/check-keymaps.sh $(top_srcdir) $^
+DISTCHECK_HOOKS += keymaps-distcheck-hook
+endif
+
+if ENABLE_MTD_PROBE
+# ------------------------------------------------------------------------------
+mtd_probe_SOURCES = \
+ src/mtd_probe/mtd_probe.c \
+ src/mtd_probe/mtd_probe.h \
+ src/mtd_probe/probe_smartmedia.c
+mtd_probe_CPPFLAGS = $(AM_CPPFLAGS)
+dist_udevrules_DATA += src/mtd_probe/75-probe_mtd.rules
+pkglibexec_PROGRAMS += mtd_probe
+endif
+
+# ------------------------------------------------------------------------------
+if ENABLE_RULE_GENERATOR
+dist_udevhome_SCRIPTS += \
+ src/rule_generator/write_cd_rules \
+ src/rule_generator/write_net_rules
+
+dist_udevhome_DATA += \
+ src/rule_generator/rule_generator.functions
+
+dist_udevrules_DATA += \
+ src/rule_generator/75-cd-aliases-generator.rules \
+ src/rule_generator/75-persistent-net-generator.rules
+endif
+
+# ------------------------------------------------------------------------------
+if ENABLE_FLOPPY
+create_floppy_devices_SOURCES = src/floppy/create_floppy_devices.c
+create_floppy_devices_LDADD = libudev-private.la
+pkglibexec_PROGRAMS += create_floppy_devices
+dist_udevrules_DATA += src/floppy/60-floppy.rules
+endif
+
+# ------------------------------------------------------------------------------
+clean-local:
+ rm -rf udev-test-install
+
+distclean-local:
+ rm -rf autom4te.cache
+
+EXTRA_DIST += \
+ $(TESTS) \
+ test/rule-syntax-check.py
+
+CLEANFILES += \
+ $(BUILT_SOURCES)
+
+install-exec-hook: $(INSTALL_EXEC_HOOKS)
+
+install-data-hook: $(INSTALL_DATA_HOOKS)
+
+uninstall-hook: $(UNINSTALL_EXEC_HOOKS)
+
+distcheck-hook: $(DISTCHECK_HOOKS)
+
+distclean-local: $(DISTCLEAN_LOCAL_HOOKS)
+
+# ------------------------------------------------------------------------------
+PREVIOUS_VERSION = `expr $(VERSION) - 1`
+changelog:
+ @ head -1 ChangeLog | grep -q "to v$(PREVIOUS_VERSION)"
+ @ mv ChangeLog ChangeLog.tmp
+ @ echo "Summary of changes from v$(PREVIOUS_VERSION) to v$(VERSION)" >> ChangeLog
+ @ echo "============================================" >> ChangeLog
+ @ echo >> ChangeLog
+ @ git log --pretty=short $(PREVIOUS_VERSION)..HEAD | git shortlog >> ChangeLog
+ @ echo >> ChangeLog
+ @ cat ChangeLog
+ @ cat ChangeLog.tmp >> ChangeLog
+ @ rm ChangeLog.tmp
+
+test-install:
+ rm -rf $(PWD)/udev-test-install/
+ make DESTDIR=$(PWD)/udev-test-install install
+ tree $(PWD)/udev-test-install/
+
+git-release:
+ head -1 ChangeLog | grep -q "to v$(VERSION)"
+ head -1 NEWS | grep -q "udev $(VERSION)"
+ git commit -a -m "release $(VERSION)"
+ git tag -m "udev $(VERSION)" -s $(VERSION)
+ git gc --prune=0
+
+git-sync:
+ git push
+ git push --tags
+
+tar-sync:
+ rm -f udev-$(VERSION).tar.sign
+ xz -d -c udev-$(VERSION).tar.xz | gpg --armor --detach-sign --output udev-$(VERSION).tar.sign
+ kup put udev-$(VERSION).tar.xz udev-$(VERSION).tar.sign /pub/linux/utils/kernel/hotplug/
+
+doc-sync:
+ for i in src/*.html; do rm -f $$i.sign; gpg --armor --detach-sign --output=$$i.sign $$i; done
+ for i in src/*.html; do echo $$i; kup put $$i $$i.sign /pub/linux/utils/kernel/hotplug/udev/; done
+ for i in src/docs/html/*.{html,css,png}; do rm -f $$i.sign; gpg --armor --detach-sign --output=$$i.sign $$i; done
+ for i in src/docs/html/*.{html,css,png}; do echo $$i; kup put $$i $$i.sign /pub/linux/utils/kernel/hotplug/libudev/; done
+ for i in src/gudev/docs/html/*.{html,css,png}; do rm -f $$i.sign; gpg --armor --detach-sign --output=$$i.sign $$i; done
+ for i in src/gudev/docs/html/*.{html,css,png}; do echo $$i; kup put $$i $$i.sign /pub/linux/utils/kernel/hotplug/gudev/; done
diff --git a/src/udev/NEWS b/src/udev/NEWS
new file mode 100644
index 000000000..f4f6f4e32
--- /dev/null
+++ b/src/udev/NEWS
@@ -0,0 +1,1735 @@
+udev 182
+========
+Rules files in /etc/udev/rules.s/ with the same name as rules files in
+/run/udev/rules.d/ now always have precedence. The stack of files is now:
+/usr/lib (package), /run (runtime, auto-generated), /etc (admin), while
+the later ones override the earlier ones. In other words: the admin has
+always the last say.
+
+USB auto-suspend is now enabled by default for some built-in USB HID
+devices.
+
+/dev/disk/by-path/ links are no longer created for ATA devices behind
+an 'ATA transport class', the logic to extract predictable numbers does
+not exist in the kernel at this moment.
+
+/dev/disk/by-id/scsi-* compatibility links are no longer created for
+ATA devices, they have their own ata-* prefix.
+
+The s390 rule to set mode == 0666 for /dev/z90crypt is is removed from
+the udev tree and will be part of s390utils (or alternatively could be
+done by the kernel driver itself).
+
+The udev-acl tool is no longer provided, it will be part of a future
+ConsoleKit release. On systemd systems, advanced ConsoleKit and udev-acl
+functionality are provided by systemd.
+
+udev 181
+========
+Require kmod version 5.
+
+Provide /dev/cdrom symlink for /dev/sr0.
+
+udev 180
+========
+Fix for ID_PART_ENTRY_* property names, added by the blkid built-in. The
+fix is needed for udisk2 to operate properly.
+
+Fix for skipped rule execution when the kernel has removed the device
+node in /dev again, before the event was even started. The fix is needed
+to run device-mapper/LVM events properly.
+
+Fix for the man page installation, which was skipped when xsltproc was not
+installed.
+
+udev 179
+========
+Bugfix for $name resolution, which broke at least some keymap handling.
+
+udev 178
+========
+Bugfix for the firmware loading behavior with kernel modules which
+try to load firmware in the module_init() path. The blocked event
+runs into a timout now, which should allow the firmware to be loaded.
+
+Bugfix for a wrong DEVNAME= export, which breaks at least the udev-acl
+tool.
+
+Bugfix for missing ID_ properties for GPT partitions.
+
+The RUN+="socket:.." option is deprecated and should not be used. A warning
+during rules parsing is printed now. Services which listen to udev events,
+need to subscribe to the netlink messages with libudev and not let udev block
+in the rules execution until the message is delivered.
+
+udev 177
+========
+Bugfix for rule_generator instalation.
+
+udev 176
+========
+The 'devtmpfs' filesystem is required now, udev will not create or delete
+device nodes anymore, it only adjusts permissions and ownership of device
+nodes and maintains additional symlinks.
+
+A writable /run directory (ususally tmpfs) is required now for a fully
+functional udev, there is no longer a fallback to /dev/.udev.
+
+The default 'configure' install locations have changed. Packages for systems
+with the historic / vs. /usr split need to be adapted, otherwise udev will
+be installed in /usr and not work properly. Example configuration options
+to install things the traditional way are in INSTALL.
+
+The default install location of the 'udevadm' tool moved from 'sbin'
+to /usr/bin. Some tools expect udevadm in 'sbin', a symlink to udevadm
+needs to be manually created if needed, or --bindir=/sbin be specified.
+
+The expected value of '--libexecdir=' has changed and must no longer contain
+the 'udev' directory.
+
+Kernel modules are now loaded directly by linking udev to 'libkmod'. The
+'modprobe' tool is no longer executed by udev.
+
+The 'blkid' tool is no longer executed from udev rules. Udev links
+directly to libblkid now.
+
+Firmware is loaded natively by udev now, the external 'firmware' binary
+is no longer used.
+
+All built-in tools can be listed and tested with 'udevadm test-builtin'.
+
+The 'udevadm control --reload-rules' option has been renamed to '--reload'.
+It now also reloads the kernel module configuration.
+
+The systemd socket files use PassCredentials=yes, which is available in
+systemd version 38.
+
+The udev build system only creates a .xz tarball now.
+
+All tabs in the source code used for indentation are replaced by spaces now. :)
+
+udev 175
+========
+Bugfixes.
+
+udev 174
+========
+Bugfixes.
+
+The udev daemon moved to /lib/udev/udevd. Non-systemd init systems
+and non-dracut initramfs image generators need to change the init
+scripts. Alternatively the udev build needs to move udevd back to
+/sbin or create a symlink in /sbin, which is not done by default.
+
+The path_id, usb_id, input_id tools are built-in commands now and
+the stand-alone tools do not exist anymore. Static lists of file in
+initramfs generators need to be updated. For testing, the commands
+can still be executed standalone with 'udevadm test-builtin <cmd>'.
+
+The fusectl filesystem is no longer mounted directly from udev.
+Systemd systems will take care of mounting fusectl and configfs
+now. Non-systemd systems need to ship their own rule if they
+need these filesystems auto-mounted.
+
+The long deprecated keys: SYSFS=, ID=, BUS= have been removed.
+
+The support for 'udevadm trigger --type=failed, and the
+RUN{fail_event_on_error} attribute was removed.
+
+The udev control socket is now created in /run/udev/control
+and no longer as an abstract namespace one.
+
+The rules to create persistent network interface and cdrom link
+rules automatically in /etc/udev/rules.d/ have been disabled by
+default. Explicit configuration will be required for these use
+cases, udev will no longer try to write any persistent system
+configuration from a device hotplug path.
+
+udev 173
+========
+Bugfixes.
+
+The udev-acl extra is no longer enabled by default now. To enable it,
+--enable-udev_acl needs to be given at ./configure time. On systemd
+systems, the udev-acl rules prevent it from running as the functionality
+has moved to systemd.
+
+udev 172
+========
+Bugfixes.
+
+Udev now enables kernel media-presence polling if available. Part
+of udisks optical drive tray-handling moved to cdrom_id: The tray
+is locked as soon as a media is detected to enable the receiving
+of media-eject-request events. Media-eject-request events will
+eject the media.
+
+Libudev enumerate is now able to enumerate a subtree of a given
+device.
+
+The mobile-action-modeswitch modeswitch tool was deleted. The
+functionality is provided by usb_modeswitch now.
+
+udev 171
+========
+Bugfixes.
+
+The systemd service files require systemd version 28. The systemd
+socket activation make it possible now to start 'udevd' and 'udevadm
+trigger' in parallel.
+
+udev 170
+========
+Fix bug in control message handling, which can lead to a failing
+udevadm control --exit. Thanks to Jürg Billeter for help tracking
+it down.
+
+udev 169
+========
+Bugfixes.
+
+We require at least Linux kernel 2.6.32 now. Some platforms might
+require a later kernel that supports accept4() and similar, or
+need to backport the trivial syscall wiring to the older kernels.
+
+The hid2hci tool moved to the bluez package and was removed.
+
+Many of the extras can be --enable/--disabled at ./configure
+time. The --disable-extras option was removed. Some extras have
+been disabled by default. The current options and their defaults
+can be checked with './configure --help'.
+
+udev 168
+========
+Bugfixes.
+
+Udev logs a warning now if /run is not writable at udevd
+startup. It will still fall back to /dev/.udev, but this is
+now considered a bug.
+
+The running udev daemon can now cleanly shut down with:
+ udevadm control --exit
+
+Udev in initramfs should clean the state of the udev database
+with: udevadm info --cleanup-db which will remove all state left
+behind from events/rules in initramfs. If initramfs uses
+--cleanup-db and device-mapper/LVM, the rules in initramfs need
+to add OPTIONS+="db_persist" for all dm devices. This will
+prevent removal of the udev database for these devices.
+
+Spawned programs by PROGRAM/IMPORT/RUN now have a hard timeout of
+120 seconds per process. If that timeout is reached the spawned
+process will be killed. The event timeout can be overwritten with
+udev rules.
+
+If systemd is used, udev gets now activated by netlink data.
+Systemd will bind the netlink socket which will buffer all data.
+If needed, such setup allows a seemless update of the udev daemon,
+where no event can be lost during a udevd update/restart.
+Packages need to make sure to: systemctl stop udev.socket udev.service
+or 'mask' udev.service during the upgrade to prevent any unwanted
+auto-spawning of udevd.
+This version of udev conflicts with systemd version below 25. The
+unchanged service files will not wirk correctly.
+
+udev 167
+========
+Bugfixes.
+
+The udev runtime data moved from /dev/.udev/ to /run/udev/. The
+/run mountpoint is supposed to be a tmpfs mounted during early boot,
+available and writable to for all tools at any time during bootup,
+it replaces /var/run/, which should become a symlink some day.
+
+If /run does not exist, or is not writable, udev will fall back using
+/dev/.udev/.
+
+On systemd systems with initramfs and LVM used, packagers must
+make sure, that the systemd and initramfs versions match. The initramfs
+needs to create the /run mountpoint for udev to store the data, and
+mount this tmpfs to /run in the rootfs, so the that the udev database
+is preserved for the udev version started in the rootfs.
+
+The command 'udevadm info --convert-db' is gone. The udev daemon
+itself, at startup, converts any old database version if necessary.
+
+The systemd services files have been reorganized. The udev control
+socket is bound by systemd and passed to the started udev daemon.
+The udev-settle.service is no longer active by default. Services which
+can not handle hotplug setups properly need to actively pull it in, to
+act like a barrier. Alternatively the settle service can be unconditionally
+'systemctl'enabled, and act like a barrier for basic.target.
+
+The fstab_import callout is no longer built or installed. Udev
+should not be used to mount, does not watch changes to fstab, and
+should not mirror fstab values in the udev database.
+
+udev 166
+========
+Bugfixes.
+
+New and updated keymaps.
+
+udev 165
+========
+Bugfixes.
+
+The udev database has changed, After installation of a new udev
+version, 'udevadm info --convert-db' should be called, to let the new
+udev/libudev version read the already stored data.
+
+udevadm now supports quoting of property values, and prefixing of
+key names:
+ $ udevadm info --export --export-prefix=MY_ --query=property -n sda
+ MY_MAJOR='259'
+ MY_MINOR='0'
+ MY_DEVNAME='/dev/sda'
+ MY_DEVTYPE='disk'
+ ...
+
+libudev now supports:
+ udev_device_get_is_initialized()
+ udev_enumerate_add_match_is_initialized()
+to be able to skip devices the kernel has created , but udev has
+not already handled.
+
+libudev now supports:
+ udev_device_get_usec_since_initialized()
+to retrieve the "age" of a udev device record.
+
+GUdev supports a more generic GUdevEnumerator class, udev TAG
+handling, device initialization and timestamp now.
+
+The counterpart of /sys/dev/{char,block}/$major:$minor,
+/dev/{char,block}/$major:$minor symlinks are now unconditionally
+created, even when no rule files exist.
+
+New and updated keymaps.
+
+udev 164
+========
+Bugfixes.
+
+GUdev moved from /usr to /.
+
+udev 163
+========
+Bugfixes.
+
+udev 162
+========
+Bugfixes.
+
+Persistent network naming rules are disabled inside of Qemu/KVM now.
+
+New and updated keymaps.
+
+Udev gets unconditionally enabled on systemd installations now. There
+is no longer the need to to run 'systemctl enable udev.service'.
+
+udev 161
+========
+Bugfixes.
+
+udev 160
+========
+Bugfixes.
+
+udev 159
+========
+Bugfixes.
+
+New and fixed keymaps.
+
+Install systemd service files if applicable.
+
+udev 158
+========
+Bugfixes.
+
+All distribution specific rules are removed from the udev source tree,
+most of them are no longer needed. The Gentoo rules which allow to support
+older kernel versions, which are not covered by the default rules anymore
+has moved to rules/misc/30-kernel-compat.rules.
+
+udev 157
+========
+Bugfixes.
+
+The option --debug-trace and the environemnt variable UDEVD_MAX_CHILDS=
+was removed from udevd.
+
+Udevd now checks the kernel commandline for the following variables:
+ udev.log-priority=<syslog priority>
+ udev.children-max=<maximum number of workers>
+ udev.exec-delay=<seconds to delay the execution of RUN=>
+to help debuging coldplug setups where the loading of a kernel
+module crashes the system.
+
+The subdirectory in the source tree rules/packages has been renamed to
+rules/arch, anc contains only architecture specific rules now.
+
+udev 156
+========
+Bugfixes.
+
+udev 155
+========
+Bugfixes.
+
+Now the udev daemon itself, does on startup:
+ - copy the content of /lib/udev/devices to /dev
+ - create the standard symlinks like /dev/std{in,out,err},
+ /dev/core, /dev/fd, ...
+ - use static node information provided by kernel modules
+ and creates these nodes to allow module on-demand loading
+ - possibly apply permissions to all ststic nodes from udev
+ rules which are annotated to match a static node
+
+The default mode for a device node is 0600 now to match the kernel
+created devtmpfs defaults. If GROUP= is specified and no MODE= is
+given the default will be 0660.
+
+udev 154
+========
+Bugfixes.
+
+Udev now gradually starts to pass control over the primary device nodes
+and their names to the kernel, and will in the end only manage the
+permissions of the node, and possibly create additional symlinks.
+As a first step NAME="" will be ignored, and NAME= setings with names
+other than the kernel provided name will result in a logged warning.
+Kernels that don't provide device names, or devtmpfs is not used, will
+still work as they did before, but it is strongly recommended to use
+only the same names for the primary device node as the recent kernel
+provides for all devices.
+
+udev 153
+========
+Fix broken firmware loader search path.
+
+udev 152
+========
+Bugfixes.
+
+"udevadm trigger" defaults to "change" events now instead of "add"
+events. The "udev boot script" might need to add "--action=add" to
+the trigger command if not already there, in case the initial coldplug
+events are expected as "add" events.
+
+The option "all_partitons" was removed from udev. This should not be
+needed for usual hardware. Udev can not safely make assumptions
+about non-existing partition major/minor numbers, and therefore no
+longer provide this unreliable and unsafe option.
+
+The option "ignore_remove" was removed from udev. With devtmpfs
+udev passed control over device nodes to the kernel. This option
+should not be needed, or can not work as advertised. Neither
+udev nor the kernel will remove device nodes which are copied from
+the /lib/udev/devices/ directory.
+
+All "add|change" matches are replaced by "!remove" in the rules and
+in the udev logic. All types of events will update possible symlinks
+and permissions, only "remove" is handled special now.
+
+The modem modeswitch extra was removed and the external usb_modeswitch
+program should be used instead.
+
+New and fixed keymaps.
+
+udev 151
+========
+Bugfixes.
+
+udev 150
+========
+Bugfixes.
+
+Kernels with SYSFS_DEPRECATED=y are not supported since a while. Many users
+depend on the current sysfs layout and the information not available in the
+deprecated layout. All remaining support for the deprecated sysfs layout is
+removed now.
+
+udev 149
+========
+Fix for a possible endless loop in the new input_id program.
+
+udev 148
+========
+Bugfixes.
+
+The option "ignore_device" does no longer exist. There is no way to
+ignore an event, as libudev events can not be suppressed by rules.
+It only prevented RUN keys from being executed, which results in an
+inconsistent behavior in current setups.
+
+BUS=, SYSFS{}=, ID= are long deprecated and should be SUBSYSTEM(S)=,
+ATTR(S){}=, KERNEL(S)=. It will cause a warning once for every rule
+file from now on.
+
+The support for the deprecated IDE devices has been removed from the
+default set of rules. Distros who still care about non-libata drivers
+need to add the rules to the compat rules file.
+
+The ID_CLASS property on input devices has been replaced by the more accurate
+set of flags ID_INPUT_{KEYBOARD,KEY,MOUSE,TOUCHPAD,TABLET,JOYSTICK}. These are
+determined by the new "input_id" prober now. Some devices, such as touchpads,
+can have several classes. So if you previously had custom udev rules which e. g.
+checked for ENV{ID_CLASS}=="kbd", you need to replace this with
+ENV{ID_INPUT_KEYBOARD}=="?*".
+
+udev 147
+========
+Bugfixes.
+
+To support DEVPATH strings larger than the maximum file name length, the
+private udev database format has changed. If some software still reads the
+private files in /dev/.udev/, which it shouldn't, now it's time to fix it.
+Please do not port anything to the new format again, everything in /dev/.udev
+is and always was private to udev, and may and will change any time without
+prior notice.
+
+Multiple devices claiming the same names in /dev are limited to symlinks
+only now. Mixing identical symlink names and node names is not supported.
+This reduces the amount of data in the database significantly.
+
+NAME="%k" causes a warning now. It's is and always was completely superfluous.
+It will break kernel supplied DEVNAMEs and therefore it needs to be removed
+from all rules.
+
+Most NAME= instructions got removed. Kernel 2.6.31 supplies the needed names
+if they are not the default. To support older kernels, the NAME= rules need to
+be added to the compat rules file.
+
+Symlinks to udevadm with the old command names are no longer resolved to
+the udevadm commands.
+
+The udev-acl tool got adopted to changes in ConsoleKit. Version 0.4.1 is
+required now.
+
+The option "last_rule" does no longer exist. Its use breaks too many
+things which expect to be run from independent later rules, and is an idication
+that something needs to be fixed properly instead.
+
+The gudev API is no longer marked as experimental,
+G_UDEV_API_IS_SUBJECT_TO_CHANGE is no longer needed. The gudev introspection
+is enabled by default now. Various projects already depend on introspection
+information to bind dynamic languages to the gudev interfaces.
+
+udev 146
+========
+Bugfixes.
+
+The udevadm trigger "--retry-failed" option, which is replaced since quite
+a while by "--type=failed" is removed.
+
+The failed tracking was not working at all for a few releases. The RUN
+option "ignore_error" is replaced by a "fail_event_on_error" option, and the
+default is not to track any failing RUN executions.
+
+New keymaps, new modem, hid2hci updated.
+
+udev 145
+========
+Fix possible crash in udevd when worker processes are busy, rules are
+changed at the same time, and workers get killed to reload the rules.
+
+udev 144
+========
+Bugfixes.
+
+Properties set with ENV{.FOO}="bar" are marked private by starting the
+name with a '.'. They will not be stored in the database, and not be
+exported with the event.
+
+Firmware files are looked up in:
+ /lib/firmware/updates/$(uname -r)
+ /lib/firmware/updates
+ /lib/firmware/$(uname -r)
+ /lib/firmware"
+now.
+
+ATA devices switched the property from ID_BUS=scsi to ID_BUS=ata.
+ata_id, instead of scsi_id, is the default tool now for ATA devices.
+
+udev 143
+========
+Bugfixes.
+
+The configure options have changed because another library needs to be
+installed in a different location. Instead of exec_prefix and udev_prefix,
+libdir, rootlibdir and libexecdir are used. The Details are explained in
+the README file.
+
+Event processes now get re-used after they handled an event. This reduces
+the number of forks and the pressure on the CPU significantly, because
+cloned event processes no longer cause page faults in the main daemon.
+After the events have settled, a few worker processes stay around for
+future events, all others get cleaned up.
+
+To be able to use signalfd(), udev depends on kernel version 2.6.25 now.
+Also inotify support is mandatory now to run udev.
+
+The format of the queue exported by the udev damon has changed. There is
+no longer a /dev/.udev/queue/ directory. The current event queue can be
+accessed with udevadm settle and libudedv.
+
+Libudev does not have the unstable API header anymore. From now on,
+incompatible changes will be handled by bumping the library major version.
+
+To build udev from the git tree gtk-doc is needed now. The tarballs will
+build without it and contain the pre-built documentation. An online copy
+is available here:
+ http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/
+
+The tools from the udev-extras repository have been merged into the main
+udev repository. Some of the extras have larger external dependencies, and
+they can be disabled with the configure switch --disable-extras.
+
+udev 142
+========
+Bugfixes.
+
+The program vol_id and the library libvolume_id are removed from the
+repository. Libvolume_id is merged with libblkid from the util-linux-ng
+package. Persistent disk links for label and uuid depend on the
+util-linux-ng version (2.15) of blkid now. Older versions of blkid
+can not be used with udev.
+
+Libudev allows to subscribe to udev events. To prevent unwanted messages
+to be delivered, and waking up the subscribing process, a filter can be
+installed, to drop messages inside a kernel socket filter. The filters
+match on the <subsytem>:<devtype> properties of the device.
+ This is part of the ongoing effort to replace HAL, and switch current
+users over to directly use libudev.
+ Libudev is still marked as experimental, and its interface might
+eventually change if needed, but no major changes of the currently exported
+interface are expected anymore, and a first stable release should happen
+soon.
+
+A too old kernel (2.6.21) or a kernel with CONFIG_SYSFS_DEPRECATED
+is not supported since while and udevd will log an error message at
+startup. It should still be able to boot-up, but advanced rules and system
+services which depend on the information not available in the old sysfs
+format will fail to work correctly.
+
+DVB device naming is supplied by the kernel now. In case older kernels
+need to be supported, the old shell script should be added to a compat
+rules file.
+
+udev 141
+========
+Bugfixes.
+
+The processed udev events get send back to the netlink socket. Libudev
+provides access to these events. This is work-in-progress, to replace
+the DeviceKit daemon functionality directly with libudev. There are
+upcoming kernel changes to allow non-root users to subcribe to these
+events.
+
+udev 140
+========
+Bugfixes.
+
+"udevadm settle" now optionally accepts a range of events to wait for,
+instead of waiting for "all" events.
+
+udev 139
+========
+Bugfixes.
+
+The installed watch for block device metadata changes is now removed
+during event hadling, because some (broken) tools may be called from udev
+rules and (wrongly) open the device with write access. After the finished
+event handling the watch is restored.
+
+udev 138
+========
+Bugfixes.
+
+Device nodes can be watched for changes with inotify with OPTIONS="watch".
+If closed after being opened for writing, a "change" uevent will occur.
+/dev/disk/by-{label,uuid}/* symlinks will be automatically updated.
+
+udev 137
+========
+Bugfixes.
+
+The udevadm test command has no longer a --force option, nodes and symlinks
+are always updated with a test run now.
+
+The udevd daemon can be started with --resolve-names=never to avoid all user
+and group lookups (e.g. in cut-down systems) or --resolve-names=late to
+lookup user and groups every time events are handled.
+
+udev 136
+========
+Bugfixes.
+
+We are currently merging the Ubuntu rules in the udev default rules,
+and get one step closer to provide a common Linux /dev setup, regarding
+device names, symlinks, and default device permissions. On udev startup,
+we now expect the following groups to be resolvable to their ids with
+glibc's getgrnam():
+ disk, cdrom, floppy, tape, audio, video, lp, tty, dialout, kmem.
+LDAP setups need to make sure, that these groups are always resolvable at
+bootup, with only the rootfs mounted, and without network access available.
+
+Some systems may need to add some new, currently not used groups, or need
+to add some users to new groups, but the cost of this change is minimal,
+compared to the pain the current, rather random, differences between the
+various distributions cause for upstream projects and third-party vendors.
+
+In general, "normal" users who log into a machine should never be a member
+of any such group, but the device-access should be managed by dynamic ACLs,
+which get added and removed for the specific users on login/logout and
+session activity/inactivity. These groups are only provided for custom setups,
+and mainly system services, to allow proper privilege separation.
+A video-streaming daemon uid would be a member of "audio" and "video", to get
+access to the sound and video devices, but no "normal" user should ever belong
+to the "audio" group, because he could listen to the built-in microphone with
+any ssh-session established from the other side of the world.
+
+/dev/serial/by-{id,path}/ now contains links for ttyUSB devices,
+which do not depend on the kernel device name. As usual, unique
+devices - only a single one per product connected, or a real
+USB serial number in the device - are always found with the same
+name in the by-id/ directory.
+Completely identical devices may overwrite their names in by-id/
+and can only be found reliably in the by-path/ directory. Devices
+specified by by-path/ must not change their connection, like the
+USB port number they are plugged in, to keep their name.
+
+To support some advanced features, Linux 2.6.22 is the oldest supported
+version now. The kernel config with enabled SYSFS_DEPRECATED is no longer
+supported. Older kernels should still work, and devices nodes should be
+reliably created, but some rules and libudev will not work correctly because
+the old kernels do not provide the expected information or interfaces.
+
+udev 135
+========
+Bugfixes.
+
+Fix for a possible segfault while swapping network interface names in udev
+versions 131-134.
+
+udev 134
+========
+Bugfixes.
+
+The group "video" is part of the default rules now.
+
+udev 133
+========
+Bugfix for kernels using SYSFS_DEPRECATED* option and finding parent
+block devices in some cases. No common distro uses this option anymore,
+and we do not get enough testing for this and recent udev versions. If
+this option is not needed to run some old distro with a new kernel,
+it should be disabled in the kernel config.
+
+Bugfix for the $links substitution variable, which may crash if no links
+are created. This should not happen in usual setups because we always
+create /dev/{block,char}/ links.
+
+The strings of the parsed rules, which are kept in memory, no longer
+contain duplicate entries, or duplicate tails of strings. This, and the
+new rules parsing/matching code reduces the total in-memory size of
+a huge distro rule sets to 0.08 MB, compared to the 1.2MB of udev
+version 130.
+
+The export of DEVTYPE=disk/partition got removed from the default
+rules. This value is available from the kernel. The pnp shell script
+modprobe hack is removed from the default rules. ACPI devices have _proper_
+modalias support and take care of the same functionality.
+Installations which support old kernels, but install current default
+udev rules may want to add that to the compat rules file.
+
+Libvolume_id now always probes for all known filesystems, and does not
+stop at the first match. Some filesystems are marked as "exclusive probe",
+and if any other filesytem type matches at the same time, libvolume_id
+will, by default, not return any probing result. This is intended to prevent
+mis-detection with conflicting left-over signatures found from earlier
+file system formats. That way, we no longer depend on the probe-order
+in case of multiple competing signatures. In some setups the kernel allows
+to mount a volume with just the old filesystem signature still in place.
+This may damage the new filesystem and cause data-loss, just by mounting
+it. Because volume_id can not decide which one the correct signature is,
+the wrong signatures need to be removed manually from the volume, or the
+volume needs to be reformatted, to enable filesystem detection and possible
+auto-mounting.
+
+udev 132
+========
+Fix segfault if compiled without optimization and dbg() does not get
+compiled out and uses variables which are not available.
+
+udev 131
+========
+Bugfixes. (And maybe new bugs. :))
+
+The rule matching engine got converted from a rule list to a token
+array which reduced the in-memory rules representation of a full
+featured distros with thousends of udev rules from 1.2MB to 0.12 MB.
+Limits like 5 ENV and ATTR matches, and one single instance for most
+other keys per rule are gone.
+
+The NAME assignment is no longer special cased. If later rules assign
+a NAME value again, the former value will be overwritten. As usual
+for most other keys, the NAME value can be protected by doing a final
+assignment with NAME:="<value>".
+
+All udev code now uses libudev, which is also exported. The library
+is still under development, marked as experimental, and its interface
+may change as long as the DeviceKit integration is not finished.
+
+Many thanks to Alan Jenkins for his continuous help, and finding and
+optimizing some of the computing expensive parts.
+
+udev 130
+========
+Bugfixes.
+
+Kernel devices and device nodes are connected now by reverse indizes in
+/sys and /dev. A device number retrieved by a stat() or similar, the
+kernel device directory can be found by looking up:
+ /sys/dev/{block,char}/<maj>:<min>
+and the device node of the same device by looking up:
+ /dev/{block,char}/<maj>:<min>
+
+udev 129
+========
+Fix recently introduced bug, which caused a compilation without large
+file support, where vol_id does not recognize raid signatures at the end
+of a volume.
+
+Firewire disks now create both, by-id/scsi-* and by-id/ieee-* links.
+Seems some kernel versions prevent the creation of the ieee-* links,
+so people used the scsi-* link which disappeared now.
+
+More libudev work. Almost all udevadm functionality comes from libudev
+now.
+
+udevadm trigger has a new option --type, which allows to trigger events
+for "devices", for "subsystems", or "failed" devices. The old option
+--retry-failed" still works, but is no longer mentioned in the man page.
+
+udev 128
+========
+Bugfixes.
+
+The udevadm info --device-id-of-file= output has changed to use
+the obvious format. Possible current users should use the --export
+option which is not affected.
+
+The old udev commands symlinks to udevadm are not installed, if
+these symlinks are used, a warning is printed.
+
+udev 127
+========
+Bugfixes.
+
+Optical drive's media is no longer probed for raid signatures,
+reading the end of the device causes some devices to malfunction.
+Also the offset of the last session found is used now to probe
+for the filesystem.
+
+The volume_id library got a major version number update to 1,
+some deprecated functions are removed.
+
+A shared library "libudev" gets installed now to provide access
+to udev device information. DeviceKit, the successor of HAL, will
+need this library to access the udev database and search sysfs for
+devices.
+The library is currently in an experimental state, also the API is
+expected to change, as long as the DeviceKit integration is not
+finished.
+
+udev 126
+========
+We use ./configure now. See INSTALL for details. Current
+options are:
+ --prefix=
+ "/usr" - prefix for man pages, include files
+ --exec-prefix=
+ "" - the root filesystem, prefix for libs and binaries
+ --sysconfdir=
+ "/etc"
+ --with-libdir-name=
+ "lib" - directory name for libraries, not a path name
+ multilib 64bit systems may use "lib64" instead of "lib"
+ --enable-debug
+ compile-in verbose debug messages
+ --disable-logging
+ disable all logging and compile-out all log strings
+ --with-selinux
+ link against SELInux libraries, to set the expected context
+ for created files
+
+In the default rules, the group "disk" gets permissions 0660 instead
+of 0640. One small step closer to unify distro rules. Some day, all
+distros hopefully end up with the same set of rules.
+
+No symlinks to udevadm are installed anymore, if they are still needed,
+they should be provided by the package.
+
+udev 125
+========
+Bugfixes.
+
+Default udev rules, which are not supposed to be edited by the user, should
+be placed in /lib/udev/rules.d/ now, to make it clear that they are private to
+the udev package and will be replaced with an update. Udev will pick up rule
+files from:
+ /lib/udev/rules.d/ - default installed rules
+ /etc/udev/rules.d/ - user rules + on-the-fly generated rules
+ /dev/.udev/rules.d/ - temporary non-persistent rules created after bootup
+It does not matter in which directory a rule file lives, all files are sorted
+in lexical order.
+
+To help creating /dev/root, we have now:
+ $ udevadm info --export --export-prefix="ROOT_" --device-id-of-file=/
+ ROOT_MAJOR=8
+ ROOT_MINOR=5
+In case the current --device-id-of-file is already used, please switch to
+the --export format version, it saves the output parsing and the old
+format will be changed to use ':' as a separator, like the format in the
+sysfs 'dev' file.
+
+udev 124
+========
+Fix cdrom_id to properly recognize blank media.
+
+udev 123
+========
+Bugfixes.
+
+Tape drive id-data is queried from /dev/bsg/* instead of the tape
+nodes. This avoids rewinding tapes on open().
+
+udev 122
+========
+Bugfixes.
+
+The symlinks udevcontrol and udevtrigger are no longer installed by
+the Makefile.
+
+The scsi_id program does not depend on sysfs anymore. It can speak
+SGv4 now, so /dev/bsg/* device nodes can be used, to query SCSI device
+data, which should solve some old problems with tape devices, where
+we better do not open all tape device nodes to identify the device.
+
+udev 121
+========
+Many bugfixes.
+
+The cdrom_id program is replaced by an advanced version, which can
+detect most common device types, and also properties of the inserted
+media. This is part of moving some basic functionality from HAL into
+udev (and the kernel).
+
+udev 120
+========
+Bugfixes.
+
+The last WAIT_FOR_SYSFS rule is removed from the default rules.
+
+The symlinks to udevadm for the debugging tools: udevmonitor and
+udevtest are no longer created.
+
+The symlinks to the udevadm man page for the old tool names are
+no longer created.
+
+Abstract namespace sockets paths in RUN+="socket:@<path>" rules,
+should be prefixed with '@' to indicate that the path is not a
+real file.
+
+udev 119
+========
+Bugfixes.
+
+udev 118
+========
+Bugfixes.
+
+Udevstart is removed from the tree, it did not get installed for
+a long time now, and is long replaced by trigger and settle.
+
+udev 117
+========
+Bugfixes.
+
+All udev tools are merged into a single binary called udevadm.
+The old names of the tools are built-in commands in udevadm now.
+Symlinks to udevadm, with the names of the old tools, provide
+the same functionality as the standalone tools. There is also
+only a single udevadm.8 man page left for all tools.
+
+Tools like mkinitramfs should be checked, if they need to include
+udevadm in the list of files.
+
+udev 116
+========
+Bugfixes.
+
+udev 115
+========
+Bugfixes.
+
+The etc/udev/rules.d/ directory now contains a default set of basic
+udev rules. This initial version is the result of a rules file merge
+of Fedora and openSUSE. For these both distros only a few specific
+rules are left in their own file, named after the distro. Rules which
+are optionally installed, because they are only valid for a specific
+architecture, or rules for subsystems which are not always used are
+in etc/udev/packages/.
+
+udev 114
+========
+Bugfixes.
+
+Dynamic rules can be created in /dev/.udev/rules.d/ to trigger
+actions by dynamically created rules.
+
+SYMLINK=="<value>" matches agains the entries in the list of
+currently defined symlinks. The links are not created in the
+filesystem at that point in time, but the values can be matched.
+
+RUN{ignore_error}+="<program>" will ignore any exit code from the
+program and not record as a failed event.
+
+udev 113
+========
+Bugfixes.
+
+Final merge of patches/features from the Ubuntu package.
+
+udev 112
+========
+Bugfixes.
+
+Control characters in filesystem label strings are no longer silenty
+removed, but hex-encoded, to be able to uniquely identify the device
+by its symlink in /dev/disk/by-label/.
+If libvolume_id is used by mount(8), LABEL= will work as expected,
+if slashes or other characters are used in the label string.
+
+To test the existence of a file, TEST=="<file>" and TEST!="<file>"
+can be specified now. The TEST key accepts an optional mode mask
+TEST{0100}=="<is executable file>".
+
+Scsi_id now supports a mode without expecting scsi-specific sysfs
+entries to allow the extraction of cciss-device persistent properties.
+
+udev 111
+========
+Bugfixes.
+
+In the future, we may see uuid's which are just simple character
+strings (see the DDF Raid Specification). For that reason vol_id now
+exports ID_FS_UUID_SAFE, just like ID_FS_LABEL_SAFE. For things like
+the creation of symlinks, the *_SAFE values ensure, that no control
+or whitespace characters are used in the filename.
+
+Possible users of libvolume_id, please use the volume_id_get_* functions.
+The public struct will go away in a future release of the library.
+
+udev 110
+========
+Bugfixes.
+
+Removal of useless extras/eventrecorder.sh.
+
+udev 109
+========
+Bugfixes.
+
+udev 108
+========
+Bugfixes.
+
+The directory multiplexer for dev.d/ and hotplug.d are finally removed
+from the udev package.
+
+udev 107
+========
+Bugfixes.
+
+Symlinks can have priorities now, the priority is assigned to the device
+and specified with OPTIONS="link_priority=100". Devices with higher
+priorities overwrite the symlinks of devices with lower priorities.
+If the device that currently owns the link, goes away, the symlink
+will be removed, and recreated, pointing to the next device with the
+highest actual priority. This should make /dev/disk/by-{label,uuid,id}
+more reliable, if multiple devices contain the same metadata and overwrite
+these symlinks.
+
+The dasd_id program is removed from the udev tree, and dasdinfo, with the
+needed rules, are part of the s390-tools now.
+
+Please add KERNEL=="[0-9]*:[0-9]*" to the scsi wait-for-sysfs rule,
+we may get the scsi sysfs mess fixed some day, and this will only catch
+the devices we are looking for.
+
+USB serial numbers for storage devices have the target:lun now appended,
+to make it possibble to distinguish broken multi-lun devices with all
+the same SCSI identifiers.
+
+Note: The extra "run_directory" which searches and executes stuff in
+/etc/hotplug.d/ and /etc/dev.d/ is long deprecated, and will be removed
+with the next release. Make sure, that you don't use it anymore, or
+provides your own implementation of that inefficient stuff.
+We are tired of reports about a "slow udev", because these directories
+contain stuff, that runs with _every_ event, instead of using rules,
+that run programs only for the matching events.
+
+udev 106
+========
+Bugfixes.
+
+udev 105
+========
+Bugfixes.
+
+DRIVER== will match only for devices that actually have a real
+driver. DRIVERS== must be used, if parent devices should be
+included in the match.
+
+Libvolume_id's "linux_raid" detection needed another fix.
+
+udev 104
+========
+Bugfixes.
+
+udev 103
+========
+Add additional check to volume_id detection of via_raid, cause
+some company decided to put a matching pattern all over the empty
+storage area of their music players.
+
+udev 102
+========
+Fix path_id for SAS devices.
+
+udev 101
+========
+The udev daemon can be started with --debug-trace now, which will
+execute all events serialized to get a chance to catch a possible
+action that crashes the box.
+
+A warning is logged, if PHYSDEV* keys, the "device" link, or a parent
+device attribute like $attr{../file} is used, only WAIT_FOR_SYSFS rules
+are excluded from the warning. Referencing parent attributes directly
+may break when something in the kernel driver model changes. Udev will
+just find the attribute by walking up the parent chain.
+
+Udevtrigger now sorts the list of devices depending on the device
+dependency, so a "usb" device is triggered after the parent "pci"
+device.
+
+udev 100
+========
+Revert persistent-storage ata-serial '_' '-' replacement.
+
+udev 099
+========
+Bugfixes.
+
+Udevtrigger can now filter the list of devices to be triggered. Matches
+for subsystems or sysfs attributes can be specified.
+
+The entries in /dev/.udev/queue and /dev/.udev/failed have changed to
+zero-sized files to avoid pointing to /sys and confuse broken tools which
+scan the /dev directory. To retry failed events, udevtrigger --retry-failed
+should be used now.
+
+The rules and scripts to create udev rules for persistent network
+devices and optical drives are in the extras/rules_generator directory
+now. If you use something similar, please consider replacing your own
+version with this, to share the support effort. The rule_generator
+installs its own rules into /etc/udev/rules.d.
+
+The cdrom_id tool installs its own rule now in /etc/udev/rules.d, cause
+the rule_generator depends on cdrom_id to be called in an earlier rule.
+
+udev 098
+========
+Bugfixes.
+
+Renaming of some key names (the old names still work):
+BUS -> SUBSYSTEMS, ID -> KERNELS, SYSFS -> ATTRS, DRIVER -> DRIVERS.
+(The behavior of the key DRIVER will change soon in one of the next
+releases, to match only the event device, please switch to DRIVERS
+instead. If DRIVER is used, it will behave like DRIVERS, but an error
+is logged.
+With the new key names, we have a more consistent and simpler scheme.
+We can match the properties of the event device only, with: KERNEL,
+SUBSYSTEM, ATTR, DRIVER. Or include all the parent devices in the match,
+with: KERNELS, SUBSYSTEMS, ATTRS, DRIVERS. ID, BUS, SYSFS, DRIVER are no
+longer mentioned in the man page and should be switched in the rule
+files.
+
+ATTR{file}="value" can be used now, to write to a sysfs file of the
+event device. Instead of:
+ ..., SYSFS{type}=="0|7|14", RUN+="/bin/sh -c 'echo 60 > /sys$$DEVPATH/timeout'"
+we now can do:
+ ..., ATTR{type}=="0|7|14", ATTR{timeout}="60"
+
+All the PHYSDEV* keys are deprecated and will be removed from a
+future kernel:
+ PHYDEVPATH - is the path of a parent device and should not be
+ needed at all.
+ PHYSDEVBUS - is just a SUBSYSTEM value of a parent, and can be
+ matched with SUBSYSTEMS==
+ PHYSDEVDRIVER - for bus devices it is available as ENV{DRIVER}.
+ Newer kernels will have DRIVER in the environment,
+ for older kernels udev puts in. Class device will
+ no longer carry this property of a parent and
+ DRIVERS== can be used to match such a parent value.
+Note that ENV{DRIVER} is only available for a few bus devices, where
+the driver is already bound at device event time. On coldplug, the
+events for a lot devices are already bound to a driver, and they will have
+that value set. But on hotplug, at the time the kernel creates the device,
+it can't know what driver may claim the device after that, therefore
+in most cases it will be empty.
+
+Failed events should now be re-triggered with:
+ udevtrigger --retry-failed.
+Please switch to this command, so we keep the details of the /dev/.udev/failed/
+files private to the udev tools. We may need to switch the current symlink
+target, cause some obviously broken tools try to scan all files in /dev
+including /dev/.udev/, find the links to /sys and end up stat()'ing sysfs files
+million times. This takes ages on slow boxes.
+
+The udevinfo attribute walk (-a) now works with giving a device node
+name (-n) instead of a devpath (-p). The query now always works, also when
+no database file was created by udev.
+
+The built-in /etc/passwd /etc/group parser is removed, we always depend on
+getpwnam() and getgrnam() now. One of the next releases will depend on
+fnmatch() and may use getopt_long().
+
+udev 097
+========
+Bugfixes and small improvements.
+
+udev 096
+========
+Fix path_id for recent kernels.
+
+udev 095
+========
+%e is finally gone.
+
+Added support for swapping network interface names, by temporarily
+renaming the device and wait for the target name to become free.
+
+udev 094
+========
+The built-in MODALIAS key and substitution is removed.
+
+udev 093
+========
+The binary firmware helper is replaced by the usual simple
+shell script. Udevsend is removed from the tree.
+
+udev 092
+========
+Bugfix release.
+
+udev 091
+========
+Some more keys require the correct use of '==' and '=' depending
+on the kind of operation beeing an assignment or a match. Rules
+with invalid operations are skipped and logged to syslog. Please
+test with udevtest if the parsing of your rules throws errors and
+fix possibly broken rules.
+
+udev 090
+========
+Provide "udevsettle" to wait for all current udev events to finish.
+It also watches the current kernel netlink queue by comparing the
+even sequence number to make sure that there are no current pending
+events that have not already arrived in the daemon.
+
+udev 089
+========
+Fix rule to skip persistent rules for removable IDE devices, which
+also skipped optical IDE drives.
+
+All *_id program are installed in /lib/udev/ by default now.
+
+No binary is stripped anymore as this should be done in the
+packaging process and not at build time.
+
+libvolume_id is provided as a shared library now and vol_id is
+linked against it. Also one of the next HAL versions will require
+this library, and the HAL build process will also require the
+header file to be installed. The copy of the same code in HAL will
+be removed to have only a single copy left on the system.
+
+udev 088
+========
+Add persistent links for SCSI tapes. The rules file is renamed
+to 60-persistent-storage.rules.
+
+Create persistent path for usb devices. Can be used for all sorts
+of devices that can't be distinguished by other properties like
+multiple identical keyboards and mice connected to the same box.
+
+Provide "udevtrigger" program to request events on coldplug. The
+shell script is much too slow with thousends of devices.
+
+udev 087
+========
+Fix persistent disk rules to exclude removable IDE drives.
+
+Warn if %e, $modalias or MODALIAS is used.
+
+udev 086
+========
+Fix queue export, which wasn't correct for subsequent add/remove
+events for the same device.
+
+udev 085
+========
+Fix cramfs detection on big endian.
+
+Make WAIT_FOR_SYSFS usable in "normal" rules and silent if the whole
+device goes away.
+
+udev 084
+========
+If BUS== and SYSFS{}== have been used in the same rule, the sysfs
+attributes were only checked at the parent device that matched the
+by BUS requested subsystem. Fix it to also look at the device we
+received the event for.
+
+Build variable CROSS has changed to CROSS_COMPILE to match the kernel
+build name.
+
+udev 083
+========
+Fix a bug where NAME="" would prevent RUN from beeing executed.
+
+RUN="/bin/program" does not longer automatically add the subsystem
+as the first parameter. This is from the days of /sbin/hotplug
+which is dead now and it's just confusing to need to add a space at
+the end of the program name to prevent this.
+If you use rules that need the subsystem as the first parameter,
+like the old "udev_run_hotlugd" and "udev_run_devd", add the subsystem
+to the key like RUN+="/bin/program $env{SUBSYSTEM}".
+
+udev 082
+========
+The udev man page has moved to udev(7) as it does not describe a command
+anymore. The programs udev, udevstart and udevsend are no longer installed
+by default and must be copied manually, if they should be installed or
+included in a package.
+
+Fix a bug where "ignore_device" could run earlier collected RUN keys before
+the ignore rule was applied.
+
+More preparation for future sysfs changes. usb_id and scsi_id no longer
+depend on a magic order of devices in the /devices chain. Specific devices
+should be requested by their subsytem.
+
+This will always find the scsi parent device without depending on a specific
+path position:
+ dev = sysfs_device_get(devpath);
+ dev_usb = sysfs_device_get_parent_with_subsystem(dev, "scsi");
+
+The "device" link in the current sysfs layout will be automatically
+_resolved_ as a parent and in the new sysfs layout it will just _be_ the
+parent in the devpath. If a device is requested by it's symlink, like all
+class devices in the new sysfs layout will look like, it gets automatically
+resolved and substituted with the real devpath and not the symlink path.
+
+Note:
+A similar logic must be applied to _all_ sysfs users, including
+scripts, that search along parent devices in sysfs. The explicit use of
+the "device" link must be avoided. With the future sysfs layout all
+DEVPATH's will start with /devices/ and have a "subsystem" symlink poiting
+back to the "class" or the "bus". The layout of the parent devices in
+/devices is not necessarily expected to be stable across kernel releases and
+searching for parents by their subsystem should make sysfs users tolerant
+for changed parent chains.
+
+udev 081
+========
+Prepare udev to work with the experimental kernel patch, that moves
+/sys/class devices to /sys/devices and /sys/block to /sys/class/block.
+
+Clarify BUS, ID, $id usage and fix $id behavior. This prepares for
+moving the class devices to /sys/devices.
+
+Thanks again to Marco for help finding a hopefully nice compromise
+to make %b simpler and working again.
+
+udev 080
+========
+Complete removal of libsysfs, replaced by simple helper functions
+which are much simpler and a bit faster. The udev daemon operatesentirely
+on event parameters and does not use sysfs for simple rules anymore.
+Please report any new bugs/problems, that may be caused by this big
+change. They will be fixed immediately.
+
+The enumeration format character '%e' is deprecated and will be
+removed sometimes from a future udev version. It never worked correctly
+outside of udevstart, so we can't use it with the new parallel
+coldplug. A simple enumeration is as useless as the devfs naming
+scheme, just get rid of both if you still use it.
+
+MODALIAS and $modalias is not needed and will be removed from one of
+the next udev versions, replace it in all rules with ENV{MODALIAS} or
+the sysfs "modalias" value.
+
+Thanks a lot to Marco for all his help on finding and fixing bugs.
+
+udev 079
+========
+Let scsi_id request libata drive serial numbers from page 0x80.
+
+Renamed etc/udev/persistent.rules to persistent-disk.rules and
+added /dev/disk/by-name/* for device mapper device names.
+
+Removed %e from the man page. It never worked reliably outside
+of udevstart and udevstart is no longer recommended to use.
+
+udev 078
+========
+Symlinks are now exported to the event environment. Hopefully it's no
+longer needed to run udevinfo from an event process, like it was
+mentioned on the hotplug list:
+ UDEV [1134776873.702967] add@/block/sdb
+ ...
+ DEVNAME=/dev/sdb
+ DEVLINKS=/dev/disk/by-id/usb-IBM_Memory_Key_0218B301030027E8 /dev/disk/by-path/usb-0218B301030027E8:0:0:0
+
+udev 077
+========
+Fix a problem if udevsend is used as the hotplug handler and tries to use
+syslog, which causes a "vc" event loop. 2.6.15 will make udevsend obsolete
+and this kind of problems will hopefully go away soon.
+
+udev 076
+========
+All built-in logic to work around bad sysfs timing is removed with this
+version. The need to wait for sysfs files is almost fixed with a kernel
+version that doesn't work with this udev version anyway. Until we fix
+the timing of the "bus" link creation, the former integrated logic should
+be emulated by a rule placed before all other rules:
+ ACTION=="add", DEVPATH=="/devices/*", ENV{PHYSDEVBUS}=="?*", WAIT_FOR_SYSFS="bus"
+
+The option "udev_db" does no longer exist. All udev state will be in
+/$udev_root/.udev/ now, there is no longer an option to set this
+to anything else.
+If the init script or something else used this value, just depend on
+this hardcoded path. But remember _all_content_ of this directory is
+still private to udev and can change at any time.
+
+Default location for rule sripts and helper programs is now: /lib/udev/.
+Everything that is not useful on the commandline should go into this
+directory. Some of the helpers in the extras folder are installed there
+now. The rules need to be changed, to find the helpers there.
+
+Also /lib/udev/devices is recommended as a directory where packages or
+the user can place real device nodes, which get copied over to /dev at
+every boot. This should replace the various solutions with custom config
+files.
+
+Udevsend does no longer start the udev daemon. This must be done with
+the init script that prepares /dev on tmpfs and creates the initial nodes,
+before starting the daemon.
+
+udev 075
+========
+Silent a too verbose error logging for the old hotplug.d/ dev.d/
+emulation.
+
+The copy of klibc is removed. A systemwide installed version of klibc
+should be used to build a klibc udev now.
+
+udev 074
+========
+NAME="" will not create any nodes, but execute RUN keys. To completely
+ignore an event the OPTION "ignore_device" should be used.
+
+After removal of the reorder queue, events with a TIMEOUT can be executed
+without any queuing now.
+
+udev 073
+========
+Fixed bug in udevd, if inotify is not available. We depend on netlink
+uevents now, kernels without that event source will not work with that
+version of udev anymore.
+
+udev 072
+========
+The rule parsing happens now in the daemon once at startup, all udev
+event processes inherit the already parsed rules from the daemon.
+It is shipped with SUSE10.0 and reduces heavily the system load at
+startup. The option to save precompiled rules and let the udev process
+pick the them up is removed, as it's no longer needed.
+
+Kernel 2.6.15 will have symlinks at /class/input pointing to the real
+device. Libsysfs is changed to "translate" the requested link into the
+real device path, as it would happen with the hotplug event. Otherwise
+device removal and the udev database will not work.
+
+Using 'make STRIPCMD=' will leave the binaries unstripped for debugging
+and packaging.
+
+A few improvements for vol_id, the filesytem probing code.
+
+udev 071
+========
+Fix a stupid typo in extras/run_directory for "make install".
+
+scsi_id creates the temporary devnode now in /dev for usage with a
+non-writable /tmp directory.
+
+The uevent kernel socket buffer can carry app. 50.000 events now,
+let's see who can break this again. :)
+
+The upcoming kernel will have a new input driver core integration.
+Some class devices are now symlinks to the real device. libsysfs
+needs a fix for this to work correctly. Udevstart of older udev
+versions will _not_ create these devices!
+
+udev 070
+========
+Fix a 'install' target in the Makefile, that prevents EXTRAS from
+beeing installed.
+
+udev 069
+========
+A bunch of mostly trivial bugfixes. From now on no node name or
+symlink name can contain any character than plain whitelisted ascii
+characters or validated utf8 byte-streams. This is needed for the
+/dev/disk/by-label/* links, because we import untrusted data and
+export it to the filesystem.
+
+udev 068
+========
+More bugfixes. If udevd was started from the kernel, we don't
+have stdin/stdout/stderr, which broke the forked tools in some
+situations.
+
+udev 067
+========
+Bugfix. udevstart event ordering was broken for a long time.
+The new run_program() uncovered it, because /dev/null was not
+available while we try to run external programs.
+Now udevstart should create it before we run anything.
+
+udev 066
+========
+Minor bugfixes and some distro rules updates. If you don't have the
+persistent disk rules in /dev/disk/by-*/* on your distro, just
+grab it from here. :)
+
+udev 065
+========
+We can use socket communication now to pass events from udev to
+other programs:
+ RUN+="socket:/org/freedesktop/hal/udev_event"
+will pass the whole udev event to the HAL daemon without the need
+for a forked helper. (See ChangeLog for udevmonitor, as an example)
+
+udev 064
+========
+Mostly bugfixes and see ChangeLog.
+
+The test for the existence of an environment value should be
+switched from:
+ ENV{KEY}=="*" to ENV{KEY}=="?*"
+because "*" will not fail anymore, if the key does not exist or
+is empty.
+
+udev 063
+========
+Bugfixes and a few tweaks described in the ChangeLog.
+
+udev 062
+========
+Mostly a Bugfix release.
+
+Added WAIT_FOR_SYSFS="<attribute>" to be able to fight against the sysfs
+timing with custom rules.
+
+udev 061
+========
+We changed the internal rule storage format. Our large rule files took
+2 MB of RAM, with the change we are down to 99kB.
+
+If the device-node has been created with default name and no symlink or
+options are to remenber, it is not longer stored in the udevdb. HAL will
+need to be updated to work correctly with that change.
+
+To overrride optimization flags, OPTFLAGS may be used now.
+
+udev 060
+========
+Bugfix release.
+
+udev 059
+========
+Major changes happened with this release. The goal is to take over the
+complete kernel-event handling and provide a more efficient way to dispatch
+kernel events. Replacing most of the current shell script logic and the
+kernel forked helper with a netlink-daemon and a rule-based event handling.
+
+o udevd listens to netlink events now. The first valid netlink event
+ will make udevd ignore any message from udevsend that contains a
+ SEQNUM, to avoid duplicate events. The forked events can be disabled
+ with:
+ echo "" > /proc/sys/kernel/hotplug
+ For full support, the broken input-subsytem needs to be fixed, not to
+ bypass the driver core.
+
+o /etc/dev.d/ + /etc/hotplug.d/ directory multiplexing is completely
+ removed from udev itself and must be emulated by calling small
+ helper binaries provided in the extras folder:
+ make EXTRAS=extras/run_directory/
+ will build udev_run_devd and udev_run_hotplugd, which can be called
+ from a rule if needed:
+ RUN+="/sbin/udev_run_hotplugd"
+ The recommended way to handle this is to convert all the calls from
+ the directories to explicit udev rules and get completely rid of the
+ multiplexing. (To catch a ttyUSB event, you now no longer need to
+ fork and exit 300 tty script instances you are not interested in, it
+ is just one rule that matches exactly the device.)
+
+o udev handles now _all_ events not just events for class and block
+ devices, this way it is possible to control the complete event
+ behavior with udev rules. Especially useful for rules like:
+ ACTION="add", DEVPATH="/devices/*", MODALIAS=="?*", RUN+="/sbin/modprobe $modalias"
+
+o As used in the modalias rule, udev supports now textual
+ substitution placeholder along with the usual format chars. This
+ needs to be documented, for now it's only visible in udev_rules_parse.c.
+
+o The rule keys support now more operations. This is documented in the
+ man page. It is possible to add values to list-keys like the SYMLINK
+ and RUN list with KEY+="value" and to clear the list by assigning KEY="".
+ Also "final"-assignments are supported by using KEY:="value", which will
+ prevent changing the key by any later rule.
+
+o kernel 2.6.12 has the "detached_state" attribute removed from
+ sysfs, which was used to recognize sysfs population. We switched that
+ to wait for the "bus" link, which is only available in kernels after 2.6.11.
+ Running this udev version on older kernels may cause a short delay for
+ some events.
+
+o To provide infrastructure for persistent device naming, the id programs:
+ scsi_id, vol_id (former udev_volume_id), and ata_id (new) are able now
+ to export the probed data in environment key format:
+ pim:~ # /sbin/ata_id --export /dev/hda
+ ID_MODEL=HTS726060M9AT00
+ ID_SERIAL=MRH401M4G6UM9B
+ ID_REVISION=MH4OA6BA
+
+ The following rules:
+ KERNEL="hd*[!0-9]", IMPORT="/sbin/ata_id --export $tempnode"
+ KERNEL="hd*[!0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_MODEL}_$env{ID_SERIAL}"
+
+ Will create:
+ kay@pim:~> tree /dev/disk
+ /dev/disk
+ |-- by-id
+ | |-- HTS726060M9AT00_MRH401M4G6UM9B -> ../../hda
+ | `-- IBM-Memory_Key -> ../../sda
+ |-- by-label
+ | |-- swap -> ../../hda1
+ | |-- date -> ../../sda1
+ | `-- home -> ../../hda3
+ `-- by-uuid
+ |-- 2E08712B0870F2E7 -> ../../hda3
+ |-- 9352cfef-7687-47bc-a2a3-34cf136f72e1 -> ../../hda1
+ |-- E845-7A89 -> ../../sda1
+ `-- b2a61681-3812-4f13-a4ff-920d70604299 -> ../../hda2
+
+ The IMPORT= operation will import these keys in the environment and make
+ it available for later PROGRAM= and RUN= executed programs. The keys are
+ also stored in the udevdb and can be queried from there with one of the
+ next udev versions.
+
+o A few binaries are silently added to the repository, which can be used
+ to replay kernel events from initramfs instead of using coldplug. udevd
+ can be instructed now to queue-up events while the stored events from
+ initramfs are filled into the udevd-queue. This code is still under
+ development and there is no documentation now besides the code itself.
+ The additional binaries get compiled, but are not installed by default.
+
+o There is also a temporary fix for a performance problem where too many
+ events happen in parallel and every event needs to parse the rules.
+ udev can now read precompiled rules stored on disk. This is likely to be
+ replaced by a more elegant solution in a future udev version.
+
+udev 058
+========
+With kernel version 2.6.12, the sysfs file "detached_state" was removed.
+Fix for libsysfs not to expect this file was added.
+
+udev 057
+========
+All rules are applied now, but only the first matching rule with a NAME-key
+will be applied. All later rules with NAME-key are completely ignored. This
+way system supplied symlinks or permissions gets applied to user-defined
+naming rules.
+
+Note:
+Please check your rules setup, if you may need to add OPTIONS="last_rule"
+to some rules, to keep the old behavior.
+
+The rules are read on "remove"-events too. That makes is possible to match
+with keys that are available on remove (KERNEL, SUBSYSTEM, ID, ENV, ...) to
+instruct udev to ignore an event (OPTIONS="ignore_device").
+The new ACTION-key may be used to let a rule act only at a "remove"-event.
+
+The new RUN-key supports rule-based execution of programs after device-node
+handling. This is meant as a general replacement for the dev.d/-directories
+to give fine grained control over the execution of programs.
+
+The %s{}-sysfs format char replacement values are searched at any of the
+devices in the device chain now, not only at the class-device.
+
+We support log priority levels now. The value udev_log in udev.conf is used
+to determine what is printed to syslog. This makes it possible to
+run a version with compiled-in debug messages in a production environment
+which is sometimes needed to find a bug.
+It is still possible to supress the inclusion of _any_ syslog usage with
+USE_LOG=false to create the smallest possible binaries if needed.
+The configured udev_log value can be overridden with the environment variable
+UDEV_LOG.
+
+udev 056
+========
+Possible use of a system-wide klibc:
+ make USE_KLIBC=true KLCC=/usr/bin/klcc all
+will link against an external klibc and our own version will be ignored.
+
+udev 055
+========
+We support an unlimited count of symlinks now.
+
+If USE_STATIC=true is passed to a glibc build, we link statically and use
+a built-in userdb parser to resolve user and group names.
+
+The PLACE= key is gone. It can be replaced by an ID= for a long time, because
+we walk up the chain of physical devices to find a match.
+
+The KEY="<value>" format supports '=', '==', '!=,' , '+=' now. This makes it
+easy to skip certain attribute matches without composing rules with weird
+character class negations like:
+ KERNEL="[!s][!c][!d]*"
+this can now be replaced with:
+ KERNEL!="scd*"
+The current simple '=' is still supported, and should work as it does today,
+but existing rules should be converted if possible, to be better readable.
+
+We have new ENV{}== key now, to match against a maximum of 5 environment
+variables.
+
+udevstart is its own binary again, because we don't need co carry this araound
+with every forked event.
diff --git a/src/udev/README b/src/udev/README
new file mode 100644
index 000000000..38459c6b2
--- /dev/null
+++ b/src/udev/README
@@ -0,0 +1,101 @@
+udev - Linux userspace device management
+
+Integrating udev in the system has complex dependencies and may differ from
+distribution to distribution. A system may not be able to boot up or work
+reliably without a properly installed udev version. The upstream udev project
+does not recommend replacing a distro's udev installation with the upstream
+version.
+
+The upstream udev project's set of default rules may require a most recent
+kernel release to work properly.
+
+Tools and rules shipped by udev are not public API and may change at any time.
+Never call any private tool in /usr/lib/udev from any external application; it
+might just go away in the next release. Access to udev information is only offered
+by udevadm and libudev. Tools and rules in /usr/lib/udev and the entire contents
+of the /run/udev directory are private to udev and do change whenever needed.
+
+Requirements:
+ - Version 2.6.34 of the Linux kernel with sysfs, procfs, signalfd, inotify,
+ unix domain sockets, networking and hotplug enabled
+
+ - Some architectures might need a later kernel, that supports accept4(),
+ or need to backport the accept4() syscall wiring in the kernel.
+
+ - These options are required:
+ CONFIG_DEVTMPFS=y
+ CONFIG_HOTPLUG=y
+ CONFIG_INOTIFY_USER=y
+ CONFIG_NET=y
+ CONFIG_PROC_FS=y
+ CONFIG_SIGNALFD=y
+ CONFIG_SYSFS=y
+ CONFIG_SYSFS_DEPRECATED*=n
+ CONFIG_UEVENT_HELPER_PATH=""
+
+ - These options might be needed:
+ CONFIG_BLK_DEV_BSG=y (SCSI devices)
+ CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
+
+ - The /dev directory needs the 'devtmpfs' filesystem mounted.
+ Udev only manages the permissions and ownership of the
+ kernel-provided device nodes, and possibly creates additional symlinks.
+
+ - Udev requires /run to be writable, which is usually done by mounting a
+ 'tmpfs' filesystem.
+
+ - This version of udev does not work properly with the CONFIG_SYSFS_DEPRECATED*
+ option enabled.
+
+ - The deprecated hotplug helper /sbin/hotplug should be disabled in the
+ kernel configuration, it is not needed today, and may render the system
+ unusable because the kernel may create too many processes in parallel
+ so that the system runs out-of-memory.
+
+ - The proc filesystem must be mounted on /proc, and the sysfs filesystem must
+ be mounted at /sys. No other locations are supported by a standard
+ udev installation.
+
+ - The default rule sset requires the following group names resolvable at udev startup:
+ disk, cdrom, floppy, tape, audio, video, lp, tty, dialout, and kmem.
+ Especially in LDAP setups, it is required that getgrnam() be able to resolve
+ these group names with only the rootfs mounted and while no network is
+ available.
+
+ - Some udev extras have external dependencies like:
+ libglib2, usbutils, pciutils, and gperf.
+ All these extras can be disabled with configure options.
+
+Setup:
+ - The udev daemon should be started to handle device events sent by the kernel.
+ During bootup, the events for already existing devices can be replayed, so
+ that they are configured by udev. The systemd service files contain the
+ needed commands to start the udev daemon and the coldplug sequence.
+
+ - Restarting the daemon never applies any rules to existing devices.
+
+ - New/changed rule files are picked up automatically; there is usually no
+ daemon restart or signal needed.
+
+Operation:
+ - Based on events the kernel sends out on device creation/removal, udev
+ creates/removes device nodes and symlinks in the /dev directory.
+
+ - All kernel events are matched against a set of specified rules, which
+ possibly hook into the event processing and load required kernel
+ modules to set up devices. For all devices, the kernel exports a major/minor
+ number; if needed, udev creates a device node with the default kernel
+ device name. If specified, udev applies permissions/ownership to the device
+ node, creates additional symlinks pointing to the node, and executes
+ programs to handle the device.
+
+ - The events udev handles, and the information udev merges into its device
+ database, can be accessed with libudev:
+ http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/
+ http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/
+
+For more details about udev and udev rules, see the udev man pages:
+ http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/
+
+Please direct any comment/question to the linux-hotplug mailing list at:
+ linux-hotplug@vger.kernel.org
diff --git a/src/udev/TODO b/src/udev/TODO
new file mode 100644
index 000000000..8b8b9c8f8
--- /dev/null
+++ b/src/udev/TODO
@@ -0,0 +1,22 @@
+ - find a way to tell udev to not cancel firmware
+ requests in initramfs
+
+ - scsi_id -> sg3_utils?
+
+ - make gtk-doc optional like kmod
+
+ - move /usr/lib/udev/devices/ to tmpfiles
+
+ - trigger --subsystem-match=usb/usb_device
+
+ - kill rules_generator
+
+ - have a $attrs{} ?
+
+ - remove RUN+="socket:"
+
+ - libudev.so.1
+ - symbol versioning
+ - return object with *_unref()
+ - udev_monitor_from_socket()
+ - udev_queue_get_failed_list_entry()
diff --git a/src/udev/autogen.sh b/src/udev/autogen.sh
new file mode 100755
index 000000000..55ee03afd
--- /dev/null
+++ b/src/udev/autogen.sh
@@ -0,0 +1,44 @@
+#!/bin/sh -e
+
+if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
+ cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \
+ chmod +x .git/hooks/pre-commit && \
+ echo "Activated pre-commit hook."
+fi
+
+gtkdocize
+autoreconf --install --symlink
+
+libdir() {
+ echo $(cd $1/$(gcc -print-multi-os-directory); pwd)
+}
+
+args="$args \
+--prefix=/usr \
+--sysconfdir=/etc \
+--libdir=$(libdir /usr/lib) \
+--with-selinux \
+--enable-gtk-doc"
+
+if [ -L /bin ]; then
+args="$args \
+--libexecdir=/usr/lib \
+--with-systemdsystemunitdir=/usr/lib/systemd/system \
+"
+else
+args="$args \
+--with-rootprefix= \
+---with-rootlibdir=$(libdir /lib) \
+--bindir=/sbin \
+--libexecdir=/lib \
+--with-systemdsystemunitdir=/lib/systemd/system \
+"
+fi
+
+echo
+echo "----------------------------------------------------------------"
+echo "Initialized build system. For a common configuration please run:"
+echo "----------------------------------------------------------------"
+echo
+echo "./configure CFLAGS='-g -O1' $args"
+echo
diff --git a/src/udev/configure.ac b/src/udev/configure.ac
new file mode 100644
index 000000000..b31b62f28
--- /dev/null
+++ b/src/udev/configure.ac
@@ -0,0 +1,242 @@
+AC_PREREQ(2.60)
+AC_INIT([udev],
+ [182],
+ [linux-hotplug@vger.kernel.org],
+ [udev],
+ [http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html])
+AC_CONFIG_SRCDIR([src/udevd.c])
+AC_CONFIG_AUX_DIR([build-aux])
+AM_INIT_AUTOMAKE([check-news foreign 1.11 -Wall -Wno-portability silent-rules tar-pax no-dist-gzip dist-xz subdir-objects])
+AC_USE_SYSTEM_EXTENSIONS
+AC_SYS_LARGEFILE
+AC_CONFIG_MACRO_DIR([m4])
+AM_SILENT_RULES([yes])
+LT_INIT([disable-static])
+AC_PROG_AWK
+AC_PROG_SED
+AC_PROG_MKDIR_P
+GTK_DOC_CHECK(1.10)
+AC_PREFIX_DEFAULT([/usr])
+
+AC_PATH_PROG([XSLTPROC], [xsltproc])
+AM_CONDITIONAL(HAVE_XSLTPROC, test x"$XSLTPROC" != x)
+
+AC_SEARCH_LIBS([clock_gettime], [rt], [], [AC_MSG_ERROR([POSIX RT library not found])])
+
+PKG_CHECK_MODULES(BLKID, blkid >= 2.20)
+
+PKG_CHECK_MODULES(KMOD, libkmod >= 5)
+
+AC_ARG_WITH([rootprefix],
+ AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
+ [], [with_rootprefix=${ac_default_prefix}])
+AC_SUBST([rootprefix], [$with_rootprefix])
+
+AC_ARG_WITH([rootlibdir],
+ AS_HELP_STRING([--with-rootlibdir=DIR], [rootfs directory to install shared libraries]),
+ [], [with_rootlibdir=$libdir])
+AC_SUBST([rootlib_execdir], [$with_rootlibdir])
+
+AC_ARG_WITH([selinux],
+ AS_HELP_STRING([--with-selinux], [enable SELinux support]),
+ [], [with_selinux=no])
+AS_IF([test "x$with_selinux" = "xyes"], [
+ LIBS_save=$LIBS
+ AC_CHECK_LIB(selinux, getprevcon,
+ [],
+ AC_MSG_ERROR([SELinux selected but libselinux not found]))
+ LIBS=$LIBS_save
+ SELINUX_LIBS="-lselinux -lsepol"
+ AC_DEFINE(WITH_SELINUX, [1] ,[SELinux support.])
+])
+AC_SUBST([SELINUX_LIBS])
+AM_CONDITIONAL(WITH_SELINUX, [test "x$with_selinux" = "xyes"])
+
+AC_ARG_ENABLE([debug],
+ AS_HELP_STRING([--enable-debug], [enable debug messages @<:@default=disabled@:>@]),
+ [], [enable_debug=no])
+AS_IF([test "x$enable_debug" = "xyes"], [ AC_DEFINE(ENABLE_DEBUG, [1], [Debug messages.]) ])
+
+AC_ARG_ENABLE([logging],
+ AS_HELP_STRING([--disable-logging], [disable system logging @<:@default=enabled@:>@]),
+ [], enable_logging=yes)
+AS_IF([test "x$enable_logging" = "xyes"], [ AC_DEFINE(ENABLE_LOGGING, [1], [System logging.]) ])
+
+AC_ARG_ENABLE([manpages],
+ AS_HELP_STRING([--disable-manpages], [disable man pages @<:@default=enabled@:>@]),
+ [], enable_manpages=yes)
+AM_CONDITIONAL([ENABLE_MANPAGES], [test "x$enable_manpages" = "xyes"])
+
+if test "x$cross_compiling" = "xno" ; then
+ AC_CHECK_FILES([/usr/share/pci.ids], [pciids=/usr/share/pci.ids])
+ AC_CHECK_FILES([/usr/share/hwdata/pci.ids], [pciids=/usr/share/hwdata/pci.ids])
+ AC_CHECK_FILES([/usr/share/misc/pci.ids], [pciids=/usr/share/misc/pci.ids])
+fi
+
+AC_ARG_WITH(usb-ids-path,
+ [AS_HELP_STRING([--with-usb-ids-path=DIR], [Path to usb.ids file])],
+ [USB_DATABASE=${withval}],
+ [if test -n "$usbids" ; then
+ USB_DATABASE="$usbids"
+ else
+ PKG_CHECK_MODULES(USBUTILS, usbutils >= 0.82)
+ AC_SUBST([USB_DATABASE], [$($PKG_CONFIG --variable=usbids usbutils)])
+ fi])
+AC_MSG_CHECKING([for USB database location])
+AC_MSG_RESULT([$USB_DATABASE])
+AC_SUBST(USB_DATABASE)
+
+AC_ARG_WITH(pci-ids-path,
+ [AS_HELP_STRING([--with-pci-ids-path=DIR], [Path to pci.ids file])],
+ [PCI_DATABASE=${withval}],
+ [if test -n "$pciids" ; then
+ PCI_DATABASE="$pciids"
+ else
+ AC_MSG_ERROR([pci.ids not found, try --with-pci-ids-path=])
+ fi])
+AC_MSG_CHECKING([for PCI database location])
+AC_MSG_RESULT([$PCI_DATABASE])
+AC_SUBST(PCI_DATABASE)
+
+AC_ARG_WITH(firmware-path,
+ AS_HELP_STRING([--with-firmware-path=DIR[[[:DIR[...]]]]],
+ [Firmware search path (default=ROOTPREFIX/lib/firmware/updates:ROOTPREFIX/lib/firmware)]),
+ [], [with_firmware_path="$rootprefix/lib/firmware/updates:$rootprefix/lib/firmware"])
+OLD_IFS=$IFS
+IFS=:
+for i in $with_firmware_path; do
+ if test "x${FIRMWARE_PATH}" = "x"; then
+ FIRMWARE_PATH="\\\"${i}/\\\""
+ else
+ FIRMWARE_PATH="${FIRMWARE_PATH}, \\\"${i}/\\\""
+ fi
+done
+IFS=$OLD_IFS
+AC_SUBST([FIRMWARE_PATH], [$FIRMWARE_PATH])
+
+AC_ARG_WITH([systemdsystemunitdir],
+ AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
+ [], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
+AS_IF([test "x$with_systemdsystemunitdir" != "xno"], [ AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir]) ])
+AM_CONDITIONAL(WITH_SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != "xno" ])
+
+# ------------------------------------------------------------------------------
+# GUdev - libudev gobject interface
+# ------------------------------------------------------------------------------
+AC_ARG_ENABLE([gudev],
+ AS_HELP_STRING([--disable-gudev], [disable Gobject libudev support @<:@default=enabled@:>@]),
+ [], [enable_gudev=yes])
+AS_IF([test "x$enable_gudev" = "xyes"], [ PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.22.0 gobject-2.0 >= 2.22.0]) ])
+
+AC_ARG_ENABLE([introspection],
+ AS_HELP_STRING([--disable-introspection], [disable GObject introspection @<:@default=enabled@:>@]),
+ [], [enable_introspection=yes])
+AS_IF([test "x$enable_introspection" = "xyes"], [
+ PKG_CHECK_MODULES([INTROSPECTION], [gobject-introspection-1.0 >= 0.6.2])
+ AC_DEFINE([ENABLE_INTROSPECTION], [1], [enable GObject introspection support])
+ AC_SUBST([G_IR_SCANNER], [$($PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0)])
+ AC_SUBST([G_IR_COMPILER], [$($PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0)])
+ AC_SUBST([G_IR_GENERATE], [$($PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0)])
+ AC_SUBST([GIRDIR], [$($PKG_CONFIG --define-variable=datadir=${datadir} --variable=girdir gobject-introspection-1.0)])
+ AC_SUBST([GIRTYPELIBDIR], [$($PKG_CONFIG --define-variable=libdir=${libdir} --variable=typelibdir gobject-introspection-1.0)])
+])
+AM_CONDITIONAL([ENABLE_INTROSPECTION], [test "x$enable_introspection" = "xyes"])
+AM_CONDITIONAL([ENABLE_GUDEV], [test "x$enable_gudev" = "xyes"])
+
+# ------------------------------------------------------------------------------
+# keymap - map custom hardware's multimedia keys
+# ------------------------------------------------------------------------------
+AC_ARG_ENABLE([keymap],
+ AS_HELP_STRING([--disable-keymap], [disable keymap fixup support @<:@default=enabled@:>@]),
+ [], [enable_keymap=yes])
+AS_IF([test "x$enable_keymap" = "xyes"], [
+ AC_PATH_PROG([GPERF], [gperf])
+ if test -z "$GPERF"; then
+ AC_MSG_ERROR([gperf is needed])
+ fi
+
+ AC_CHECK_HEADER([linux/input.h], [:], AC_MSG_ERROR([kernel headers not found]))
+ AC_SUBST([INCLUDE_PREFIX], [$(echo '#include <linux/input.h>' | eval $ac_cpp -E - | sed -n '/linux\/input.h/ {s:.*"\(.*\)/linux/input.h".*:\1:; p; q}')])
+])
+AM_CONDITIONAL([ENABLE_KEYMAP], [test "x$enable_keymap" = "xyes"])
+
+# ------------------------------------------------------------------------------
+# mtd_probe - autoloads FTL module for mtd devices
+# ------------------------------------------------------------------------------
+AC_ARG_ENABLE([mtd_probe],
+ AS_HELP_STRING([--disable-mtd_probe], [disable MTD support @<:@default=enabled@:>@]),
+ [], [enable_mtd_probe=yes])
+AM_CONDITIONAL([ENABLE_MTD_PROBE], [test "x$enable_mtd_probe" = "xyes"])
+
+# ------------------------------------------------------------------------------
+# rule_generator - persistent network and optical device rule generator
+# ------------------------------------------------------------------------------
+AC_ARG_ENABLE([rule_generator],
+ AS_HELP_STRING([--enable-rule_generator], [enable persistent network + cdrom links support @<:@default=disabled@:>@]),
+ [], [enable_rule_generator=no])
+AM_CONDITIONAL([ENABLE_RULE_GENERATOR], [test "x$enable_rule_generator" = "xyes"])
+
+# ------------------------------------------------------------------------------
+# create_floppy_devices - historical floppy kernel device nodes (/dev/fd0h1440, ...)
+# ------------------------------------------------------------------------------
+AC_ARG_ENABLE([floppy],
+ AS_HELP_STRING([--enable-floppy], [enable legacy floppy support @<:@default=disabled@:>@]),
+ [], [enable_floppy=no])
+AM_CONDITIONAL([ENABLE_FLOPPY], [test "x$enable_floppy" = "xyes"])
+
+my_CFLAGS="-Wall \
+-Wmissing-declarations -Wmissing-prototypes \
+-Wnested-externs -Wpointer-arith \
+-Wpointer-arith -Wsign-compare -Wchar-subscripts \
+-Wstrict-prototypes -Wshadow \
+-Wformat-security -Wtype-limits"
+AC_SUBST([my_CFLAGS])
+
+AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_FILES([
+ Makefile
+ src/docs/Makefile
+ src/docs/version.xml
+ src/gudev/docs/Makefile
+ src/gudev/docs/version.xml
+])
+
+AC_OUTPUT
+AC_MSG_RESULT([
+ $PACKAGE $VERSION
+ ========
+
+ prefix: ${prefix}
+ rootprefix: ${rootprefix}
+ sysconfdir: ${sysconfdir}
+ bindir: ${bindir}
+ libdir: ${libdir}
+ rootlibdir: ${rootlib_execdir}
+ libexecdir: ${libexecdir}
+ datarootdir: ${datarootdir}
+ mandir: ${mandir}
+ includedir: ${includedir}
+ include_prefix: ${INCLUDE_PREFIX}
+ systemdsystemunitdir: ${systemdsystemunitdir}
+ firmware path: ${FIRMWARE_PATH}
+ usb.ids: ${USB_DATABASE}
+ pci.ids: ${PCI_DATABASE}
+
+ compiler: ${CC}
+ cflags: ${CFLAGS}
+ ldflags: ${LDFLAGS}
+ xsltproc: ${XSLTPROC}
+ gperf: ${GPERF}
+
+ logging: ${enable_logging}
+ debug: ${enable_debug}
+ selinux: ${with_selinux}
+
+ man pages ${enable_manpages}
+ gudev: ${enable_gudev}
+ gintrospection: ${enable_introspection}
+ keymap: ${enable_keymap}
+ mtd_probe: ${enable_mtd_probe}
+ rule_generator: ${enable_rule_generator}
+ floppy: ${enable_floppy}
+])
diff --git a/src/udev/m4/.gitignore b/src/udev/m4/.gitignore
new file mode 100644
index 000000000..0ca2c0372
--- /dev/null
+++ b/src/udev/m4/.gitignore
@@ -0,0 +1,4 @@
+libtool.m4
+lt*m4
+gtk-doc.m4
+
diff --git a/src/udev/rules/42-usb-hid-pm.rules b/src/udev/rules/42-usb-hid-pm.rules
new file mode 100644
index 000000000..d5d5897c3
--- /dev/null
+++ b/src/udev/rules/42-usb-hid-pm.rules
@@ -0,0 +1,49 @@
+#
+# Enable autosuspend for qemu emulated usb hid devices.
+#
+# Note that there are buggy qemu versions which advertise remote
+# wakeup support but don't actually implement it correctly. This
+# is the reason why we need a match for the serial number here.
+# The serial number "42" is used to tag the implementations where
+# remote wakeup is working.
+#
+
+ACTION=="add", SUBSYSTEM=="usb", ATTR{product}=="QEMU USB Mouse", ATTR{serial}=="42", TEST=="power/control", ATTR{power/control}="auto"
+ACTION=="add", SUBSYSTEM=="usb", ATTR{product}=="QEMU USB Tablet", ATTR{serial}=="42", TEST=="power/control", ATTR{power/control}="auto"
+ACTION=="add", SUBSYSTEM=="usb", ATTR{product}=="QEMU USB Keyboard", ATTR{serial}=="42", TEST=="power/control", ATTR{power/control}="auto"
+
+#
+# Enable autosuspend for KVM and iLO usb hid devices. These are
+# effectively self-powered (despite what some claim in their USB
+# profiles) and so it's safe to do so.
+#
+
+# AMI 046b:ff10
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="046b", ATTR{idProduct}=="ff10", TEST=="power/control", ATTR{power/control}="auto"
+
+#
+# Catch-all for Avocent HID devices. Keyed off interface in order to only
+# trigger on HID class devices.
+#
+ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0624", ATTR{bInterfaceClass}=="03", TEST=="../power/control", ATTR{../power/control}="auto"
+
+# Dell DRAC 4
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="413c", ATTR{idProduct}=="2500", TEST=="power/control", ATTR{power/control}="auto"
+
+# Dell DRAC 5
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="413c", ATTR{idProduct}=="0000", TEST=="power/control", ATTR{power/control}="auto"
+
+# Hewlett Packard iLO
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03f0", ATTR{idProduct}=="7029", TEST=="power/control", ATTR{power/control}="auto"
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="03f0", ATTR{idProduct}=="1027", TEST=="power/control", ATTR{power/control}="auto"
+
+# IBM remote access
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04b3", ATTR{idProduct}=="4001", TEST=="power/control", ATTR{power/control}="auto"
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04b3", ATTR{idProduct}=="4002", TEST=="power/control", ATTR{power/control}="auto"
+ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="04b3", ATTR{idProduct}=="4012", TEST=="power/control", ATTR{power/control}="auto"
+
+# Raritan Computer, Inc KVM.
+ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="14dd", ATTR{idProduct}="0002", TEST=="power/control", ATTR{power/control}="auto"
+
+# USB HID devices that are internal to the machine should also be safe to autosuspend
+ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="03", ATTRS{removable}=="fixed", TEST=="../power/control", ATTR{../power/control}="auto"
diff --git a/src/udev/rules/50-udev-default.rules b/src/udev/rules/50-udev-default.rules
new file mode 100644
index 000000000..5ad787fc7
--- /dev/null
+++ b/src/udev/rules/50-udev-default.rules
@@ -0,0 +1,107 @@
+# do not edit this file, it will be overwritten on update
+
+KERNEL=="pty[pqrstuvwxyzabcdef][0123456789abcdef]", GROUP="tty", MODE="0660"
+KERNEL=="tty[pqrstuvwxyzabcdef][0123456789abcdef]", GROUP="tty", MODE="0660"
+KERNEL=="ptmx", GROUP="tty", MODE="0666"
+KERNEL=="tty", GROUP="tty", MODE="0666"
+KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
+KERNEL=="vcs|vcs[0-9]*|vcsa|vcsa[0-9]*", GROUP="tty"
+
+# serial
+KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
+KERNEL=="mwave", GROUP="dialout"
+KERNEL=="hvc*|hvsi*", GROUP="dialout"
+
+# virtio serial / console ports
+KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"
+
+# mem
+KERNEL=="null|zero|full|random|urandom", MODE="0666"
+KERNEL=="mem|kmem|port|nvram", GROUP="kmem", MODE="0640"
+
+# input
+SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
+KERNEL=="mouse*|mice|event*", MODE="0640"
+KERNEL=="ts[0-9]*|uinput", MODE="0640"
+KERNEL=="js[0-9]*", MODE="0644"
+
+# video4linux
+SUBSYSTEM=="video4linux", GROUP="video"
+KERNEL=="vttuner*", GROUP="video"
+KERNEL=="vtx*|vbi*", GROUP="video"
+KERNEL=="winradio*", GROUP="video"
+
+# graphics
+KERNEL=="agpgart", GROUP="video"
+KERNEL=="pmu", GROUP="video"
+KERNEL=="nvidia*|nvidiactl*", GROUP="video"
+SUBSYSTEM=="graphics", GROUP="video"
+SUBSYSTEM=="drm", GROUP="video"
+
+# sound
+SUBSYSTEM=="sound", GROUP="audio", \
+ OPTIONS+="static_node=snd/seq", OPTIONS+="static_node=snd/timer"
+
+# DVB (video)
+SUBSYSTEM=="dvb", GROUP="video"
+
+# FireWire (firewire-core driver: IIDC devices, AV/C devices)
+SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x00010*", GROUP="video"
+SUBSYSTEM=="firewire", ATTR{units}=="*0x00b09d:0x00010*", GROUP="video"
+SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x010001*", GROUP="video"
+SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x014001*", GROUP="video"
+
+# 'libusb' device nodes
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id"
+
+# printer
+KERNEL=="parport[0-9]*", GROUP="lp"
+SUBSYSTEM=="printer", KERNEL=="lp*", GROUP="lp"
+SUBSYSTEM=="ppdev", GROUP="lp"
+KERNEL=="lp[0-9]*", GROUP="lp"
+KERNEL=="irlpt[0-9]*", GROUP="lp"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", GROUP="lp"
+
+# block
+SUBSYSTEM=="block", GROUP="disk"
+
+# floppy
+SUBSYSTEM=="block", KERNEL=="fd[0-9]", GROUP="floppy"
+
+# cdrom
+SUBSYSTEM=="block", KERNEL=="sr[0-9]*", GROUP="cdrom"
+SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="cdrom"
+KERNEL=="pktcdvd[0-9]*", GROUP="cdrom"
+KERNEL=="pktcdvd", GROUP="cdrom"
+
+# tape
+KERNEL=="ht[0-9]*|nht[0-9]*", GROUP="tape"
+KERNEL=="pt[0-9]*|npt[0-9]*|pht[0-9]*", GROUP="tape"
+SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="tape"
+
+# block-related
+KERNEL=="sch[0-9]*", GROUP="disk"
+SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="0", GROUP="disk"
+KERNEL=="pg[0-9]*", GROUP="disk"
+KERNEL=="qft[0-9]*|nqft[0-9]*|zqft[0-9]*|nzqft[0-9]*|rawqft[0-9]*|nrawqft[0-9]*", GROUP="disk"
+KERNEL=="rawctl", GROUP="disk"
+SUBSYSTEM=="raw", KERNEL=="raw[0-9]*", GROUP="disk"
+SUBSYSTEM=="aoe", GROUP="disk", MODE="0220"
+SUBSYSTEM=="aoe", KERNEL=="err", MODE="0440"
+
+# network
+KERNEL=="tun", MODE="0666", OPTIONS+="static_node=net/tun"
+KERNEL=="rfkill", MODE="0644"
+
+# CPU
+KERNEL=="cpu[0-9]*", MODE="0444"
+
+KERNEL=="fuse", ACTION=="add", MODE="0666", OPTIONS+="static_node=fuse"
+
+SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
+KERNEL=="mmtimer", MODE="0644"
+KERNEL=="rflash[0-9]*", MODE="0400"
+KERNEL=="rrom[0-9]*", MODE="0400"
+
+SUBSYSTEM=="firmware", ACTION=="add", IMPORT{builtin}="firmware"
diff --git a/src/udev/rules/60-persistent-alsa.rules b/src/udev/rules/60-persistent-alsa.rules
new file mode 100644
index 000000000..8154e2dbb
--- /dev/null
+++ b/src/udev/rules/60-persistent-alsa.rules
@@ -0,0 +1,14 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="persistent_alsa_end"
+SUBSYSTEM!="sound", GOTO="persistent_alsa_end"
+KERNEL!="controlC[0-9]*", GOTO="persistent_alsa_end"
+
+SUBSYSTEMS=="usb", ENV{ID_MODEL}=="", IMPORT{builtin}="usb_id"
+ENV{ID_SERIAL}=="?*", ENV{ID_USB_INTERFACE_NUM}=="?*", SYMLINK+="snd/by-id/$env{ID_BUS}-$env{ID_SERIAL}-$env{ID_USB_INTERFACE_NUM}"
+ENV{ID_SERIAL}=="?*", ENV{ID_USB_INTERFACE_NUM}=="", SYMLINK+="snd/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
+
+IMPORT{builtin}="path_id"
+ENV{ID_PATH}=="?*", SYMLINK+="snd/by-path/$env{ID_PATH}"
+
+LABEL="persistent_alsa_end"
diff --git a/src/udev/rules/60-persistent-input.rules b/src/udev/rules/60-persistent-input.rules
new file mode 100644
index 000000000..fb798ddb0
--- /dev/null
+++ b/src/udev/rules/60-persistent-input.rules
@@ -0,0 +1,38 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="persistent_input_end"
+SUBSYSTEM!="input", GOTO="persistent_input_end"
+SUBSYSTEMS=="bluetooth", GOTO="persistent_input_end"
+
+SUBSYSTEMS=="usb", ENV{ID_BUS}=="", IMPORT{builtin}="usb_id"
+
+# determine class name for persistent symlinks
+ENV{ID_INPUT_KEYBOARD}=="?*", ENV{.INPUT_CLASS}="kbd"
+ENV{ID_INPUT_MOUSE}=="?*", ENV{.INPUT_CLASS}="mouse"
+ENV{ID_INPUT_TOUCHPAD}=="?*", ENV{.INPUT_CLASS}="mouse"
+ENV{ID_INPUT_TABLET}=="?*", ENV{.INPUT_CLASS}="mouse"
+ENV{ID_INPUT_JOYSTICK}=="?*", ENV{.INPUT_CLASS}="joystick"
+DRIVERS=="pcspkr", ENV{.INPUT_CLASS}="spkr"
+ATTRS{name}=="*dvb*|*DVB*|* IR *", ENV{.INPUT_CLASS}="ir"
+
+# fill empty serial number
+ENV{.INPUT_CLASS}=="?*", ENV{ID_SERIAL}=="", ENV{ID_SERIAL}="noserial"
+
+# by-id links
+KERNEL=="mouse*|js*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-$env{.INPUT_CLASS}"
+KERNEL=="mouse*|js*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="?*", ATTRS{bInterfaceNumber}!="00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$attr{bInterfaceNumber}-$env{.INPUT_CLASS}"
+KERNEL=="event*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-event-$env{.INPUT_CLASS}"
+KERNEL=="event*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="?*", ATTRS{bInterfaceNumber}!="00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$attr{bInterfaceNumber}-event-$env{.INPUT_CLASS}"
+# allow empty class for USB devices, by appending the interface number
+SUBSYSTEMS=="usb", ENV{ID_BUS}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="", ATTRS{bInterfaceNumber}=="?*", \
+ SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-event-if$attr{bInterfaceNumber}"
+
+# by-path
+SUBSYSTEMS=="pci|usb|platform|acpi", IMPORT{builtin}="path_id"
+ENV{ID_PATH}=="?*", KERNEL=="mouse*|js*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-path/$env{ID_PATH}-$env{.INPUT_CLASS}"
+ENV{ID_PATH}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-path/$env{ID_PATH}-event-$env{.INPUT_CLASS}"
+# allow empty class for platform and usb devices; platform supports only a single interface that way
+SUBSYSTEMS=="usb|platform", ENV{ID_PATH}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="", \
+ SYMLINK+="input/by-path/$env{ID_PATH}-event"
+
+LABEL="persistent_input_end"
diff --git a/src/udev/rules/60-persistent-serial.rules b/src/udev/rules/60-persistent-serial.rules
new file mode 100644
index 000000000..2948200c5
--- /dev/null
+++ b/src/udev/rules/60-persistent-serial.rules
@@ -0,0 +1,20 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="persistent_serial_end"
+SUBSYSTEM!="tty", GOTO="persistent_serial_end"
+KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="persistent_serial_end"
+
+SUBSYSTEMS=="usb-serial", ENV{.ID_PORT}="$attr{port_number}"
+
+IMPORT{builtin}="path_id"
+ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="", SYMLINK+="serial/by-path/$env{ID_PATH}"
+ENV{ID_PATH}=="?*", ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-path/$env{ID_PATH}-port$env{.ID_PORT}"
+
+IMPORT{builtin}="usb_id"
+ENV{ID_SERIAL}=="", GOTO="persistent_serial_end"
+SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACE_NUM}="$attr{bInterfaceNumber}"
+ENV{ID_USB_INTERFACE_NUM}=="", GOTO="persistent_serial_end"
+ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
+ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}-port$env{.ID_PORT}"
+
+LABEL="persistent_serial_end"
diff --git a/src/udev/rules/60-persistent-storage-tape.rules b/src/udev/rules/60-persistent-storage-tape.rules
new file mode 100644
index 000000000..f2eabd92a
--- /dev/null
+++ b/src/udev/rules/60-persistent-storage-tape.rules
@@ -0,0 +1,25 @@
+# do not edit this file, it will be overwritten on update
+
+# persistent storage links: /dev/tape/{by-id,by-path}
+
+ACTION=="remove", GOTO="persistent_storage_tape_end"
+
+# type 8 devices are "Medium Changers"
+SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="8", IMPORT{program}="scsi_id --sg-version=3 --export --whitelisted -d $devnode", \
+ SYMLINK+="tape/by-id/scsi-$env{ID_SERIAL}"
+
+SUBSYSTEM!="scsi_tape", GOTO="persistent_storage_tape_end"
+
+KERNEL=="st*[0-9]|nst*[0-9]", ATTRS{ieee1394_id}=="?*", ENV{ID_SERIAL}="$attr{ieee1394_id}", ENV{ID_BUS}="ieee1394"
+KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
+KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", KERNELS=="[0-9]*:*[0-9]", ENV{.BSG_DEV}="$root/bsg/$id"
+KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --whitelisted --export --device=$env{.BSG_DEV}", ENV{ID_BUS}="scsi"
+KERNEL=="st*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
+KERNEL=="nst*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}-nst"
+
+# by-path (parent device path)
+KERNEL=="st*[0-9]|nst*[0-9]", IMPORT{builtin}="path_id"
+KERNEL=="st*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="tape/by-path/$env{ID_PATH}"
+KERNEL=="nst*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="tape/by-path/$env{ID_PATH}-nst"
+
+LABEL="persistent_storage_tape_end"
diff --git a/src/udev/rules/60-persistent-storage.rules b/src/udev/rules/60-persistent-storage.rules
new file mode 100644
index 000000000..b74821edd
--- /dev/null
+++ b/src/udev/rules/60-persistent-storage.rules
@@ -0,0 +1,89 @@
+# do not edit this file, it will be overwritten on update
+
+# persistent storage links: /dev/disk/{by-id,by-uuid,by-label,by-path}
+# scheme based on "Linux persistent device names", 2004, Hannes Reinecke <hare@suse.de>
+
+# forward scsi device event to corresponding block device
+ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
+
+ACTION=="remove", GOTO="persistent_storage_end"
+
+# enable in-kernel media-presence polling
+ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
+
+SUBSYSTEM!="block", GOTO="persistent_storage_end"
+
+# skip rules for inappropriate block devices
+KERNEL=="fd*|mtd*|nbd*|gnbd*|btibm*|dm-*|md*", GOTO="persistent_storage_end"
+
+# ignore partitions that span the entire disk
+TEST=="whole_disk", GOTO="persistent_storage_end"
+
+# for partitions import parent information
+ENV{DEVTYPE}=="partition", IMPORT{parent}="ID_*"
+
+# virtio-blk
+KERNEL=="vd*[!0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}"
+KERNEL=="vd*[0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}-part%n"
+
+# ATA devices with their own "ata" kernel subsystem
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="ata", IMPORT{program}="ata_id --export $devnode"
+# ATA devices using the "scsi" subsystem
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"
+# ATA/ATAPI devices (SPC-3 or later) using the "scsi" subsystem
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{type}=="5", ATTRS{scsi_level}=="[6-9]*", IMPORT{program}="ata_id --export $devnode"
+
+# Run ata_id on non-removable USB Mass Storage (SATA/PATA disks in enclosures)
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", ATTR{removable}=="0", SUBSYSTEMS=="usb", IMPORT{program}="ata_id --export $devnode"
+# Otherwise fall back to using usb_id for USB devices
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
+
+# scsi devices
+KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --whitelisted -d $devnode", ENV{ID_BUS}="scsi"
+KERNEL=="cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --whitelisted -d $devnode", ENV{ID_BUS}="cciss"
+KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
+KERNEL=="sd*|cciss*", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
+
+# firewire
+KERNEL=="sd*[!0-9]|sr*", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}"
+KERNEL=="sd*[0-9]", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}-part%n"
+
+KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}"
+KERNEL=="mmcblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
+KERNEL=="mspblk[0-9]", SUBSYSTEMS=="memstick", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}"
+KERNEL=="mspblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
+
+# by-path (parent device path)
+ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"
+
+# skip unpartitioned removable media devices from drivers which do not send "change" events
+ENV{DEVTYPE}=="disk", KERNEL!="sd*|sr*", ATTR{removable}=="1", GOTO="persistent_storage_end"
+
+# probe filesystem metadata of optical drives which have a media inserted
+KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="?*", \
+ IMPORT{builtin}="blkid --offset=$env{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}"
+# single-session CDs do not have ID_CDROM_MEDIA_SESSION_LAST_OFFSET
+KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="", \
+ IMPORT{builtin}="blkid --noraid"
+
+# probe filesystem metadata of disks
+KERNEL!="sr*", IMPORT{builtin}="blkid"
+
+# watch metadata changes by tools closing the device after writing
+KERNEL!="sr*", OPTIONS+="watch"
+
+# by-label/by-uuid links (filesystem metadata)
+ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
+ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
+
+# by-id (World Wide Name)
+ENV{DEVTYPE}=="disk", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}"
+ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-id/wwn-$env{ID_WWN_WITH_EXTENSION}-part%n"
+
+# by-partlabel/by-partuuid links (partition metadata)
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
+
+LABEL="persistent_storage_end"
diff --git a/src/udev/rules/75-net-description.rules b/src/udev/rules/75-net-description.rules
new file mode 100644
index 000000000..ce57d48e8
--- /dev/null
+++ b/src/udev/rules/75-net-description.rules
@@ -0,0 +1,14 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="net_end"
+SUBSYSTEM!="net", GOTO="net_end"
+
+SUBSYSTEMS=="usb", ENV{ID_MODEL}=="", IMPORT{builtin}="usb_id"
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb-db"
+SUBSYSTEMS=="usb", ATTRS{idVendor}!="", ATTRS{idProduct}!="", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}"
+SUBSYSTEMS=="usb", GOTO="net_end"
+
+SUBSYSTEMS=="pci", IMPORT{builtin}="pci-db"
+SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
+
+LABEL="net_end"
diff --git a/src/udev/rules/75-tty-description.rules b/src/udev/rules/75-tty-description.rules
new file mode 100644
index 000000000..2e63e140c
--- /dev/null
+++ b/src/udev/rules/75-tty-description.rules
@@ -0,0 +1,14 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="tty_end"
+SUBSYSTEM!="tty", GOTO="tty_end"
+
+SUBSYSTEMS=="usb", ENV{ID_MODEL}=="", IMPORT{builtin}="usb_id"
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb-db"
+SUBSYSTEMS=="usb", ATTRS{idVendor}!="", ATTRS{idProduct}!="", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}"
+SUBSYSTEMS=="usb", GOTO="tty_end"
+
+SUBSYSTEMS=="pci", IMPORT{builtin}="pci-db"
+SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
+
+LABEL="tty_end"
diff --git a/src/udev/rules/78-sound-card.rules b/src/udev/rules/78-sound-card.rules
new file mode 100644
index 000000000..e56444189
--- /dev/null
+++ b/src/udev/rules/78-sound-card.rules
@@ -0,0 +1,89 @@
+# do not edit this file, it will be overwritten on update
+
+SUBSYSTEM!="sound", GOTO="sound_end"
+
+ACTION=="add|change", KERNEL=="controlC*", ATTR{../uevent}="change"
+ACTION!="change", GOTO="sound_end"
+
+# Ok, we probably need a little explanation here for what the two lines above
+# are good for.
+#
+# The story goes like this: when ALSA registers a new sound card it emits a
+# series of 'add' events to userspace, for the main card device and for all the
+# child device nodes that belong to it. udev relays those to applications,
+# however only maintains the order between father and child, but not between
+# the siblings. The control device node creation can be used as synchronization
+# point. All other devices that belong to a card are created in the kernel
+# before it. However unfortunately due to the fact that siblings are forwarded
+# out of order by udev this fact is lost to applications.
+#
+# OTOH before an application can open a device it needs to make sure that all
+# its device nodes are completely created and set up.
+#
+# As a workaround for this issue we have added the udev rule above which will
+# generate a 'change' event on the main card device from the 'add' event of the
+# card's control device. Due to the ordering semantics of udev this event will
+# only be relayed after all child devices have finished processing properly.
+# When an application needs to listen for appearing devices it can hence look
+# for 'change' events only, and ignore the actual 'add' events.
+#
+# When the application is initialized at the same time as a device is plugged
+# in it may need to figure out if the 'change' event has already been triggered
+# or not for a card. To find that out we store the flag environment variable
+# SOUND_INITIALIZED on the device which simply tells us if the card 'change'
+# event has already been processed.
+
+KERNEL!="card*", GOTO="sound_end"
+
+ENV{SOUND_INITIALIZED}="1"
+
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb-db"
+SUBSYSTEMS=="usb", GOTO="skip_pci"
+
+SUBSYSTEMS=="firewire", ATTRS{vendor_name}=="?*", ATTRS{model_name}=="?*", \
+ ENV{ID_BUS}="firewire", ENV{ID_VENDOR}="$attr{vendor_name}", ENV{ID_MODEL}="$attr{model_name}"
+SUBSYSTEMS=="firewire", ATTRS{guid}=="?*", ENV{ID_ID}="firewire-$attr{guid}"
+SUBSYSTEMS=="firewire", GOTO="skip_pci"
+
+
+SUBSYSTEMS=="pci", IMPORT{builtin}="pci-db"
+SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
+
+LABEL="skip_pci"
+
+ENV{ID_SERIAL}=="?*", ENV{ID_USB_INTERFACE_NUM}=="?*", ENV{ID_ID}="$env{ID_BUS}-$env{ID_SERIAL}-$env{ID_USB_INTERFACE_NUM}-$attr{id}"
+ENV{ID_SERIAL}=="?*", ENV{ID_USB_INTERFACE_NUM}=="", ENV{ID_ID}="$env{ID_BUS}-$env{ID_SERIAL}-$attr{id}"
+
+IMPORT{builtin}="path_id"
+
+# The values used here for $SOUND_FORM_FACTOR and $SOUND_CLASS should be kept
+# in sync with those defined for PulseAudio's src/pulse/proplist.h
+# PA_PROP_DEVICE_FORM_FACTOR, PA_PROP_DEVICE_CLASS properties.
+
+# If the first PCM device of this card has the pcm class 'modem', then the card is a modem
+ATTR{pcmC%nD0p/pcm_class}=="modem", ENV{SOUND_CLASS}="modem", GOTO="sound_end"
+
+# Identify cards on the internal PCI bus as internal
+SUBSYSTEMS=="pci", DEVPATH=="*/0000:00:??.?/sound/*", ENV{SOUND_FORM_FACTOR}="internal", GOTO="sound_end"
+
+# Devices that also support Image/Video interfaces are most likely webcams
+SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACES}=="*:0e????:*", ENV{SOUND_FORM_FACTOR}="webcam", GOTO="sound_end"
+
+# Matching on the model strings is a bit ugly, I admit
+ENV{ID_MODEL}=="*[Ss]peaker*", ENV{SOUND_FORM_FACTOR}="speaker", GOTO="sound_end"
+ENV{ID_MODEL_FROM_DATABASE}=="*[Ss]peaker*", ENV{SOUND_FORM_FACTOR}="speaker", GOTO="sound_end"
+
+ENV{ID_MODEL}=="*[Hh]eadphone*", ENV{SOUND_FORM_FACTOR}="headphone", GOTO="sound_end"
+ENV{ID_MODEL_FROM_DATABASE}=="*[Hh]eadphone*", ENV{SOUND_FORM_FACTOR}="headphone", GOTO="sound_end"
+
+ENV{ID_MODEL}=="*[Hh]eadset*", ENV{SOUND_FORM_FACTOR}="headset", GOTO="sound_end"
+ENV{ID_MODEL_FROM_DATABASE}=="*[Hh]eadset*", ENV{SOUND_FORM_FACTOR}="headset", GOTO="sound_end"
+
+ENV{ID_MODEL}=="*[Hh]andset*", ENV{SOUND_FORM_FACTOR}="handset", GOTO="sound_end"
+ENV{ID_MODEL_FROM_DATABASE}=="*[Hh]andset*", ENV{SOUND_FORM_FACTOR}="handset", GOTO="sound_end"
+
+ENV{ID_MODEL}=="*[Mm]icrophone*", ENV{SOUND_FORM_FACTOR}="microphone", GOTO="sound_end"
+ENV{ID_MODEL_FROM_DATABASE}=="*[Mm]icrophone*", ENV{SOUND_FORM_FACTOR}="microphone", GOTO="sound_end"
+
+LABEL="sound_end"
diff --git a/src/udev/rules/80-drivers.rules b/src/udev/rules/80-drivers.rules
new file mode 100644
index 000000000..38ebfeb0e
--- /dev/null
+++ b/src/udev/rules/80-drivers.rules
@@ -0,0 +1,12 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="drivers_end"
+
+DRIVER!="?*", ENV{MODALIAS}=="?*", IMPORT{builtin}="kmod load $env{MODALIAS}"
+SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", IMPORT{builtin}="kmod load tifm_sd"
+SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", IMPORT{builtin}="kmod load tifm_ms"
+SUBSYSTEM=="memstick", IMPORT{builtin}="kmod load ms_block mspro_block"
+SUBSYSTEM=="i2o", IMPORT{builtin}="kmod load i2o_block"
+SUBSYSTEM=="module", KERNEL=="parport_pc", IMPORT{builtin}="kmod load ppdev"
+
+LABEL="drivers_end"
diff --git a/src/udev/rules/95-udev-late.rules b/src/udev/rules/95-udev-late.rules
new file mode 100644
index 000000000..eca0faa5c
--- /dev/null
+++ b/src/udev/rules/95-udev-late.rules
@@ -0,0 +1,4 @@
+# do not edit this file, it will be overwritten on update
+
+# run a command on remove events
+ACTION=="remove", ENV{REMOVE_CMD}!="", RUN+="$env{REMOVE_CMD}"
diff --git a/src/udev/src/.gitignore b/src/udev/src/.gitignore
new file mode 100644
index 000000000..beb8604bc
--- /dev/null
+++ b/src/udev/src/.gitignore
@@ -0,0 +1,5 @@
+*.[78]
+*.html
+udev.pc
+libudev.pc
+udev*.service
diff --git a/src/udev/src/COPYING b/src/udev/src/COPYING
new file mode 100644
index 000000000..d2e31278b
--- /dev/null
+++ b/src/udev/src/COPYING
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/src/udev/src/accelerometer/61-accelerometer.rules b/src/udev/src/accelerometer/61-accelerometer.rules
new file mode 100644
index 000000000..a6a2bfd08
--- /dev/null
+++ b/src/udev/src/accelerometer/61-accelerometer.rules
@@ -0,0 +1,3 @@
+# do not edit this file, it will be overwritten on update
+
+SUBSYSTEM=="input", ACTION!="remove", ENV{ID_INPUT_ACCELEROMETER}=="1", IMPORT{program}="accelerometer %p"
diff --git a/src/udev/src/accelerometer/accelerometer.c b/src/udev/src/accelerometer/accelerometer.c
new file mode 100644
index 000000000..bc9715b26
--- /dev/null
+++ b/src/udev/src/accelerometer/accelerometer.c
@@ -0,0 +1,357 @@
+/*
+ * accelerometer - exports device orientation through property
+ *
+ * When an "change" event is received on an accelerometer,
+ * open its device node, and from the value, as well as the previous
+ * value of the property, calculate the device's new orientation,
+ * and export it as ID_INPUT_ACCELEROMETER_ORIENTATION.
+ *
+ * Possible values are:
+ * undefined
+ * * normal
+ * * bottom-up
+ * * left-up
+ * * right-up
+ *
+ * The property will be persistent across sessions, and the new
+ * orientations can be deducted from the previous one (it allows
+ * for a threshold for switching between opposite ends of the
+ * orientation).
+ *
+ * Copyright (C) 2011 Red Hat, Inc.
+ * Author:
+ * Bastien Nocera <hadess@hadess.net>
+ *
+ * orientation_calc() from the sensorfw package
+ * Copyright (C) 2009-2010 Nokia Corporation
+ * Authors:
+ * Üstün Ergenoglu <ext-ustun.ergenoglu@nokia.com>
+ * Timo Rongas <ext-timo.2.rongas@nokia.com>
+ * Lihan Guo <lihan.guo@digia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with keymap; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <limits.h>
+#include <linux/limits.h>
+#include <linux/input.h>
+
+#include "libudev.h"
+#include "libudev-private.h"
+
+/* we must use this kernel-compatible implementation */
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+#define OFF(x) ((x)%BITS_PER_LONG)
+#define BIT(x) (1UL<<OFF(x))
+#define LONG(x) ((x)/BITS_PER_LONG)
+#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
+
+static int debug = 0;
+
+static void log_fn(struct udev *udev, int priority,
+ const char *file, int line, const char *fn,
+ const char *format, va_list args)
+{
+ if (debug) {
+ fprintf(stderr, "%s: ", fn);
+ vfprintf(stderr, format, args);
+ } else {
+ vsyslog(priority, format, args);
+ }
+}
+
+typedef enum {
+ ORIENTATION_UNDEFINED,
+ ORIENTATION_NORMAL,
+ ORIENTATION_BOTTOM_UP,
+ ORIENTATION_LEFT_UP,
+ ORIENTATION_RIGHT_UP
+} OrientationUp;
+
+static const char *orientations[] = {
+ "undefined",
+ "normal",
+ "bottom-up",
+ "left-up",
+ "right-up",
+ NULL
+};
+
+#define ORIENTATION_UP_UP ORIENTATION_NORMAL
+
+#define DEFAULT_THRESHOLD 250
+#define RADIANS_TO_DEGREES 180.0/M_PI
+#define SAME_AXIS_LIMIT 5
+
+#define THRESHOLD_LANDSCAPE 25
+#define THRESHOLD_PORTRAIT 20
+
+static const char *
+orientation_to_string (OrientationUp o)
+{
+ return orientations[o];
+}
+
+static OrientationUp
+string_to_orientation (const char *orientation)
+{
+ int i;
+
+ if (orientation == NULL)
+ return ORIENTATION_UNDEFINED;
+ for (i = 0; orientations[i] != NULL; i++) {
+ if (strcmp (orientation, orientations[i]) == 0)
+ return i;
+ }
+ return ORIENTATION_UNDEFINED;
+}
+
+static OrientationUp
+orientation_calc (OrientationUp prev,
+ int x, int y, int z)
+{
+ int rotation;
+ OrientationUp ret = prev;
+
+ /* Portrait check */
+ rotation = round(atan((double) x / sqrt(y * y + z * z)) * RADIANS_TO_DEGREES);
+
+ if (abs(rotation) > THRESHOLD_PORTRAIT) {
+ ret = (rotation < 0) ? ORIENTATION_LEFT_UP : ORIENTATION_RIGHT_UP;
+
+ /* Some threshold to switching between portrait modes */
+ if (prev == ORIENTATION_LEFT_UP || prev == ORIENTATION_RIGHT_UP) {
+ if (abs(rotation) < SAME_AXIS_LIMIT) {
+ ret = prev;
+ }
+ }
+
+ } else {
+ /* Landscape check */
+ rotation = round(atan((double) y / sqrt(x * x + z * z)) * RADIANS_TO_DEGREES);
+
+ if (abs(rotation) > THRESHOLD_LANDSCAPE) {
+ ret = (rotation < 0) ? ORIENTATION_BOTTOM_UP : ORIENTATION_NORMAL;
+
+ /* Some threshold to switching between landscape modes */
+ if (prev == ORIENTATION_BOTTOM_UP || prev == ORIENTATION_NORMAL) {
+ if (abs(rotation) < SAME_AXIS_LIMIT) {
+ ret = prev;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+static OrientationUp
+get_prev_orientation(struct udev_device *dev)
+{
+ const char *value;
+
+ value = udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER_ORIENTATION");
+ if (value == NULL)
+ return ORIENTATION_UNDEFINED;
+ return string_to_orientation(value);
+}
+
+#define SET_AXIS(axis, code_) if (ev[i].code == code_) { if (got_##axis == 0) { axis = ev[i].value; got_##axis = 1; } }
+
+/* accelerometers */
+static void test_orientation(struct udev *udev,
+ struct udev_device *dev,
+ const char *devpath)
+{
+ OrientationUp old, new;
+ int fd, r;
+ struct input_event ev[64];
+ int got_syn = 0;
+ int got_x, got_y, got_z;
+ int x = 0, y = 0, z = 0;
+ char text[64];
+
+ old = get_prev_orientation(dev);
+
+ if ((fd = open(devpath, O_RDONLY)) < 0)
+ return;
+
+ got_x = got_y = got_z = 0;
+
+ while (1) {
+ int i;
+
+ r = read(fd, ev, sizeof(struct input_event) * 64);
+
+ if (r < (int) sizeof(struct input_event))
+ return;
+
+ for (i = 0; i < r / (int) sizeof(struct input_event); i++) {
+ if (got_syn == 1) {
+ if (ev[i].type == EV_ABS) {
+ SET_AXIS(x, ABS_X);
+ SET_AXIS(y, ABS_Y);
+ SET_AXIS(z, ABS_Z);
+ }
+ }
+ if (ev[i].type == EV_SYN && ev[i].code == SYN_REPORT) {
+ got_syn = 1;
+ }
+ if (got_x && got_y && got_z)
+ goto read_dev;
+ }
+ }
+
+read_dev:
+ close(fd);
+
+ if (!got_x || !got_y || !got_z)
+ return;
+
+ new = orientation_calc(old, x, y, z);
+ snprintf(text, sizeof(text), "ID_INPUT_ACCELEROMETER_ORIENTATION=%s", orientation_to_string(new));
+ puts(text);
+}
+
+static void help(void)
+{
+ printf("Usage: accelerometer [options] <device path>\n"
+ " --debug debug to stderr\n"
+ " --help print this help text\n\n");
+}
+
+int main (int argc, char** argv)
+{
+ struct udev *udev;
+ struct udev_device *dev;
+
+ static const struct option options[] = {
+ { "debug", no_argument, NULL, 'd' },
+ { "help", no_argument, NULL, 'h' },
+ {}
+ };
+
+ char devpath[PATH_MAX];
+ char *devnode;
+ const char *id_path;
+ struct udev_enumerate *enumerate;
+ struct udev_list_entry *list_entry;
+
+ udev = udev_new();
+ if (udev == NULL)
+ return 1;
+
+ udev_log_init("input_id");
+ udev_set_log_fn(udev, log_fn);
+
+ /* CLI argument parsing */
+ while (1) {
+ int option;
+
+ option = getopt_long(argc, argv, "dxh", options, NULL);
+ if (option == -1)
+ break;
+
+ switch (option) {
+ case 'd':
+ debug = 1;
+ if (udev_get_log_priority(udev) < LOG_INFO)
+ udev_set_log_priority(udev, LOG_INFO);
+ break;
+ case 'h':
+ help();
+ exit(0);
+ default:
+ exit(1);
+ }
+ }
+
+ if (argv[optind] == NULL) {
+ help();
+ exit(1);
+ }
+
+ /* get the device */
+ snprintf(devpath, sizeof(devpath), "%s/%s", udev_get_sys_path(udev), argv[optind]);
+ dev = udev_device_new_from_syspath(udev, devpath);
+ if (dev == NULL) {
+ fprintf(stderr, "unable to access '%s'\n", devpath);
+ return 1;
+ }
+
+ id_path = udev_device_get_property_value(dev, "ID_PATH");
+ if (id_path == NULL) {
+ fprintf (stderr, "unable to get property ID_PATH for '%s'", devpath);
+ return 0;
+ }
+
+ /* Get the children devices and find the devnode
+ * FIXME: use udev_enumerate_add_match_children() instead
+ * when it's available */
+ devnode = NULL;
+ enumerate = udev_enumerate_new(udev);
+ udev_enumerate_add_match_property(enumerate, "ID_PATH", id_path);
+ udev_enumerate_add_match_subsystem(enumerate, "input");
+ udev_enumerate_scan_devices(enumerate);
+ udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) {
+ struct udev_device *device;
+ const char *node;
+
+ device = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate),
+ udev_list_entry_get_name(list_entry));
+ if (device == NULL)
+ continue;
+ /* Already found it */
+ if (devnode != NULL) {
+ udev_device_unref(device);
+ continue;
+ }
+
+ node = udev_device_get_devnode(device);
+ if (node == NULL) {
+ udev_device_unref(device);
+ continue;
+ }
+ /* Use the event sub-device */
+ if (strstr(node, "/event") == NULL) {
+ udev_device_unref(device);
+ continue;
+ }
+
+ devnode = strdup(node);
+ udev_device_unref(device);
+ }
+
+ if (devnode == NULL) {
+ fprintf(stderr, "unable to get device node for '%s'\n", devpath);
+ return 0;
+ }
+
+ info(udev, "Opening accelerometer device %s\n", devnode);
+ test_orientation(udev, dev, devnode);
+ free(devnode);
+
+ return 0;
+}
diff --git a/src/udev/src/ata_id/ata_id.c b/src/udev/src/ata_id/ata_id.c
new file mode 100644
index 000000000..846a73b54
--- /dev/null
+++ b/src/udev/src/ata_id/ata_id.c
@@ -0,0 +1,721 @@
+/*
+ * ata_id - reads product/serial number from ATA drives
+ *
+ * Copyright (C) 2005-2008 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2009 Lennart Poettering <lennart@poettering.net>
+ * Copyright (C) 2009-2010 David Zeuthen <zeuthen@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <getopt.h>
+#include <scsi/scsi.h>
+#include <scsi/sg.h>
+#include <scsi/scsi_ioctl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <linux/types.h>
+#include <linux/hdreg.h>
+#include <linux/fs.h>
+#include <linux/cdrom.h>
+#include <linux/bsg.h>
+#include <arpa/inet.h>
+
+#include "libudev.h"
+#include "libudev-private.h"
+
+#define COMMAND_TIMEOUT_MSEC (30 * 1000)
+
+static int disk_scsi_inquiry_command(int fd,
+ void *buf,
+ size_t buf_len)
+{
+ struct sg_io_v4 io_v4;
+ uint8_t cdb[6];
+ uint8_t sense[32];
+ int ret;
+
+ /*
+ * INQUIRY, see SPC-4 section 6.4
+ */
+ memset(cdb, 0, sizeof(cdb));
+ cdb[0] = 0x12; /* OPERATION CODE: INQUIRY */
+ cdb[3] = (buf_len >> 8); /* ALLOCATION LENGTH */
+ cdb[4] = (buf_len & 0xff);
+
+ memset(sense, 0, sizeof(sense));
+
+ memset(&io_v4, 0, sizeof(struct sg_io_v4));
+ io_v4.guard = 'Q';
+ io_v4.protocol = BSG_PROTOCOL_SCSI;
+ io_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD;
+ io_v4.request_len = sizeof (cdb);
+ io_v4.request = (uintptr_t) cdb;
+ io_v4.max_response_len = sizeof (sense);
+ io_v4.response = (uintptr_t) sense;
+ io_v4.din_xfer_len = buf_len;
+ io_v4.din_xferp = (uintptr_t) buf;
+ io_v4.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_v4);
+ if (ret != 0) {
+ /* could be that the driver doesn't do version 4, try version 3 */
+ if (errno == EINVAL) {
+ struct sg_io_hdr io_hdr;
+
+ memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
+ io_hdr.interface_id = 'S';
+ io_hdr.cmdp = (unsigned char*) cdb;
+ io_hdr.cmd_len = sizeof (cdb);
+ io_hdr.dxferp = buf;
+ io_hdr.dxfer_len = buf_len;
+ io_hdr.sbp = sense;
+ io_hdr.mx_sb_len = sizeof (sense);
+ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
+ io_hdr.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_hdr);
+ if (ret != 0)
+ goto out;
+
+ /* even if the ioctl succeeds, we need to check the return value */
+ if (!(io_hdr.status == 0 &&
+ io_hdr.host_status == 0 &&
+ io_hdr.driver_status == 0)) {
+ errno = EIO;
+ ret = -1;
+ goto out;
+ }
+ } else {
+ goto out;
+ }
+ }
+
+ /* even if the ioctl succeeds, we need to check the return value */
+ if (!(io_v4.device_status == 0 &&
+ io_v4.transport_status == 0 &&
+ io_v4.driver_status == 0)) {
+ errno = EIO;
+ ret = -1;
+ goto out;
+ }
+
+ out:
+ return ret;
+}
+
+static int disk_identify_command(int fd,
+ void *buf,
+ size_t buf_len)
+{
+ struct sg_io_v4 io_v4;
+ uint8_t cdb[12];
+ uint8_t sense[32];
+ uint8_t *desc = sense+8;
+ int ret;
+
+ /*
+ * ATA Pass-Through 12 byte command, as described in
+ *
+ * T10 04-262r8 ATA Command Pass-Through
+ *
+ * from http://www.t10.org/ftp/t10/document.04/04-262r8.pdf
+ */
+ memset(cdb, 0, sizeof(cdb));
+ cdb[0] = 0xa1; /* OPERATION CODE: 12 byte pass through */
+ cdb[1] = 4 << 1; /* PROTOCOL: PIO Data-in */
+ cdb[2] = 0x2e; /* OFF_LINE=0, CK_COND=1, T_DIR=1, BYT_BLOK=1, T_LENGTH=2 */
+ cdb[3] = 0; /* FEATURES */
+ cdb[4] = 1; /* SECTORS */
+ cdb[5] = 0; /* LBA LOW */
+ cdb[6] = 0; /* LBA MID */
+ cdb[7] = 0; /* LBA HIGH */
+ cdb[8] = 0 & 0x4F; /* SELECT */
+ cdb[9] = 0xEC; /* Command: ATA IDENTIFY DEVICE */;
+ memset(sense, 0, sizeof(sense));
+
+ memset(&io_v4, 0, sizeof(struct sg_io_v4));
+ io_v4.guard = 'Q';
+ io_v4.protocol = BSG_PROTOCOL_SCSI;
+ io_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD;
+ io_v4.request_len = sizeof (cdb);
+ io_v4.request = (uintptr_t) cdb;
+ io_v4.max_response_len = sizeof (sense);
+ io_v4.response = (uintptr_t) sense;
+ io_v4.din_xfer_len = buf_len;
+ io_v4.din_xferp = (uintptr_t) buf;
+ io_v4.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_v4);
+ if (ret != 0) {
+ /* could be that the driver doesn't do version 4, try version 3 */
+ if (errno == EINVAL) {
+ struct sg_io_hdr io_hdr;
+
+ memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
+ io_hdr.interface_id = 'S';
+ io_hdr.cmdp = (unsigned char*) cdb;
+ io_hdr.cmd_len = sizeof (cdb);
+ io_hdr.dxferp = buf;
+ io_hdr.dxfer_len = buf_len;
+ io_hdr.sbp = sense;
+ io_hdr.mx_sb_len = sizeof (sense);
+ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
+ io_hdr.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_hdr);
+ if (ret != 0)
+ goto out;
+ } else {
+ goto out;
+ }
+ }
+
+ if (!(sense[0] == 0x72 && desc[0] == 0x9 && desc[1] == 0x0c)) {
+ errno = EIO;
+ ret = -1;
+ goto out;
+ }
+
+ out:
+ return ret;
+}
+
+static int disk_identify_packet_device_command(int fd,
+ void *buf,
+ size_t buf_len)
+{
+ struct sg_io_v4 io_v4;
+ uint8_t cdb[16];
+ uint8_t sense[32];
+ uint8_t *desc = sense+8;
+ int ret;
+
+ /*
+ * ATA Pass-Through 16 byte command, as described in
+ *
+ * T10 04-262r8 ATA Command Pass-Through
+ *
+ * from http://www.t10.org/ftp/t10/document.04/04-262r8.pdf
+ */
+ memset(cdb, 0, sizeof(cdb));
+ cdb[0] = 0x85; /* OPERATION CODE: 16 byte pass through */
+ cdb[1] = 4 << 1; /* PROTOCOL: PIO Data-in */
+ cdb[2] = 0x2e; /* OFF_LINE=0, CK_COND=1, T_DIR=1, BYT_BLOK=1, T_LENGTH=2 */
+ cdb[3] = 0; /* FEATURES */
+ cdb[4] = 0; /* FEATURES */
+ cdb[5] = 0; /* SECTORS */
+ cdb[6] = 1; /* SECTORS */
+ cdb[7] = 0; /* LBA LOW */
+ cdb[8] = 0; /* LBA LOW */
+ cdb[9] = 0; /* LBA MID */
+ cdb[10] = 0; /* LBA MID */
+ cdb[11] = 0; /* LBA HIGH */
+ cdb[12] = 0; /* LBA HIGH */
+ cdb[13] = 0; /* DEVICE */
+ cdb[14] = 0xA1; /* Command: ATA IDENTIFY PACKET DEVICE */;
+ cdb[15] = 0; /* CONTROL */
+ memset(sense, 0, sizeof(sense));
+
+ memset(&io_v4, 0, sizeof(struct sg_io_v4));
+ io_v4.guard = 'Q';
+ io_v4.protocol = BSG_PROTOCOL_SCSI;
+ io_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_CMD;
+ io_v4.request_len = sizeof (cdb);
+ io_v4.request = (uintptr_t) cdb;
+ io_v4.max_response_len = sizeof (sense);
+ io_v4.response = (uintptr_t) sense;
+ io_v4.din_xfer_len = buf_len;
+ io_v4.din_xferp = (uintptr_t) buf;
+ io_v4.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_v4);
+ if (ret != 0) {
+ /* could be that the driver doesn't do version 4, try version 3 */
+ if (errno == EINVAL) {
+ struct sg_io_hdr io_hdr;
+
+ memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
+ io_hdr.interface_id = 'S';
+ io_hdr.cmdp = (unsigned char*) cdb;
+ io_hdr.cmd_len = sizeof (cdb);
+ io_hdr.dxferp = buf;
+ io_hdr.dxfer_len = buf_len;
+ io_hdr.sbp = sense;
+ io_hdr.mx_sb_len = sizeof (sense);
+ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
+ io_hdr.timeout = COMMAND_TIMEOUT_MSEC;
+
+ ret = ioctl(fd, SG_IO, &io_hdr);
+ if (ret != 0)
+ goto out;
+ } else {
+ goto out;
+ }
+ }
+
+ if (!(sense[0] == 0x72 && desc[0] == 0x9 && desc[1] == 0x0c)) {
+ errno = EIO;
+ ret = -1;
+ goto out;
+ }
+
+ out:
+ return ret;
+}
+
+/**
+ * disk_identify_get_string:
+ * @identify: A block of IDENTIFY data
+ * @offset_words: Offset of the string to get, in words.
+ * @dest: Destination buffer for the string.
+ * @dest_len: Length of destination buffer, in bytes.
+ *
+ * Copies the ATA string from @identify located at @offset_words into @dest.
+ */
+static void disk_identify_get_string(uint8_t identify[512],
+ unsigned int offset_words,
+ char *dest,
+ size_t dest_len)
+{
+ unsigned int c1;
+ unsigned int c2;
+
+ assert(identify != NULL);
+ assert(dest != NULL);
+ assert((dest_len & 1) == 0);
+
+ while (dest_len > 0) {
+ c1 = identify[offset_words * 2 + 1];
+ c2 = identify[offset_words * 2];
+ *dest = c1;
+ dest++;
+ *dest = c2;
+ dest++;
+ offset_words++;
+ dest_len -= 2;
+ }
+}
+
+static void disk_identify_fixup_string(uint8_t identify[512],
+ unsigned int offset_words,
+ size_t len)
+{
+ disk_identify_get_string(identify, offset_words,
+ (char *) identify + offset_words * 2, len);
+}
+
+static void disk_identify_fixup_uint16 (uint8_t identify[512], unsigned int offset_words)
+{
+ uint16_t *p;
+
+ p = (uint16_t *) identify;
+ p[offset_words] = le16toh (p[offset_words]);
+}
+
+/**
+ * disk_identify:
+ * @udev: The libudev context.
+ * @fd: File descriptor for the block device.
+ * @out_identify: Return location for IDENTIFY data.
+ * @out_is_packet_device: Return location for whether returned data is from a IDENTIFY PACKET DEVICE.
+ *
+ * Sends the IDENTIFY DEVICE or IDENTIFY PACKET DEVICE command to the
+ * device represented by @fd. If successful, then the result will be
+ * copied into @out_identify and @out_is_packet_device.
+ *
+ * This routine is based on code from libatasmart, Copyright 2008
+ * Lennart Poettering, LGPL v2.1.
+ *
+ * Returns: 0 if the data was successfully obtained, otherwise
+ * non-zero with errno set.
+ */
+static int disk_identify(struct udev *udev,
+ int fd,
+ uint8_t out_identify[512],
+ int *out_is_packet_device)
+{
+ int ret;
+ uint8_t inquiry_buf[36];
+ int peripheral_device_type;
+ int all_nul_bytes;
+ int n;
+ int is_packet_device;
+
+ assert(out_identify != NULL);
+
+ /* init results */
+ ret = -1;
+ memset(out_identify, '\0', 512);
+ is_packet_device = 0;
+
+ /* If we were to use ATA PASS_THROUGH (12) on an ATAPI device
+ * we could accidentally blank media. This is because MMC's BLANK
+ * command has the same op-code (0x61).
+ *
+ * To prevent this from happening we bail out if the device
+ * isn't a Direct Access Block Device, e.g. SCSI type 0x00
+ * (CD/DVD devices are type 0x05). So we send a SCSI INQUIRY
+ * command first... libata is handling this via its SCSI
+ * emulation layer.
+ *
+ * This also ensures that we're actually dealing with a device
+ * that understands SCSI commands.
+ *
+ * (Yes, it is a bit perverse that we're tunneling the ATA
+ * command through SCSI and relying on the ATA driver
+ * emulating SCSI well-enough...)
+ *
+ * (See commit 160b069c25690bfb0c785994c7c3710289179107 for
+ * the original bug-fix and see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=556635
+ * for the original bug-report.)
+ */
+ ret = disk_scsi_inquiry_command (fd, inquiry_buf, sizeof (inquiry_buf));
+ if (ret != 0)
+ goto out;
+
+ /* SPC-4, section 6.4.2: Standard INQUIRY data */
+ peripheral_device_type = inquiry_buf[0] & 0x1f;
+ if (peripheral_device_type == 0x05)
+ {
+ is_packet_device = 1;
+ ret = disk_identify_packet_device_command(fd, out_identify, 512);
+ goto check_nul_bytes;
+ }
+ if (peripheral_device_type != 0x00) {
+ ret = -1;
+ errno = EIO;
+ goto out;
+ }
+
+ /* OK, now issue the IDENTIFY DEVICE command */
+ ret = disk_identify_command(fd, out_identify, 512);
+ if (ret != 0)
+ goto out;
+
+ check_nul_bytes:
+ /* Check if IDENTIFY data is all NUL bytes - if so, bail */
+ all_nul_bytes = 1;
+ for (n = 0; n < 512; n++) {
+ if (out_identify[n] != '\0') {
+ all_nul_bytes = 0;
+ break;
+ }
+ }
+
+ if (all_nul_bytes) {
+ ret = -1;
+ errno = EIO;
+ goto out;
+ }
+
+out:
+ if (out_is_packet_device != NULL)
+ *out_is_packet_device = is_packet_device;
+ return ret;
+}
+
+static void log_fn(struct udev *udev, int priority,
+ const char *file, int line, const char *fn,
+ const char *format, va_list args)
+{
+ vsyslog(priority, format, args);
+}
+
+int main(int argc, char *argv[])
+{
+ struct udev *udev;
+ struct hd_driveid id;
+ uint8_t identify[512];
+ uint16_t *identify_words;
+ char model[41];
+ char model_enc[256];
+ char serial[21];
+ char revision[9];
+ const char *node = NULL;
+ int export = 0;
+ int fd;
+ uint16_t word;
+ int rc = 0;
+ int is_packet_device = 0;
+ static const struct option options[] = {
+ { "export", no_argument, NULL, 'x' },
+ { "help", no_argument, NULL, 'h' },
+ {}
+ };
+
+ udev = udev_new();
+ if (udev == NULL)
+ goto exit;
+
+ udev_log_init("ata_id");
+ udev_set_log_fn(udev, log_fn);
+
+ while (1) {
+ int option;
+
+ option = getopt_long(argc, argv, "xh", options, NULL);
+ if (option == -1)
+ break;
+
+ switch (option) {
+ case 'x':
+ export = 1;
+ break;
+ case 'h':
+ printf("Usage: ata_id [--export] [--help] <device>\n"
+ " --export print values as environment keys\n"
+ " --help print this help text\n\n");
+ goto exit;
+ }
+ }
+
+ node = argv[optind];
+ if (node == NULL) {
+ err(udev, "no node specified\n");
+ rc = 1;
+ goto exit;
+ }
+
+ fd = open(node, O_RDONLY|O_NONBLOCK);
+ if (fd < 0) {
+ err(udev, "unable to open '%s'\n", node);
+ rc = 1;
+ goto exit;
+ }
+
+ if (disk_identify(udev, fd, identify, &is_packet_device) == 0) {
+ /*
+ * fix up only the fields from the IDENTIFY data that we are going to
+ * use and copy it into the hd_driveid struct for convenience
+ */
+ disk_identify_fixup_string (identify, 10, 20); /* serial */
+ disk_identify_fixup_string (identify, 23, 6); /* fwrev */
+ disk_identify_fixup_string (identify, 27, 40); /* model */
+ disk_identify_fixup_uint16 (identify, 0); /* configuration */
+ disk_identify_fixup_uint16 (identify, 75); /* queue depth */
+ disk_identify_fixup_uint16 (identify, 75); /* SATA capabilities */
+ disk_identify_fixup_uint16 (identify, 82); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 83); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 84); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 85); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 86); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 87); /* command set supported */
+ disk_identify_fixup_uint16 (identify, 89); /* time required for SECURITY ERASE UNIT */
+ disk_identify_fixup_uint16 (identify, 90); /* time required for enhanced SECURITY ERASE UNIT */
+ disk_identify_fixup_uint16 (identify, 91); /* current APM values */
+ disk_identify_fixup_uint16 (identify, 94); /* current AAM value */
+ disk_identify_fixup_uint16 (identify, 128); /* device lock function */
+ disk_identify_fixup_uint16 (identify, 217); /* nominal media rotation rate */
+ memcpy(&id, identify, sizeof id);
+ } else {
+ /* If this fails, then try HDIO_GET_IDENTITY */
+ if (ioctl(fd, HDIO_GET_IDENTITY, &id) != 0) {
+ info(udev, "HDIO_GET_IDENTITY failed for '%s': %m\n", node);
+ rc = 2;
+ goto close;
+ }
+ }
+ identify_words = (uint16_t *) identify;
+
+ memcpy (model, id.model, 40);
+ model[40] = '\0';
+ udev_util_encode_string(model, model_enc, sizeof(model_enc));
+ util_replace_whitespace((char *) id.model, model, 40);
+ util_replace_chars(model, NULL);
+ util_replace_whitespace((char *) id.serial_no, serial, 20);
+ util_replace_chars(serial, NULL);
+ util_replace_whitespace((char *) id.fw_rev, revision, 8);
+ util_replace_chars(revision, NULL);
+
+ if (export) {
+ /* Set this to convey the disk speaks the ATA protocol */
+ printf("ID_ATA=1\n");
+
+ if ((id.config >> 8) & 0x80) {
+ /* This is an ATAPI device */
+ switch ((id.config >> 8) & 0x1f) {
+ case 0:
+ printf("ID_TYPE=cd\n");
+ break;
+ case 1:
+ printf("ID_TYPE=tape\n");
+ break;
+ case 5:
+ printf("ID_TYPE=cd\n");
+ break;
+ case 7:
+ printf("ID_TYPE=optical\n");
+ break;
+ default:
+ printf("ID_TYPE=generic\n");
+ break;
+ }
+ } else {
+ printf("ID_TYPE=disk\n");
+ }
+ printf("ID_BUS=ata\n");
+ printf("ID_MODEL=%s\n", model);
+ printf("ID_MODEL_ENC=%s\n", model_enc);
+ printf("ID_REVISION=%s\n", revision);
+ if (serial[0] != '\0') {
+ printf("ID_SERIAL=%s_%s\n", model, serial);
+ printf("ID_SERIAL_SHORT=%s\n", serial);
+ } else {
+ printf("ID_SERIAL=%s\n", model);
+ }
+
+ if (id.command_set_1 & (1<<5)) {
+ printf ("ID_ATA_WRITE_CACHE=1\n");
+ printf ("ID_ATA_WRITE_CACHE_ENABLED=%d\n", (id.cfs_enable_1 & (1<<5)) ? 1 : 0);
+ }
+ if (id.command_set_1 & (1<<10)) {
+ printf("ID_ATA_FEATURE_SET_HPA=1\n");
+ printf("ID_ATA_FEATURE_SET_HPA_ENABLED=%d\n", (id.cfs_enable_1 & (1<<10)) ? 1 : 0);
+
+ /*
+ * TODO: use the READ NATIVE MAX ADDRESS command to get the native max address
+ * so it is easy to check whether the protected area is in use.
+ */
+ }
+ if (id.command_set_1 & (1<<3)) {
+ printf("ID_ATA_FEATURE_SET_PM=1\n");
+ printf("ID_ATA_FEATURE_SET_PM_ENABLED=%d\n", (id.cfs_enable_1 & (1<<3)) ? 1 : 0);
+ }
+ if (id.command_set_1 & (1<<1)) {
+ printf("ID_ATA_FEATURE_SET_SECURITY=1\n");
+ printf("ID_ATA_FEATURE_SET_SECURITY_ENABLED=%d\n", (id.cfs_enable_1 & (1<<1)) ? 1 : 0);
+ printf("ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=%d\n", id.trseuc * 2);
+ if ((id.cfs_enable_1 & (1<<1))) /* enabled */ {
+ if (id.dlf & (1<<8))
+ printf("ID_ATA_FEATURE_SET_SECURITY_LEVEL=maximum\n");
+ else
+ printf("ID_ATA_FEATURE_SET_SECURITY_LEVEL=high\n");
+ }
+ if (id.dlf & (1<<5))
+ printf("ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=%d\n", id.trsEuc * 2);
+ if (id.dlf & (1<<4))
+ printf("ID_ATA_FEATURE_SET_SECURITY_EXPIRE=1\n");
+ if (id.dlf & (1<<3))
+ printf("ID_ATA_FEATURE_SET_SECURITY_FROZEN=1\n");
+ if (id.dlf & (1<<2))
+ printf("ID_ATA_FEATURE_SET_SECURITY_LOCKED=1\n");
+ }
+ if (id.command_set_1 & (1<<0)) {
+ printf("ID_ATA_FEATURE_SET_SMART=1\n");
+ printf("ID_ATA_FEATURE_SET_SMART_ENABLED=%d\n", (id.cfs_enable_1 & (1<<0)) ? 1 : 0);
+ }
+ if (id.command_set_2 & (1<<9)) {
+ printf("ID_ATA_FEATURE_SET_AAM=1\n");
+ printf("ID_ATA_FEATURE_SET_AAM_ENABLED=%d\n", (id.cfs_enable_2 & (1<<9)) ? 1 : 0);
+ printf("ID_ATA_FEATURE_SET_AAM_VENDOR_RECOMMENDED_VALUE=%d\n", id.acoustic >> 8);
+ printf("ID_ATA_FEATURE_SET_AAM_CURRENT_VALUE=%d\n", id.acoustic & 0xff);
+ }
+ if (id.command_set_2 & (1<<5)) {
+ printf("ID_ATA_FEATURE_SET_PUIS=1\n");
+ printf("ID_ATA_FEATURE_SET_PUIS_ENABLED=%d\n", (id.cfs_enable_2 & (1<<5)) ? 1 : 0);
+ }
+ if (id.command_set_2 & (1<<3)) {
+ printf("ID_ATA_FEATURE_SET_APM=1\n");
+ printf("ID_ATA_FEATURE_SET_APM_ENABLED=%d\n", (id.cfs_enable_2 & (1<<3)) ? 1 : 0);
+ if ((id.cfs_enable_2 & (1<<3)))
+ printf("ID_ATA_FEATURE_SET_APM_CURRENT_VALUE=%d\n", id.CurAPMvalues & 0xff);
+ }
+ if (id.command_set_2 & (1<<0))
+ printf("ID_ATA_DOWNLOAD_MICROCODE=1\n");
+
+ /*
+ * Word 76 indicates the capabilities of a SATA device. A PATA device shall set
+ * word 76 to 0000h or FFFFh. If word 76 is set to 0000h or FFFFh, then
+ * the device does not claim compliance with the Serial ATA specification and words
+ * 76 through 79 are not valid and shall be ignored.
+ */
+ word = *((uint16_t *) identify + 76);
+ if (word != 0x0000 && word != 0xffff) {
+ printf("ID_ATA_SATA=1\n");
+ /*
+ * If bit 2 of word 76 is set to one, then the device supports the Gen2
+ * signaling rate of 3.0 Gb/s (see SATA 2.6).
+ *
+ * If bit 1 of word 76 is set to one, then the device supports the Gen1
+ * signaling rate of 1.5 Gb/s (see SATA 2.6).
+ */
+ if (word & (1<<2))
+ printf("ID_ATA_SATA_SIGNAL_RATE_GEN2=1\n");
+ if (word & (1<<1))
+ printf("ID_ATA_SATA_SIGNAL_RATE_GEN1=1\n");
+ }
+
+ /* Word 217 indicates the nominal media rotation rate of the device */
+ word = *((uint16_t *) identify + 217);
+ if (word != 0x0000) {
+ if (word == 0x0001) {
+ printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */
+ } else if (word >= 0x0401 && word <= 0xfffe) {
+ printf ("ID_ATA_ROTATION_RATE_RPM=%d\n", word);
+ }
+ }
+
+ /*
+ * Words 108-111 contain a mandatory World Wide Name (WWN) in the NAA IEEE Registered identifier
+ * format. Word 108 bits (15:12) shall contain 5h, indicating that the naming authority is IEEE.
+ * All other values are reserved.
+ */
+ word = *((uint16_t *) identify + 108);
+ if ((word & 0xf000) == 0x5000) {
+ uint64_t wwwn;
+
+ wwwn = *((uint16_t *) identify + 108);
+ wwwn <<= 16;
+ wwwn |= *((uint16_t *) identify + 109);
+ wwwn <<= 16;
+ wwwn |= *((uint16_t *) identify + 110);
+ wwwn <<= 16;
+ wwwn |= *((uint16_t *) identify + 111);
+ printf("ID_WWN=0x%llx\n", (unsigned long long int) wwwn);
+ /* ATA devices have no vendor extension */
+ printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn);
+ }
+
+ /* from Linux's include/linux/ata.h */
+ if (identify_words[0] == 0x848a || identify_words[0] == 0x844a) {
+ printf("ID_ATA_CFA=1\n");
+ } else {
+ if ((identify_words[83] & 0xc004) == 0x4004) {
+ printf("ID_ATA_CFA=1\n");
+ }
+ }
+ } else {
+ if (serial[0] != '\0')
+ printf("%s_%s\n", model, serial);
+ else
+ printf("%s\n", model);
+ }
+close:
+ close(fd);
+exit:
+ udev_unref(udev);
+ udev_log_close();
+ return rc;
+}
diff --git a/src/udev/src/cdrom_id/60-cdrom_id.rules b/src/udev/src/cdrom_id/60-cdrom_id.rules
new file mode 100644
index 000000000..6eaf76a72
--- /dev/null
+++ b/src/udev/src/cdrom_id/60-cdrom_id.rules
@@ -0,0 +1,20 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="cdrom_end"
+SUBSYSTEM!="block", GOTO="cdrom_end"
+KERNEL!="sr[0-9]*|xvd*", GOTO="cdrom_end"
+ENV{DEVTYPE}!="disk", GOTO="cdrom_end"
+
+# unconditionally tag device as CDROM
+KERNEL=="sr[0-9]*", ENV{ID_CDROM}="1"
+
+# media eject button pressed
+ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdrom_id --eject-media $devnode", GOTO="cdrom_end"
+
+# import device and media properties and lock tray to
+# enable the receiving of media eject button events
+IMPORT{program}="cdrom_id --lock-media $devnode"
+
+KERNEL=="sr0", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"
+
+LABEL="cdrom_end"
diff --git a/src/udev/src/cdrom_id/cdrom_id.c b/src/udev/src/cdrom_id/cdrom_id.c
new file mode 100644
index 000000000..f90d52ec9
--- /dev/null
+++ b/src/udev/src/cdrom_id/cdrom_id.c
@@ -0,0 +1,1099 @@
+/*
+ * cdrom_id - optical drive and media information prober
+ *
+ * Copyright (C) 2008-2010 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <getopt.h>
+#include <time.h>
+#include <scsi/sg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <linux/cdrom.h>
+
+#include "libudev.h"
+#include "libudev-private.h"
+
+static bool debug;
+
+static void log_fn(struct udev *udev, int priority,
+ const char *file, int line, const char *fn,
+ const char *format, va_list args)
+{
+ if (debug) {
+ fprintf(stderr, "%s: ", fn);
+ vfprintf(stderr, format, args);
+ } else {
+ vsyslog(priority, format, args);
+ }
+}
+
+/* device info */
+static unsigned int cd_cd_rom;
+static unsigned int cd_cd_r;
+static unsigned int cd_cd_rw;
+static unsigned int cd_dvd_rom;
+static unsigned int cd_dvd_r;
+static unsigned int cd_dvd_rw;
+static unsigned int cd_dvd_ram;
+static unsigned int cd_dvd_plus_r;
+static unsigned int cd_dvd_plus_rw;
+static unsigned int cd_dvd_plus_r_dl;
+static unsigned int cd_dvd_plus_rw_dl;
+static unsigned int cd_bd;
+static unsigned int cd_bd_r;
+static unsigned int cd_bd_re;
+static unsigned int cd_hddvd;
+static unsigned int cd_hddvd_r;
+static unsigned int cd_hddvd_rw;
+static unsigned int cd_mo;
+static unsigned int cd_mrw;
+static unsigned int cd_mrw_w;
+
+/* media info */
+static unsigned int cd_media;
+static unsigned int cd_media_cd_rom;
+static unsigned int cd_media_cd_r;
+static unsigned int cd_media_cd_rw;
+static unsigned int cd_media_dvd_rom;
+static unsigned int cd_media_dvd_r;
+static unsigned int cd_media_dvd_rw;
+static unsigned int cd_media_dvd_rw_ro; /* restricted overwrite mode */
+static unsigned int cd_media_dvd_rw_seq; /* sequential mode */
+static unsigned int cd_media_dvd_ram;
+static unsigned int cd_media_dvd_plus_r;
+static unsigned int cd_media_dvd_plus_rw;
+static unsigned int cd_media_dvd_plus_r_dl;
+static unsigned int cd_media_dvd_plus_rw_dl;
+static unsigned int cd_media_bd;
+static unsigned int cd_media_bd_r;
+static unsigned int cd_media_bd_re;
+static unsigned int cd_media_hddvd;
+static unsigned int cd_media_hddvd_r;
+static unsigned int cd_media_hddvd_rw;
+static unsigned int cd_media_mo;
+static unsigned int cd_media_mrw;
+static unsigned int cd_media_mrw_w;
+
+static const char *cd_media_state = NULL;
+static unsigned int cd_media_session_next;
+static unsigned int cd_media_session_count;
+static unsigned int cd_media_track_count;
+static unsigned int cd_media_track_count_data;
+static unsigned int cd_media_track_count_audio;
+static unsigned long long int cd_media_session_last_offset;
+
+#define ERRCODE(s) ((((s)[2] & 0x0F) << 16) | ((s)[12] << 8) | ((s)[13]))
+#define SK(errcode) (((errcode) >> 16) & 0xF)
+#define ASC(errcode) (((errcode) >> 8) & 0xFF)
+#define ASCQ(errcode) ((errcode) & 0xFF)
+
+static bool is_mounted(const char *device)
+{
+ struct stat statbuf;
+ FILE *fp;
+ int maj, min;
+ bool mounted = false;
+
+ if (stat(device, &statbuf) < 0)
+ return -ENODEV;
+
+ fp = fopen("/proc/self/mountinfo", "r");
+ if (fp == NULL)
+ return -ENOSYS;
+ while (fscanf(fp, "%*s %*s %i:%i %*[^\n]", &maj, &min) == 2) {
+ if (makedev(maj, min) == statbuf.st_rdev) {
+ mounted = true;
+ break;
+ }
+ }
+ fclose(fp);
+ return mounted;
+}
+
+static void info_scsi_cmd_err(struct udev *udev, char *cmd, int err)
+{
+ if (err == -1) {
+ info(udev, "%s failed\n", cmd);
+ return;
+ }
+ info(udev, "%s failed with SK=%Xh/ASC=%02Xh/ACQ=%02Xh\n", cmd, SK(err), ASC(err), ASCQ(err));
+}
+
+struct scsi_cmd {
+ struct cdrom_generic_command cgc;
+ union {
+ struct request_sense s;
+ unsigned char u[18];
+ } _sense;
+ struct sg_io_hdr sg_io;
+};
+
+static void scsi_cmd_init(struct udev *udev, struct scsi_cmd *cmd)
+{
+ memset(cmd, 0x00, sizeof(struct scsi_cmd));
+ cmd->cgc.quiet = 1;
+ cmd->cgc.sense = &cmd->_sense.s;
+ cmd->sg_io.interface_id = 'S';
+ cmd->sg_io.mx_sb_len = sizeof(cmd->_sense);
+ cmd->sg_io.cmdp = cmd->cgc.cmd;
+ cmd->sg_io.sbp = cmd->_sense.u;
+ cmd->sg_io.flags = SG_FLAG_LUN_INHIBIT | SG_FLAG_DIRECT_IO;
+}
+
+static void scsi_cmd_set(struct udev *udev, struct scsi_cmd *cmd, size_t i, unsigned char arg)
+{
+ cmd->sg_io.cmd_len = i + 1;
+ cmd->cgc.cmd[i] = arg;
+}
+
+#define CHECK_CONDITION 0x01
+
+static int scsi_cmd_run(struct udev *udev, struct scsi_cmd *cmd, int fd, unsigned char *buf, size_t bufsize)
+{
+ int ret = 0;
+
+ if (bufsize > 0) {
+ cmd->sg_io.dxferp = buf;
+ cmd->sg_io.dxfer_len = bufsize;
+ cmd->sg_io.dxfer_direction = SG_DXFER_FROM_DEV;
+ } else {
+ cmd->sg_io.dxfer_direction = SG_DXFER_NONE;
+ }
+ if (ioctl(fd, SG_IO, &cmd->sg_io))
+ return -1;
+
+ if ((cmd->sg_io.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
+ errno = EIO;
+ ret = -1;
+ if (cmd->sg_io.masked_status & CHECK_CONDITION) {
+ ret = ERRCODE(cmd->_sense.u);
+ if (ret == 0)
+ ret = -1;
+ }
+ }
+ return ret;
+}
+
+static int media_lock(struct udev *udev, int fd, bool lock)
+{
+ int err;
+
+ /* disable the kernel's lock logic */
+ err = ioctl(fd, CDROM_CLEAR_OPTIONS, CDO_LOCK);
+ if (err < 0)
+ info(udev, "CDROM_CLEAR_OPTIONS, CDO_LOCK failed\n");
+
+ err = ioctl(fd, CDROM_LOCKDOOR, lock ? 1 : 0);
+ if (err < 0)
+ info(udev, "CDROM_LOCKDOOR failed\n");
+
+ return err;
+}
+
+static int media_eject(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ int err;
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x1b);
+ scsi_cmd_set(udev, &sc, 4, 0x02);
+ scsi_cmd_set(udev, &sc, 5, 0);
+ err = scsi_cmd_run(udev, &sc, fd, NULL, 0);
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "START_STOP_UNIT", err);
+ return -1;
+ }
+ return 0;
+}
+
+static int cd_capability_compat(struct udev *udev, int fd)
+{
+ int capability;
+
+ capability = ioctl(fd, CDROM_GET_CAPABILITY, NULL);
+ if (capability < 0) {
+ info(udev, "CDROM_GET_CAPABILITY failed\n");
+ return -1;
+ }
+
+ if (capability & CDC_CD_R)
+ cd_cd_r = 1;
+ if (capability & CDC_CD_RW)
+ cd_cd_rw = 1;
+ if (capability & CDC_DVD)
+ cd_dvd_rom = 1;
+ if (capability & CDC_DVD_R)
+ cd_dvd_r = 1;
+ if (capability & CDC_DVD_RAM)
+ cd_dvd_ram = 1;
+ if (capability & CDC_MRW)
+ cd_mrw = 1;
+ if (capability & CDC_MRW_W)
+ cd_mrw_w = 1;
+ return 0;
+}
+
+static int cd_media_compat(struct udev *udev, int fd)
+{
+ if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) != CDS_DISC_OK) {
+ info(udev, "CDROM_DRIVE_STATUS != CDS_DISC_OK\n");
+ return -1;
+ }
+ cd_media = 1;
+ return 0;
+}
+
+static int cd_inquiry(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ unsigned char inq[128];
+ int err;
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x12);
+ scsi_cmd_set(udev, &sc, 4, 36);
+ scsi_cmd_set(udev, &sc, 5, 0);
+ err = scsi_cmd_run(udev, &sc, fd, inq, 36);
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "INQUIRY", err);
+ return -1;
+ }
+
+ if ((inq[0] & 0x1F) != 5) {
+ info(udev, "not an MMC unit\n");
+ return -1;
+ }
+
+ info(udev, "INQUIRY: [%.8s][%.16s][%.4s]\n", inq + 8, inq + 16, inq + 32);
+ return 0;
+}
+
+static void feature_profile_media(struct udev *udev, int cur_profile)
+{
+ switch (cur_profile) {
+ case 0x03:
+ case 0x04:
+ case 0x05:
+ info(udev, "profile 0x%02x \n", cur_profile);
+ cd_media = 1;
+ cd_media_mo = 1;
+ break;
+ case 0x08:
+ info(udev, "profile 0x%02x media_cd_rom\n", cur_profile);
+ cd_media = 1;
+ cd_media_cd_rom = 1;
+ break;
+ case 0x09:
+ info(udev, "profile 0x%02x media_cd_r\n", cur_profile);
+ cd_media = 1;
+ cd_media_cd_r = 1;
+ break;
+ case 0x0a:
+ info(udev, "profile 0x%02x media_cd_rw\n", cur_profile);
+ cd_media = 1;
+ cd_media_cd_rw = 1;
+ break;
+ case 0x10:
+ info(udev, "profile 0x%02x media_dvd_ro\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_rom = 1;
+ break;
+ case 0x11:
+ info(udev, "profile 0x%02x media_dvd_r\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_r = 1;
+ break;
+ case 0x12:
+ info(udev, "profile 0x%02x media_dvd_ram\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_ram = 1;
+ break;
+ case 0x13:
+ info(udev, "profile 0x%02x media_dvd_rw_ro\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_rw = 1;
+ cd_media_dvd_rw_ro = 1;
+ break;
+ case 0x14:
+ info(udev, "profile 0x%02x media_dvd_rw_seq\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_rw = 1;
+ cd_media_dvd_rw_seq = 1;
+ break;
+ case 0x1B:
+ info(udev, "profile 0x%02x media_dvd_plus_r\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_plus_r = 1;
+ break;
+ case 0x1A:
+ info(udev, "profile 0x%02x media_dvd_plus_rw\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_plus_rw = 1;
+ break;
+ case 0x2A:
+ info(udev, "profile 0x%02x media_dvd_plus_rw_dl\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_plus_rw_dl = 1;
+ break;
+ case 0x2B:
+ info(udev, "profile 0x%02x media_dvd_plus_r_dl\n", cur_profile);
+ cd_media = 1;
+ cd_media_dvd_plus_r_dl = 1;
+ break;
+ case 0x40:
+ info(udev, "profile 0x%02x media_bd\n", cur_profile);
+ cd_media = 1;
+ cd_media_bd = 1;
+ break;
+ case 0x41:
+ case 0x42:
+ info(udev, "profile 0x%02x media_bd_r\n", cur_profile);
+ cd_media = 1;
+ cd_media_bd_r = 1;
+ break;
+ case 0x43:
+ info(udev, "profile 0x%02x media_bd_re\n", cur_profile);
+ cd_media = 1;
+ cd_media_bd_re = 1;
+ break;
+ case 0x50:
+ info(udev, "profile 0x%02x media_hddvd\n", cur_profile);
+ cd_media = 1;
+ cd_media_hddvd = 1;
+ break;
+ case 0x51:
+ info(udev, "profile 0x%02x media_hddvd_r\n", cur_profile);
+ cd_media = 1;
+ cd_media_hddvd_r = 1;
+ break;
+ case 0x52:
+ info(udev, "profile 0x%02x media_hddvd_rw\n", cur_profile);
+ cd_media = 1;
+ cd_media_hddvd_rw = 1;
+ break;
+ default:
+ info(udev, "profile 0x%02x <ignored>\n", cur_profile);
+ break;
+ }
+}
+
+static int feature_profiles(struct udev *udev, const unsigned char *profiles, size_t size)
+{
+ unsigned int i;
+
+ for (i = 0; i+4 <= size; i += 4) {
+ int profile;
+
+ profile = profiles[i] << 8 | profiles[i+1];
+ switch (profile) {
+ case 0x03:
+ case 0x04:
+ case 0x05:
+ info(udev, "profile 0x%02x mo\n", profile);
+ cd_mo = 1;
+ break;
+ case 0x08:
+ info(udev, "profile 0x%02x cd_rom\n", profile);
+ cd_cd_rom = 1;
+ break;
+ case 0x09:
+ info(udev, "profile 0x%02x cd_r\n", profile);
+ cd_cd_r = 1;
+ break;
+ case 0x0A:
+ info(udev, "profile 0x%02x cd_rw\n", profile);
+ cd_cd_rw = 1;
+ break;
+ case 0x10:
+ info(udev, "profile 0x%02x dvd_rom\n", profile);
+ cd_dvd_rom = 1;
+ break;
+ case 0x12:
+ info(udev, "profile 0x%02x dvd_ram\n", profile);
+ cd_dvd_ram = 1;
+ break;
+ case 0x13:
+ case 0x14:
+ info(udev, "profile 0x%02x dvd_rw\n", profile);
+ cd_dvd_rw = 1;
+ break;
+ case 0x1B:
+ info(udev, "profile 0x%02x dvd_plus_r\n", profile);
+ cd_dvd_plus_r = 1;
+ break;
+ case 0x1A:
+ info(udev, "profile 0x%02x dvd_plus_rw\n", profile);
+ cd_dvd_plus_rw = 1;
+ break;
+ case 0x2A:
+ info(udev, "profile 0x%02x dvd_plus_rw_dl\n", profile);
+ cd_dvd_plus_rw_dl = 1;
+ break;
+ case 0x2B:
+ info(udev, "profile 0x%02x dvd_plus_r_dl\n", profile);
+ cd_dvd_plus_r_dl = 1;
+ break;
+ case 0x40:
+ cd_bd = 1;
+ info(udev, "profile 0x%02x bd\n", profile);
+ break;
+ case 0x41:
+ case 0x42:
+ cd_bd_r = 1;
+ info(udev, "profile 0x%02x bd_r\n", profile);
+ break;
+ case 0x43:
+ cd_bd_re = 1;
+ info(udev, "profile 0x%02x bd_re\n", profile);
+ break;
+ case 0x50:
+ cd_hddvd = 1;
+ info(udev, "profile 0x%02x hddvd\n", profile);
+ break;
+ case 0x51:
+ cd_hddvd_r = 1;
+ info(udev, "profile 0x%02x hddvd_r\n", profile);
+ break;
+ case 0x52:
+ cd_hddvd_rw = 1;
+ info(udev, "profile 0x%02x hddvd_rw\n", profile);
+ break;
+ default:
+ info(udev, "profile 0x%02x <ignored>\n", profile);
+ break;
+ }
+ }
+ return 0;
+}
+
+/* returns 0 if media was detected */
+static int cd_profiles_old_mmc(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ int err;
+
+ unsigned char header[32];
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x51);
+ scsi_cmd_set(udev, &sc, 8, sizeof(header));
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, header, sizeof(header));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ DISC INFORMATION", err);
+ if (cd_media == 1) {
+ info(udev, "no current profile, but disc is present; assuming CD-ROM\n");
+ cd_media_cd_rom = 1;
+ return 0;
+ } else {
+ info(udev, "no current profile, assuming no media\n");
+ return -1;
+ }
+ };
+
+ cd_media = 1;
+
+ if (header[2] & 16) {
+ cd_media_cd_rw = 1;
+ info(udev, "profile 0x0a media_cd_rw\n");
+ } else if ((header[2] & 3) < 2 && cd_cd_r) {
+ cd_media_cd_r = 1;
+ info(udev, "profile 0x09 media_cd_r\n");
+ } else {
+ cd_media_cd_rom = 1;
+ info(udev, "profile 0x08 media_cd_rom\n");
+ }
+ return 0;
+}
+
+/* returns 0 if media was detected */
+static int cd_profiles(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ unsigned char features[65530];
+ unsigned int cur_profile = 0;
+ unsigned int len;
+ unsigned int i;
+ int err;
+ int ret;
+
+ ret = -1;
+
+ /* First query the current profile */
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x46);
+ scsi_cmd_set(udev, &sc, 8, 8);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, features, 8);
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "GET CONFIGURATION", err);
+ /* handle pre-MMC2 drives which do not support GET CONFIGURATION */
+ if (SK(err) == 0x5 && ASC(err) == 0x20) {
+ info(udev, "drive is pre-MMC2 and does not support 46h get configuration command\n");
+ info(udev, "trying to work around the problem\n");
+ ret = cd_profiles_old_mmc(udev, fd);
+ }
+ goto out;
+ }
+
+ cur_profile = features[6] << 8 | features[7];
+ if (cur_profile > 0) {
+ info(udev, "current profile 0x%02x\n", cur_profile);
+ feature_profile_media (udev, cur_profile);
+ ret = 0; /* we have media */
+ } else {
+ info(udev, "no current profile, assuming no media\n");
+ }
+
+ len = features[0] << 24 | features[1] << 16 | features[2] << 8 | features[3];
+ info(udev, "GET CONFIGURATION: size of features buffer 0x%04x\n", len);
+
+ if (len > sizeof(features)) {
+ info(udev, "can not get features in a single query, truncating\n");
+ len = sizeof(features);
+ } else if (len <= 8) {
+ len = sizeof(features);
+ }
+
+ /* Now get the full feature buffer */
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x46);
+ scsi_cmd_set(udev, &sc, 7, ( len >> 8 ) & 0xff);
+ scsi_cmd_set(udev, &sc, 8, len & 0xff);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, features, len);
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "GET CONFIGURATION", err);
+ return -1;
+ }
+
+ /* parse the length once more, in case the drive decided to have other features suddenly :) */
+ len = features[0] << 24 | features[1] << 16 | features[2] << 8 | features[3];
+ info(udev, "GET CONFIGURATION: size of features buffer 0x%04x\n", len);
+
+ if (len > sizeof(features)) {
+ info(udev, "can not get features in a single query, truncating\n");
+ len = sizeof(features);
+ }
+
+ /* device features */
+ for (i = 8; i+4 < len; i += (4 + features[i+3])) {
+ unsigned int feature;
+
+ feature = features[i] << 8 | features[i+1];
+
+ switch (feature) {
+ case 0x00:
+ info(udev, "GET CONFIGURATION: feature 'profiles', with %i entries\n", features[i+3] / 4);
+ feature_profiles(udev, &features[i]+4, features[i+3]);
+ break;
+ default:
+ info(udev, "GET CONFIGURATION: feature 0x%04x <ignored>, with 0x%02x bytes\n", feature, features[i+3]);
+ break;
+ }
+ }
+out:
+ return ret;
+}
+
+static int cd_media_info(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ unsigned char header[32];
+ static const char *media_status[] = {
+ "blank",
+ "appendable",
+ "complete",
+ "other"
+ };
+ int err;
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x51);
+ scsi_cmd_set(udev, &sc, 8, sizeof(header) & 0xff);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, header, sizeof(header));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ DISC INFORMATION", err);
+ return -1;
+ };
+
+ cd_media = 1;
+ info(udev, "disk type %02x\n", header[8]);
+ info(udev, "hardware reported media status: %s\n", media_status[header[2] & 3]);
+
+ /* exclude plain CDROM, some fake cdroms return 0 for "blank" media here */
+ if (!cd_media_cd_rom)
+ cd_media_state = media_status[header[2] & 3];
+
+ /* fresh DVD-RW in restricted overwite mode reports itself as
+ * "appendable"; change it to "blank" to make it consistent with what
+ * gets reported after blanking, and what userspace expects */
+ if (cd_media_dvd_rw_ro && (header[2] & 3) == 1)
+ cd_media_state = media_status[0];
+
+ /* DVD+RW discs (and DVD-RW in restricted mode) once formatted are
+ * always "complete", DVD-RAM are "other" or "complete" if the disc is
+ * write protected; we need to check the contents if it is blank */
+ if ((cd_media_dvd_rw_ro || cd_media_dvd_plus_rw || cd_media_dvd_plus_rw_dl || cd_media_dvd_ram) && (header[2] & 3) > 1) {
+ unsigned char buffer[32 * 2048];
+ unsigned char result, len;
+ int block, offset;
+
+ if (cd_media_dvd_ram) {
+ /* a write protected dvd-ram may report "complete" status */
+
+ unsigned char dvdstruct[8];
+ unsigned char format[12];
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0xAD);
+ scsi_cmd_set(udev, &sc, 7, 0xC0);
+ scsi_cmd_set(udev, &sc, 9, sizeof(dvdstruct));
+ scsi_cmd_set(udev, &sc, 11, 0);
+ err = scsi_cmd_run(udev, &sc, fd, dvdstruct, sizeof(dvdstruct));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ DVD STRUCTURE", err);
+ return -1;
+ }
+ if (dvdstruct[4] & 0x02) {
+ cd_media_state = media_status[2];
+ info(udev, "write-protected DVD-RAM media inserted\n");
+ goto determined;
+ }
+
+ /* let's make sure we don't try to read unformatted media */
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x23);
+ scsi_cmd_set(udev, &sc, 8, sizeof(format));
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, format, sizeof(format));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ DVD FORMAT CAPACITIES", err);
+ return -1;
+ }
+
+ len = format[3];
+ if (len & 7 || len < 16) {
+ info(udev, "invalid format capacities length\n");
+ return -1;
+ }
+
+ switch(format[8] & 3) {
+ case 1:
+ info(udev, "unformatted DVD-RAM media inserted\n");
+ /* This means that last format was interrupted
+ * or failed, blank dvd-ram discs are factory
+ * formatted. Take no action here as it takes
+ * quite a while to reformat a dvd-ram and it's
+ * not automatically started */
+ goto determined;
+
+ case 2:
+ info(udev, "formatted DVD-RAM media inserted\n");
+ break;
+
+ case 3:
+ cd_media = 0; //return no media
+ info(udev, "format capacities returned no media\n");
+ return -1;
+ }
+ }
+
+ /* Take a closer look at formatted media (unformatted DVD+RW
+ * has "blank" status", DVD-RAM was examined earlier) and check
+ * for ISO and UDF PVDs or a fs superblock presence and do it
+ * in one ioctl (we need just sectors 0 and 16) */
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x28);
+ scsi_cmd_set(udev, &sc, 5, 0);
+ scsi_cmd_set(udev, &sc, 8, 32);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, buffer, sizeof(buffer));
+ if ((err != 0)) {
+ cd_media = 0;
+ info_scsi_cmd_err(udev, "READ FIRST 32 BLOCKS", err);
+ return -1;
+ }
+
+ /* if any non-zero data is found in sector 16 (iso and udf) or
+ * eventually 0 (fat32 boot sector, ext2 superblock, etc), disc
+ * is assumed non-blank */
+ result = 0;
+
+ for (block = 32768; block >= 0 && !result; block -= 32768) {
+ offset = block;
+ while (offset < (block + 2048) && !result) {
+ result = buffer [offset];
+ offset++;
+ }
+ }
+
+ if (!result) {
+ cd_media_state = media_status[0];
+ info(udev, "no data in blocks 0 or 16, assuming blank\n");
+ } else {
+ info(udev, "data in blocks 0 or 16, assuming complete\n");
+ }
+ }
+
+determined:
+ /* "other" is e. g. DVD-RAM, can't append sessions there; DVDs in
+ * restricted overwrite mode can never append, only in sequential mode */
+ if ((header[2] & 3) < 2 && !cd_media_dvd_rw_ro)
+ cd_media_session_next = header[10] << 8 | header[5];
+ cd_media_session_count = header[9] << 8 | header[4];
+ cd_media_track_count = header[11] << 8 | header[6];
+
+ return 0;
+}
+
+static int cd_media_toc(struct udev *udev, int fd)
+{
+ struct scsi_cmd sc;
+ unsigned char header[12];
+ unsigned char toc[65536];
+ unsigned int len, i, num_tracks;
+ unsigned char *p;
+ int err;
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x43);
+ scsi_cmd_set(udev, &sc, 6, 1);
+ scsi_cmd_set(udev, &sc, 8, sizeof(header) & 0xff);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, header, sizeof(header));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ TOC", err);
+ return -1;
+ }
+
+ len = (header[0] << 8 | header[1]) + 2;
+ info(udev, "READ TOC: len: %d, start track: %d, end track: %d\n", len, header[2], header[3]);
+ if (len > sizeof(toc))
+ return -1;
+ if (len < 2)
+ return -1;
+ /* 2: first track, 3: last track */
+ num_tracks = header[3] - header[2] + 1;
+
+ /* empty media has no tracks */
+ if (len < 8)
+ return 0;
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x43);
+ scsi_cmd_set(udev, &sc, 6, header[2]); /* First Track/Session Number */
+ scsi_cmd_set(udev, &sc, 7, (len >> 8) & 0xff);
+ scsi_cmd_set(udev, &sc, 8, len & 0xff);
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, toc, len);
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ TOC (tracks)", err);
+ return -1;
+ }
+
+ /* Take care to not iterate beyond the last valid track as specified in
+ * the TOC, but also avoid going beyond the TOC length, just in case
+ * the last track number is invalidly large */
+ for (p = toc+4, i = 4; i < len-8 && num_tracks > 0; i += 8, p += 8, --num_tracks) {
+ unsigned int block;
+ unsigned int is_data_track;
+
+ is_data_track = (p[1] & 0x04) != 0;
+
+ block = p[4] << 24 | p[5] << 16 | p[6] << 8 | p[7];
+ info(udev, "track=%u info=0x%x(%s) start_block=%u\n",
+ p[2], p[1] & 0x0f, is_data_track ? "data":"audio", block);
+
+ if (is_data_track)
+ cd_media_track_count_data++;
+ else
+ cd_media_track_count_audio++;
+ }
+
+ scsi_cmd_init(udev, &sc);
+ scsi_cmd_set(udev, &sc, 0, 0x43);
+ scsi_cmd_set(udev, &sc, 2, 1); /* Session Info */
+ scsi_cmd_set(udev, &sc, 8, sizeof(header));
+ scsi_cmd_set(udev, &sc, 9, 0);
+ err = scsi_cmd_run(udev, &sc, fd, header, sizeof(header));
+ if ((err != 0)) {
+ info_scsi_cmd_err(udev, "READ TOC (multi session)", err);
+ return -1;
+ }
+ len = header[4+4] << 24 | header[4+5] << 16 | header[4+6] << 8 | header[4+7];
+ info(udev, "last track %u starts at block %u\n", header[4+2], len);
+ cd_media_session_last_offset = (unsigned long long int)len * 2048;
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ struct udev *udev;
+ static const struct option options[] = {
+ { "lock-media", no_argument, NULL, 'l' },
+ { "unlock-media", no_argument, NULL, 'u' },
+ { "eject-media", no_argument, NULL, 'e' },
+ { "debug", no_argument, NULL, 'd' },
+ { "help", no_argument, NULL, 'h' },
+ {}
+ };
+ bool eject = false;
+ bool lock = false;
+ bool unlock = false;
+ const char *node = NULL;
+ int fd = -1;
+ int cnt;
+ int rc = 0;
+
+ udev = udev_new();
+ if (udev == NULL)
+ goto exit;
+
+ udev_log_init("cdrom_id");
+ udev_set_log_fn(udev, log_fn);
+
+ while (1) {
+ int option;
+
+ option = getopt_long(argc, argv, "deluh", options, NULL);
+ if (option == -1)
+ break;
+
+ switch (option) {
+ case 'l':
+ lock = true;
+ break;
+ case 'u':
+ unlock = true;
+ break;
+ case 'e':
+ eject = true;
+ break;
+ case 'd':
+ debug = true;
+ if (udev_get_log_priority(udev) < LOG_INFO)
+ udev_set_log_priority(udev, LOG_INFO);
+ break;
+ case 'h':
+ printf("Usage: cdrom_id [options] <device>\n"
+ " --lock-media lock the media (to enable eject request events)\n"
+ " --unlock-media unlock the media\n"
+ " --eject-media eject the media\n"
+ " --debug debug to stderr\n"
+ " --help print this help text\n\n");
+ goto exit;
+ default:
+ rc = 1;
+ goto exit;
+ }
+ }
+
+ node = argv[optind];
+ if (!node) {
+ err(udev, "no device\n");
+ fprintf(stderr, "no device\n");
+ rc = 1;
+ goto exit;
+ }
+
+ srand((unsigned int)getpid());
+ for (cnt = 20; cnt > 0; cnt--) {
+ struct timespec duration;
+
+ fd = open(node, O_RDONLY|O_NONBLOCK|(is_mounted(node) ? 0 : O_EXCL));
+ if (fd >= 0 || errno != EBUSY)
+ break;
+ duration.tv_sec = 0;
+ duration.tv_nsec = (100 * 1000 * 1000) + (rand() % 100 * 1000 * 1000);
+ nanosleep(&duration, NULL);
+ }
+ if (fd < 0) {
+ info(udev, "unable to open '%s'\n", node);
+ fprintf(stderr, "unable to open '%s'\n", node);
+ rc = 1;
+ goto exit;
+ }
+ info(udev, "probing: '%s'\n", node);
+
+ /* same data as original cdrom_id */
+ if (cd_capability_compat(udev, fd) < 0) {
+ rc = 1;
+ goto exit;
+ }
+
+ /* check for media - don't bail if there's no media as we still need to
+ * to read profiles */
+ cd_media_compat(udev, fd);
+
+ /* check if drive talks MMC */
+ if (cd_inquiry(udev, fd) < 0)
+ goto work;
+
+ /* read drive and possibly current profile */
+ if (cd_profiles(udev, fd) != 0)
+ goto work;
+
+ /* at this point we are guaranteed to have media in the drive - find out more about it */
+
+ /* get session/track info */
+ cd_media_toc(udev, fd);
+
+ /* get writable media state */
+ cd_media_info(udev, fd);
+
+work:
+ /* lock the media, so we enable eject button events */
+ if (lock && cd_media) {
+ info(udev, "PREVENT_ALLOW_MEDIUM_REMOVAL (lock)\n");
+ media_lock(udev, fd, true);
+ }
+
+ if (unlock && cd_media) {
+ info(udev, "PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)\n");
+ media_lock(udev, fd, false);
+ }
+
+ if (eject) {
+ info(udev, "PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)\n");
+ media_lock(udev, fd, false);
+ info(udev, "START_STOP_UNIT (eject)\n");
+ media_eject(udev, fd);
+ }
+
+ printf("ID_CDROM=1\n");
+ if (cd_cd_rom)
+ printf("ID_CDROM_CD=1\n");
+ if (cd_cd_r)
+ printf("ID_CDROM_CD_R=1\n");
+ if (cd_cd_rw)
+ printf("ID_CDROM_CD_RW=1\n");
+ if (cd_dvd_rom)
+ printf("ID_CDROM_DVD=1\n");
+ if (cd_dvd_r)
+ printf("ID_CDROM_DVD_R=1\n");
+ if (cd_dvd_rw)
+ printf("ID_CDROM_DVD_RW=1\n");
+ if (cd_dvd_ram)
+ printf("ID_CDROM_DVD_RAM=1\n");
+ if (cd_dvd_plus_r)
+ printf("ID_CDROM_DVD_PLUS_R=1\n");
+ if (cd_dvd_plus_rw)
+ printf("ID_CDROM_DVD_PLUS_RW=1\n");
+ if (cd_dvd_plus_r_dl)
+ printf("ID_CDROM_DVD_PLUS_R_DL=1\n");
+ if (cd_dvd_plus_rw_dl)
+ printf("ID_CDROM_DVD_PLUS_RW_DL=1\n");
+ if (cd_bd)
+ printf("ID_CDROM_BD=1\n");
+ if (cd_bd_r)
+ printf("ID_CDROM_BD_R=1\n");
+ if (cd_bd_re)
+ printf("ID_CDROM_BD_RE=1\n");
+ if (cd_hddvd)
+ printf("ID_CDROM_HDDVD=1\n");
+ if (cd_hddvd_r)
+ printf("ID_CDROM_HDDVD_R=1\n");
+ if (cd_hddvd_rw)
+ printf("ID_CDROM_HDDVD_RW=1\n");
+ if (cd_mo)
+ printf("ID_CDROM_MO=1\n");
+ if (cd_mrw)
+ printf("ID_CDROM_MRW=1\n");
+ if (cd_mrw_w)
+ printf("ID_CDROM_MRW_W=1\n");
+
+ if (cd_media)
+ printf("ID_CDROM_MEDIA=1\n");
+ if (cd_media_mo)
+ printf("ID_CDROM_MEDIA_MO=1\n");
+ if (cd_media_mrw)
+ printf("ID_CDROM_MEDIA_MRW=1\n");
+ if (cd_media_mrw_w)
+ printf("ID_CDROM_MEDIA_MRW_W=1\n");
+ if (cd_media_cd_rom)
+ printf("ID_CDROM_MEDIA_CD=1\n");
+ if (cd_media_cd_r)
+ printf("ID_CDROM_MEDIA_CD_R=1\n");
+ if (cd_media_cd_rw)
+ printf("ID_CDROM_MEDIA_CD_RW=1\n");
+ if (cd_media_dvd_rom)
+ printf("ID_CDROM_MEDIA_DVD=1\n");
+ if (cd_media_dvd_r)
+ printf("ID_CDROM_MEDIA_DVD_R=1\n");
+ if (cd_media_dvd_ram)
+ printf("ID_CDROM_MEDIA_DVD_RAM=1\n");
+ if (cd_media_dvd_rw)
+ printf("ID_CDROM_MEDIA_DVD_RW=1\n");
+ if (cd_media_dvd_plus_r)
+ printf("ID_CDROM_MEDIA_DVD_PLUS_R=1\n");
+ if (cd_media_dvd_plus_rw)
+ printf("ID_CDROM_MEDIA_DVD_PLUS_RW=1\n");
+ if (cd_media_dvd_plus_rw_dl)
+ printf("ID_CDROM_MEDIA_DVD_PLUS_RW_DL=1\n");
+ if (cd_media_dvd_plus_r_dl)
+ printf("ID_CDROM_MEDIA_DVD_PLUS_R_DL=1\n");
+ if (cd_media_bd)
+ printf("ID_CDROM_MEDIA_BD=1\n");
+ if (cd_media_bd_r)
+ printf("ID_CDROM_MEDIA_BD_R=1\n");
+ if (cd_media_bd_re)
+ printf("ID_CDROM_MEDIA_BD_RE=1\n");
+ if (cd_media_hddvd)
+ printf("ID_CDROM_MEDIA_HDDVD=1\n");
+ if (cd_media_hddvd_r)
+ printf("ID_CDROM_MEDIA_HDDVD_R=1\n");
+ if (cd_media_hddvd_rw)
+ printf("ID_CDROM_MEDIA_HDDVD_RW=1\n");
+
+ if (cd_media_state != NULL)
+ printf("ID_CDROM_MEDIA_STATE=%s\n", cd_media_state);
+ if (cd_media_session_next > 0)
+ printf("ID_CDROM_MEDIA_SESSION_NEXT=%d\n", cd_media_session_next);
+ if (cd_media_session_count > 0)
+ printf("ID_CDROM_MEDIA_SESSION_COUNT=%d\n", cd_media_session_count);
+ if (cd_media_session_count > 1 && cd_media_session_last_offset > 0)
+ printf("ID_CDROM_MEDIA_SESSION_LAST_OFFSET=%llu\n", cd_media_session_last_offset);
+ if (cd_media_track_count > 0)
+ printf("ID_CDROM_MEDIA_TRACK_COUNT=%d\n", cd_media_track_count);
+ if (cd_media_track_count_audio > 0)
+ printf("ID_CDROM_MEDIA_TRACK_COUNT_AUDIO=%d\n", cd_media_track_count_audio);
+ if (cd_media_track_count_data > 0)
+ printf("ID_CDROM_MEDIA_TRACK_COUNT_DATA=%d\n", cd_media_track_count_data);
+exit:
+ if (fd >= 0)
+ close(fd);
+ udev_unref(udev);
+ udev_log_close();
+ return rc;
+}
diff --git a/src/udev/src/collect/collect.c b/src/udev/src/collect/collect.c
new file mode 100644
index 000000000..076fe479e
--- /dev/null
+++ b/src/udev/src/collect/collect.c
@@ -0,0 +1,473 @@
+/*
+ * Collect variables across events.
+ *
+ * usage: collect [--add|--remove] <checkpoint> <id> <idlist>
+ *
+ * Adds ID <id> to the list governed by <checkpoint>.
+ * <id> must be part of the ID list <idlist>.
+ * If all IDs given by <idlist> are listed (ie collect has been
+ * invoked for each ID in <idlist>) collect returns 0, the
+ * number of missing IDs otherwise.
+ * A negative number is returned on error.
+ *
+ * Copyright(C) 2007, Hannes Reinecke <hare@suse.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "libudev.h"
+#include "libudev-private.h"
+
+#define BUFSIZE 16
+#define UDEV_ALARM_TIMEOUT 180
+
+enum collect_state {
+ STATE_NONE,
+ STATE_OLD,
+ STATE_CONFIRMED,
+};
+
+struct _mate {
+ struct udev_list_node node;
+ char *name;
+ enum collect_state state;
+};
+
+static struct udev_list_node bunch;
+static int debug;
+
+/* This can increase dynamically */
+static size_t bufsize = BUFSIZE;
+
+static struct _mate *node_to_mate(struct udev_list_node *node)
+{
+ char *mate;
+
+ mate = (char *)node;
+ mate -= offsetof(struct _mate, node);
+ return (struct _mate *)mate;
+}
+
+static void sig_alrm(int signo)
+{
+ exit(4);
+}
+
+static void usage(void)
+{
+ printf("usage: collect [--add|--remove] [--debug] <checkpoint> <id> <idlist>\n"
+ "\n"
+ " Adds ID <id> to the list governed by <checkpoint>.\n"
+ " <id> must be part of the list <idlist>.\n"
+ " If all IDs given by <idlist> are listed (ie collect has been\n"
+ " invoked for each ID in <idlist>) collect returns 0, the\n"
+ " number of missing IDs otherwise.\n"
+ " On error a negative number is returned.\n"
+ "\n");
+}
+
+/*
+ * prepare
+ *
+ * Prepares the database file
+ */
+static int prepare(char *dir, char *filename)
+{
+ struct stat statbuf;
+ char buf[512];
+ int fd;
+
+ if (stat(dir, &statbuf) < 0)
+ mkdir(dir, 0700);
+
+ sprintf(buf, "%s/%s", dir, filename);
+
+ fd = open(buf,O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
+ if (fd < 0)
+ fprintf(stderr, "Cannot open %s: %s\n", buf, strerror(errno));
+
+ if (lockf(fd,F_TLOCK,0) < 0) {
+ if (debug)
+ fprintf(stderr, "Lock taken, wait for %d seconds\n", UDEV_ALARM_TIMEOUT);
+ if (errno == EAGAIN || errno == EACCES) {
+ alarm(UDEV_ALARM_TIMEOUT);
+ lockf(fd, F_LOCK, 0);
+ if (debug)
+ fprintf(stderr, "Acquired lock on %s\n", buf);
+ } else {
+ if (debug)
+ fprintf(stderr, "Could not get lock on %s: %s\n", buf, strerror(errno));
+ }
+ }
+
+ return fd;
+}
+
+/*
+ * Read checkpoint file
+ *
+ * Tricky reading this. We allocate a buffer twice as large
+ * as we're going to read. Then we read into the upper half
+ * of that buffer and start parsing.
+ * Once we do _not_ find end-of-work terminator (whitespace
+ * character) we move the upper half to the lower half,
+ * adjust the read pointer and read the next bit.
+ * Quite clever methinks :-)
+ * I should become a programmer ...
+ *
+ * Yes, one could have used fgets() for this. But then we'd
+ * have to use freopen etc which I found quite tedious.
+ */
+static int checkout(int fd)
+{
+ int len;
+ char *buf, *ptr, *word = NULL;
+ struct _mate *him;
+
+ restart:
+ len = bufsize >> 1;
+ buf = calloc(1,bufsize + 1);
+ if (!buf) {
+ fprintf(stderr, "Out of memory\n");
+ return -1;
+ }
+ memset(buf, ' ', bufsize);
+ ptr = buf + len;
+ while ((read(fd, buf + len, len)) > 0) {
+ while (ptr && *ptr) {
+ word = ptr;
+ ptr = strpbrk(word," \n\t\r");
+ if (!ptr && word < (buf + len)) {
+ bufsize = bufsize << 1;
+ if (debug)
+ fprintf(stderr, "ID overflow, restarting with size %zi\n", bufsize);
+ free(buf);
+ lseek(fd, 0, SEEK_SET);
+ goto restart;
+ }
+ if (ptr) {
+ *ptr = '\0';
+ ptr++;
+ if (!strlen(word))
+ continue;
+
+ if (debug)
+ fprintf(stderr, "Found word %s\n", word);
+ him = malloc(sizeof (struct _mate));
+ him->name = strdup(word);
+ him->state = STATE_OLD;
+ udev_list_node_append(&him->node, &bunch);
+ word = NULL;
+ }
+ }
+ memcpy(buf, buf + len, len);
+ memset(buf + len, ' ', len);
+
+ if (!ptr)
+ ptr = word;
+ if (!ptr)
+ break;
+ ptr -= len;
+ }
+
+ free(buf);
+ return 0;
+}
+
+/*
+ * invite
+ *
+ * Adds a new ID 'us' to the internal list,
+ * marks it as confirmed.
+ */
+static void invite(char *us)
+{
+ struct udev_list_node *him_node;
+ struct _mate *who = NULL;
+
+ if (debug)
+ fprintf(stderr, "Adding ID '%s'\n", us);
+
+ udev_list_node_foreach(him_node, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ if (!strcmp(him->name, us)) {
+ him->state = STATE_CONFIRMED;
+ who = him;
+ }
+ }
+ if (debug && !who)
+ fprintf(stderr, "ID '%s' not in database\n", us);
+
+}
+
+/*
+ * reject
+ *
+ * Marks the ID 'us' as invalid,
+ * causing it to be removed when the
+ * list is written out.
+ */
+static void reject(char *us)
+{
+ struct udev_list_node *him_node;
+ struct _mate *who = NULL;
+
+ if (debug)
+ fprintf(stderr, "Removing ID '%s'\n", us);
+
+ udev_list_node_foreach(him_node, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ if (!strcmp(him->name, us)) {
+ him->state = STATE_NONE;
+ who = him;
+ }
+ }
+ if (debug && !who)
+ fprintf(stderr, "ID '%s' not in database\n", us);
+}
+
+/*
+ * kickout
+ *
+ * Remove all IDs in the internal list which are not part
+ * of the list passed via the commandline.
+ */
+static void kickout(void)
+{
+ struct udev_list_node *him_node;
+ struct udev_list_node *tmp;
+
+ udev_list_node_foreach_safe(him_node, tmp, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ if (him->state == STATE_OLD) {
+ udev_list_node_remove(&him->node);
+ free(him->name);
+ free(him);
+ }
+ }
+}
+
+/*
+ * missing
+ *
+ * Counts all missing IDs in the internal list.
+ */
+static int missing(int fd)
+{
+ char *buf;
+ int ret = 0;
+ struct udev_list_node *him_node;
+
+ buf = malloc(bufsize);
+ if (!buf)
+ return -1;
+
+ udev_list_node_foreach(him_node, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ if (him->state == STATE_NONE) {
+ ret++;
+ } else {
+ while (strlen(him->name)+1 >= bufsize) {
+ char *tmpbuf;
+
+ bufsize = bufsize << 1;
+ tmpbuf = realloc(buf, bufsize);
+ if (!tmpbuf) {
+ free(buf);
+ return -1;
+ }
+ buf = tmpbuf;
+ }
+ snprintf(buf, strlen(him->name)+2, "%s ", him->name);
+ write(fd, buf, strlen(buf));
+ }
+ }
+
+ free(buf);
+ return ret;
+}
+
+/*
+ * everybody
+ *
+ * Prints out the status of the internal list.
+ */
+static void everybody(void)
+{
+ struct udev_list_node *him_node;
+ const char *state = "";
+
+ udev_list_node_foreach(him_node, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ switch (him->state) {
+ case STATE_NONE:
+ state = "none";
+ break;
+ case STATE_OLD:
+ state = "old";
+ break;
+ case STATE_CONFIRMED:
+ state = "confirmed";
+ break;
+ }
+ fprintf(stderr, "ID: %s=%s\n", him->name, state);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ struct udev *udev;
+ static const struct option options[] = {
+ { "add", no_argument, NULL, 'a' },
+ { "remove", no_argument, NULL, 'r' },
+ { "debug", no_argument, NULL, 'd' },
+ { "help", no_argument, NULL, 'h' },
+ {}
+ };
+ int argi;
+ char *checkpoint, *us;
+ int fd;
+ int i;
+ int ret = EXIT_SUCCESS;
+ int prune = 0;
+ char tmpdir[UTIL_PATH_SIZE];
+
+ udev = udev_new();
+ if (udev == NULL) {
+ ret = EXIT_FAILURE;
+ goto exit;
+ }
+
+ while (1) {
+ int option;
+
+ option = getopt_long(argc, argv, "ardh", options, NULL);
+ if (option == -1)
+ break;
+
+ switch (option) {
+ case 'a':
+ prune = 0;
+ break;
+ case 'r':
+ prune = 1;
+ break;
+ case 'd':
+ debug = 1;
+ break;
+ case 'h':
+ usage();
+ goto exit;
+ default:
+ ret = 1;
+ goto exit;
+ }
+ }
+
+ argi = optind;
+ if (argi + 2 > argc) {
+ printf("Missing parameter(s)\n");
+ ret = 1;
+ goto exit;
+ }
+ checkpoint = argv[argi++];
+ us = argv[argi++];
+
+ if (signal(SIGALRM, sig_alrm) == SIG_ERR) {
+ fprintf(stderr, "Cannot set SIGALRM: %s\n", strerror(errno));
+ ret = 2;
+ goto exit;
+ }
+
+ udev_list_node_init(&bunch);
+
+ if (debug)
+ fprintf(stderr, "Using checkpoint '%s'\n", checkpoint);
+
+ util_strscpyl(tmpdir, sizeof(tmpdir), udev_get_run_path(udev), "/collect", NULL);
+ fd = prepare(tmpdir, checkpoint);
+ if (fd < 0) {
+ ret = 3;
+ goto out;
+ }
+
+ if (checkout(fd) < 0) {
+ ret = 2;
+ goto out;
+ }
+
+ for (i = argi; i < argc; i++) {
+ struct udev_list_node *him_node;
+ struct _mate *who;
+
+ who = NULL;
+ udev_list_node_foreach(him_node, &bunch) {
+ struct _mate *him = node_to_mate(him_node);
+
+ if (!strcmp(him->name, argv[i]))
+ who = him;
+ }
+ if (!who) {
+ struct _mate *him;
+
+ if (debug)
+ fprintf(stderr, "ID %s: not in database\n", argv[i]);
+ him = malloc(sizeof (struct _mate));
+ him->name = malloc(strlen(argv[i]) + 1);
+ strcpy(him->name, argv[i]);
+ him->state = STATE_NONE;
+ udev_list_node_append(&him->node, &bunch);
+ } else {
+ if (debug)
+ fprintf(stderr, "ID %s: found in database\n", argv[i]);
+ who->state = STATE_CONFIRMED;
+ }
+ }
+
+ if (prune)
+ reject(us);
+ else
+ invite(us);
+
+ if (debug) {
+ everybody();
+ fprintf(stderr, "Prune lists\n");
+ }
+ kickout();
+
+ lseek(fd, 0, SEEK_SET);
+ ftruncate(fd, 0);
+ ret = missing(fd);
+
+ lockf(fd, F_ULOCK, 0);
+ close(fd);
+out:
+ if (debug)
+ everybody();
+ if (ret >= 0)
+ printf("COLLECT_%s=%d\n", checkpoint, ret);
+exit:
+ udev_unref(udev);
+ return ret;
+}
diff --git a/src/udev/src/docs/.gitignore b/src/udev/src/docs/.gitignore
new file mode 100644
index 000000000..dca700a99
--- /dev/null
+++ b/src/udev/src/docs/.gitignore
@@ -0,0 +1,17 @@
+libudev-overrides.txt
+html/
+tmpl/
+xml/
+*.stamp
+*.bak
+version.xml
+libudev-decl-list.txt
+libudev-decl.txt
+libudev-undeclared.txt
+libudev-undocumented.txt
+libudev-unused.txt
+libudev.args
+libudev.hierarchy
+libudev.interfaces
+libudev.prerequisites
+libudev.signals
diff --git a/src/udev/src/docs/Makefile.am b/src/udev/src/docs/Makefile.am
new file mode 100644
index 000000000..07d06eb14
--- /dev/null
+++ b/src/udev/src/docs/Makefile.am
@@ -0,0 +1,99 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.10 at least.
+AUTOMAKE_OPTIONS = 1.10
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=libudev
+
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=2
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR=$(top_srcdir)/src
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space udev
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS=--path=$(abs_srcdir) --path=$(abs_builddir)
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS=
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/src/libudev*.h
+CFILE_GLOB=$(top_srcdir)/src/libudev*.c
+
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+EXTRA_HFILES=
+
+# Header files to ignore when scanning. Use base file name, no paths
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES= libudev-private.h
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+GTKDOC_CFLAGS=
+GTKDOC_LIBS=
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST += version.xml.in
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you want your docs-status tested during 'make check'
+if ENABLE_GTK_DOC
+#TESTS_ENVIRONMENT = cd $(srcsrc)
+#TESTS = $(GTKDOC_CHECK)
+endif
diff --git a/src/udev/src/docs/libudev-docs.xml b/src/udev/src/docs/libudev-docs.xml
new file mode 100644
index 000000000..b7feb4552
--- /dev/null
+++ b/src/udev/src/docs/libudev-docs.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+ <!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>libudev Reference Manual</title>
+ <releaseinfo>for libudev version &version;</releaseinfo>
+ <copyright>
+ <year>2009-2011</year>
+ <holder>Kay Sievers &lt;kay.sievers@vrfy.org&gt;</holder>
+ </copyright>
+ </bookinfo>
+
+ <chapter>
+ <title>libudev</title>
+ <xi:include href="xml/libudev.xml"/>
+ <xi:include href="xml/libudev-list.xml"/>
+ <xi:include href="xml/libudev-device.xml"/>
+ <xi:include href="xml/libudev-monitor.xml"/>
+ <xi:include href="xml/libudev-enumerate.xml"/>
+ <xi:include href="xml/libudev-queue.xml"/>
+ <xi:include href="xml/libudev-util.xml"/>
+ </chapter>
+
+ <index id="api-index-full">
+ <title>API Index</title>
+ <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
+ </index>
+</book>
diff --git a/src/udev/src/docs/libudev-sections.txt b/src/udev/src/docs/libudev-sections.txt
new file mode 100644
index 000000000..15c3e934b
--- /dev/null
+++ b/src/udev/src/docs/libudev-sections.txt
@@ -0,0 +1,127 @@
+<SECTION>
+<FILE>libudev</FILE>
+<TITLE>udev</TITLE>
+udev
+udev_ref
+udev_unref
+udev_new
+udev_set_log_fn
+udev_get_log_priority
+udev_set_log_priority
+udev_get_sys_path
+udev_get_dev_path
+udev_get_run_path
+udev_get_userdata
+udev_set_userdata
+</SECTION>
+
+<SECTION>
+<FILE>libudev-list</FILE>
+<TITLE>udev_list</TITLE>
+udev_list_entry
+udev_list_entry_get_next
+udev_list_entry_get_by_name
+udev_list_entry_get_name
+udev_list_entry_get_value
+udev_list_entry_foreach
+</SECTION>
+
+<SECTION>
+<FILE>libudev-device</FILE>
+<TITLE>udev_device</TITLE>
+udev_device
+udev_device_ref
+udev_device_unref
+udev_device_get_udev
+udev_device_new_from_syspath
+udev_device_new_from_devnum
+udev_device_new_from_subsystem_sysname
+udev_device_new_from_environment
+udev_device_get_parent
+udev_device_get_parent_with_subsystem_devtype
+udev_device_get_devpath
+udev_device_get_subsystem
+udev_device_get_devtype
+udev_device_get_syspath
+udev_device_get_sysname
+udev_device_get_sysnum
+udev_device_get_devnode
+udev_device_get_is_initialized
+udev_device_get_devlinks_list_entry
+udev_device_get_properties_list_entry
+udev_device_get_tags_list_entry
+udev_device_get_property_value
+udev_device_get_driver
+udev_device_get_devnum
+udev_device_get_action
+udev_device_get_sysattr_value
+udev_device_get_sysattr_list_entry
+udev_device_get_seqnum
+udev_device_get_usec_since_initialized
+udev_device_has_tag
+</SECTION>
+
+<SECTION>
+<FILE>libudev-monitor</FILE>
+<TITLE>udev_monitor</TITLE>
+udev_monitor
+udev_monitor_ref
+udev_monitor_unref
+udev_monitor_get_udev
+udev_monitor_new_from_netlink
+udev_monitor_new_from_socket
+udev_monitor_enable_receiving
+udev_monitor_set_receive_buffer_size
+udev_monitor_get_fd
+udev_monitor_receive_device
+udev_monitor_filter_add_match_subsystem_devtype
+udev_monitor_filter_add_match_tag
+udev_monitor_filter_update
+udev_monitor_filter_remove
+</SECTION>
+
+<SECTION>
+<FILE>libudev-enumerate</FILE>
+<TITLE>udev_enumerate</TITLE>
+udev_enumerate
+udev_enumerate_ref
+udev_enumerate_unref
+udev_enumerate_get_udev
+udev_enumerate_new
+udev_enumerate_add_match_subsystem
+udev_enumerate_add_nomatch_subsystem
+udev_enumerate_add_match_sysattr
+udev_enumerate_add_nomatch_sysattr
+udev_enumerate_add_match_property
+udev_enumerate_add_match_tag
+udev_enumerate_add_match_parent
+udev_enumerate_add_match_is_initialized
+udev_enumerate_add_match_sysname
+udev_enumerate_add_syspath
+udev_enumerate_scan_devices
+udev_enumerate_scan_subsystems
+udev_enumerate_get_list_entry
+</SECTION>
+
+<SECTION>
+<FILE>libudev-queue</FILE>
+<TITLE>udev_queue</TITLE>
+udev_queue
+udev_queue_ref
+udev_queue_unref
+udev_queue_get_udev
+udev_queue_new
+udev_queue_get_udev_is_active
+udev_queue_get_queue_is_empty
+udev_queue_get_seqnum_is_finished
+udev_queue_get_seqnum_sequence_is_finished
+udev_queue_get_queued_list_entry
+udev_queue_get_kernel_seqnum
+udev_queue_get_udev_seqnum
+</SECTION>
+
+<SECTION>
+<FILE>libudev-util</FILE>
+<TITLE>udev_util</TITLE>
+udev_util_encode_string
+</SECTION>
diff --git a/src/udev/src/docs/libudev.types b/src/udev/src/docs/libudev.types
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/src/udev/src/docs/libudev.types
diff --git a/src/udev/src/docs/version.xml.in b/src/udev/src/docs/version.xml.in
new file mode 100644
index 000000000..d78bda934
--- /dev/null
+++ b/src/udev/src/docs/version.xml.in
@@ -0,0 +1 @@
+@VERSION@
diff --git a/src/udev/src/floppy/60-floppy.rules b/src/udev/src/floppy/60-floppy.rules
new file mode 100644
index 000000000..53e4a9e59
--- /dev/null
+++ b/src/udev/src/floppy/60-floppy.rules
@@ -0,0 +1,4 @@
+# do not edit this file, it will be overwritten on update
+
+SUBSYSTEM=="block", KERNEL=="fd[0-9]", ACTION=="add", ATTRS{cmos}=="?*", ENV{CMOS_TYPE}="$attr{cmos}", \
+ RUN+="create_floppy_devices -c -t $env{CMOS_TYPE} -m %M -M 0660 -G floppy $root/%k"
diff --git a/src/udev/src/floppy/create_floppy_devices.c b/src/udev/src/floppy/create_floppy_devices.c
new file mode 100644
index 000000000..f71ef0d80
--- /dev/null
+++ b/src/udev/src/floppy/create_floppy_devices.c
@@ -0,0 +1,177 @@
+/*
+ * Create all possible floppy device based on the CMOS type.
+ * Based upon code from drivers/block/floppy.c
+ *
+ * Copyright(C) 2005, SUSE Linux Products GmbH
+ *
+ * Author: Hannes Reinecke <hare@suse.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include "libudev.h"
+#include "libudev-private.h"
+
+static char *table[] = {
+ "", "d360", "h1200", "u360", "u720", "h360", "h720",
+ "u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
+ "u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
+ "h880", "u1040", "u1120", "h1600", "u1760", "u1920",
+ "u3200", "u3520", "u3840", "u1840", "u800", "u1600",
+ NULL
+};
+
+static int t360[] = { 1, 0 };
+static int t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23, 0 };
+static int t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13, 17, 21, 22, 30, 0 };
+static int *table_sup[] = { NULL, t360, t1200, t3in+5+8, t3in+5, t3in, t3in };
+
+static void log_fn(struct udev *udev, int priority,
+ const char *file, int line, const char *fn,
+ const char *format, va_list args)
+{
+ vsyslog(priority, format, args);
+}
+
+int main(int argc, char **argv)
+{
+ struct udev *udev;
+ char *dev;
+ char *devname;
+ char node[64];
+ int type = 0, i, fdnum, c;
+ int major = 2, minor;
+ uid_t uid = 0;
+ gid_t gid = 0;
+ mode_t mode = 0660;
+ int create_nodes = 0;
+ int print_nodes = 0;
+ int is_err = 0;
+
+ udev = udev_new();
+ if (udev == NULL)
+ goto exit;
+
+ udev_log_init("create_floppy_devices");
+ udev_set_log_fn(udev, log_fn);
+ udev_selinux_init(udev);
+
+ while ((c = getopt(argc, argv, "cudm:U:G:M:t:")) != -1) {
+ switch (c) {
+ case 'c':
+ create_nodes = 1;
+ break;
+ case 'd':
+ print_nodes = 1;
+ break;
+ case 'U':
+ uid = util_lookup_user(udev, optarg);
+ break;
+ case 'G':
+ gid = util_lookup_group(udev, optarg);
+ break;
+ case 'M':
+ mode = strtol(optarg, NULL, 0);
+ mode = mode & 0666;
+ break;
+ case 'm':
+ major = strtol(optarg, NULL, 0);
+ break;
+ case 't':
+ type = strtol(optarg, NULL, 0);
+ break;
+ default:
+ is_err++;
+ break;
+ }
+ }
+
+ if (is_err || optind >= argc) {
+ printf("Usage: %s [OPTION] device\n"
+ " -c create\n"
+ " -d debug\n"
+ " -m Major number\n"
+ " -t floppy type number\n"
+ " -U device node user ownership\n"
+ " -G device node group owner\n"
+ " -M device node mode\n"
+ "\n", argv[0]);
+ return 1;
+ }
+
+ dev = argv[optind];
+ devname = strrchr(dev, '/');
+ if (devname != NULL)
+ devname = &devname[1];
+ else
+ devname = dev;
+ if (strncmp(devname, "fd", 2) != 0) {
+ fprintf(stderr,"Device '%s' is not a floppy device\n", dev);
+ return 1;
+ }
+
+ fdnum = strtol(&devname[2], NULL, 10);
+ if (fdnum < 0 || fdnum > 7) {
+ fprintf(stderr,"Floppy device number %d out of range (0-7)\n", fdnum);
+ return 1;
+ }
+ if (fdnum > 3)
+ fdnum += 124;
+
+ if (major < 1) {
+ fprintf(stderr,"Invalid major number %d\n", major);
+ return 1;
+ }
+
+ if (type < 0 || type >= (int) ARRAY_SIZE(table_sup)) {
+ fprintf(stderr,"Invalid CMOS type %d\n", type);
+ return 1;
+ }
+
+ if (type == 0)
+ return 0;
+
+ i = 0;
+ while (table_sup[type][i]) {
+ sprintf(node, "%s%s", dev, table[table_sup[type][i]]);
+ minor = (table_sup[type][i] << 2) + fdnum;
+ if (print_nodes)
+ printf("%s b %.4o %d %d\n", node, mode, major, minor);
+ if (create_nodes) {
+ unlink(node);
+ udev_selinux_setfscreatecon(udev, node, S_IFBLK | mode);
+ mknod(node, S_IFBLK | mode, makedev(major,minor));
+ udev_selinux_resetfscreatecon(udev);
+ chown(node, uid, gid);
+ chmod(node, S_IFBLK | mode);
+ }
+ i++;
+ }
+
+ udev_selinux_exit(udev);
+ udev_unref(udev);
+ udev_log_close();
+exit:
+ return 0;
+}
diff --git a/src/udev/src/gudev/.gitignore b/src/udev/src/gudev/.gitignore
new file mode 100644
index 000000000..d20fa523e
--- /dev/null
+++ b/src/udev/src/gudev/.gitignore
@@ -0,0 +1,9 @@
+gtk-doc.make
+docs/version.xml
+gudev-1.0.pc
+gudevenumtypes.c
+gudevenumtypes.h
+gudevmarshal.c
+gudevmarshal.h
+GUdev-1.0.gir
+GUdev-1.0.typelib
diff --git a/src/udev/src/gudev/COPYING b/src/udev/src/gudev/COPYING
new file mode 100644
index 000000000..da97db2bd
--- /dev/null
+++ b/src/udev/src/gudev/COPYING
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/src/udev/src/gudev/docs/.gitignore b/src/udev/src/gudev/docs/.gitignore
new file mode 100644
index 000000000..8eada6d40
--- /dev/null
+++ b/src/udev/src/gudev/docs/.gitignore
@@ -0,0 +1,16 @@
+gudev-overrides.txt
+gudev-decl-list.txt
+gudev-decl.txt
+gudev-undeclared.txt
+gudev-undocumented.txt
+gudev-unused.txt
+gudev.args
+gudev.hierarchy
+gudev.interfaces
+gudev.prerequisites
+gudev.signals
+html.stamp
+html/*
+xml/*
+tmpl/*
+*.stamp
diff --git a/src/udev/src/gudev/docs/Makefile.am b/src/udev/src/gudev/docs/Makefile.am
new file mode 100644
index 000000000..cfe696c50
--- /dev/null
+++ b/src/udev/src/gudev/docs/Makefile.am
@@ -0,0 +1,106 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.10 at least.
+AUTOMAKE_OPTIONS = 1.10
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=gudev
+
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=2
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR=$(top_srcdir)/src
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space=g_udev
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS=--path=$(abs_srcdir) --path=$(abs_builddir)
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS=
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/src/gudev/*.h
+CFILE_GLOB=$(top_srcdir)/src/gudev/*.c
+
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+EXTRA_HFILES=
+
+# Header files to ignore when scanning. Use base file name, no paths
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES=
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+GTKDOC_CFLAGS = \
+ $(DBUS_GLIB_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ -I$(top_srcdir)/src/gudev \
+ -I$(top_builddir)/src/gudev
+
+GTKDOC_LIBS = \
+ $(GLIB_LIBS) \
+ $(top_builddir)/libgudev-1.0.la
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST += version.xml.in
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you want your docs-status tested during 'make check'
+if ENABLE_GTK_DOC
+#TESTS_ENVIRONMENT = cd $(srcsrc)
+#TESTS = $(GTKDOC_CHECK)
+endif
diff --git a/src/udev/src/gudev/docs/gudev-docs.xml b/src/udev/src/gudev/docs/gudev-docs.xml
new file mode 100644
index 000000000..f876c3bc0
--- /dev/null
+++ b/src/udev/src/gudev/docs/gudev-docs.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+<!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>GUDev Reference Manual</title>
+ <releaseinfo>For GUdev version &version;</releaseinfo>
+ <authorgroup>
+ <author>
+ <firstname>David</firstname>
+ <surname>Zeuthen</surname>
+ <affiliation>
+ <address>
+ <email>davidz@redhat.com</email>
+ </address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>Bastien</firstname>
+ <surname>Nocera</surname>
+ <affiliation>
+ <address>
+ <email>hadess@hadess.net</email>
+ </address>
+ </affiliation>
+ </author>
+ </authorgroup>
+
+ <copyright>
+ <year>2011</year>
+ <holder>The GUDev Authors</holder>
+ </copyright>
+
+ <legalnotice>
+ <para>
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the <citetitle>GNU Free
+ Documentation License</citetitle>, Version 1.1 or any later
+ version published by the Free Software Foundation with no
+ Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. You may obtain a copy of the <citetitle>GNU Free
+ Documentation License</citetitle> from the Free Software
+ Foundation by visiting <ulink type="http"
+ url="http://www.fsf.org">their Web site</ulink> or by writing
+ to:
+
+ <address>
+ The Free Software Foundation, Inc.,
+ <street>59 Temple Place</street> - Suite 330,
+ <city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>,
+ <country>USA</country>
+ </address>
+ </para>
+
+ <para>
+ Many of the names used by companies to distinguish their
+ products and services are claimed as trademarks. Where those
+ names appear in any freedesktop.org documentation, and those
+ trademarks are made aware to the members of the
+ freedesktop.org Project, the names have been printed in caps
+ or initial caps.
+ </para>
+ </legalnotice>
+ </bookinfo>
+
+ <reference id="ref-API">
+ <title>API Reference</title>
+ <partintro>
+ <para>
+ This part presents the class and function reference for the
+ <literal>libgudev</literal> library.
+ </para>
+ </partintro>
+ <xi:include href="xml/gudevclient.xml"/>
+ <xi:include href="xml/gudevdevice.xml"/>
+ <xi:include href="xml/gudevenumerator.xml"/>
+ </reference>
+
+ <chapter id="gudev-hierarchy">
+ <title>Object Hierarchy</title>
+ <xi:include href="xml/tree_index.sgml"/>
+ </chapter>
+ <index>
+ <title>Index</title>
+ </index>
+ <index role="165">
+ <title>Index of new symbols in 165</title>
+ <xi:include href="xml/api-index-165.xml"><xi:fallback /></xi:include>
+ </index>
+
+</book>
diff --git a/src/udev/src/gudev/docs/gudev-sections.txt b/src/udev/src/gudev/docs/gudev-sections.txt
new file mode 100644
index 000000000..213e1a746
--- /dev/null
+++ b/src/udev/src/gudev/docs/gudev-sections.txt
@@ -0,0 +1,113 @@
+<SECTION>
+<FILE>gudevclient</FILE>
+<TITLE>GUdevClient</TITLE>
+GUdevClient
+GUdevClientClass
+GUdevDeviceType
+GUdevDeviceNumber
+g_udev_client_new
+g_udev_client_query_by_subsystem
+g_udev_client_query_by_device_number
+g_udev_client_query_by_device_file
+g_udev_client_query_by_sysfs_path
+g_udev_client_query_by_subsystem_and_name
+<SUBSECTION Standard>
+G_UDEV_CLIENT
+G_UDEV_IS_CLIENT
+G_UDEV_TYPE_CLIENT
+g_udev_client_get_type
+G_UDEV_CLIENT_CLASS
+G_UDEV_IS_CLIENT_CLASS
+G_UDEV_CLIENT_GET_CLASS
+<SUBSECTION Private>
+GUdevClientPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gudevdevice</FILE>
+<TITLE>GUdevDevice</TITLE>
+GUdevDevice
+GUdevDeviceClass
+g_udev_device_get_subsystem
+g_udev_device_get_devtype
+g_udev_device_get_name
+g_udev_device_get_number
+g_udev_device_get_sysfs_path
+g_udev_device_get_driver
+g_udev_device_get_action
+g_udev_device_get_seqnum
+g_udev_device_get_device_type
+g_udev_device_get_device_number
+g_udev_device_get_device_file
+g_udev_device_get_device_file_symlinks
+g_udev_device_get_parent
+g_udev_device_get_parent_with_subsystem
+g_udev_device_get_tags
+g_udev_device_get_is_initialized
+g_udev_device_get_usec_since_initialized
+g_udev_device_get_property_keys
+g_udev_device_has_property
+g_udev_device_get_property
+g_udev_device_get_property_as_int
+g_udev_device_get_property_as_uint64
+g_udev_device_get_property_as_double
+g_udev_device_get_property_as_boolean
+g_udev_device_get_property_as_strv
+g_udev_device_get_sysfs_attr
+g_udev_device_get_sysfs_attr_as_int
+g_udev_device_get_sysfs_attr_as_uint64
+g_udev_device_get_sysfs_attr_as_double
+g_udev_device_get_sysfs_attr_as_boolean
+g_udev_device_get_sysfs_attr_as_strv
+<SUBSECTION Standard>
+G_UDEV_DEVICE
+G_UDEV_IS_DEVICE
+G_UDEV_TYPE_DEVICE
+g_udev_device_get_type
+G_UDEV_DEVICE_CLASS
+G_UDEV_IS_DEVICE_CLASS
+G_UDEV_DEVICE_GET_CLASS
+<SUBSECTION Private>
+GUdevDevicePrivate
+</SECTION>
+
+<SECTION>
+<FILE>gudevenumerator</FILE>
+<TITLE>GUdevEnumerator</TITLE>
+GUdevEnumerator
+GUdevEnumeratorClass
+g_udev_enumerator_new
+g_udev_enumerator_add_match_subsystem
+g_udev_enumerator_add_nomatch_subsystem
+g_udev_enumerator_add_match_sysfs_attr
+g_udev_enumerator_add_nomatch_sysfs_attr
+g_udev_enumerator_add_match_property
+g_udev_enumerator_add_match_name
+g_udev_enumerator_add_match_tag
+g_udev_enumerator_add_match_is_initialized
+g_udev_enumerator_add_sysfs_path
+g_udev_enumerator_execute
+<SUBSECTION Standard>
+G_UDEV_ENUMERATOR
+G_UDEV_IS_ENUMERATOR
+G_UDEV_TYPE_ENUMERATOR
+g_udev_enumerator_get_type
+G_UDEV_ENUMERATOR_CLASS
+G_UDEV_IS_ENUMERATOR_CLASS
+G_UDEV_ENUMERATOR_GET_CLASS
+<SUBSECTION Private>
+GUdevEnumeratorPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gudevmarshal</FILE>
+<SUBSECTION Private>
+g_udev_marshal_VOID__STRING_OBJECT
+</SECTION>
+
+<SECTION>
+<FILE>gudevenumtypes</FILE>
+<SUBSECTION Private>
+G_TYPE_UDEV_DEVICE_TYPE
+g_udev_device_type_get_type
+</SECTION>
diff --git a/src/udev/src/gudev/docs/gudev.types b/src/udev/src/gudev/docs/gudev.types
new file mode 100644
index 000000000..a89857a04
--- /dev/null
+++ b/src/udev/src/gudev/docs/gudev.types
@@ -0,0 +1,4 @@
+g_udev_device_type_get_type
+g_udev_device_get_type
+g_udev_client_get_type
+g_udev_enumerator_get_type
diff --git a/src/udev/src/gudev/docs/version.xml.in b/src/udev/src/gudev/docs/version.xml.in
new file mode 100644
index 000000000..d78bda934
--- /dev/null
+++ b/src/udev/src/gudev/docs/version.xml.in
@@ -0,0 +1 @@
+@VERSION@
diff --git a/src/udev/src/gudev/gjs-example.js b/src/udev/src/gudev/gjs-example.js
new file mode 100755
index 000000000..5586fd6a6
--- /dev/null
+++ b/src/udev/src/gudev/gjs-example.js
@@ -0,0 +1,75 @@
+#!/usr/bin/env gjs-console
+
+// This currently depends on the following patches to gjs
+//
+// http://bugzilla.gnome.org/show_bug.cgi?id=584558
+// http://bugzilla.gnome.org/show_bug.cgi?id=584560
+// http://bugzilla.gnome.org/show_bug.cgi?id=584568
+
+const GUdev = imports.gi.GUdev;
+const Mainloop = imports.mainloop;
+
+function print_device (device) {
+ print (" subsystem: " + device.get_subsystem ());
+ print (" devtype: " + device.get_devtype ());
+ print (" name: " + device.get_name ());
+ print (" number: " + device.get_number ());
+ print (" sysfs_path: " + device.get_sysfs_path ());
+ print (" driver: " + device.get_driver ());
+ print (" action: " + device.get_action ());
+ print (" seqnum: " + device.get_seqnum ());
+ print (" device type: " + device.get_device_type ());
+ print (" device number: " + device.get_device_number ());
+ print (" device file: " + device.get_device_file ());
+ print (" device file symlinks: " + device.get_device_file_symlinks ());
+ print (" foo: " + device.get_sysfs_attr_as_strv ("stat"));
+ var keys = device.get_property_keys ();
+ for (var n = 0; n < keys.length; n++) {
+ print (" " + keys[n] + "=" + device.get_property (keys[n]));
+ }
+}
+
+function on_uevent (client, action, device) {
+ print ("action " + action + " on device " + device.get_sysfs_path());
+ print_device (device);
+ print ("");
+}
+
+var client = new GUdev.Client ({subsystems: ["block", "usb/usb_interface"]});
+client.connect ("uevent", on_uevent);
+
+var block_devices = client.query_by_subsystem ("block");
+for (var n = 0; n < block_devices.length; n++) {
+ print ("block device: " + block_devices[n].get_device_file ());
+}
+
+var d;
+
+d = client.query_by_device_number (GUdev.DeviceType.BLOCK, 0x0810);
+if (d == null) {
+ print ("query_by_device_number 0x810 -> null");
+} else {
+ print ("query_by_device_number 0x810 -> " + d.get_device_file ());
+ var dd = d.get_parent_with_subsystem ("usb", null);
+ print_device (dd);
+ print ("--------------------------------------------------------------------------");
+ while (d != null) {
+ print_device (d);
+ print ("");
+ d = d.get_parent ();
+ }
+}
+
+d = client.query_by_sysfs_path ("/sys/block/sda/sda1");
+print ("query_by_sysfs_path (\"/sys/block/sda1\") -> " + d.get_device_file ());
+
+d = client.query_by_subsystem_and_name ("block", "sda2");
+print ("query_by_subsystem_and_name (\"block\", \"sda2\") -> " + d.get_device_file ());
+
+d = client.query_by_device_file ("/dev/sda");
+print ("query_by_device_file (\"/dev/sda\") -> " + d.get_device_file ());
+
+d = client.query_by_device_file ("/dev/block/8:0");
+print ("query_by_device_file (\"/dev/block/8:0\") -> " + d.get_device_file ());
+
+Mainloop.run('udev-example');
diff --git a/src/udev/src/gudev/gudev-1.0.pc.in b/src/udev/src/gudev/gudev-1.0.pc.in
new file mode 100644
index 000000000..058262d76
--- /dev/null
+++ b/src/udev/src/gudev/gudev-1.0.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gudev-1.0
+Description: GObject bindings for libudev
+Version: @VERSION@
+Requires: glib-2.0, gobject-2.0
+Libs: -L${libdir} -lgudev-1.0
+Cflags: -I${includedir}/gudev-1.0
diff --git a/src/udev/src/gudev/gudev.h b/src/udev/src/gudev/gudev.h
new file mode 100644
index 000000000..a31346081
--- /dev/null
+++ b/src/udev/src/gudev/gudev.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __G_UDEV_H__
+#define __G_UDEV_H__
+
+#define _GUDEV_INSIDE_GUDEV_H 1
+#include <gudev/gudevenums.h>
+#include <gudev/gudevenumtypes.h>
+#include <gudev/gudevtypes.h>
+#include <gudev/gudevclient.h>
+#include <gudev/gudevdevice.h>
+#include <gudev/gudevenumerator.h>
+#undef _GUDEV_INSIDE_GUDEV_H
+
+#endif /* __G_UDEV_H__ */
diff --git a/src/udev/src/gudev/gudevclient.c b/src/udev/src/gudev/gudevclient.c
new file mode 100644
index 000000000..2b94102ac
--- /dev/null
+++ b/src/udev/src/gudev/gudevclient.c
@@ -0,0 +1,527 @@
+/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008-2010 David Zeuthen <davidz@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gudevclient.h"
+#include "gudevdevice.h"
+#include "gudevmarshal.h"
+#include "gudevprivate.h"
+
+/**
+ * SECTION:gudevclient
+ * @short_description: Query devices and listen to uevents
+ *
+ * #GUdevClient is used to query information about devices on a Linux
+ * system from the Linux kernel and the udev device
+ * manager.
+ *
+ * Device information is retrieved from the kernel (through the
+ * <literal>sysfs</literal> filesystem) and the udev daemon (through a
+ * <literal>tmpfs</literal> filesystem) and presented through
+ * #GUdevDevice objects. This means that no blocking IO ever happens
+ * (in both cases, we are essentially just reading data from kernel
+ * memory) and as such there are no asynchronous versions of the
+ * provided methods.
+ *
+ * To get #GUdevDevice objects, use
+ * g_udev_client_query_by_subsystem(),
+ * g_udev_client_query_by_device_number(),
+ * g_udev_client_query_by_device_file(),
+ * g_udev_client_query_by_sysfs_path(),
+ * g_udev_client_query_by_subsystem_and_name()
+ * or the #GUdevEnumerator type.
+ *
+ * To listen to uevents, connect to the #GUdevClient::uevent signal.
+ */
+
+struct _GUdevClientPrivate
+{
+ GSource *watch_source;
+ struct udev *udev;
+ struct udev_monitor *monitor;
+
+ gchar **subsystems;
+};
+
+enum
+{
+ PROP_0,
+ PROP_SUBSYSTEMS,
+};
+
+enum
+{
+ UEVENT_SIGNAL,
+ LAST_SIGNAL,
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (GUdevClient, g_udev_client, G_TYPE_OBJECT)
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean
+monitor_event (GIOChannel *source,
+ GIOCondition condition,
+ gpointer data)
+{
+ GUdevClient *client = (GUdevClient *) data;
+ GUdevDevice *device;
+ struct udev_device *udevice;
+
+ if (client->priv->monitor == NULL)
+ goto out;
+ udevice = udev_monitor_receive_device (client->priv->monitor);
+ if (udevice == NULL)
+ goto out;
+
+ device = _g_udev_device_new (udevice);
+ udev_device_unref (udevice);
+ g_signal_emit (client,
+ signals[UEVENT_SIGNAL],
+ 0,
+ g_udev_device_get_action (device),
+ device);
+ g_object_unref (device);
+
+ out:
+ return TRUE;
+}
+
+static void
+g_udev_client_finalize (GObject *object)
+{
+ GUdevClient *client = G_UDEV_CLIENT (object);
+
+ if (client->priv->watch_source != NULL)
+ {
+ g_source_destroy (client->priv->watch_source);
+ client->priv->watch_source = NULL;
+ }
+
+ if (client->priv->monitor != NULL)
+ {
+ udev_monitor_unref (client->priv->monitor);
+ client->priv->monitor = NULL;
+ }
+
+ if (client->priv->udev != NULL)
+ {
+ udev_unref (client->priv->udev);
+ client->priv->udev = NULL;
+ }
+
+ g_strfreev (client->priv->subsystems);
+
+ if (G_OBJECT_CLASS (g_udev_client_parent_class)->finalize != NULL)
+ G_OBJECT_CLASS (g_udev_client_parent_class)->finalize (object);
+}
+
+static void
+g_udev_client_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GUdevClient *client = G_UDEV_CLIENT (object);
+
+ switch (prop_id)
+ {
+ case PROP_SUBSYSTEMS:
+ if (client->priv->subsystems != NULL)
+ g_strfreev (client->priv->subsystems);
+ client->priv->subsystems = g_strdupv (g_value_get_boxed (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_udev_client_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GUdevClient *client = G_UDEV_CLIENT (object);
+
+ switch (prop_id)
+ {
+ case PROP_SUBSYSTEMS:
+ g_value_set_boxed (value, client->priv->subsystems);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+g_udev_client_constructed (GObject *object)
+{
+ GUdevClient *client = G_UDEV_CLIENT (object);
+ GIOChannel *channel;
+ guint n;
+
+ client->priv->udev = udev_new ();
+
+ /* connect to event source */
+ client->priv->monitor = udev_monitor_new_from_netlink (client->priv->udev, "udev");
+
+ //g_debug ("ss = %p", client->priv->subsystems);
+
+ if (client->priv->subsystems != NULL)
+ {
+ /* install subsystem filters to only wake up for certain events */
+ for (n = 0; client->priv->subsystems[n] != NULL; n++)
+ {
+ gchar *subsystem;
+ gchar *devtype;
+ gchar *s;
+
+ subsystem = g_strdup (client->priv->subsystems[n]);
+ devtype = NULL;
+
+ //g_debug ("s = '%s'", subsystem);
+
+ s = strstr (subsystem, "/");
+ if (s != NULL)
+ {
+ devtype = s + 1;
+ *s = '\0';
+ }
+
+ if (client->priv->monitor != NULL)
+ udev_monitor_filter_add_match_subsystem_devtype (client->priv->monitor, subsystem, devtype);
+
+ g_free (subsystem);
+ }
+
+ /* listen to events, and buffer them */
+ if (client->priv->monitor != NULL)
+ {
+ udev_monitor_enable_receiving (client->priv->monitor);
+ channel = g_io_channel_unix_new (udev_monitor_get_fd (client->priv->monitor));
+ client->priv->watch_source = g_io_create_watch (channel, G_IO_IN);
+ g_io_channel_unref (channel);
+ g_source_set_callback (client->priv->watch_source, (GSourceFunc) monitor_event, client, NULL);
+ g_source_attach (client->priv->watch_source, g_main_context_get_thread_default ());
+ g_source_unref (client->priv->watch_source);
+ }
+ else
+ {
+ client->priv->watch_source = NULL;
+ }
+ }
+
+ if (G_OBJECT_CLASS (g_udev_client_parent_class)->constructed != NULL)
+ G_OBJECT_CLASS (g_udev_client_parent_class)->constructed (object);
+}
+
+
+static void
+g_udev_client_class_init (GUdevClientClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ gobject_class->constructed = g_udev_client_constructed;
+ gobject_class->set_property = g_udev_client_set_property;
+ gobject_class->get_property = g_udev_client_get_property;
+ gobject_class->finalize = g_udev_client_finalize;
+
+ /**
+ * GUdevClient:subsystems:
+ *
+ * The subsystems to listen for uevents on.
+ *
+ * To listen for only a specific DEVTYPE for a given SUBSYSTEM, use
+ * "subsystem/devtype". For example, to only listen for uevents
+ * where SUBSYSTEM is usb and DEVTYPE is usb_interface, use
+ * "usb/usb_interface".
+ *
+ * If this property is %NULL, then no events will be reported. If
+ * it's the empty array, events from all subsystems will be
+ * reported.
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_SUBSYSTEMS,
+ g_param_spec_boxed ("subsystems",
+ "The subsystems to listen for changes on",
+ "The subsystems to listen for changes on",
+ G_TYPE_STRV,
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_READWRITE));
+
+ /**
+ * GUdevClient::uevent:
+ * @client: The #GUdevClient receiving the event.
+ * @action: The action for the uevent e.g. "add", "remove", "change", "move", etc.
+ * @device: Details about the #GUdevDevice the event is for.
+ *
+ * Emitted when @client receives an uevent.
+ *
+ * This signal is emitted in the
+ * <link linkend="g-main-context-push-thread-default">thread-default main loop</link>
+ * of the thread that @client was created in.
+ */
+ signals[UEVENT_SIGNAL] = g_signal_new ("uevent",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GUdevClientClass, uevent),
+ NULL,
+ NULL,
+ g_udev_marshal_VOID__STRING_OBJECT,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_STRING,
+ G_UDEV_TYPE_DEVICE);
+
+ g_type_class_add_private (klass, sizeof (GUdevClientPrivate));
+}
+
+static void
+g_udev_client_init (GUdevClient *client)
+{
+ client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client,
+ G_UDEV_TYPE_CLIENT,
+ GUdevClientPrivate);
+}
+
+/**
+ * g_udev_client_new:
+ * @subsystems: (array zero-terminated=1) (element-type utf8) (transfer none) (allow-none): A %NULL terminated string array of subsystems to listen for uevents on, %NULL to not listen on uevents at all, or an empty array to listen to uevents on all subsystems. See the documentation for the #GUdevClient:subsystems property for details on this parameter.
+ *
+ * Constructs a #GUdevClient object that can be used to query
+ * information about devices. Connect to the #GUdevClient::uevent
+ * signal to listen for uevents. Note that signals are emitted in the
+ * <link linkend="g-main-context-push-thread-default">thread-default main loop</link>
+ * of the thread that you call this constructor from.
+ *
+ * Returns: A new #GUdevClient object. Free with g_object_unref().
+ */
+GUdevClient *
+g_udev_client_new (const gchar * const *subsystems)
+{
+ return G_UDEV_CLIENT (g_object_new (G_UDEV_TYPE_CLIENT, "subsystems", subsystems, NULL));
+}
+
+/**
+ * g_udev_client_query_by_subsystem:
+ * @client: A #GUdevClient.
+ * @subsystem: (allow-none): The subsystem to get devices for or %NULL to get all devices.
+ *
+ * Gets all devices belonging to @subsystem.
+ *
+ * Returns: (element-type GUdevDevice) (transfer full): A list of #GUdevDevice objects. The caller should free the result by using g_object_unref() on each element in the list and then g_list_free() on the list.
+ */
+GList *
+g_udev_client_query_by_subsystem (GUdevClient *client,
+ const gchar *subsystem)
+{
+ struct udev_enumerate *enumerate;
+ struct udev_list_entry *l, *devices;
+ GList *ret;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+
+ ret = NULL;
+
+ /* prepare a device scan */
+ enumerate = udev_enumerate_new (client->priv->udev);
+
+ /* filter for subsystem */
+ if (subsystem != NULL)
+ udev_enumerate_add_match_subsystem (enumerate, subsystem);
+ /* retrieve the list */
+ udev_enumerate_scan_devices (enumerate);
+
+ /* add devices to the list */
+ devices = udev_enumerate_get_list_entry (enumerate);
+ for (l = devices; l != NULL; l = udev_list_entry_get_next (l))
+ {
+ struct udev_device *udevice;
+ GUdevDevice *device;
+
+ udevice = udev_device_new_from_syspath (udev_enumerate_get_udev (enumerate),
+ udev_list_entry_get_name (l));
+ if (udevice == NULL)
+ continue;
+ device = _g_udev_device_new (udevice);
+ udev_device_unref (udevice);
+ ret = g_list_prepend (ret, device);
+ }
+ udev_enumerate_unref (enumerate);
+
+ ret = g_list_reverse (ret);
+
+ return ret;
+}
+
+/**
+ * g_udev_client_query_by_device_number:
+ * @client: A #GUdevClient.
+ * @type: A value from the #GUdevDeviceType enumeration.
+ * @number: A device number.
+ *
+ * Looks up a device for a type and device number.
+ *
+ * Returns: (transfer full): A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
+ */
+GUdevDevice *
+g_udev_client_query_by_device_number (GUdevClient *client,
+ GUdevDeviceType type,
+ GUdevDeviceNumber number)
+{
+ struct udev_device *udevice;
+ GUdevDevice *device;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+
+ device = NULL;
+ udevice = udev_device_new_from_devnum (client->priv->udev, type, number);
+
+ if (udevice == NULL)
+ goto out;
+
+ device = _g_udev_device_new (udevice);
+ udev_device_unref (udevice);
+
+ out:
+ return device;
+}
+
+/**
+ * g_udev_client_query_by_device_file:
+ * @client: A #GUdevClient.
+ * @device_file: A device file.
+ *
+ * Looks up a device for a device file.
+ *
+ * Returns: (transfer full): A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
+ */
+GUdevDevice *
+g_udev_client_query_by_device_file (GUdevClient *client,
+ const gchar *device_file)
+{
+ struct stat stat_buf;
+ GUdevDevice *device;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ g_return_val_if_fail (device_file != NULL, NULL);
+
+ device = NULL;
+
+ if (stat (device_file, &stat_buf) != 0)
+ goto out;
+
+ if (stat_buf.st_rdev == 0)
+ goto out;
+
+ if (S_ISBLK (stat_buf.st_mode))
+ device = g_udev_client_query_by_device_number (client, G_UDEV_DEVICE_TYPE_BLOCK, stat_buf.st_rdev);
+ else if (S_ISCHR (stat_buf.st_mode))
+ device = g_udev_client_query_by_device_number (client, G_UDEV_DEVICE_TYPE_CHAR, stat_buf.st_rdev);
+
+ out:
+ return device;
+}
+
+/**
+ * g_udev_client_query_by_sysfs_path:
+ * @client: A #GUdevClient.
+ * @sysfs_path: A sysfs path.
+ *
+ * Looks up a device for a sysfs path.
+ *
+ * Returns: (transfer full): A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
+ */
+GUdevDevice *
+g_udev_client_query_by_sysfs_path (GUdevClient *client,
+ const gchar *sysfs_path)
+{
+ struct udev_device *udevice;
+ GUdevDevice *device;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ g_return_val_if_fail (sysfs_path != NULL, NULL);
+
+ device = NULL;
+ udevice = udev_device_new_from_syspath (client->priv->udev, sysfs_path);
+ if (udevice == NULL)
+ goto out;
+
+ device = _g_udev_device_new (udevice);
+ udev_device_unref (udevice);
+
+ out:
+ return device;
+}
+
+/**
+ * g_udev_client_query_by_subsystem_and_name:
+ * @client: A #GUdevClient.
+ * @subsystem: A subsystem name.
+ * @name: The name of the device.
+ *
+ * Looks up a device for a subsystem and name.
+ *
+ * Returns: (transfer full): A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
+ */
+GUdevDevice *
+g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
+ const gchar *subsystem,
+ const gchar *name)
+{
+ struct udev_device *udevice;
+ GUdevDevice *device;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ g_return_val_if_fail (subsystem != NULL, NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ device = NULL;
+ udevice = udev_device_new_from_subsystem_sysname (client->priv->udev, subsystem, name);
+ if (udevice == NULL)
+ goto out;
+
+ device = _g_udev_device_new (udevice);
+ udev_device_unref (udevice);
+
+ out:
+ return device;
+}
+
+struct udev *
+_g_udev_client_get_udev (GUdevClient *client)
+{
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ return client->priv->udev;
+}
diff --git a/src/udev/src/gudev/gudevclient.h b/src/udev/src/gudev/gudevclient.h
new file mode 100644
index 000000000..b425d03d4
--- /dev/null
+++ b/src/udev/src/gudev/gudevclient.h
@@ -0,0 +1,100 @@
+/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
+#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
+#endif
+
+#ifndef __G_UDEV_CLIENT_H__
+#define __G_UDEV_CLIENT_H__
+
+#include <gudev/gudevtypes.h>
+
+G_BEGIN_DECLS
+
+#define G_UDEV_TYPE_CLIENT (g_udev_client_get_type ())
+#define G_UDEV_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_UDEV_TYPE_CLIENT, GUdevClient))
+#define G_UDEV_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_UDEV_TYPE_CLIENT, GUdevClientClass))
+#define G_UDEV_IS_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_UDEV_TYPE_CLIENT))
+#define G_UDEV_IS_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_UDEV_TYPE_CLIENT))
+#define G_UDEV_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_UDEV_TYPE_CLIENT, GUdevClientClass))
+
+typedef struct _GUdevClientClass GUdevClientClass;
+typedef struct _GUdevClientPrivate GUdevClientPrivate;
+
+/**
+ * GUdevClient:
+ *
+ * The #GUdevClient struct is opaque and should not be accessed directly.
+ */
+struct _GUdevClient
+{
+ GObject parent;
+
+ /*< private >*/
+ GUdevClientPrivate *priv;
+};
+
+/**
+ * GUdevClientClass:
+ * @parent_class: Parent class.
+ * @uevent: Signal class handler for the #GUdevClient::uevent signal.
+ *
+ * Class structure for #GUdevClient.
+ */
+struct _GUdevClientClass
+{
+ GObjectClass parent_class;
+
+ /* signals */
+ void (*uevent) (GUdevClient *client,
+ const gchar *action,
+ GUdevDevice *device);
+
+ /*< private >*/
+ /* Padding for future expansion */
+ void (*reserved1) (void);
+ void (*reserved2) (void);
+ void (*reserved3) (void);
+ void (*reserved4) (void);
+ void (*reserved5) (void);
+ void (*reserved6) (void);
+ void (*reserved7) (void);
+ void (*reserved8) (void);
+};
+
+GType g_udev_client_get_type (void) G_GNUC_CONST;
+GUdevClient *g_udev_client_new (const gchar* const *subsystems);
+GList *g_udev_client_query_by_subsystem (GUdevClient *client,
+ const gchar *subsystem);
+GUdevDevice *g_udev_client_query_by_device_number (GUdevClient *client,
+ GUdevDeviceType type,
+ GUdevDeviceNumber number);
+GUdevDevice *g_udev_client_query_by_device_file (GUdevClient *client,
+ const gchar *device_file);
+GUdevDevice *g_udev_client_query_by_sysfs_path (GUdevClient *client,
+ const gchar *sysfs_path);
+GUdevDevice *g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
+ const gchar *subsystem,
+ const gchar *name);
+
+G_END_DECLS
+
+#endif /* __G_UDEV_CLIENT_H__ */
diff --git a/src/udev/src/gudev/gudevdevice.c b/src/udev/src/gudev/gudevdevice.c
new file mode 100644
index 000000000..62a26f99b
--- /dev/null
+++ b/src/udev/src/gudev/gudevdevice.c
@@ -0,0 +1,963 @@
+/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gudevdevice.h"
+#include "gudevprivate.h"
+
+/**
+ * SECTION:gudevdevice
+ * @short_description: Get information about a device
+ *
+ * The #GUdevDevice class is used to get information about a specific
+ * device. Note that you cannot instantiate a #GUdevDevice object
+ * yourself. Instead you must use #GUdevClient to obtain #GUdevDevice
+ * objects.
+ *
+ * To get basic information about a device, use
+ * g_udev_device_get_subsystem(), g_udev_device_get_d