Marc Balmer | 3 Jan 2010 13:50
Picon
Favicon

Re: interface name optional in wake(8)

>> Make the interface name argument to wake(8) optional. If the first argument
>> given to wake(8) is not the name of a local ethernet interface, wake(8)
>> determines the first ethernet device in the system and uses it instead.
>> 
>> With the interface name being optional, scripts using wake(8) can work
>> unaltered on machines with different ethernet devices.

[...]

In a discussion with joerg <at>  we found that just checking for AF_LINK and IFT_ETHER might give us the wrong
interface.  So at least also check IFF_UP and IFF_RUNNING to make sure we get an ethernet interface that is
up and running:

static int
find_ether(char *dst, size_t len)
{
	struct ifaddrs *ifap, *ifa;
	struct sockaddr_dl *sdl = NULL;

	if (dst == NULL || len == 0)
		return 0;

	if (getifaddrs(&ifap) != 0)
		return -1;

	for (ifa = ifap; ifa; ifa = ifa->ifa_next)
		if (ifa->ifa_addr->sa_family == AF_LINK &&
		    ifa->ifa_flags & IFF_UP && ifa->ifa_flags & IFF_RUNNING) {
			sdl = (struct sockaddr_dl *)ifa->ifa_addr;
			if (sdl->sdl_type == IFT_ETHER) {
(Continue reading)


Gmane