This how I think ifplugd should work, it should not poll it
should just use libnetlink and read for the next message.

The RUNNING flag works for wireless and non-wireless devices.
If there is a driver it doesn't work on than that is a bug in
the device driver and should be fixed ASAP, not worked around
in user space.

===============================
/* Demo of how to monitor link status with netlink */
#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

#include <linux/netdevice.h>
#include "libnetlink.h"

static int filter_link(const struct sockaddr_nl *who,
                       struct nlmsghdr *n, void *arg)
{
        struct ifinfomsg *ifi = NLMSG_DATA(n);
        struct rtattr * tb[IFLA_MAX+1];
        int len = n->nlmsg_len;

        if (n->nlmsg_type != RTM_NEWLINK && n->nlmsg_type != RTM_DELLINK)
                return 0;

        len -= NLMSG_LENGTH(sizeof(*ifi));
        if (len < 0)
                return -1;

        parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);

        if (n->nlmsg_type == RTM_DELLINK)
                printf("Deleted ");

        printf("%d: %s %s,%sCARRIER\n", ifi->ifi_index,
               tb[IFLA_IFNAME] ? (char *) RTA_DATA(tb[IFLA_IFNAME]) : "???",
               (ifi->ifi_flags & IFF_UP) ? "UP" : "DOWN",
               (ifi->ifi_flags & IFF_RUNNING) ? "": "NO");

        return 0;
}

int main(int argc, char **argv)
{
        struct rtnl_handle rth;

        if (rtnl_open(&rth, RTMGRP_LINK) < 0) {
                fprintf(stderr, "Cannot open rtnetlink\n");
                return -1;
        }

        if (rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_NEWLINK) < 0) {
                perror("Cannot send dump request");
                return -1;
        }
        return (rtnl_listen(&rth, filter_link, NULL) < 0) ? 1 : 0;
}
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to