How to check if interface is up
c++, ioctl, linux
Solution
Answer was simple: I used the bitwise OR (`|`) operator instead of the AND (`&`) operator. Fixed code is:
bool is_interface_online(std::string interface) {
struct ifreq ifr;
int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, interface.c_str());
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
perror("SIOCGIFFLAGS");
}
close(sock);
return !!(ifr.ifr_flags & IFF_UP);
}
Problem
Title pretty much says it all. If I run `ifconfig`, I get this: ``` eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet -snip- netmask 255.255.255.0 broadcast -snip- ... ``` Using this, I can know if it's up or not (`<UP,...`), but I want to be able to do this in C (or C++, if there is a simpler solution there) without relying on parsing external processes. Here is what I've got so far (doesn't work): ``` bool is_interface_online(std::string interface) { struct ifreq ifr; int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, interface.c_str()); if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { perror("SIOCGIFFLAGS"); } close(sock); return !!(ifr.ifr_flags | IFF_UP); } ``` Can anyone point me in the correct direction for this?