Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 3 Jun 2003 23:07:39 +0000 (23:07 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 3 Jun 2003 23:07:39 +0000 (23:07 +0000)
* sysdeps/unix/sysv/linux/ifaddrs.c (netlink_open): Call getsockname
to get the actual PID value used in the records passed up.
(getifaddrs): Don't initialize nh.pid here.

2003-06-02  Ulrich Drepper  <drepper@redhat.com>

ChangeLog
sysdeps/unix/sysv/linux/ifaddrs.c

index 8c71048..fab8d28 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2003-06-02  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/unix/sysv/linux/ifaddrs.c (netlink_open): Call getsockname
+       to get the actual PID value used in the records passed up.
+       (getifaddrs): Don't initialize nh.pid here.
+
+2003-06-02  Ulrich Drepper  <drepper@redhat.com>
+
        * sysdeps/unix/sysv/linux/ifaddrs.c (netlink_receive): Minor
        optimization.
 
index 6765387..bc1ca85 100644 (file)
@@ -233,9 +233,17 @@ netlink_open (struct netlink_handle *h)
   nladdr.nl_family = AF_NETLINK;
   if (__bind (h->fd, (struct sockaddr *) &nladdr, sizeof (nladdr)) < 0)
     {
+    close_and_out:
       netlink_close (h);
       return -1;
     }
+  /* Determine the ID the kernel assigned for this netlink connection.
+     It is not necessarily the PID if there is more than one socket
+     open.  */
+  socklen_t addr_len = sizeof (nladdr);
+  if (__getsockname (h->fd, (struct sockaddr *) &nladdr, &addr_len) < 0)
+    goto close_and_out;
+  h->pid = nladdr.nl_pid;
   return 0;
 }
 
@@ -303,8 +311,6 @@ getifaddrs (struct ifaddrs **ifap)
     return fallback_getifaddrs (ifap);
 #endif
 
-  nh.pid = getpid ();
-
   /* Tell the kernel that we wish to get a list of all
      active interfaces.  */
   if (netlink_sendreq (&nh, RTM_GETLINK) < 0)