How to check Ethernet in Linux?
To check if the link is up, try something like this. It works without root privileges.
#include <stdio.h> // printf#include <string.h> // strncpy//#include <sys/socket.h> // AF_INET#include <sys/ioctl.h> // SIOCGIFFLAGS#include <errno.h> // errno#include <netinet/in.h> // IPPROTO_IP#include <net/if.h> // IFF_*, ifreq#define ERROR(fmt, ...) do { printf(fmt, __VA_ARGS__); return -1; } while(0)int CheckLink(char *ifname) { int state = -1; int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (socId < 0) ERROR("Socket failed. Errno = %d\n", errno); struct ifreq if_req; (void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name)); int rv = ioctl(socId, SIOCGIFFLAGS, &if_req); close(socId); if ( rv == -1) ERROR("Ioctl failed. Errno = %d\n", errno); return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING);}int main() { printf("%d\n", CheckLink("eth0"));}
If IFF_UP is set, it means interface is up (see ifup). If IFF_RUNNING is set then interface is plugged.I also tried using the ethtool ioctl call, but it failed when the gid was not root. But just for the log:
...#include <asm/types.h> // __u32#include <linux/ethtool.h> // ETHTOOL_GLINK#include <linux/sockios.h> // SIOCETHTOOL...int CheckLink(char *ifname) { ... struct ifreq if_req; (void) strncpy( if_req.ifr_name, ifname, sizeof(if_req.ifr_name) ); struct ethtool_value edata; edata.cmd = ETHTOOL_GLINK; if_req.ifr_data = (char*) &edata; int rv = ioctl(socId, SIOCETHTOOL, &if_req); ... return !!edata.data;}