GNetworkMonitorNetlink *nl = user_data;
GInputVector iv;
gssize len;
- GSocketControlMessage **cmsgs = NULL;
- gint num_cmsgs = 0, i, flags;
+ gint flags;
GError *error = NULL;
- GCredentials *creds;
- uid_t sender;
+ GSocketAddress *addr;
struct nlmsghdr *msg;
struct rtmsg *rtmsg;
struct rtattr *attr;
+ struct sockaddr_nl source_sockaddr;
gsize attrlen;
guint8 *dest, *gateway, *oif;
gboolean retval = TRUE;
iv.buffer = g_malloc (len);
iv.size = len;
- len = g_socket_receive_message (nl->priv->sock, NULL, &iv, 1,
- &cmsgs, &num_cmsgs, NULL, NULL, &error);
+ len = g_socket_receive_message (nl->priv->sock, &addr, &iv, 1,
+ NULL, NULL, NULL, NULL, &error);
if (len < 0)
{
g_warning ("Error on netlink socket: %s", error->message);
return FALSE;
}
- if (num_cmsgs != 1 || !G_IS_UNIX_CREDENTIALS_MESSAGE (cmsgs[0]))
- goto done;
+ if (!g_socket_address_to_native (addr, &source_sockaddr, sizeof (source_sockaddr), &error))
+ {
+ g_warning ("Error on netlink socket: %s", error->message);
+ g_error_free (error);
+ if (nl->priv->dump_networks)
+ finish_dump (nl);
+ return FALSE;
+ }
- creds = g_unix_credentials_message_get_credentials (G_UNIX_CREDENTIALS_MESSAGE (cmsgs[0]));
- sender = g_credentials_get_unix_user (creds, NULL);
- if (sender != 0)
+ /* If the sender port id is 0 (not fakeable) then the message is from the kernel */
+ if (source_sockaddr.nl_pid != 0)
goto done;
msg = (struct nlmsghdr *) iv.buffer;
}
done:
- for (i = 0; i < num_cmsgs; i++)
- g_object_unref (cmsgs[i]);
- g_free (cmsgs);
-
g_free (iv.buffer);
if (!retval && nl->priv->dump_networks)