Applications used the system call interface, or performed file I/O on device nodes in order to communicate with hardware through these abstractions.
As a result, devices are discovered or change state in ways which can be difficult to track through the system call interface or Unix IPC.
These must often be invoked in ways that can be awkward to express with the Unix permissions model (for example, allowing users to join wireless networks only if they are logged into the video console).
[1] Application authors resort to using setuid binaries or run service daemons to provide their own access control and privilege separation, potentially introducing security holes each time.
The device's functionality is exposed through D-Bus interfaces, and its state accessed through properties, a set of key-value pairs.
As of 2011[update], Linux distributions such as Ubuntu,[5] Debian,[6] and Fedora and on FreeBSD,[7] and projects such as KDE,[8] GNOME and X.org are in the process of deprecating HAL as it has "become a large monolithic unmaintainable mess".