Hi Marcel.
+int caif_rtnl_init(void)
+{
+ struct sockaddr_nl addr;
+ int sk, err;
+ GError *gerr = NULL;
+
+ sk = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
+ if (sk < 0)
+ return sk;
+
+ memset(&addr, 0, sizeof(addr));
+ addr.nl_family = AF_NETLINK;
+ addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
+
+ err = bind(sk, (struct sockaddr *) &addr, sizeof(addr));
+ if (err < 0) {
+ close(sk);
+ return err;
+ }
+
+ channel = g_io_channel_unix_new(sk);
+ g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, &gerr);
+ g_io_channel_set_encoding(channel, NULL, &gerr);
+ g_io_channel_set_buffered(channel, TRUE);
+ g_io_channel_set_close_on_unref(channel, TRUE);
+
+ rtnl_watch = g_io_add_watch(channel,
+ G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+ netlink_event, NULL);
+ pending_requests = NULL;
+
+ return 0;
+}
Sigh, I realize I have a potential leak on gerr above. I'll wait for
more review comments from you,
and resubmit later.
Regards,
Sjur