Skip to content

Instantly share code, notes, and snippets.

@4anonz
Created August 3, 2021 17:17
Show Gist options
  • Save 4anonz/1541dad5dded55482aae85f5326ccaa1 to your computer and use it in GitHub Desktop.
Save 4anonz/1541dad5dded55482aae85f5326ccaa1 to your computer and use it in GitHub Desktop.
Implementing a C program for listing interfaces on device. This is much like the ifconfig command on Linux
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
int main() {
//A strcuture that has the linked list of all internet addresses on the machine
struct ifaddrs *addresses;
//getifaddrs is use to allocate memory for storing the linked list
if(getifaddrs(&addresses) == -1) {
printf("getifaddrs failed\n");
return 1;
}
// get each address and loop through to print them
struct ifaddrs *address = addresses;
while(address) {
int family = address->ifa_addr->sa_family;
if(family == AF_INET || family == AF_INET6) {
if(family == AF_INET) {
char ap6[100] = {0};
char np6[100] = {0};
struct ifaddrs *tmp = addresses;
while(tmp) {
if(tmp->ifa_addr->sa_family == AF_INET6) {
if(strcmp(address->ifa_name, tmp->ifa_name) == 0) {
const int fsize = sizeof(struct sockaddr_in6);
getnameinfo(tmp->ifa_addr, fsize, ap6, sizeof(ap6),
0, 0, NI_NUMERICHOST);
getnameinfo(tmp->ifa_netmask, fsize, np6, sizeof(np6),
0, 0, NI_NUMERICHOST);
break;
}
}
tmp = tmp->ifa_next;
}
const int family_size = sizeof(struct sockaddr_in6);
char ap[100];
getnameinfo(address->ifa_addr, family_size,
ap, sizeof(ap), 0, 0, NI_NUMERICHOST);
char np[100];
getnameinfo(address->ifa_netmask, family_size,
np, sizeof(np), 0, 0, NI_NUMERICHOST);
unsigned int flags = address->ifa_flags;
char *name = address->ifa_name;
const char *yellow = "\033[1;33m",
*green = "\033[0;32m",
*reset = "\e[0m";
struct ifreq ifr;
strcpy(ifr.ifr_name, address->ifa_name);
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ioctl(sock, SIOCGIFFLAGS, &ifr);
printf("%s: flags=<", name);
if(ifr.ifr_flags & IFF_UP)
printf("%sUP%s,", yellow, reset);
if(ifr.ifr_flags & IFF_BROADCAST)
printf("%sBROADCAST%s,", yellow, reset);
if(ifr.ifr_flags & IFF_DEBUG)
printf("%sDEBUG%s,", yellow, reset);
if(ifr.ifr_flags & IFF_LOOPBACK)
printf("%sLOOPBACK%s,", yellow, reset);
if(ifr.ifr_flags & IFF_POINTOPOINT)
printf("%sPOINTTOPOINT%s,", yellow, reset);
if(ifr.ifr_flags & IFF_NOTRAILERS)
printf("%sNOTRAILERS%s,", yellow, reset);
if(ifr.ifr_flags & IFF_RUNNING)
printf("%sRUNNING%s,", yellow, reset);
if(ifr.ifr_flags & IFF_NOARP)
printf("%sNOARP%s,", yellow, reset);
if(ifr.ifr_flags & IFF_PROMISC)
printf("%sPROMISC%s,", yellow, reset);
if(ifr.ifr_flags & IFF_ALLMULTI)
printf("%sALLMULTI%s,", yellow, reset);
if(ifr.ifr_flags & IFF_MASTER)
printf("%sNO-MASTER%s,", yellow, reset);
if(ifr.ifr_flags & IFF_SLAVE)
printf("%sSLAVE%s,", yellow, reset);
if(ifr.ifr_flags & IFF_MULTICAST)
printf("%sMULTICAST%s,", yellow, reset);
if(ifr.ifr_flags & IFF_PORTSEL)
printf("%sPORTSEL%s,", yellow, reset);
if(ifr.ifr_flags & IFF_AUTOMEDIA)
printf("%sAUTOMEDIA%s,", yellow, reset);
if(ifr.ifr_flags & IFF_DYNAMIC)
printf("%sDYNAMIC%s,", yellow, reset);
printf("\b> mtu %d\n", ifr.ifr_mtu);
if(ifr.ifr_flags & IFF_BROADCAST) {
char broad[100];
getnameinfo(address->ifa_broadaddr, family_size, broad,
sizeof(broad), 0, 0, NI_NUMERICHOST);
printf("\tinet %s%s%s netmask %s%s%s broadcast %s%s%s\n"
, green, ap, reset, green, np, reset, green, broad, reset);
} else if(ifr.ifr_flags & IFF_POINTOPOINT) {
char ptp[100];
getnameinfo(address->ifa_dstaddr, family_size, ptp,
sizeof(ptp), 0, 0, NI_NUMERICHOST);
printf("\tinet %s%s%s netmask %s%s%s point-to-point %s%s%s\n"
, green, ap, reset, green, np, reset, green, ptp, reset);
} else
printf("\tinet %s%s%s netmask %s%s%s\n"
, green, ap, reset, green, np, reset);
if(strlen(ap6) > 1 || strlen(np6) > 1)
printf("\tinet6 %s%s%s netmask %s%s%s\n"
, green, ap6, reset, green, np6, reset);
}
}
address = address->ifa_next;
}
freeifaddrs(addresses);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment