diff options
author | Diogo Ferreira <defer@cyngn.com> | 2014-11-05 12:46:22 +0000 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-10-26 15:49:35 -0700 |
commit | 95e732727996328a0f760d6da7668ba4d55a58b3 (patch) | |
tree | a8f6976edd93a81eadd49e509c62a79f8298446e | |
parent | 2737a4374b601a5158796f9377f6536137364c05 (diff) | |
download | hardware_libhardware_legacy-95e732727996328a0f760d6da7668ba4d55a58b3.zip hardware_libhardware_legacy-95e732727996328a0f760d6da7668ba4d55a58b3.tar.gz hardware_libhardware_legacy-95e732727996328a0f760d6da7668ba4d55a58b3.tar.bz2 |
uevent: Allow multiple uevent listeners from the same process
The netlink socket created by uevent_init sets the nl_pid to the
current PID. nl_pid must be unique per-process, however it does not
have to do with the PID. From the documentation:
"
For a user-space process, nl_pid
is usually the PID of the process owning the destination socket.
However, nl_pid identifies a netlink socket, not a process. If a
process owns several netlink sockets, then nl_pid can be equal to the
process ID only for at most one socket.
"
In use cases where a single process calls uevent_init more than one
time, the second one will always fail. This patch sets the nl_pid
to 0, which lets the kernel pick its own unique identifier as per the
documentation:
"
If the application sets it to 0, the kernel takes
care of assigning it. The kernel assigns the process ID to the first
netlink socket the process opens and assigns a unique nl_pid to every
netlink socket that the process subsequently creates.
"
The behavior stays the same for the first socket but will also succeed
in subsequent calls.
Change-Id: I6fa74adc9d5835ff39b86187799998111fc12001
(cherry picked from commit 6dcd02055aaa2ce1e7132d5886557a7a5be6571f)
-rw-r--r-- | uevent/uevent.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/uevent/uevent.c b/uevent/uevent.c index e40aa2e..a723caf 100644 --- a/uevent/uevent.c +++ b/uevent/uevent.c @@ -48,7 +48,7 @@ int uevent_init() memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; - addr.nl_pid = getpid(); + addr.nl_pid = 0; addr.nl_groups = 0xffffffff; s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); |