#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>

#define __KERNEL__
#include <asm/types.h>
#undef __KERNEL__
#include <linux/sockios.h>
#include <linux/ethtool.h>

int main(int argc, char* argv[])
{
	struct ethtool_value ethval;
	struct ifreq          ifr;
	int err;
	int fd;

	/* check arg */
	if( 2!=argc || '-'==argv[1][0]){
		fputs("Usage:\n", stderr);
		fputs("  ethlink <interface>\n\n", stderr);
		return 1;
	}

	/* init query structure */
	memset(&ifr, 0, sizeof(struct ifreq));
	strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);

	ethval.cmd = ETHTOOL_GLINK;
	ifr.ifr_data = (caddr_t)&ethval;


	/* open control socket */
	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if( 0 > fd ){
		fputs("Cannot open socket\n", stderr);
		return 1;
	}
	
	/* query */
	err = ioctl(fd, SIOCETHTOOL, &ifr);
	close(fd);

	if( 0 == err ){
		if( ethval.data ){
			/* Link */
			printf("ethlink: yes\n");
		}else{
			/* Ethernet is not linked */
			printf("ethlink: no\n");
		}
	}else{
		/* Query failed */
		printf("ethlink: unknown\n");
	}
	return 0;
}
