int connection_active(char *if_name, int if_type) { /* * Returns 1 if the network status on the interface is active. * if_type: 0 for ethernet, 1 for ieee80211 */ struct ifmediareq ifmr; const struct ifmedia_status_description *ifms; static const int ifm_status_valid_list[] = IFM_STATUS_VALID_LIST; static const struct ifmedia_status_description ifm_status_descriptions[] = IFM_STATUS_DESCRIPTIONS; int bit = 0, s = -1, res; s = open_socket(AF_INET); if (s < 0) { printf("error opening socket: %s\n", strerror(errno)); } memset(&ifmr, 0, sizeof(ifmr)); strlcpy(ifmr.ifm_name, if_name, sizeof(ifmr.ifm_name)); res = ioctl(s, SIOCGIFMEDIA, (caddr_t) & ifmr); close(s); if (res) { printf("res: %d (%s)\n", res, strerror(errno)); return 0; } if (if_type) { /* ieee80211 check */ if (IFM_ACTIVE) { printf("connection_active: ieee80211 network is active\n"); return 1; } printf("connection_active: ieee80211 failed check\n"); return 0; } else { /* ethernet check */ for (ifms = ifm_status_descriptions; ifms->ifms_valid != 0; ifms++) { if (ifms->ifms_type == IFM_TYPE(ifmr.ifm_current)) if (strcmp(IFM_STATUS_DESC(ifms, ifmr.ifm_status), "active") == 0) { printf("connection_active: ethernet network is active\n"); return 1; } else { printf("connection_active: ethernet failed check\n"); return 0; } } } }
void media_status(int s, char *ifname, char *delim) { uint64_t *media_list; struct ifmediareq ifmr; memset(&ifmr, 0, sizeof(ifmr)); strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name)); if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { if (errno != ENOTTY) printf("%% media_status: SIOCGIFMEDIA: %s\n", strerror(errno)); return; } if (ifmr.ifm_count == 0) { if (verbose) printf("%% %s: No media types?\n", ifname); return; } media_list = calloc(ifmr.ifm_count, sizeof(*media_list)); if (media_list == NULL) { printf("%% media_status: calloc: %s\n", strerror(errno)); return; } ifmr.ifm_ulist = media_list; if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { printf("%% media_status: SIOCGIFMEDIA: %s\n", strerror(errno)); free(media_list); return; } printf("%s", delim); print_media_word(ifmr.ifm_current, 0, 0); if (ifmr.ifm_active != ifmr.ifm_current) { printf(" ("); print_media_word(ifmr.ifm_active, 0, 0); putchar(')'); } if (ifmr.ifm_status & IFM_AVALID) { const struct ifmedia_status_description *ifms; int bitno, found = 0; printf(", status "); for (bitno = 0; ifm_status_valid_list[bitno] != 0; bitno++) { for (ifms = ifm_status_descriptions; ifms->ifms_valid != 0; ifms++) { if (ifms->ifms_type != IFM_TYPE(ifmr.ifm_current) || ifms->ifms_valid != ifm_status_valid_list[bitno]) continue; printf("%s%s", found ? ", " : "", IFM_STATUS_DESC(ifms, ifmr.ifm_status)); found = 1; /* * For each valid indicator bit, there's only * one entry for each media type, so * terminate the inner loop now. */ break; } } if (found == 0) printf("unknown"); } putchar('\n'); free(media_list); return; }