--- a/src/interface.c +++ b/src/interface.c @@ -89,6 +89,10 @@ interface_status_t interface_detect_beat_mii(int fd, char *iface) { struct ifreq ifr; + union { + caddr_t *data; + unsigned short *usz; + } ifd; if (interface_auto_up) interface_up(fd, iface); @@ -103,7 +107,8 @@ return IFSTATUS_ERR; } - ((unsigned short*) &ifr.ifr_data)[1] = 1; + ifd.data = &ifr.ifr_data; + *++ifd.usz = 1; if (ioctl(fd, SIOCGMIIREG, &ifr) == -1) { if (interface_do_message) @@ -112,12 +117,17 @@ return IFSTATUS_ERR; } - return (((unsigned short*) &ifr.ifr_data)[3] & 0x0004) ? IFSTATUS_UP : IFSTATUS_DOWN; + ifd.usz += 2; + return (*ifd.usz & 0x0004) ? IFSTATUS_UP : IFSTATUS_DOWN; } interface_status_t interface_detect_beat_priv(int fd, char *iface) { struct ifreq ifr; - + union { + caddr_t *data; + unsigned short *usz; + } ifd; + if (interface_auto_up) interface_up(fd, iface); @@ -131,7 +141,8 @@ return IFSTATUS_ERR; } - ((unsigned short*) &ifr.ifr_data)[1] = 1; + ifd.data = &ifr.ifr_data; + *++ifd.usz = 1; if (ioctl(fd, SIOCDEVPRIVATE+1, &ifr) == -1) { if (interface_do_message) @@ -140,7 +151,8 @@ return IFSTATUS_ERR; } - return (((unsigned short*) &ifr.ifr_data)[3] & 0x0004) ? IFSTATUS_UP : IFSTATUS_DOWN; + ifd.usz += 2; + return (*ifd.usz & 0x0004) ? IFSTATUS_UP : IFSTATUS_DOWN; } interface_status_t interface_detect_beat_ethtool(int fd, char *iface) {